协程4 --- 一个特殊的栈溢出例子

文章目录

  • 代码
  • 运行结果
  • 分析

代码

先看下面这个程序流程:

有个长度位24的字符数组buffer,前面16个字符初始化。
attack函数的地址复制到后面8个字符(编译成64位程序,指针大小为8Byte)。
打印信息:do Something
调用doSomething,函数内调用了copy函数拷贝到temp变量中,但是注意temp变量长度只有16。
打印信息:do next

提问:do next会打印出来吗

#include <stdio.h>
#include <stdlib.h>#define BUFFER_LEN 24void attack()
{printf("Hello. I will close your program.\n");exit(1);
}void copy(char* src, char* dest, int n)
{for (int i = 0; i < n; ++i){dest[i] = src[i];}
}void doSomething(char* str, int n)
{// 字符串拷贝char temp[16];copy(str, temp, n);
}int main()
{char buffer[BUFFER_LEN] ={'w', 'o', 'l', 'd','a', 'b', 'a', 'b', 'a', 'b','a', 'b', 'a', 'b', 'a', 'b'};// 将函数注册到字符串最后八个字节int n = BUFFER_LEN - 8;for (int i = 0; i < 8; ++i){buffer[n+i] = (char)((((long)(&attack)) >> (i*8)) & 0xff);}printf("do Something\n");// 运行程序doSomething(buffer, BUFFER_LEN);// 继续往下执行printf("do next\n");return 0;
}

运行结果

注意这边用了-O1优化,-fno-stack-protector禁用堆栈保护。
在这里插入图片描述

分析

分析之前先普及一下几点知识

三个寄存器:
rip指向要运行的代码
rbp指向栈底
rsp指向栈顶

程序运行时候的内存分布(当然这个大概是Linux 0.11的,现在的不长这样,不过大体是类似的):
在这里插入图片描述

这边注意一下栈是往下生长的

objdump -d stackattack 看一下汇编

