深入浅出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 ...
随机推荐
- IM跨平台技术学习(九):全面解密新QQ桌面版的Electron内存优化实践
本文由QQ技术团队分享,本文收录时有内容修订和大量排版优化. 1.引言 QQ 作为国民级应用,从互联网兴起就一直陪伴着大家,是很多用户刚接触互联网就开始使用的应用. 而 QQ 桌面版最近一次技术架构升 ...
- Datawhale AI 夏令营-天池Better Synth多模态大模型数据合成挑战赛-baseline复现与理解总结(更新中)
在大数据.大模型时代,随着大模型发展,互联网数据渐尽且需大量处理标注,为新模型训练高效合成优质数据成为新兴问题."天池 Better Synth - 多模态大模型数据合成挑战赛"应 ...
- 最新AI智能体开发案例:辅助写作神器!教你用Coze平台搭建「文匠智创 1.0」智能体!
各位小伙伴们,大家好呀!我是疯狂老包.我精心打造的<疯狂AI智能体开发:100个实战案例, 从 入门到精通 >正在开发中!要是你对 AI 应用搭建满怀热忱,渴望深入学习其中的奥秘与技巧,那 ...
- flutter如何搭建android环境
1.电脑上按安装sdk 首先配置Java的JDK 配好后,输入java 出现内容说明安装成功 然后在输入javac 出现内容说明jre安装成功 2.电脑上安装android Studio 安卓下载地址 ...
- S3基准测试工具 - Warp使用简介
本文分享自天翼云开发者社区<S3基准测试工具 - Warp使用简介>,作者:y****n 1.Warp⼯具简介 warp 是⼀款开源的S3基准测试⼯具,开源S3项⽬minio下的⼀个⼦项⽬ ...
- 玩转云端|够轻松!天翼云边缘安全加速平台AccessOne助力企业解决远程办公难题!
本文分享自天翼云开发者社区<玩转云端|够轻松!天翼云边缘安全加速平台AccessOne助力企业解决远程办公难题>,作者:天翼云社区官方账号 省去早起挤地铁的苦恼,享受居家办公的从容不迫-- ...
- 天翼云重磅升级边缘WAF能力,助力企业高效应对Web安全威胁!
"2022年,网络高危漏洞数量同比增长了13%:Q2遭受攻击的API数量月均超过了25万:物联网的普及大大降低了DDoS的攻击成本,大流量攻击指数显著提升:恶意Bot流量仍在持续增长,202 ...
- Apache Camel系列(2)----Hello World
下面创建一个Apache Camel的Hello World程序,该程序使用Maven,Intellij 15,运行环境是JDK 8. 1,创建一个maven工程,在pom.xml文件中添加apa ...
- MySQL主从复制-原理实战
一.原理 主从复制架构图:主从复制原理: Mysql 中有一种日志叫做 bin 日志(二进制日志).这个日志会记录下所有修改了数据库的SQL 语句(insert,update,delete,creat ...
- ORACLE SELECT INTO 赋值为空,抛出 NO DATA FOUND 异常
例子: DECLARE ORDER_NUM VARCHAR2(20); BEGIN SELECT S.ORDER_NUM INTO ORDER_NUM FROM SALES_ORDER S WHERE ...