首页
社区
课程
招聘
[原创]分享一个堆中链表的卸载过程图
发表于: 2014-4-3 11:43 3883

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

2014-4-3 11:43
3883

最近再看《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字节偏移),虽然第一步不成功第二步当然不会执行,但是我觉得还是说一下好,以免在修改的地址合法的时候忽略了第二步。

这些是目前我学习到这里的心得,希望能对和我一样的初学者有所帮助,文中有错误的地方,还请大家指正!


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

上传的附件:
收藏
免费 5
支持
分享
最新回复 (2)
雪    币: 9
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
第二步书里称为 指针反射
2014-4-3 12:59
0
雪    币: 43
活跃值: (40)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
0day2,我还没有看完,进度不如楼主,呵呵
2014-4-10 10:50
0
游客
登录 | 注册 方可回帖
返回
//