20242420 2026-2027-1 《网络与系统攻防技术》实验一实验报告

网络攻防与实践

实验指导书

题目: 实践一 网络攻防环境的搭建

学生姓名: 王 睿

所在系别: 网络空间安全系

专 业: 网络空间安全专业

学 号: 20242420

指导教师: 王志强

2026 年10月

目 录

1 实验目的 1

1.1整体实验目的 1

1.2细分实验目标 1

2 实验内容及实验原理 1

2.1实验内容 2

2.2实验原理 2

2.2.1ELF文件基础原理 2

2.2.2Call相对寻址原理 2

2.2.3二进制补丁修改原理 3

3 实验环境 3

4 实验步骤 3

4.1导入并初始化实验文件 3

4.2备份原始实验文件 5

4.3反汇编定位核心函数与指令 5

4.4计算call指令全新偏移量 6

4.5二进制修改pwn2文件 7

4.6校验二进制修改结果 7

4.7运行程序验证实验效果 8

5 实验结果与分析 9

5.1 实验结果 9

5.2 结果分析 9

6 实验思考 9

1 实验目的

1.1整体实验目的

本次网络攻防实践实验,主要目的是熟悉Linux攻防实验环境,掌握ELF可执行文件基础特性,熟练使用objdump、dd等二进制分析修改工具,理解x86架构下call指令相对寻址原理,通过修改ELF二进制文件实现程序执行流劫持,掌握基础的二进制漏洞利用前置技术,为后续网络攻防、漏洞挖掘实验奠定基础。

1.2细分实验目标

1. 熟悉Kali Linux攻防环境基础操作,掌握文件导入、权限配置、基础命令使用方法;

2. 了解32位ELF可执行文件的基本结构、代码段存储规则;

3. 掌握objdump反汇编工具的使用,能够精准定位程序函数与机器码指令;

4. 理解x86-32架构call近调用相对偏移寻址机制及小端存储规则;

5. 掌握二进制文件字节修改方法,实现程序执行流篡改,成功劫持程序跳转目标;

6. 验证修改效果,完成程序shell获取,总结二进制修改核心原理与实操要点。

2 实验内容及实验原理

2.1实验内容

本次实验基于Kali Linux环境,以32位ELF可执行文件pwn1为实验对象开展实操。目标程序包含main、foo、getShell三个核心函数,原始程序运行时main函数会调用foo函数,无特殊权限效果。

实验核心内容为:备份原始程序生成pwn2副本,通过反汇编工具定位main函数内call指令机器码,结合相对寻址公式计算出新的跳转偏移,通过dd工具修改ELF二进制文件指定字节,将main函数原本调用foo函数的逻辑,修改为调用getShell函数,最终运行修改后的程序,成功获取系统Shell权限,完成执行流劫持实验。

2.2 环境介绍

2.2.1实验内容

ELF是Linux系统下标准的可执行文件格式,文件内部包含代码段、数据段等核心段区,其中.text代码段用于存储程序编译后的机器指令,程序运行时系统会加载该段机器码执行对应逻辑。32位ELF文件适配x86架构指令集,机器码与汇编指令一一对应,可通过修改代码段字节篡改程序执行逻辑。

2.2.2实验内容

x86-32架构中,近调用call指令固定为5字节长度,编码格式为【1字节操作码0xe8 + 4字节相对偏移量】。CPU执行call指令时,不直接跳转绝对地址,而是通过相对偏移计算跳转目标地址,核心计算公式如下:

相对偏移 = 目标函数虚拟地址 - (call指令虚拟地址 + 5)

公式中“call指令地址+5”为call指令执行完成后,下一条指令的虚拟地址。同时,x86架构采用小端存储模式,4字节偏移量需按照低字节在前、高字节在后的顺序存储在ELF文件中。

2.2.3实验内容

