当前位置: 首页 > news >正文

20251905 2025-2026-2 《网络攻防实践》实验九

20251905 2025-2026-2 《网络攻防实践》实验九

1.实践内容

学习内容

二进制文件修改

二进制文件修改是指在不重新编译源代码的情况下,直接对可执行文件中的机器指令或数据进行修改。程序在运行时会按照二进制指令的顺序执行,函数调用、条件跳转、返回地址等内容都会影响控制流。因此,只要准确找到关键指令的位置,就可以通过修改调用目标、跳转条件或立即数等方式改变程序行为。常用工具如 IDA、OllyDbg、010 Editor 等都可以辅助定位和修改二进制代码。

栈溢出漏洞原理

栈溢出是一类典型的内存破坏漏洞,通常发生在程序向栈上的局部缓冲区写入数据时没有检查长度。函数调用时,栈中会保存局部变量、保存的栈基址以及函数返回地址等信息;当输入数据超过缓冲区大小后,就可能继续覆盖这些关键栈数据。如果攻击者能够精确控制覆盖内容,就可以把返回地址改成指定函数地址或恶意代码地址,从而在函数返回时劫持程序控制流。

Shellcode 构造与执行

Shellcode 是一段可以直接被处理器执行的机器码,常用于漏洞利用后执行特定功能,例如启动 Shell、建立反向连接或执行系统命令。构造 shellcode 时需要考虑目标系统架构、系统调用号、寄存器传参方式、坏字符限制以及代码存放位置等因素。在栈溢出利用中,攻击者通常会把 shellcode 放入输入数据中,再将返回地址覆盖为 shellcode 所在的内存地址,使程序跳转到该位置执行自定义指令。

实践内容

本次实践共完成三个任务:第一,直接修改二进制文件中的函数调用指令,使程序运行后调用 getShell;第二,分析 pwn1 程序中的 gets() 栈溢出漏洞,使用 pwntools 构造 payload 覆盖返回地址并调用 getShell;第三,通过 gdb 定位输入数据在栈中的位置,构造包含 shellcode 的攻击字符串,使程序执行栈中的自定义代码。

2.实验过程

实验一:对二进制文件直接作出修改,调用getShell函数

首先打开ida,对pwn1文件进行反汇编分析。

首先看到main函数,其调用了foo函数

image-20260520165651077

而我们的目标即需要被调用的getshell函数在如图中的位置,0x804847D,分析可知其作用是打开shell

image-20260520165930606

既然需要修改二进制代码,直接在IDA中改就可以。选中call foo一行代码

image-20260520165651077在菜单栏选择Edit ->Patch Program -> Assemble

image-20260520170013408

修改call foo为call getShell

image-20260520170048117

随手Apply patches to input file

image-20260520170433972

可以看到修改已经成功

image-20260520170055438

随后在虚拟机中尝试运行,可以看到直接得到了shell,也就是能够执行原程序中的getShell函数

image-20260523131248473

实验二:pwn分析

重新分析pwn1函数。首先是main函数,其调用了一个名为foo的函数,跟进该函数去分析内部执行逻辑。

image-20260525122804105

可以看到foo函数中执行了具体的读取字符串的操作,其并未有做输入长度检查的操作,而是采用了不安全的gets()函数,因此可以在这里构造缓冲区溢出。

image-20260525123358703

程序调用函数的过程为:先将下一条指令的地址压栈(即返回地址),然后保存程序断点(push ebp之类),随后调用函数功能读取字符串。字符串的内容会保存到栈中,因此过长的字符串会覆盖原本申领的栈空间,进而破坏原本程序的栈结构。我们只需要保证最终能将原有的返回地址精确的覆盖为getShell的地址即可。

在IDA中可以看到getShell的地址是0x804847D。

image-20260525123422573

所以攻击字符串应为【28个任意字符】+【4字节任意字符,用于覆盖断点栈基址,这里取0用于截断前面的字符串】+【目标返回地址,这里应该是0804847d的16进制,并且是小端序。】

使用pwntools编写python攻击脚本,可以看到也是获取了shell,成功通过栈溢出执行了原本不应该执行的函数。

image-20260525131754766

实验三:shellcode构造分析

首先关闭一下地址随机化

sudo su -echo 0 > /proc/sys/kernel/randomize_va_space

打开pwn1程序的同时打开gdb

ps -ef|grew pwn查看所有带有pwn关键字的进程,记住刚刚pwn1程序的进程号

image-20260525140234841

在gdb内部arrach "进程号"来以附加形式调试进程

image-20260525140310414

首先在foo函数的入口设一个断点b *0x8048491

image-20260525140631139

好像不太好使,程序没中断

image-20260525140944075

那在最后foo函数的返回位置设一个断点b *0x80484AE

image-20260525140930022

这回成功断下来了。我们如果要执行任意的代码,代码必须要在我们输入的字符串中,而字符串是保存在栈里的。而我们需要覆盖原来的返回地址为我们自己的代码所在的地址,因此我们需要找到字符串存储在哪里。

image-20260525141324853

image-20260525141355702

根据之前的攻击字符串:【28个任意字符】+【4字节任意字符】+【4字节目标返回地址】,而攻击字符串第三部分存储的位置在0xffffcf7c。

