堆溢出

我是研究僧i 提交于 2020-01-21 23:58:24

 

1.申请一个堆区;

2.连续申请3个大小一样的堆块H1 H2 H3;

3.释放H1 H3;

4.申请同大小的H4

 

当发生再次申请同样空间大小的h4时

 

依据最优匹配原则,空闲块h3将被摘下提交给程序进行管理。

 

堆溢出的关键点就在这里!我们仔细看看摘除H3是具体怎样实现的,我们先来看看H3的Blink指向的是H1的Flink,H3的Flink存放的是堆表某一项的Blink地址,通过赋值:[H3.Blink] <- H3.Flink,正常情况下,通过此赋值,将会完成H3的分配工作;

 

这是简单的正常分配过程,那溢出利用是怎样发生的呢?

假设在释放H1 H3后,申请H4前,

我们通过对H2数据区进行溢出赋值,内容A, B分别覆盖了H3中的Flink和Blink字段,我们看看会出现什么结果。

在申请H4发生时将触发[H3.Blink] <- H3.Flink赋值操作,然而由于溢出的发生,将变成[B] <- A

这个A我们就可以改成shellcode的起始地址,B可以改成重要函数的调用地址,当相应函数调用发生时,即可跳去执行shellcode。

 

 

 

 

 

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!