深入浅出CPU眼中的函数调用&栈溢出攻击
深入浅出CPU眼中的函数调用——栈溢出攻击
原理解读
函数调用,大家再耳熟能详了,我们先看一个最简单的函数:
#include <stdio.h>
#include <stdlib.h>
int func1(int a, int b){
int c = a + b;
return c;
}
int main(){
int res = func1(2, 5);
printf("%d", res);
}


函数调用前,调用者会先把需要传递的参数保存在对应的寄存器中,然后就会调用call函数,call函数会做两件事情,第一件事情是把下一条指令的地址入栈(对应的上图22行的指令地址),第二件事情是跳转到fun1所在的位置执行;跳转过去之后,首先要开辟当前函数的栈帧,对应push rbp; mov rbp, rsp两条指令;再往后便是
我们知道,局部变量都是保存在栈上的,每个函数也有自己的栈帧,在整个函数调用的过程中,我们回顾一下栈帧的变化;

整个函数调用过程如上图
call指令先将调用者函数的下一条指令入栈,之后跳转到被调用函数执行。
被调用者函数先将调用者函数的栈帧基地址入栈。
然后开辟自己的栈帧,主要是将ebp设置为自己的栈帧基地址。
...执行相关的函数操作...
pop rbp将ebp恢复为main函数栈帧。
ret将下一条指令程序计数器PC,然后该指令出栈。(有点像pop)。
栈溢出攻击
实验环境:

经过上面的介绍,我们会发现,栈是从高地址向低地址增长的,并且局部变量都保存在当前栈帧的基地址之下;当前栈帧的基地址之上则包含了当前函数的返回地址,那么是不是可以通过某种方式,去修改这个返回地址,来实现栈溢出攻击呢,答案是可以的;
#include <stdio.h>
#include <stdlib.h>
void func2(){
printf("☠️☠️☠️☠️☠️");
exit(4);
}
void func1(){
long a[2];
a[1] = 1;
a[0] = 2;
// 修改返回地址
a[4] = (long)func2;
}
int main(){
func1();
printf("hello");
}

