首页 > 其他分享 >深入浅出CPU眼中的函数调用&栈溢出攻击

深入浅出CPU眼中的函数调用&栈溢出攻击

时间:2024-05-30 22:12:48浏览次数:22  
标签:函数 int 深入浅出 函数调用 地址 指令 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();
    printf("%d", res);
}

image-20240530160651597

函数调用前,调用者会先把需要传递的参数保存在对应的寄存器中,然后就会调用call函数,call函数会做两件事情,第一件事情是把下一条指令的地址入栈(对应的上图22行的指令地址),第二件事情是跳转到fun1所在的位置执行;跳转过去之后,首先要开辟当前函数的栈帧,对应push rbp; mov rbp, rsp两条指令;再往后便是

我们知道,局部变量都是保存在栈上的,每个函数也有自己的栈帧,在整个函数调用的过程中,我们回顾一下栈帧的变化;

image-20240530164206034

整个函数调用过程如上图

  1. call指令先将调用者函数的下一条指令入栈,之后跳转到被调用函数执行。

  2. 被调用者函数先将调用者函数的栈帧基地址入栈。

  3. 然后开辟自己的栈帧,主要是将ebp设置为自己的栈帧基地址。

    ...执行相关的函数操作...

  4. pop rbp将ebp恢复为main函数栈帧。

  5. ret将下一条指令程序计数器PC,然后该指令出栈。(有点像pop)。

栈溢出攻击

实验环境:

image-20240530165754151

经过上面的介绍,我们会发现,栈是从高地址向低地址增长的,并且局部变量都保存在当前栈帧的基地址之下;当前栈帧的基地址之上则包含了当前函数的返回地址,那么是不是可以通过某种方式,去修改这个返回地址,来实现栈溢出攻击呢,答案是可以的;

#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");
}

CamScanner 05-30-2024 16.40_02_0

这段代码我们通过数组越界写,使用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

标签:函数,int,深入浅出,函数调用,地址,指令,CPU,调用者
From: https://www.cnblogs.com/curiositywang/p/18223331

相关文章

  • 存储器和CPU的连接与TCP的流量控制
    存储器与CPU的连接存储容量的拓展(1)位拓展:增加存储字长 (2)字拓展增加存储器字的数量     例题:设CPU有16根地址线,8根数据线,并用MREQ作为访问存储控制信号(低电平有效),WR作为读写控制信号,(高电平读,低电平写)。   现有以下存储芯片:1k*4位RAM,4K*8位RAM,8K......
  • 什么?部署ClickHouse的服务器CPU利用率100%了?
    背景  某客户现场的ClickHouse所在服务器资源占用率100%了,引发了服务器告警。观察Grafana监控面板发现,从12点左右出现了大量的碎片写入,从而引起了相关指标的快速上升。  本文主要通过ClickHouse官方的系统表system.query_log表进行问题排查定位,结合Grafana监控面板最......
  • SQLServer如何查询近3分钟最消耗CPU的SQL
    在SQLServer中,要查询近3分钟最消耗CPU的SQL语句,可以使用sys.dm_exec_query_stats动态管理视图结合sys.dm_exec_sql_text函数来获取SQL语句的文本。不过,直接查询近3分钟的数据可能需要一些额外的逻辑来筛选时间范围,因为sys.dm_exec_query_stats并不直接提供时间筛选的功能。一种......
  • CPU温度告警
    CPU温度阈值CPU温度有3档阈值(TCC\PROCHOT\ThermalTrip),HDM中的sensor是CPUDTS,如CPUDTS=0对应的是TCC告警。ThermalControlCircuit,TCC:轻微,温度控制电路PROCHOT:紧急,处理器过热ThermalTrip:极限温度,热跳闸(1)TCC不会影响CPU频率,也不会触发关机;但HDM会出现警报提示(2)如果C......
  • MySQL中如何快速定位占用CPU过高的SQL
    作为DBA工作中都会遇到过数据库服务器CPU飙升的场景,我们该如何快速定位问题?又该如何快速找到具体是哪个SQL引发的CPU异常呢?下面我们说两个方法。聊聊MySQL中如何快速定位占用CPU过高的SQL。技术人人都可以磨炼,但处理问题的思路和角度各有不同,希望这篇文章可以抛砖引玉。 以一......
  • 深入探讨Function Calling:实现外部函数调用的工作原理
    引言FunctionCalling是一个允许大型语言模型(如GPT)在生成文本的过程中调用外部函数或服务的功能。FunctionCalling允许我们以JSON格式向LLM模型描述函数,并使用模型的固有推理能力来决定在生成响应之前是否调用该函数。模型本身不执行函数,而是生成包含函数名称和执行函数......
  • DB Link导致SCN Headroom以及2012年1月的CPU或PSU补丁问题研究
    转自:https://www.cnblogs.com/dc-chen/p/7245290.htmlhttps://www.laoxiong.net/scn-ora-19706-_external_scn_rejection_threshold_hours-parameter.htmlhttps://www.modb.pro/db/4664https://www.iteye.com/blog/tianmaotalk-2437997一、基础概念1、SCN(SystemChangeNumb......
  • 阿里面试:NIO为什么会导致CPU100%?
    在Java中总共有三种IO类型:BIO(BlockingI/O,阻塞I/O)、NIO(Non-blockingI/O,非阻塞I/O)和AIO(AsynchronousI/O,异步I/O),它们的区别如下:在JDK1.4之前,只有BIO一种模式,其开发过程相对简单,新来一个连接就会创建一个新的线程处理,但随着请求并发度的提升,BIO很快遇到了性能瓶颈。......
  • Java 进程 CPU 占用过高问题排查
    1.Java进程CPU占用过高问题排查1.1.运行环境1.2.定位CPU占用高的进程1.3.定位CPU占用高的线程1.4.将线程ID转换为十六进制1.5.找到线程对应的栈信息1.5.1.使用jstack1.5.2.使用jcmd1.5.3.使用arthas1.5.4.使用jattach1.Java进程CPU......
  • 深入浅出-CAS算法原理
    1、什么是CAS?CAS:CompareandSwap,即比较再交换。jdk5增加了并发包java.util.concurrent.*,其下面的类使用CAS算法实现了区别于synchronouse同步锁的一种乐观锁。JDK5之前Java语言是靠synchronized关键字保证同步的,这是一种独占锁,也是是悲观锁。2、CAS算法理解对CAS的理......