最近再看《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直播授课