ELF文件磁盘存储的机器码与内存加载后的执行指令完全一致,无需编译即可直接修改。通过换算虚拟内存地址与文件磁盘偏移,精准定位需要修改的机器码字节,使用dd工具定向写入新字节,在不损坏文件结构的前提下,完成程序指令篡改,永久改变程序执行逻辑。

3 实验环境

本次实验基于虚拟机环境搭建,核心使用Kali Linux攻防系统,内置完整的二进制分析、文件处理工具,可满足ELF文件反汇编、二进制修改、程序运行验证等全部实验需求。实验环境软件介绍如下表所示:

表1.1 软件介绍

虚拟机 基本软件介绍
Kali Linux 内置objdump反汇编工具、dd二进制修改工具、文件权限管理工具,支持32位ELF可执行文件运行、解析与修改,是网络攻防、二进制漏洞实验专用环境

4 实验步骤

4.1编写漏洞源代码

通过虚拟机共享目录将实验文件pwn1导入Kali系统,将文件复制到工作目录,配置可执行权限,查看文件基础属性,确认文件为32位ELF可执行文件。

执行命令:

cp '/var/run/vmblock-fuse/blockdir/gELF8J/pwn1' ./

chmod +x pwn1

file pwn1
1

图1-1 复制pwn1文件到工作目录
2

图1-2 查看pwn1文件属性及架构信息

4.2编译漏洞程序并关闭安全防护

为避免修改损坏原始实验文件,复制pwn1生成副本文件pwn2,所有二进制修改操作均在pwn2上执行,保留原始文件用于对比校验。

执行命令:cp pwn1 pwn2、ls
3

图1-3 备份原始文件生成pwn2

4.3 GDB调试确定溢出偏移

使用objdump工具对pwn1进行反汇编,精准定位getShell、foo、main三个核心函数的虚拟地址,重点查看main函数内部call指令的机器码与跳转目标。

执行命令:objdump -d pwn1

关键信息提取:

1. getShell函数虚拟地址:0x0804847d

2. foo函数虚拟地址:0x08048491

3. main函数call指令地址:0x080484b5

4. 原始机器码:e8 d7 ff ff ff,默认跳转至foo函数
4

图1-4 反汇编查看程序核心函数与机器码

4.4获取目标函数get_shell地址

根据call相对寻址公式计算跳转getShell所需的偏移量:

1. call指令下一条指令地址 = 0x080484b5 + 5 = 0x080484ba

2. 相对偏移 = 0x0804847d - 0x080484ba = 0xffffffc6

3. 小端序存储结果:c6 ff ff ff

4. 修改后完整机器码:e8 c6 ff ff ff

4.5构造Payload溢出载荷

通过虚拟地址与文件偏移换算,确定待修改字节位置为0x4b6,使用dd工具定向写入新字节,完成机器码替换,保留文件原有结构不被截断。

执行命令:printf '\xc6' | dd of=pwn2 bs=1 seek=$((0x4b6)) conv=notrunc
5

图1-5 dd工具修改ELF二进制字节

4.6执行漏洞利用,验证溢出效果

再次使用objdump工具反汇编pwn2,查看main函数call指令跳转目标,验证是否成功从foo函数改为getShell函数。

执行命令:objdump -d pwn2 | grep -A5 main
6

图1-6 校验修改后call指令跳转逻辑

4.7执行漏洞利用,验证溢出效果

执行修改后的pwn2程序,观察程序运行状态,验证是否成功获取系统Shell权限。

执行命令:./pwn2
7

图1-7 程序运行成功获取Shell权限

5 实验结果与现象分析

5.1执行漏洞利用,验证溢出效果

1. 实验文件导入、权限配置、备份操作全部成功,成功生成原始文件pwn1与修改文件pwn2,文件无损坏、无丢失;

2. 反汇编操作精准定位了三个核心函数的虚拟地址与main函数call指令机器码,明确了原始程序执行逻辑;

3. 成功计算出跳转getShell所需的相对偏移,并通过dd工具完成二进制字节修改;

