博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
简单栈溢出
阅读量:6428 次
发布时间:2019-06-23

本文共 713 字,大约阅读时间需要 2 分钟。

hot3.png

简单栈溢出

C语言中,每一个函数调用都会有自己的栈空间,WIN32下用2个寄存器来标识位于栈顶的工作单元:
EBP:指向当前工作栈区的底部
ESP:指向当前工作栈区的顶部
函数调用步骤为:
(1) 参数从右至左依次入栈
(2) 返回地址入栈
(3) 代码区跳转
(4) 更改EBP,ESP寄存器,开辟新的栈工作区
一个函数调用时的指令大致为
! push arg2;
push arg1;
push arg0;
push 返回地址;
push ebp; //保存旧的栈区底部
mov ebp,esp; //栈区单元切换
sub esp,xxx; //抬高栈顶,开辟新栈区

注:栈在内存中是从高地址向低地址延伸的,即栈顶位于低地址单元。一个函数开始时,ebp指向返回地址.

实例:

一个C函数如下:
int verify(char* key)
{
int right;
char buf[8];
right = strcmp(“12345”, key);
strcpy(buf, key);
return right;
}
 则工作栈区如图,此时,若构造key为 “1234123412341234xxxx”总共20字节,后面xxxx为4字节的16进制地址,则strcpy函数后xxxx将覆盖原来的返回地址,即可将程序流程定位到任何位置。

在本机上调试之后发现,老EBP和第一个变量之间还有2个单元被占用,因此我将key修改为28个字节,恰好覆盖返回地址。(个人猜测是编译器不同造成的,原文作者采用的是VC6,我用的是gcc)

转载于:https://my.oschina.net/mavericsoung/blog/133127

你可能感兴趣的文章
我的友情链接
查看>>
C#中的线程池使用(一)
查看>>
利用Windows Server Backup功能备份活动目录
查看>>
RAC维护手记08-ASM磁盘组信息查看常用命令
查看>>
实验08 磁盘和文件系统管理
查看>>
我的友情链接
查看>>
我的友情链接
查看>>
FastDFS整合nginx后,nginx一直报错
查看>>
使用Fuel安装OpenStack juno之三使用OpenStack创建云主机和Volume
查看>>
zabbix安装源
查看>>
Eclipse+kafka集群 实例源码
查看>>
Vijos 1067Warcraft III 守望者的烦恼
查看>>
SQL语句
查看>>
LinkedList
查看>>
Python number
查看>>
【Lv1-Lesson008】A Guide to Birthdays
查看>>
MySQL_PHP学习笔记_2015.04.19_PHP连接数据库
查看>>
juery 选择器 选择多个元素
查看>>
【新手向】TensorFlow 安装教程:RK3399上运行谷歌人工智能
查看>>
Oracle Net Configuration(监听程序和网络服务配置)
查看>>