【PWN】学习笔记(二)【栈溢出基础】

news2024/11/27 20:26:16

课程教学

课程链接:https://www.bilibili.com/video/BV1854y1y7Ro/?vd_source=7b06bd7a9dd90c45c5c9c44d12e7b4e6
课程附件: https://pan.baidu.com/s/1vRCd4bMkqnqqY1nT2uhSYw 提取码: 5rx6

C语言函数调用栈

在这里插入图片描述
一个栈帧保存的是一个函数的状态信息,父函数每调用一个子函数就会在函数调用栈中新增一个栈帧;
32 x86 esp
64 x86 rsp
在这里插入图片描述
ebp 栈底
esp 栈顶
stack frame pointer记录上一个父函数的栈顶指针的值,便于恢复父函数;
发生栈溢出的地方在local variables【上图是32位情况】
上图是32位情况,在32位传参时,子函数所用到的参数保存在父函数栈帧的末尾(并不是保存在自己的栈帧中),这里的arguments是子函数所用到的形参
父函数最末尾的字长保存父函数自己栈顶的值,如上面红色的箭头指向previous stack frame pointer,同理父函数的父函数也是一样的
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

父函数(main)先把所要调用的子函数(sum)中的参数(1,2)逆序压栈(压入自己的栈帧),此后压入return address【即子函数下一条指令的地址(return 0 的地址)】,在子函数执行后回到下一条指令的地址(执行return 0);在子函数结束后要返回父函数的栈帧,这意味在调用子函数时不能把父函数的栈帧丢弃,由此需要加入父函数的栈底指针加入
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
丢弃某块数据不用,并不需要把这块数据抹除,只需要标记成不是我所使用的范围即可;这也是磁盘数据恢复的原理,除非有新来的数据复写
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
主调函数 caller
被调函数 callee
在这里插入图片描述
遵循C语言函数调用规范,一般在开头用push ebp以及mov ebp, esp,需要保存父函数栈底的状态;结束会执行leave(恢复父函数的栈底)以及 ret(返回到父函数的下一条指令)

首先,主调函数也是有自己的父函数,将它的父函数的ebp压入
在这里插入图片描述
接着把esp抬高到和ebp相同的位置
在这里插入图片描述
下一条指令为新的栈帧开辟局部变量的空间;这里是sub 0x10 , esp,即esp-16;为什么是减去?因为栈是反向增长(高到低)

将被调函数所用到的参数(1,2,3)反向压入栈,即先压入3,再压入2,最后压入1;
在这里插入图片描述
call 这条指令不等于jump,jump是一个跳转指令;call 不仅会将eip移动到目标代码的位置,还会在栈中自动保存下一条指令的地址【此时的return address就是23的位置】
在这里插入图片描述
此时进入被调函数,同理首先是push ebp和mov sep , ebp;先把主调函数的栈帧保存;注意此时父函数的ebp重新增加到栈里了,将esp的值赋给ebp;让ebp抬高到新的栈帧的栈顶
在这里插入图片描述
执行实际操作,最后的运算结果保存在eax的寄存器中【默认情况下保存函数的返回值】
在这里插入图片描述
由于esp并没有开辟局部变量的空间;为什么不是leave?leave就是 mov ebp,esp再pop ebp,这里只有pop ebp是因为子函数没有任何局部变量,所以ebp在调用返回时已经在相应的位置了;pop这条指令总是把esp当前指向的位置,对应的一个字长的数据抬入到目标位置;所以pop ebp就会把esp向上抬一个字长,把esp本来指向父函数的值抬入ebp中;
在这里插入图片描述
ret 相当于pop eip,eip回到父函数的位置

在这里插入图片描述
主调函数情况其局部变量以及被调函数的相关参数
在这里插入图片描述
使用add这条指令清空数据;最后保存结果到eax中
在这里插入图片描述
值得注意的是,此时返回时esp和ebp并不在相同位置,所以需要leave,首先将esp的值变成ebp
在这里插入图片描述
返回父函数的父函数
在这里插入图片描述
以上过程需要非常熟练;栈还有很多其他工作的规则,以上是最基本的

