欢迎来到 嗅灵易学

零基础也能上手的脚本技术课,一对一答疑带你入门

[原创]分享一个堆中链表的卸载过程图

[原创]分享一个堆中链表的卸载过程图

最近再看《0day安全》,研究了好久,终于弄明白了链表的卸载过程,给大家分享下我的心得。由于是新手初学,若有错误,还请大家指正。
在空表中,当堆被重新分配时,链表会从索引中卸下,这里主要有2步操作(这里不考虑堆块的合并):
1.node -> blink -> flink = node -> flink
意思就是将flink中的值写入到blink所指的flink中去
(这里的第一个flink和blink是将要卸载链表里的)
2.node -> flink -> blink = node -> blink
意思就是将blink中的值写入到flink所指的blink中去
(这里的第一个blink和flink是将要卸载链表里的)
感觉很绕,其实很简单,过程如下图:

其中Freelist是空表索引,h1,h2,h3代表不相邻的堆块,a1-a8表示地址。
对照上边的2步,验证后没有问题。这是卸载最后一个的堆块的过程,那么卸载中间的是否也是这样呢?如下图:

依然正确,没有问题。
书中实验为将flink改为0x44444444,blink改为0x00000000,但是只提到将“0x44444444”写入到0x00000000,而没有说将“0x00000000”写入到0x44444444+4(这里加4是因为blink相对flink有4字节偏移),虽然第一步不成功第二步当然不会执行,但是我觉得还是说一下好,以免在修改的地址合法的时候忽略了第二步。
这些是目前我学习到这里的心得,希望能对和我一样的初学者有所帮助,文中有错误的地方,还请大家指正!

上传的附件 flink_blink.JPG
flink_blink2.JPG

注意:上传附件及图片大小不得大于30M。

⚠️ 版权声明:
本博客所有内容(含教程、源码、工具)仅供个人技术学习与研究交流使用,严禁商用、倒卖、二次分发及非法用途。
未经作者书面授权,任何组织或个人不得转载、复制或用于其他平台,违者将追究相关责任。

0 0 0 举报
复制成功