해커스쿨 F.T.Z Level 15
level 15 로그인 후 hint를 본다.
level 14와 같은 코드지만 "int *check" 변수 check의 변수가 포인터로 쓰여있다.
이것은 변수 *check가 가리키는 주소에 0xdeadbeef가 들어있는지 봐야 한다.
C 코드 분석은 level 14에서 했으므로 생략하고 gdb를 열어본다.
main+3에서 0x38(56)byte만큼 공간을 확보하고 main+17에서 ebp-56의 주소를 eax에 넣은 뒤 fgets 함수를 call 한다.
main+29에서 ebp-16의 주소를 eax에 넣고 그 결과를 main+32에서 0xdeadbeef와 비교한다.
이 사이에 *check 변수의 주소를 찾아 먼저 넣어주면 BOF가 일어나게 된다.
여기서 level 14와 같은 크기로 ebp-56에서 비교문은 ebp-16에 있으니 거리는 40byte 떨어진 곳에 있는 것이다.
이 문제는 포인터 변수의 주소를 gdb로 어떻게 찾는지 알면 쉽게 풀리는 문제다.
gdb로 각각의 주소를 찾는 방법은 "x/16x main"으로 찾을 수 있다.
"x/16x main"에서 16은 숫자 16을 뜻하고 main에서부터 16byte까지 출력하는 명령어다. 숫자는 원하는 만큼 나올 수 있게 변경할 수 있다.

이렇게 보게 되면 main+32에서 "0xbeef3881", "0x2575dead"가 있는 걸 볼 수 있다.
main+32를 자세히 보게 되면 그 주소를 찾을 수 있다.

"x/x 주소"를 입력하면 그 주소에 해당하는 데이터를 볼 수 있다.
주소는 16진수로 하나씩 올려가면서 볼 수 있다.
이렇게 0xdeadbeef의 주소를 찾았으면 공격하면 된다.

위에서 말했듯이 level 14와 비슷하지만, level 14에서는 "0xdeadbeef" 문자와 비교했다면 level 15에서는 "0xdeadbeef"가 들어있는 주소를 입력해주어야 한다.