ret2text

在这里插入图片描述
关注eip寄存器,其中return address存在eip中;当eip中写入我们目标代码的地址,程序的控制流便被劫持了
在这里插入图片描述
栈溢出是缓冲区溢出的一种
在这里插入图片描述
在这里插入图片描述
向局部变量(str[8])中写入24字节数据,溢出到了关键结构
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
当我们拿到一个CTF PWN的题先通过checksec 看这个程序有什么保护措施
【x86架构小端序的可执行ELF】
在这里插入图片描述
通过IDA看c语言代码
在这里插入图片描述
显然漏洞明显,读入的数据长度不受限向上溢出
值得注意的是,此时虽然开辟了8字节,但是与ebp的距离是16字节(10h)
最好的方法还是动态调试,因为出题人可能以esp来寻址
在这里插入图片描述
通过gdb动态调试,直接run是没什么意义的,先打断点,例如b main【b 表示 break】,再r【r 表示run】;此时我们可以看到具体的信息
在这里插入图片描述
在程序执行到绿色箭头位置时,所有寄存器的值;
eip此时main函数偏移26字节的指令,当前指针也是0x804856b
esp和ebp此时对应的值是一个很大的值,这是栈的地址(用户空间的最高地址)
在这里插入图片描述
这是反汇编窗口
在这里插入图片描述
最上面的00:0000是栈顶(低地址),最下面的07:001c是栈底(高地址);gdb是反着显示的
在这里插入图片描述
函数调用栈的关系
在这里插入图片描述
按n一直步过到漏洞位置
在这里插入图片描述
按s步进入这个函数
在这里插入图片描述
按n开始输入,按照正常输入8个A看什么情况
在这里插入图片描述
这里我们看栈里面的情况,输入stack 看多少项(24项栈值)
esp和ebp之间就是当前执行的函数的栈帧,esp表示栈顶,ebp是栈底
ebp是前一个函数被保存在栈里的ebp的值,ebp再往高一个字长就是返回地址,我们的目标就是攻击这个返回地址
我们此时可控制的区域是esp和ebp之间的位置,即buffer这个变量
在这里插入图片描述
这意味着只要我们一直写,覆盖返回地址即可达到攻击效果
在这里插入图片描述
回到IDA我们可找到这个后门函数,执行系统命令,直接获得shell的控制权,相当于在shell中打开shell
这意味着我们先写20个字节A(ebp还有4个字节),再写4个字节制定的地址就会把原本的地址覆盖掉
在这里插入图片描述
我们要找到getshell的开始地址,通过双击IDA中getshell在汇编代码中找到起始地址8048522
在这里插入图片描述
我们这里就可以写脚本来获得shell了,值得注意的是payload中不能直接加0x8048522【前面是字符串这里是整型】,所以需要p32来转换
最终发送payload并且与之交互io.interactive(),即可获得shell
打远程只要用remote即可

但是实际情况下不一定有后门函数
在这里插入图片描述
一般系统调用这样的代码需要我们自己输入
在这里插入图片描述
只要不是代码的地方都不可执行
在这里插入图片描述
随机化栈中的地址
在这里插入图片描述
所以放在Bss中居多,Bss用于存放全局变量的,如果这个全局变量是开辟缓存区可以输入系统调用即可
在这里插入图片描述
比如上面这个情况
在这里插入图片描述
利用工具直接生成shellcode的机械码,再io.send直接发送

PWN工具

在这里插入图片描述
IDA pro
f5 进入c程序
esc 返回上一个程序
在这里插入图片描述
白色的函数为已写死的函数
粉色的函数要用的时候再去调
在这里插入图片描述
在Options的General中可调整一些设置,例如加入机械码
在这里插入图片描述
在这里插入图片描述
这样C语言代码被拷贝到汇编代码中
在这里插入图片描述
shift+f12 或者 shift+fn+f12打开一个字符串界面【在不知道mian函数位置,可通过程序所表示的字符串找程序的主函数】
在这里插入图片描述
在这里插入图片描述
\r把之前的文本在显示时清空,io.recv()把所有的数据完全还原【这里我用的时io.recvline()一行一行接收】
这里的ZmxhZ3tuMHRfZjRzdGVyX3Q2YW5feTB1fQo=显然是Base64,我们需要解码