gcc -O1 -o stackattack stackattack.c -g -fno-stack-protector
objdump -d stackattack000000000040117f <main>:40117f:       48 83 ec 28             sub    $0x28,%rsp // 栈中开辟临时变量空间401183:       48 c7 44 24 10 00 00    movq   $0x0,0x10(%rsp)40118a:       00 00 40118c:       c6 04 24 77             movb   $0x77,(%rsp)401190:       c6 44 24 01 6f          movb   $0x6f,0x1(%rsp)401195:       c6 44 24 02 6c          movb   $0x6c,0x2(%rsp)40119a:       c6 44 24 03 64          movb   $0x64,0x3(%rsp)40119f:       c6 44 24 04 61          movb   $0x61,0x4(%rsp)4011a4:       c6 44 24 05 62          movb   $0x62,0x5(%rsp)4011a9:       c6 44 24 06 61          movb   $0x61,0x6(%rsp)4011ae:       c6 44 24 07 62          movb   $0x62,0x7(%rsp)4011b3:       c6 44 24 08 61          movb   $0x61,0x8(%rsp)4011b8:       c6 44 24 09 62          movb   $0x62,0x9(%rsp)4011bd:       c6 44 24 0a 61          movb   $0x61,0xa(%rsp)4011c2:       c6 44 24 0b 62          movb   $0x62,0xb(%rsp)4011c7:       c6 44 24 0c 61          movb   $0x61,0xc(%rsp)4011cc:       c6 44 24 0d 62          movb   $0x62,0xd(%rsp)4011d1:       c6 44 24 0e 61          movb   $0x61,0xe(%rsp)4011d6:       c6 44 24 0f 62          movb   $0x62,0xf(%rsp) // 赋值4011db:       b8 00 00 00 00          mov    $0x0,%eax4011e0:       be 32 11 40 00          mov    $0x401132,%esi // attack函数地址4011e5:       8d 0c c5 00 00 00 00    lea    0x0(,%rax,8),%ecx // i*84011ec:       48 89 f2                mov    %rsi,%rdx4011ef:       48 d3 fa                sar    %cl,%rdx // 算数右移4011f2:       88 54 04 10             mov    %dl,0x10(%rsp,%rax,1) // dl就是rdx & 0xff 写入目标字符串4011f6:       48 83 c0 01             add    $0x1,%rax // ++i4011fa:       48 83 f8 08             cmp    $0x8,%rax4011fe:       75 e5                   jne    4011e5 <main+0x66>401200:       bf 30 20 40 00          mov    $0x402030,%edi401205:       e8 26 fe ff ff          callq  401030 <puts@plt> // printf40120a:       be 18 00 00 00          mov    $0x18,%esi // 参数n40120f:       48 89 e7                mov    %rsp,%rdi // 参数str401212:       e8 55 ff ff ff          callq  40116c <doSomething> // 调用doSomething401217:       bf 3d 20 40 00          mov    $0x40203d,%edi40121c:       e8 0f fe ff ff          callq  401030 <puts@plt>  // printf401221:       b8 00 00 00 00          mov    $0x0,%eax401226:       48 83 c4 28             add    $0x28,%rsp40122a:       c3                      retq   40122b:       0f 1f 44 00 00          nopl   0x0(%rax,%rax,1)000000000040116c <doSomething>:40116c:       48 83 ec 10             sub    $0x10,%rsp // 栈中开辟临时变量空间401170:       89 f2                   mov    %esi,%edx // 参数 n401172:       48 89 e6                mov    %rsp,%rsi // desc401175:       e8 d0 ff ff ff          callq  40114a <copy> // 调用copy40117a:       48 83 c4 10             add    $0x10,%rsp40117e:       c3                      retq000000000040114a <copy>:40114a:       85 d2                   test   %edx,%edx40114c:       7e 1d                   jle    40116b <copy+0x21> // 如果参数n是0 直接返回40114e:       8d 4a ff                lea    -0x1(%rdx),%ecx // 参数n-1 因为从0开始循环401151:       b8 00 00 00 00          mov    $0x0,%eax // i = 0401156:       eb 03                   jmp    40115b <copy+0x11>401158:       48 89 d0                mov    %rdx,%rax40115b:       0f b6 14 07             movzbl (%rdi,%rax,1),%edx // src[n] -> 寄存器40115f:       88 14 06                mov    %dl,(%rsi,%rax,1) // 寄存器 -> desc[n]401162:       48 8d 50 01             lea    0x1(%rax),%rdx // ++i401166:       48 39 c8                cmp    %rcx,%rax401169:       75 ed                   jne    401158 <copy+0xe>40116b:       c3                      retq
  • -fno-stack-protector:禁用堆栈保护
  • 如果不优化用O0,不仅会push rip还会push rbp
  • 第一行sub $0x28,%rsp 在栈中开辟临时变量空间,其中0x28中是 (字符串长度24,16字节对齐到0x20) + (printf的0x8)
  • printf会在第一次调用的时候用malloc申请缓冲区,malloc会在分配的地址前预留2*sizeof(size_t)的空间维护malloc_chunk信息 。

如果看不懂汇编的可以看这个堆栈变换的示意图:
在这里插入图片描述
一开始attack函数的地址被放在buffer数组后8位,调用了doSomething后压栈了riptemp数组变量,结果字符串copybuffer数组比temp数组长的后8位也被拷贝过去了,由于关闭了栈保护,把原来的rip覆盖了。doSomething函数结束后就调用到attack函数了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/885083.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

C++用string实现字符串相加

. - 力扣&#xff08;LeetCode&#xff09; -》》》》》题目链接 实现思路&#xff1a;计算数字符串长度并用数组的方式计算出字符位置&#xff0c;用字符的ask码‘0’计算出字符本身。 class Solution { public:string addStrings(string num1, string num2) {string str;int…

03 Oracle进程秘籍:深度解析Oracle后台进程体系

