2 qq 33769290 qq_33769290 于 2016.03.11 00:03 提问

关于一个简单的堆栈例子

我在读一本入侵检测技术的书,看到一个简单的堆栈溢出示例,看不懂,请各位大神解释一下是什么意思图片说明图片说明

3个回答

zuishikonghuan
zuishikonghuan   2016.03.11 08:08
已采纳

简单说就是通过程序编写的不严格,使局部变量溢出从而覆盖掉堆栈上的返回值。调用一个函数时,以__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,当然代价是使系统运行效率下降。

caozhy
caozhy   Ds   Rxr 2016.03.11 00:35

因为你没有基础,所以看不懂。以科普的方式和你说下堆栈溢出的原理。要理解堆栈溢出,最先需要理解,对于x86处理器来说,指令和数据是混合编址的。以及调用函数的过程,我们把返回地址、参数放在堆栈上,而函数局部变量也放在堆栈上。
当你对数组一类的变量越界访问的时候,你写入的数据就会冲掉堆栈里的返回值(堆栈是向下增长的,越界的数组冲掉的是堆栈下面的数据,包括返回地址),一旦这样,函数执行完以后,就不会返回调用的地方了,而是另一个地方。
如果攻击者注入一段可执行机器代码作为数据,同时改变返回地址,那么就会造成这些本来作为数据的内存被当作代码执行,而这些代码如果用于做坏事,那么就会造成破坏。特别是你的进程拥有很高权限的情况下。

qq_24502329
qq_24502329   2016.03.11 00:10

最近在深攻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

Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
简单的堆栈.ppt
关于数据结构堆栈的简单学习与认识 简单的例子 简洁的说明
继承的一个简单例子
package com; public class Cleaner { public int price; public Cleaner(int price) { this.price = price; } public void clean() { System.out.println("可以去污"); } public static voi
多态的一个简单例子
package com; public class Animal { public int a; public void move() { System.out.println("移动"); } public static void main(String[] args) { // 多态调用时,父类变量指向子类对象,所能调用的方法和属性仅限于父类变量中定义
两个简单的队列和栈的例子
循环队列的简单程序: #include #include #define MAXSIZE 256 /*************************************** *定义队列结构 * **************************************/ typedef struct { int data[MAXSIZE];/*数据类型,其中int可以
经典java继承例子
非常适合初学者的java继承学习 很经典因为我也是初学者!哈哈
java模拟堆栈例子
/** * 堆栈后进先出 * @author wyh * */ public class Stack { /** 存储区域 */ int[] data; /** 最大存储量 */ int maxSize; // TODO int top; public Stack(int maxSize) { this.maxSize = maxSize; this.data =
$.ajax 的简单小例子
感觉自己对$.ajax 不是很清晰 就看了文档 尝试写了下 .然后还发现个问题,$arr2 = array("id"=>2,"name"=>2); 如果是这种格式的length 就会出问题,遍历也是。 但是如果改成$arr2 = array(0=>2,1=>2); 这样就没问题了 。表示不是很理解。但是如果返回的是 $arr[0] = array("id"=>$_POST['id'
栈和队列的简单实例
栈 import java.util.Stack; public class StackClass { public static void main(String[] args) { Stack s=new Stack(); s.push("A"); s.push("B"); s.push("C");
java 一个关于泛型的简单例子
java 一个关于泛型的简单例子 java 一个关于泛型的简单例子 java 一个关于泛型的简单例子
JAVA中有关继承的一个实例
在JAVA中,“extends”用来表示继承,当创建一个类时,总是在继承,除非已经明确指出要从其他类中继承,否则都是隐式从JAVA中的标准根类Object中继承。