이번 문제의 힌트는
이다.
스택 구조상
buf
check
crap
으로 되어있을것이므로 fgets를 이용해 check부분을 0xdeadbeef로 오버플로우시키면 쉘을 얻을 수 있을 것이다.
메인을 디스어셈블해보면 main+3에 sub 0x38이 보인다. 이는 십진수로 56이다.
코드상으론
int 형 변수 2개와 char 형 buf[20]이 선언되었으므로 4+4+20 총 28이 선언되었지만 실제론 56이 할당된걸 볼 수 있다.
스택이
---------------
buf
---------------
check
---------------
crap
---------------
dummy
---------------
sfp(여긴 계속 까먹..)
---------------
ret
처럼 되어있다면 간단하게 20바이트를 채우고 0xdeadbeef를 넣겠지만
사실 더미값은 변수들 사이사이에도 있다.
이를 알아보기 위해 한참 뒤져보다가
한 선배의 도움으로
set disassembly-flavor intel
이라는 명령어를 알게 되었다.
이 설정을 해주고 disas main을 해주면
코드가 이렇게 ollydbg에서 보던 익숙한 모습으로 보이게 되는데
여기서 cmp가 있는 main+29를 보면 0xdeadbeef와 ebp-16을 비교하는 것을 볼 수 있다.
총 할당된것이 56인데 그중 -16해서 비교하는 것을 보면 check가 뒤에서 16바이트 전에 위치함을 알 수 있었다.
그리해서 아무값이나 40바이트 채우고 0xdeadbeef를 입력하였다.
그러자 쉘을 얻을 수 있었다.