文章目录 Oracle进程秘籍&#xff1a;深度解析Oracle后台进程体系一、Oracle后台进程概览1.1 DBWn&#xff08;Database Writer Process&#xff09;1.2 LGWR&#xff08;Log Writer Process&#xff09;1.3 SMON&#xff08;System Monitor Process&#xff09;1.4 PMON&#…

【大数据学习 | kafka高级部分】文件清除原理

2. 两种文件清除策略 kafka数据并不是为了做大量存储使用的&#xff0c;主要的功能是在流式计算中进行数据的流转&#xff0c;所以kafka中的数据并不做长期存储&#xff0c;默认存储时间为7天 那么问题来了&#xff0c;kafka中的数据是如何进行删除的呢&#xff1f; 在Kafka…

浏览器存储策略解析(三)Local/sessionStorage实战:如何查看本地浏览器上数据

物理意义上的localStorage/sessionStorage在哪里 我们都知道&#xff0c;localStorage存于本地&#xff0c;sessionStorage存于会话&#xff0c;这是见名知意可以得到的。但是在物理层面他们究竟存储在哪里呢&#xff1f; localStorage和sessionStorage一样&#xff0c;是存储…

设计模式讲解02—责任链模式(Chain)

1. 概述 定义&#xff1a;责任链模式是一种行为型模式&#xff0c;在这个模式中&#xff0c;通常创建了一个接收者对象的链来处理请求&#xff0c;该请求沿着链的顺序传递。直到有对象处理该请求为止&#xff0c;从而达到解耦请求发送者和请求处理者的目的。 解释&#xff1a;责…

判断二叉搜索树(递归)

给你一个二叉树的根节点 root &#xff0c;判断其是否是一个有效的二叉搜索树。binary search tree (BST) 有效 二叉搜索树定义如下&#xff1a; 节点的左子树只包含 小于 当前节点的数。节点的右子树只包含 大于 当前节点的数。所有左子树和右子树自身必须也是二叉搜索树。 …

私有化视频平台EasyCVR海康大华宇视视频平台视频诊断技术是如何实时监测视频质量的?

在现代视频监控系统中&#xff0c;确保视频流的质量和稳定性至关重要。随着技术的进步&#xff0c;视频诊断技术已经成为实时监测视频质量的关键工具。这种技术通过智能分析算法对视频流进行实时评估和处理&#xff0c;能够自动识别视频中的各种质量问题&#xff0c;并给出相应…

大语言模型(LLM)量化基础知识(一)

请大家关注我的知乎博客&#xff1a;- 派神 - - 知乎 随着大型语言模型 (LLM) 的参数数量的增长,与其支持硬件&#xff08;加速器内存&#xff09;增长速度之间的差距越来越大&#xff0c;如下图所示&#xff1a; 上图显示&#xff0c;从 2017 年到 2022 年&#xff0c;语言模…

【comfyui教程】ComfyUI 现已支持 Stable Diffusion 3.5 Medium!人人都能轻松上手的图像生成利器

前言 ComfyUI 现已支持 Stable Diffusion 3.5 Medium&#xff01;人人都能轻松上手的图像生成利器 大家翘首以盼的Stable Diffusion 3.5 Medium模型终于来了&#xff01;就在今天&#xff0c;Stability AI 正式推出了这款“亲民版”平衡模型&#xff0c;让创作者们得以在消费…

大模型微调技术 --> LoRA 系列之 AdaLoRA

AdaLoRA 1.摘要 之前的微调方法(如低秩更新)通常将增量更新的预算均匀地分布在所有预训练的权重矩阵上&#xff0c;并且忽略了不同权重参数的不同重要性。结果&#xff0c;微调结果不是最优的。 为了弥补这一差距&#xff0c;我们提出了AdaLoRA&#xff0c;它根据权重矩阵的…

带你搞懂红黑树的插入和删除

