level14

해커스쿨 FTZ 2018. 3. 28. 16:52

이번 문제의 힌트는

이다.


스택 구조상 



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를 입력하였다.

그러자 쉘을 얻을 수 있었다.

'해커스쿨 FTZ' 카테고리의 다른 글

level16  (0) 2018.04.02
LEVEL15  (0) 2018.03.29
level13  (0) 2018.03.28
level12  (0) 2018.03.28
level11  (0) 2018.03.27
블로그 이미지

천재보다는 범재

,