4. 修改后反汇编校验结果显示,main函数call指令机器码由 e8 d7 ff ff ff 变为 e8 c6 ff ff ff,跳转目标由foo函数成功切换为getShell函数;

5. 运行./pwn2程序,成功弹出系统Shell(#提示符),完全达成实验预期目标,程序执行流劫持成功。

5.2执行漏洞利用,验证溢出效果

本次实验成功的核心在于精准掌握了x86架构call相对寻址规则与小端存储特性。不同于绝对地址跳转,call近调用依赖相对偏移计算跳转位置,仅需修改4字节偏移首字节,即可篡改程序执行流向。同时,通过备份原始文件、修改后校验的双重操作,规避了文件损坏、修改失效等问题,保证了实验的准确性与可重复性。该实验直观验证了ELF二进制文件可通过人工修改机器码改变程序逻辑,是理解软件逆向、漏洞利用的基础实操。

6 实验思考

问题1:x86的call rel32为相对地址跳转,为什么不能直接写入getShell绝对虚拟地址?

答:rel32编码规则仅支持存储相对偏移量,不支持绝对地址。CPU执行call指令时,默认用“下一条指令地址+偏移量”计算目标地址,若写入绝对地址,会导致跳转地址错乱,程序触发段错误、直接崩溃,无法正常运行。

问题2:dd命令中conv=notrunc参数的作用是什么?缺失该参数会有什么后果?

答:该参数作用是写入字节后不截断原文件。若缺失该参数,dd工具会将ELF文件截断为本次写入的数据长度,破坏文件完整结构,导致ELF文件损坏、无法反汇编和运行。

问题3:为什么不能修改call指令的0xe8操作码?修改后会出现什么现象?

答:0xe8是call指令唯一操作码,用于标识近调用指令。若修改该字节,CPU无法识别为call指令,会将其解析为其他机器指令,彻底打乱程序执行逻辑,造成程序闪退、段错误等问题。

问题4:本次实验修改磁盘ELF文件与缓冲区溢出漏洞的执行流劫持有何区别?

答:本次实验是永久修改磁盘文件机器码,文件本身逻辑被篡改,每次运行均会触发跳转;缓冲区溢出是程序运行时篡改内存数据,仅单次运行生效,不会修改原始磁盘文件。

问题5:虚拟内存地址与磁盘文件偏移为何不相等?

答:ELF文件运行时会进行内存段映射,虚拟地址 = 段虚拟基址 + 段内偏移,磁盘偏移 = 段文件偏移 + 段内偏移,二者映射基数不同,因此不能直接等同,必须通过换算得到真实修改位置。

问题6:实验中文件提示权限不足时,如何解决?

答:执行chmod +x 文件名命令,为ELF文件添加可执行权限,即可正常运行程序。

问题7:如何将修改后的pwn2文件恢复为原始状态?

答:可通过原始文件重新复制覆盖,执行cp pwn1 pwn2;也可通过dd工具将修改的字节还原为原始值0xd7,恢复原始机器码。

问题8:objdump工具的核心功能是什么?

答:objdump是Linux核心二进制分析工具,可将ELF可执行文件的机器码反编译为汇编指令,清晰展示程序函数结构、指令地址、机器码,用于逆向分析、指令定位与修改校验。

问题9:ELF文件.text代码段的核心作用是什么?

答:.text段是ELF文件的核心代码段,专门存储程序编译完成后的可执行机器指令,是程序运行的核心数据区域,本次修改的指令均存储在该段中。

问题10:x86架构小端存储模式对本次实验有什么影响?

答:小端存储要求4字节偏移量低字节在前、高字节在后,本次计算的偏移0xffffffc6,需以c6 ff ff ff的顺序写入文件,若存储顺序错误,会导致跳转地址错误,实验失败。

posted @ 2026-10-12 10:04  瓦特汉德  阅读(5)  评论(0)    收藏  举报