文章目录 1. 红黑树1.1 红黑树的概念1.2 红黑树的性质1.3 红黑树节点的定义1.4 红黑树的插入找到插入的位置调节平衡 1.5 红黑树的删除删除节点平衡调整 1.6 红黑树和AVL树的比较 1. 红黑树 1.1 红黑树的概念 红黑树也是一种二叉搜索树,但是在每一个节点上增加了一个存储位表…

揭秘全向轮运动学:机动艺术与上下位机通信的智慧桥梁

✨✨ Rqtz 个人主页 : 点击✨✨ &#x1f308;Qt系列专栏:点击 &#x1f388;Qt智能车上位机专栏: 点击&#x1f388; 本篇文章介绍的是有关于全向轮运动学分析&#xff0c;单片机与上位机通信C代码以及ROS里程计解算的内容。 目录 大纲 ROS&#xff08;机器人操作系统&…

移远通信推出八款天线新品,覆盖5G、4G、Wi-Fi和LoRa领域

近日&#xff0c;全球领先的物联网整体解决方案供应商移远通信宣布&#xff0c;再次推出八款高性能天线新品&#xff0c;进一步丰富其天线产品阵容&#xff0c;更好地满足全球客户对高品质天线的更多需求。具体包括5G超宽带天线YECT005W1A和YECT004W1A、5G天线YECT028W1A、4G天…

【设计模式系列】桥接模式(十三)

一、什么是桥接模式 桥接模式&#xff08;Bridge Pattern&#xff09;是一种结构型设计模式&#xff0c;其核心目的是将抽象部分与实现部分分离&#xff0c;使它们可以独立地变化。这种模式主要用于处理那些在设计时无法确定实现细节的场合&#xff0c;或者需要在多个实现之间…

Java多态和继承(下篇)

今天接着学习多态和继承 目录 1 继承1.1 再谈初始化1.2 protect关键字1.3 继承方式1.4 final 关键字1.5 组合 2 多态2.1 多态的概念2.2 多态实现条件2.3 重写2.4 向上转型和向下转型2.4.1 向上转型2.4.2 向下转型 2.5 多态的优缺点2.6 避免在构造方法中使用重写的方法 总结 1 继…

动态规划理论基础和习题【力扣】【算法学习day.25】

前言 ###我做这类文档一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;&#xff09;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关键点&#xff0c;力扣上的大佬们的题解质量是非常非常高滴&am…

数据结构之顺序表(C语言)

1 线性表 线性表是n个具有相同特性的数据元素的有限序列&#xff0c;是一种在实际中广泛应用的数据结构&#xff0c;常见的线性表有&#xff1a;顺序表、链表、栈、队列、字符串等。 线性表在逻辑上是线性结构&#xff0c;也就说是连续的一条直线。但是在物理结构上并不一定是…

Qt——窗口

一.窗口概述 Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow是一个为用户提供主窗口程序的类&#xff0c;继承QWidget类&#xff0c;并且提供一个预定义的布局。包含一个菜单栏&#xff08;menu bar&#xff09;&#xff0c;多个工具栏&#xff08;tool bars&#xff0…

长亭那个检测能力超强的 WAF,出免费版啦

告诉你们一个震撼人心的消息&#xff0c;那个检测能力超强的 WAF——长亭雷池&#xff0c;他推出免费社区版啦&#xff0c;体验地址见文末。 八年前我刚从学校毕业&#xff0c;在腾讯做安全研究&#xff0c;看到宇森在 BlackHat 上演讲的议题 《永别了&#xff0c;SQL 注入》 …

漏洞分析 | Spring Framework路径遍历漏洞(CVE-2024-38816)

漏洞概述 VMware Spring Framework是美国威睿&#xff08;VMware&#xff09;公司的一套开源的Java、JavaEE应用程序框架。该框架可帮助开发人员构建高质量的应用。 近期&#xff0c;网宿安全演武实验室监测到Spring Framework在特定条件下&#xff0c;存在目录遍历漏洞&…