问题描述
解决方案
简单说就是通过程序编写的不严格,使局部变量溢出从而覆盖掉堆栈上的返回值。调用一个函数时,以__stdcall为例,先把参数入栈,然后时返回地址入栈, CPU执行现场跳转到函数中 ,然后是ebp寄存器入栈,随后局部变量和寄存器入栈,不同的编译器可能会有所差别,比如微软CL编译器在处理Debug和Release时是有一些区别的,但大致是相同的,溢出攻击,简单说就是溢出覆盖掉了返回值,这样就可以在函数返回时跳转到hacker指定的一个地址,如果hacker事先发送精心设计好的数据,就可以在远程计算机上执行他想执行的代码,然后反弹一个shell给hacker,hacker就可以在目标主机上上传和执行程序,如果溢出的程序没有权限,hacker还可以利用本地提权漏洞提权得到管理员/root权限,随后以这台主机为跳板,渗透网络中的其他主机!
后话:人类为了抑制溢出攻击,具有划时代意义的成果有:DEP(数据执行保护)、ALSR(地址空间分布随机化)等。简单说DEP通过将指定虚拟内存页面设置为“不可执行”,当然需要硬件支持,所有和Intel x86和amd x86_64兼容的CPU均支持,当CPU执行不可执行页面的代码时,就会出现虚拟内存违规访问,从而程序崩溃退出,在部分Windows系统上,操作系统还会在右下角弹出一个气泡“数据执行保护已终止XXX程序”。绕过DEP在没有ALSR的系统上(比如XP)还是比较简单的,溢出覆盖返回值为VirtualProtect,修改指定内存页面的访问规则即可。ALSR简单说就是将程序载入内存时不载入程序要求载入的地方,而是随机载入(当然操作系统必须遍历程序代码,然后对导入的函数、数据、以及自己的函数调用进行“重定向”),这样函数地址什么的全是随机的了,hacker溢出后就不知道往哪个地址调用VirtualProtect了,非常棘手,360为何对自己的XP甲盾如此有信心?因为XP甲盾通过驱动拦截可执行模块载入并修改了基地址,相当于在XP上实现了ALSR,当然代价是使系统运行效率下降。
解决方案二:
因为你没有基础,所以看不懂。以科普的方式和你说下堆栈溢出的原理。要理解堆栈溢出,最先需要理解,对于x86处理器来说,指令和数据是混合编址的。以及调用函数的过程,我们把返回地址、参数放在堆栈上,而函数局部变量也放在堆栈上。
当你对数组一类的变量越界访问的时候,你写入的数据就会冲掉堆栈里的返回值(堆栈是向下增长的,越界的数组冲掉的是堆栈下面的数据,包括返回地址),一旦这样,函数执行完以后,就不会返回调用的地方了,而是另一个地方。
如果攻击者注入一段可执行机器代码作为数据,同时改变返回地址,那么就会造成这些本来作为数据的内存被当作代码执行,而这些代码如果用于做坏事,那么就会造成破坏。特别是你的进程拥有很高权限的情况下。
解决方案三:
最近在深攻c语言,巧了,这句代码也是c语言的。
首先,你要知道c语言的字符串是用数组承载的,但它(c语言)并不会检查上标,一旦超出定义的内存,就会产生溢出,举个例子:
#include
void main () {
char str[1]="xy";
int i;
for (i=-1;i<10000;i++){
printf("%c",str[i]);
};
}
我故意非法访问内存地址,结果:
v7l/data/data/com.n0n3m4.droidc/files/tempEXTERNAL_STORAGE=/storage/emulated/legacyLOOP_MOUNTPOINT=/mnt/obbLD_LIBRARY_PATH=/vendor/lib:/system/libOLDPWD=/TERMINFO=/data/data/com.n0n3m4.droidc/files/gcc/terminfoANDROID_ASSETS=/system/appBOOTCLASSPATH=/system/framework/core.jar:/system/framework/conscrypt.jar:/system/framework/okhttp.jar:/system/framework/core-junit.jar:/system/framework/bouncycastle.jar:/system/framework/ext.jar:/system/framework/framework.jar:/system/framework/framework2.jar:/system/framework/telephony-common.jar:/system/framework/voip-common.jar:/system/framework/mms-common.jar:/system/framework/android.policy.jar:/system/framework/services.jar:/systSegmentation fault