缓冲区溢出漏洞(堆溢出和栈溢出)
缓冲区溢出漏洞是由于软件在处理用户数据时使用了不限边界的拷贝,导致程序内部一些关键的数据被覆盖,引发了安全问题,严重的缓冲区漏洞会使得程序被利用而安装上木马或者病毒。
那么何谓缓冲区呢?缓冲区是指操作系统中用来保存临时数据的空间,一般分为栈和堆两种缓冲区类型。
堆栈是一数据结构,遵循“先进后出,后进先出”的规则,就像我们平时叠盘子一样,先放在下面的最后才能取出来,最后放上去的最先取出来。而在操作系统中,存和取的动作就是PUSH和POP。PUSH放一个数据到堆栈中去,POP取一个堆栈中的数据出来。
用一段经典代码测试:
#i nclude<stdio.h>
#i nclude<string.h>
char name[]="abcdefghijklmnopqrstuvwxyz";
void cc(char * a)
{
char output[8];
strcpy(output,a);
printf("%s\n",output);
}
int main()
{
cc(name);
return 0;
}

‘abcd’是‘61626364’,那么‘6d6e6f70’就应该是mnop了
在字母i以前,刚好就是8个字母"abcdefgh",也就是说output指向的8个字节的内存地址此刻完全被装满,而多余的“igklmnopqrstuvwxyz”就覆盖到了栈空间中的其它数据,这里包括函数的返回地址。


对应转换表

用OD查看:

从图中可以看到,esp寄存器果然指向了ijkl4个字母后面的过长字符串。
如果此时,esp指向的这段过长数据是一段恶意代码,那么当我们把函数的返回地址覆盖成为一个jmp esp指令或者call esp指令所在的地址时,溢出发生后,函数一返回就会跳转到jmp esp指令或者call esp指令所在地址上,CPU执行jmp esp指令或者call esp指令后,马上就会跳到esp寄存器指向的过长数据上,从而执行恶意代码。
esp指向的这段恶意代码称之为“shellcode”
缓冲区溢出漏洞利用三步:
第一步、精确定位返回点。我们可以利用求余取整法可巧妙得到返回位置。
第二步、shellcode编写。我们可以直接利用别人写好的shellcode。
第三步、JMP ESP的地址。我们使用lion共享的中文通用地址—0x7ffa4512