shellcode를 쓰기에는 너무 비좁은 버퍼...
(사실 버퍼가 작지않아도 shellcode는 너무 지저분해서 않쓰려고했음 -_-;; )
어쨋든, 내가 생각한 방법은 2가지이다.
환경변수를 이용하는 방법과, RTL이다.
풀고나서 풀이를 검색해보니 Sasin이라는분이 상당히 독특하게 푸셨다.
argv[2]를 이용하면 저 비좁은 버퍼따위 문제가 되지않는다고한다(?)
argv[2]에 nop slide+shellcode를 넣어놓고, argv[1]가 buffer로 복사되어 buffer의 ret에 argv[2]의 주소를 넣는다.
자세한 주소는 http://0xffff.tistory.com/entry/Sasin-0xffff-BOF%EC%9B%90%EC%A0%95%EB%8C%80-2-gremlin-cobolt 에 있다.
실제로 많은 분들이 환경변수를 이용해서 풀고있지만, system함수를 이용해서 풀어보겠다.
0x40058ae0이 system함수의 주소이다.
이제 인자로 쓸 /bin/sh의 주소를 찾아보자...
다음은 /bin/sh의 주소를 찾을 소스다.
저렇게해서 돌렸더니 주소가 나온다.
그리고 간략하게 페이로드를 구성해보자면
[buffer + ebp (20bytes)] + [ret (4bytes)] + [dummy (4bytes)] + [argument (4bytes)] 가 된다.
실제로 페이로드 짠것이다.
./cobolt $(python -c 'print "a"*20+"\xe0\x8a\x05\x
40"+"aaaa"+"\xf9\xbf\x0f\x40"')
결과를 봐보자.
clear!!
'Wargame > LOB (Redhat9)' 카테고리의 다른 글
orge -> troll (0) | 2014.02.20 |
---|---|
darkelf->orge (0) | 2014.02.20 |
wolfman -> darkelf (0) | 2014.02.20 |
orc -> wolfman (0) | 2014.02.20 |
gate -> gremlin (0) | 2014.02.20 |