于是我们可以构建新的payload:【28个任意字符】+【4字节任意字符】+【4字节目标返回地址】+【shellcode】,只需要第三部分的内容指向第四部分即可,即0xffffcf7c+0x4=0xffffcf80,如此便可以让目标程序执行存储在栈中的shellcode代码。

image-20260525144059328

由于不同运行环境下栈基址可能不一样,因此在最终进行攻击的环境中使用gdb调试,最终的返回地址应该是0xffffcf00

先不手写shellcode,用pwntools生成一个,可以看到攻击可以成功。

image-20260525150115486

用网上找的汇编代码翻译成机器码再输入,也是可以成功的。图中标白的部分即修改后的函数返回地址(小端)

image-20260525152013186

3.学习中遇到的问题及解决

  • 问题一:文件传到虚拟机后后无法执行

  • 解决方案:使用 chmod +x 文件名 赋予权限

4.实验总结

本次实验围绕二进制漏洞利用的基本流程展开,从直接修改程序指令,到利用栈溢出改变返回地址,再到构造 shellcode 执行自定义代码,逐步加深了我对程序控制流劫持的理解。在第一个实验中,通过 IDA 修改 call foocall getShell,可以很直观地看到二进制指令决定程序执行路径;这也说明在逆向分析中,函数调用关系和关键函数地址是非常重要的分析对象。

在后两个实验中,gets() 函数没有进行长度检查导致了典型的栈溢出漏洞。通过分析栈结构,可以知道输入数据会依次覆盖缓冲区、保存的栈基址和返回地址,因此只要控制好填充长度和地址的小端序表示,就能让程序返回到指定位置。进一步使用 gdb 定位栈中输入字符串的位置后,还可以让程序跳转到 shellcode,实现比调用已有函数更灵活的利用方式。

这次实践让我认识到,漏洞利用并不是简单地输入一串超长字符串,而是需要结合反汇编分析、栈布局判断、调试验证和 payload 构造来完成。对应到防御角度,应避免使用 gets() 这类危险函数,并开启地址随机化、栈不可执行、栈保护等安全机制,从源代码和运行环境两方面降低栈溢出漏洞被利用的风险。

http://www.jsqmd.com/news/923877/

相关文章:

  • HackMyVM-Quick3
  • 3步掌握消息留存神器:RevokeMsgPatcher深度解析与实战指南
  • novel-downloader:终极跨站点小说下载器深度实战指南
  • 终极实战指南:如何用Arduino-IRremote库解决15种红外遥控协议兼容性问题
  • 论文写作高效落地:百考通AI全流程辅助功能实战解析
  • 免费开源AMD锐龙调试工具SMUDebugTool:释放处理器潜能的终极指南
  • 2026年2月衢州黄金回收实录:今日金价677元,警惕高价引流陷阱 - 黄金回收
  • 别再只调包了!用ResNet18/50在CIFAR-10上跑出第一个模型(环境配置+训练技巧避坑)
  • 盐城黄金回收实体店全解析:资质、鉴定、报价与上门服务 - 黄金回收
  • ROS2多机通讯实战:当WiFi局域网遇上虚拟机,如何用集中式发现协议绕过UDP组播限制?
  • 2026年4月质量好的焊管供应商推荐,对焊法兰/不锈钢无缝管/弯头/耐蚀合金无缝管/不锈钢法兰,焊管供货商哪家靠谱 - 品牌推荐师
  • 基于Arduino与超声波传感器的手势识别游戏机设计与实现
  • 电路设计从实验室到生活:创客实践与多元应用场景解析
  • 为什么Windows 10用户需要这个3步搞定OneDrive的卸载神器?
  • 绍兴金价高位变现攻略:上门回收实测6家机构,实时金价1300元/克 - 黄金回收
  • 告别调参炼丹!看VOYAGER如何用‘提示工程’在《我的世界》里从砍树到挖矿
  • SpringBoot整合Milvus向量数据库
  • 成都H型钢今日价格、价格行情、盛世钢联最新报价(2025年09月31日) - 四川盛世钢联营销中心
  • 从平面点云到清晰轮廓:结合RANSAC与AC方法,搞定复杂场景下的轮廓提取
  • 重磅上新:靠谱的气力输送设备制造商 - 品牌推广大师
  • 2026年5月盐城黄金回收实测:金价高位下各区变现实录 - 黄金回收
  • BotW存档管理器:跨平台存档转换与进度同步的终极解决方案
  • 2026年餐饮连锁酱料厂家深度测评:如何为你的餐饮连锁匹配最佳方案? - 资讯纵览
  • 2026衡水防水补漏公司怎么选?三家主流品牌实力全方位对比 - 吉修匠
  • TSP问题实战:对比模拟退火、遗传算法与禁忌搜索在Python中的表现与调参心得
  • Havenlon 产品哲学(三):为什么自动化系统需要独立授权层(Enigma Auth Key)
  • 2026河源贵金属奢侈品回收权威排行榜:金奢汇领衔,闲置变现不踩坑 - 小仙贝贝
  • RetroBar终极指南:在Windows 11上重温经典任务栏的完整教程
  • Android逆向分析的终极利器:Androguard完全指南
  • 2026年7月实测兰州黄金回收:6家门店比价,金价高位下谁更透明? - 黄金回收