bugbear.c의 코드이다.
주석에 RTL이라고 적혀있고, 이번엔 argv[1][47]에 0xbf면 exit하도록 바뀌었다.
RTL은 Return To liblary 의 약자로, 라이브러리 내의 함수로 점프하여 쉘을 실행하는것이다.
(http://itsaessak.tistory.com/270?category=977991)
간단히 말해서 위의 코드의 경우 스택에
┌──────────┐
│ buffer[40] │
├──────────┤
│ SFP │
├──────────┤
│ addr │
├──────────┤
│ argc │
├──────────┤
│ argv[0] │
├──────────┤
│ ....... │
처럼 넣을 예정이다.
addr에는 시스템함수의 주소를 넣고, argv[0] 에 /bin/sh를 넣어 라이브러리에서 /bin/sh를 실행하게 하는 것이다.
gdb로 아무 프로그램이나 열어서 시스템 함수의 주소를 구해보자.
그냥 main에다 BP를 걸고 run한 후, p system을 하면 주소를 볼 수 있다.
0x40058ae0이 시스템의 주소인 것을 알 수 있다.
이 코드는 /bin/sh의 주소를 구해오는 코드이다. shell로 시스템의주소를 넣고, memcmp로 /bin/sh와 같은지 계속 비교해나간다.
실행 결과 /bin/sh의위치가 0x400fbff9인것을 알 수 있다.
즉 44바이트로 SFP까지 덮은 후, system함수의 주소 0x40058ae0을 넣은 후, 4바이트를 또 채우고 /bin/sh의 주소 0x400fbff9를 인자로 넣어주면된다.
./bugbear `python -c 'print "A"*44 + "\xe0\x8a\x05\x40" + "AAAA" + "\xf9\xbf\x0f\x40"'`
'LOB' 카테고리의 다른 글
LOB:Giant→Assasin (0) | 2018.05.01 |
---|---|
LOB:Bugbear→Giant (0) | 2018.04.30 |
LOB:Golem→Darkknight (0) | 2018.04.11 |
LOB:Skeleton→Golem (0) | 2018.04.10 |
LOB:Vampire→Skeleton (0) | 2018.04.09 |