堆溢出

 

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。

 

堆溢出