在这里插入图片描述
将其解码

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

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

相关文章

java--Date、SimpleDateFormat时间类,JDK8之前的

1.Date 代表的是日期和时间 2.SimpleDateFormat 代表简单日期格式化,可以用来把日期对象、时间毫秒值格式化成我们想要的形式。 3.时间格式常见符号 4.SimpleDateFormat解析字符串时间成为日期对象

专业mac投屏软件AirServer v7.2.7 mac中文版

专业mac投屏软件AirServer v7.2.7 mac中文版是一款好用的投屏工具,它可以将您的Mac变成通用镜像接收器,允许您使用内置的AirPlay或基于Google Cast的屏幕投影功能镜像设备的显示器。您可以通过任何AirPlay或Google Cast兼容设备镜像或投射屏幕&#xff0…

C语言精选——选择题Day42

第一题 1. 下面程序输出的结果是&#xff08;&#xff09; #include <stdio.h> int main () {int x;x printf("I See, Sea in C");printf("x%d" , x); } A&#xff1a;2 B&#xff1a;随机值 C&#xff1a;都不是 D&#xff1a;15 答案及解析 D p…

LabVIEW开发新型电化学性能测试设备

LabVIEW开发新型电化学性能测试设备 开发了一种基于Arduino和LabVIEW的新型电化学性能测试装置&#xff0c;专门用于实验电池&#xff0c;特别是在锂硫&#xff08;Li-S&#xff09;技术领域的评估。这种装置结合了简单、灵活的硬件和软件工具&#xff0c;使新科学家能够设计针…

DiffiT

本文首发于AIWalker&#xff0c;欢迎关注。 https://arxiv.org/abs/2312.02139 https://github.com/NVlabs/DiffiT 扩散模型以其强大的表达能力和高样本质量在许多领域得到了新的应用。对于样本生成&#xff0c;这些模型依赖于通过迭代去噪生成图像的去噪神经网络。然而&#x…

每天五分钟计算机视觉:使用1*1卷积层来改变输入层的通道数量

本文重点 在卷积神经网络中有很多重要的卷积核&#xff0c;比如1*1的卷积核&#xff0c;3*3的卷积核&#xff0c;本文将讲解1*1的卷积核的使用&#xff0c;它在卷积神经网络中具有重要的地位。由于1*1的卷积核使用了最小的窗口&#xff0c;那么1*1的卷积核就失去了卷积层可以识…

Redis 持久化 —— 超详细操作演示!

四、Redis 持久化 四、Redis 持久化4.1 持久化基本原理4.2 RDB持久化4.3 AOF持久化4.4 RDB与AOF对比4.5 持久化技术转型 五、Redis 主从集群六、Redis 分布式系统七、Redis 缓存八、Lua脚本详解九、分布式锁 数据库系列文章&#xff1a; 关系型数据库: MySQL —— 基础语法大全…

leetcode 100.相同的树

涉及到递归&#xff0c;最好多画图理解&#xff0c;希望对你们有帮助 100.相同的树 题目 给你两棵二叉树的根节点 p 和 q &#xff0c;编写一个函数来检验这两棵树是否相同。 如果两个树在结构上相同&#xff0c;并且节点具有相同的值&#xff0c;则认为它们是相同的。 题目链接…

2023-12-05 Qt学习总结6

点击 <C 语言编程核心突破> 快速C语言入门 Qt学习总结 前言十八 QMessageBox消息对话框十九 Qt布局管理总结 前言 要解决问题: 学习qt最核心知识, 多一个都不学. 十八 QMessageBox消息对话框 QMessageBox消息对话框是Qt中的一个提供用户交互界面的对话框窗口。 它通常…

perl处理base64、md5、SHA-1、SHA-256的计算

