off-by-one null byte - Blog of Mathias
Blog of Mathias Web Securtiy&Deep Learning
off-by-one null byte
发表于: | 分类: off-by-one | 评论:0 | 阅读:665

场景:有strcpy等函数,以为长度符合,实际则添加了额外的\x00的情况
目的:覆盖掉下一块chunk的size的inuse部分,使其为0(可以推广到一般的覆盖情况)
而后触发堆块的合并,使某个块在并没有被free的情况下,实现对其前面chunk的伪造,进而free它
触发unlink漏洞的利用
附加知识:
malloc的对齐机制

x86
malloc(byte)
(head+byte+more)%8==0
real_byte=byte+more

x64
malloc(byte)
(head+byte+more)%16==0
real_byte=byte+more

head指的是size的那8byte(x64下),因为有时候不会分配pre_size的内存
但是usable指的是byte+more
这个多出来的more是通过下个chunk的pre_size来提供内存的
因此,如果最后一个byte溢出,那么将写入size位的最低位中

流程:
under x64
首先malloc(A),size(A)=0x100,由于对齐,实际为0x108
malloc(B),0x200
malloc(C),0x100

内存布局如下

2.jpg

接下来,我们对A输入数据,覆盖掉B的inuse和其位置

3.jpg

然后free(B),更新了C的pre_size 正是B这个空闲区块的大小

4.jpg

申请B1,B2
这时候按顺序free掉B1和C.
C会按照自己的pre_size去寻找上一个chunk,则找到了B1
而且会按照自己的pre_size而不是B1的size做判断
触发了合并操作,这时候只需要再
malloc(N),0x308 就能得到之前B所在的位置,并且这时候留下了一个指针B2,没有被free掉

5.jpg

这才是这种漏洞的重点,其实通过malloc重新得到之前chunk的地址操作权是容易的
但在free一次后,如果指针被清零,就无法利用,在double free中是因为没有这种操作所以造成利用
而off by one则是'欺骗'了系统,留下了这个指针给我们作为unlink的利用点

还不快抢沙发

添加新评论