这段代码我们通过数组越界写,使用a[3]修改当前函数的返回地址,使得其去执行fun2。代码执行如下:
tackAttack.cpp:14:5: warning: array index 4 is past the end of the array (which contains 2 elements) [-Warray-bounds]
a[4] = (long)func2;
^ ~
stackAttack.cpp:10:5: note: array 'a' declared here
long a[2];
^
1 warning generated.
☠️☠️☠️☠️☠️
[Done] exited with code=4 in 0.231 seconds
我们可以发现虽然编译器提示我们数组发生越界,但是并没有阻止,将返回地址修改后,程序执行了我们的恶意代码,并且没有输出hello;
深入浅出CPU眼中的函数调用&栈溢出攻击的更多相关文章
- [转]现代Linux系统上的栈溢出攻击
1. 基本内容 这个教程试着向读者展示最基本的栈溢出攻击和现代Linux发行版中针对这种攻击的防御机制.为此我选择了最新版本的Ubuntu系统(12.10),因为它默认集成了几个安全防御机制,而且它也 ...
- [翻译]现代Linux系统上的栈溢出攻击【转】
转自:http://www.codeweblog.com/%E7%BF%BB%E8%AF%91-%E7%8E%B0%E4%BB%A3linux%E7%B3%BB%E7%BB%9F%E4%B8%8A%E ...
- Linux下基本栈溢出攻击【转】
转自:http://blog.csdn.net/wangxiaolong_china/article/details/6844415 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[ ...
- 使用metasploit进行栈溢出攻击-1
攻击是在bt5下面进行,目标程序是在ubuntu虚拟机上运行. 首先,需要搞明白什么是栈溢出攻击,详细内容请阅读 http://blog.csdn.net/cnctloveyu/article/det ...
- WINDOWS平台下的栈溢出攻击从0到1(篇幅略长但非常值得一看)
到1的这个过程.笔者也希望能够通过这些技术分享帮助更多的朋友走入到二进制安全的领域中.2.文章拓扑由于本篇文章的篇幅略长,所以笔者在这里放一个文章的拓扑,让大家能够在开始阅读文章之前对整个文章的体系架 ...
- 使用metasploit进行栈溢出攻击-3
有了shellcode,就可以进行攻击了,但是要有漏洞才行,真实世界中的漏洞很复杂,并且很难发现,因此我专门做一个漏洞来进行攻击. 具体来说就是做一个简单的tcp server,里面包含明显的栈溢出漏 ...
- 使用metasploit进行栈溢出攻击-2
基本的栈溢出搞明白了,真实攻击中一个很重要的问题是shellcode生成. 利用Metasploit提供的工具,可以方便的生成shellcode,然后可以使用第一篇中的代码进行验证. 先说一下如何生成 ...
- 多事之秋-最近在阿里云上遇到的问题:负载均衡失灵、服务器 CPU 100%、被 DDoS 攻击
昨天 22:00~22:30 左右与 23:30~00:30 左右,有1台服役多年的阿里云负载均衡突然失灵,造成通过这台负载均衡访问博客站点的用户遭遇 502, 503, 504 ,由此给您带来麻烦, ...
- 使用metasploit进行栈溢出攻击-5
我们先尝试使用这个脚本进行攻击: msf > use exploit/linux/myvictim msf exploit(myvictim) > set payload linux/x8 ...
- 使用metasploit进行栈溢出攻击-4
有了漏洞我们就可以进行攻击了.首先我们需要了解metasploit的exploit模块,具体可以看 http://www.offensive-security.com/metasploit-unlea ...
随机推荐
- AsyncLocal的妙用
AsyncLocal<T>是一个在.NET中用来在同步任务和异步任务中保持全局变量的工具类. 它允许你在不同线程的同一个对象中保留一个特定值,这样你可以在不同的函数和任务中访问这个值. 这 ...
- rabbitmq部署及配置与验证-copy
1. 场景描述 朋友项目需要弄个测试环境,稍微帮忙了下,系统不复杂,但是需要自己安装mysql.Reids.Es.RabbitMq等,Mq主要用在同步用户信息与发送站内消息和短信上,RabbitMq以 ...
- w3cschool-HBase官方文档-3MapReduce
HBase和MapReduce 2018-03-30 13:59 更新 HBase和MapReduce Apache MapReduce 是一个用于分析大量数据的软件框架.它由 Apache Hado ...
- IDEA 统计代码量
参考:链接 打开setting 找到Plugins,打开插件市场 搜索Statistic ,点击下载 重启IDEA即可 问题 idea插件安装后不显示 插件版本与idea本身版本不同导致的不兼容.解决 ...
- 微信小程序slot(一)
在我们封装组件的时候,有些时候,我们需要使用类似于vue中的slot插槽: 小程序借鉴了这个优秀的想法: 在小程序中,组件模板中可以提供一个 <slot> 节点,用于承载组件引用时提供的子 ...
- Linux下普通用户免密切换root
问题需求: Linux下普通用户doge免密切换root 问题解决: Linux下普通用户切换到root用户下,默认情况是需要输入密码很不方便,因此需要实现普通用户doge免密切换到root用户. 示 ...
- DeepSeek-V3 解读:优化效率与规模
DeepSeek-V3 是大语言模型(LLM)领域的一项变革性进展,为开源人工智能设定了新的标杆.作为一个拥有 6710 亿参数的专家混合(Mixture-of-Experts,MoE)模型,其中每个 ...
- 深度对比:PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
深度对比:PostgreSQL 和 SQL Server 在统计信息维护中的关键差异 数据库统计信息的作用 在数据库系统中,查询优化在决定应用程序性能方面起着至关重要的作用. 高效的查询依赖于最新的数 ...
- ABB机器人维修I/O通信详细解释
信号解析的深度探索与解析 在ABB机器人维修系统那精密而复杂的运作机制中,I/O(Input/Output)信号与外围机械手间的通信,是通过一种既高度组织化又精心设计的层次结构来实现的.这一结构严格遵 ...
- Esp32s3(立创实战派)移植LVGL
Esp32s3(立创实战派)移植LVGL 移植: 使用软件EEZ studio 创建工程选择带EEZ Flow的,可以使用该软件更便捷的功能 根据屏幕像素调整画布为320*240 复制ui文件至工程 ...