使用perl可以进行base64、md5、SHA-1、SHA-256的计算&#xff0c;使用也非常方便&#xff0c;下面是示例代码&#xff1a; #! /usr/bin/perl use v5.14; use MIME::Base64; use Digest;my $test_str hello world;# 测试base64 say encode_base64($test_str);# 测试md5 my $md…

kafka入门(四):消费者

消费者 (Consumer ) 消费者 订阅 Kafka 中的主题 (Topic) &#xff0c;并 拉取消息。 消费者群组&#xff08; Consumer Group&#xff09; 每一个消费者都有一个对应的 消费者群组。 一个群组里的消费者订阅的是同一个主题&#xff0c;每个消费者接收主题的一部分分区的消息…

STM32-TIM定时器输出比较

目录 一、输出比较简介 二、PWM简介 三、输出比较通道&#xff08;通用&#xff09; 四、输出比较通道&#xff08;高级&#xff09; 五、输出比较模式 六、PWM基本结构 七、PWM参数计算 八、外设介绍 8.1 舵机 8.2 直流电机及驱动 九、开发步骤 十、输出比较库函数…

TCP数据粘包的处理

TCP数据粘包的处理 背锅侠TCP解决方案2.1 发送端2.2 接收端 背锅侠TCP 在前面介绍套接字通信的时候说到了TCP是传输层协议&#xff0c;它是一个面向连接的、安全的、流式传输协议。因为数据的传输是基于流的所以发送端和接收端每次处理的数据的量&#xff0c;处理数据的频率可…

springboot084基于springboot的论坛网站

springboot084基于springboot的论坛网站 源码获取&#xff1a; https://docs.qq.com/doc/DUXdsVlhIdVlsemdX

[香橙派]orange pi zero 3 烧录Ubuntu系统镜像——无需HDMI数据线安装

一、前言 本文我们将介绍如何使用orange pi zero 3 安装Ubuntu系统&#xff0c;本文相关步骤均参考自开发手册。 二、实施准备 根据开发手册中所提到的&#xff0c;我们应该拥有如下配件: 1.orange pi zero 3 开发板 2.TF 卡——最小 8GB 容量的 class10 级或以上的高速闪迪卡。…

十大排序算法讲解

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab&#xff0c;机器人运动控制、多机器人协作&#xff0c;智能优化算法&#xff0c;滤波估计、多传感器信息融合&#xff0c;机器学习&#xff0c;人工智能等相关领域的知识和技术。关…

ActiveMQ任意文件写入漏洞(CVE-2016-3088)

简述&#xff1a;ActiveMQ的fileserver支持写入文件(但是不支持解析jsp),同时也支持移动文件。所以我们只需要先上传到服务器&#xff0c;然后再移动到可以解析的地方即可造成任意文件写入漏洞。我们可以利用这个漏洞来上传webshell或者上传定时任务文件。 漏洞复现 启动环境 …

一个例子带你入门影刀编码版(一)

文章结构 摘要需求分析伪代码编写代码实现完整代码相关链接 摘要 将通过一个电商业务场景下的真实需求&#xff0c;带领大家零基础入门影刀编码版&#xff0c;本系列将会分三步讲解&#xff0c;从接到需求到最后完成发版&#xff0c;整个过程中我们需要做些什么&#xff1f;带…

网页设计中增强现实的兴起

目录 了解增强现实 增强现实的历史背景 AR 和网页设计的交叉点 AR 在网页设计中的优势 增强参与度和互动性 个性化的用户体验 竞争优势和品牌差异化 AR 在网页设计中的用例 结论 近年来&#xff0c;增强现实已成为一股变革力量&#xff0c;重塑了我们与数字领域互动的方式。它被…

2023北京智慧城市与电气高峰论坛-安科瑞 蒋静

2023年7月27日&#xff0c;北京土木建筑学会电气设计委员会、北京电气设计技术协作及情报交流网联合举办的“北京电气设计第43届年会”在京盛大召开。安科瑞作为企业微电网能效管理平台服务商与广大同仁共聚本次盛会&#xff0c;尽享技术盛宴。 本次会议采用线上线下相结合&…