먼저 ls를 해보면
요렇게 나온다.
당연히 flag는 실행이 안되는데, 그래서 col을 실행해보면
20바이트를 받는 것을 알 수 있다.
그래서 넣어보면
패스워드가 틀렸다고 나온다.
아마 20바이트의 옳은 패스워드를 찾아야 할 것 같다.
한번 코드를 살펴보자
main 함수를 보면
첫 번째 if문에서 매개변수 개수를 체크하고 2개보다 적으면 사용법을 출력한다.
두 번째 if문에서는 입력 값의 바이트가 20바이트인지 확인한다.
세 번째 if문에서는 hashcode와 check_password 함수 들어간 값과 비교해 flag를 출력한다.
그렇지 않으면 wrong passcode가 출력된다.
check_password 함수를 보면
입력받은 매개변수 값을 받아와서 int형 포인터 변수로 가리키고
for문에 4바이트씩 잘라서 res 변수에 더한 값이 저장된다.
res 변수의 값과 hashcode인 0x21DD09EC 값과 같아야 한다.
어떤 값을 4개를 더해서 0x21DD09EC 값이 나오려면
어떤 값 * 4 + 0x21DD09EC - 어떤 값 * 4 = 0x21DD09EC
어떤 값을 임의로 1이라고 해보면
hex 0x01
0x01010101 * 4 = 0x04040404
0x21DD09EC - 0x04040404 = 0x1DD905E8
근데 리눅스는 리틀앤디안 방식을 사용하기 때문에 값을 거꾸로 넣어주어야 한다.
두 자리씩 끊어서 거꾸로 넣어주게되면은 E805D91D 이런 식으로 된다.
근데 그냥 맨 처음에 했던 것처럼 매개변수 넣듯이 그런 식으로 하면 안되고
0x01이 16번이나 들어가서 파이썬 스크립트를 이용한다.
성공!
'Pwnable' 카테고리의 다른 글
[pwnable.kr] bof (0) | 2021.05.18 |
---|---|
[Pwnable] GDB로 코드 분석 (0) | 2021.05.11 |
[Pwnable] GDB 사용방법 정리 (0) | 2021.05.11 |
[pwnable] swing_pwn_chall (0) | 2021.04.28 |
[Pwnable] 리눅스 메모리 구조 (0) | 2021.03.31 |
댓글