基础知识
首先就是unlink的认识了,在libc版本中曾经出现过安全机制不强的版本,其大致逻辑如下,其中fd,bk分别是forward,backward的缩写,我学的时候老分叉,但是知道原本单词是啥就没事了,所以我个人建议也是缩写尽量知道原译比较好。
[C] 纯文本查看 复制代码
void unlink(ptr * p){
FD = p->fd;
BK = p->bk;
FD->bk = p->bk;
BK->fd = p->fd;
} SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
而用图来描述呢,大致就是如下图(由于我想自己更加深理解,所以没用网图,各位可能看着吃力点,这个红线就是unlink时连接的)
至于为什么要有unlink以及unlink的时机嘛,我也时一知半解,因为我刚学完fastbin,一些largebin、smallbin、tcache等机制我还没接触,所以不是很清楚,就本题我自己查阅的资料加上自己的见解来说,
unlink就是为了防止堆内存空间的碎块过多,而其中unlink也并不就是说真把上面那个p块拿走了,而是说他合并了,这点我最开始很不理解,就是ctfwiki上面讲的拿出来,我寻思拿出来了再怎么利用呢,还有ctfwiki上面对于unlink的时机我觉得没则么说清楚,我自己上网查阅资料得出再free掉一个块的时候会首先查看自身的prev_size位是否为0,如果为0的话那么就说明上一块时空闲的,这时如果free掉当前快的话,那么就会对你自身free块的上一个空闲块进行unlink,然后这两个块就顺势合并,所以说并没有真的把哪一块弄下来了,当然我只知道free函数调用的时候会判断unlink,其他有没有用这个操作我就不太了解了(这也留作之后的学习罢)。以下我分享一下free时调用unlink函数的源码的一部分,大家有兴趣看堆的源码我推荐一个师傅的文章,那可真叫一个细
glibc中malloc源码分析
https://www.52pojie.cn/thread-1581911-1-1.html
(出处: 吾爱破解论坛)
[Asm] 纯文本查看 复制代码
if (!prev_inuse(p)) { prevsize = p->prev_size;
size += prevsize;
p = chunk_at_offset(p, -((long ) prevsize));
unlink(av, p, bck, fwd);
} SyntaxHighlighter Copyright 2004-2013 Alex Gorbatchev.
而对于unlink的利用也很容易理解,既然我要unlink这个p块,那我在他的fd以及bk上填上我自身想填的地址值就行阿,涉及到这里,我就还是画图(图画的不好见谅)
知道以上俗称unsafe unlink之后,再了解了解目前更为常见的safe unlink罢(悲),根据其名字就知道这个肯定有安全点的意思了,看他的源码会发现他在un
支付5UD,阅读全文
还有更多的精彩内容,作者设置为付费后可见