堆溢出
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。