栈溢出利用--预备知识
2015-12-07 11:14
232 查看
一、缓冲区溢出原理:
简单而言就是大缓冲区中的数据向小缓冲区复制的过程,小缓冲区的相邻内存区域被覆盖,而引起的内存问题。成功的利用缓冲区漏洞可以修改内存中变量的值,甚至是劫持进程,执行恶意代码,最终获得程序的控制权。二、理解内存的功能:
1、代码区.text–存储被装入执行的二进制代码,CPU会到这里来取指执行。2、数据区.data–存储全局变量。
3、堆区–进程在堆区动态的请求一定大小的内存块,并在用完后回收。特点–动态&回收。
4、栈区–动态存储函数之间的调用关系,以保证在调用完成后恢复到上级父函数执行。
三、PE文件装载:
高级语言程序编译后生成可执行的PE文件。PE文件被装载运行后,就成了进程。PE文件中二进制机器码被装入内存的.text区。
四、栈的操作:
1、push–压栈操作,在栈顶处增加一个元素;2、pop–弹栈操作,从栈顶处取出一个元素;
3、top–表示栈顶位置。每push一次,top++;每pop一次,top–;
4、base–表示栈底。用于防止栈空后继续弹栈。
五、函数调用在底层的工作原理:
int func_B(int arg_B1,int arg_B2) { int var_B1, int var_B2; var_B1=arg_B1+arg_B2; var_B2=arg_B1-arg_B2; return var_B1*var_B2; } int func_A(int arg_A1,int arg_A2) { int var_A; var_A=func_B(arg_A1,arg_A2)+arg_A1; return var_A; } int main(int argc,char **argv,char **envp) { int var_main; var_main=func_A(4,3); return var_main; }
代码区中的跳转都是和系统栈的巧妙结合下完成的。
1、在main函数调用func_A时,首先将自己的栈帧中压入函数返回地址,然后为func_A创建新栈帧并压入系统栈。
2、在func_A 调用 func_B 时,同样先将自己的栈帧中压入函数返回地址,然后为func_B创建新栈帧并压入系统栈。
3、在func_B 返回时,func_B 栈帧弹出系统栈,func_A 的返回地址此时位于栈顶处,pop 出func_A 的返回地址转去执行func_A 代码区。
4、在func_A返回时,func_A 栈帧弹出系统栈,main函数的返回地址此时位于栈顶处,pop 出 main 函数的返回地址转去执行main代码区。
六、几个重要的术语
每个函数独自拥有自己的栈帧。当前运行的函数的栈帧总是位于系统栈的栈顶。1、ESP–栈指针寄存器,该指针永远指向系统栈最上面的一个栈帧的栈顶元素;
2、EBP–基址指针寄存器,该指针永远指向系统栈最上面的一个栈帧的底部元素;
Notice:EBP指向的是系统栈最上面一个栈帧的底部,而并非系统栈的底部。
栈帧底部和栈底是不同的概念。
3、函数栈帧:位于ESP和EBP之间的内存空间。在函数栈帧中包含有:
(1)局部变量;
(2)栈帧状态值–保存当前栈的底部和顶部,用于在本帧被弹出恢复上一个栈帧;
(3)函数返回地址–保存当前函数调用前的断点信息。也就是函数调用前的指令的位置。
4、EIP寄存器:指针寄存器。存放下一条等待执行的指令的地址。
七、函数调用的相关指令:
1、调用步骤:(1)参数入栈:从右到左;
(2)返回地址入栈:当前代码区的下一条指令地址入栈;
(3)代码区跳转:处理器从当前跳转到调用函数入口;
(4)栈帧调整:
1)保存当前栈帧内容(EBP入栈);
2)切换当前栈帧到新栈帧(将ESP值装入EBP,更新栈帧底部);
3)给新栈帧分配空间(ESP减去所需空间,抬高栈顶)
;调用前 push 参数3 push 参数2 push 参数1 call 函数地址 push ebp ;保存旧栈帧底部 mov esp,ebp ;设置新栈帧底部,栈帧切换 sub esp,xxx ;设置新栈帧顶部,分配空间
2、返回步骤:
(1)保存返回值:返回值通常保存在EAX中
(2)弹出当前栈帧,恢复上一栈帧
1)ESP加上栈帧大小,降低栈帧,回收栈帧空间;
2)当前栈帧底部保存的前栈帧EBP弹入EBP寄存器,恢复上一栈帧;
3)函数返回地址弹入EIP寄存器
(3)跳转:函数返回地址调到父函数执行。
add esp,xxx ;降低栈顶,回收栈帧空间 pop ebp ;前栈帧底部位置恢复 retn ;弹出当前栈顶元素,也就是弹出栈帧的返回地址 ;处理器跳转到返回地址执行
相关文章推荐
- 汽车座椅中的黑科技
- c++_3: 继承和组合
- R语言 caret包 findCorrelation()函数用法
- unity3d 之本地推送
- POJ1182食物链,HDU1829(种类并查集)
- Android Audio Focus的应用(requestAudioFocus)
- Intel(R) 6 Series/C200 Series Chipset Family USB Enhanced Host Controller 1c2d
- 10_5 在信号处理函数中调用非可重入函数getpwnam。
- Tomcat安装配置
- Eclipse 报 “Exception in thread "main" java.lang.OutOfMemoryError: Java heap space ”错误的解决办法
- 光流法简单介绍
- 哈夫曼树的编码与译码
- [Windows Server 2008] SQL Server 2008 数据库还原方法
- MINA源码笔记(二)IoBuffer的封装
- Android Studio插件---For UML
- Git本地仓库与Github远程仓库关联
- MVC下载Excel
- User cannot be resolved to a type
- 10006---Memcached--安装
- FZU--2188(BFS+多条件判断,这题超好)