网络安全缓冲区溢出实验

news2024/11/24 5:55:59

    • 实验要求
    • 实验步骤
      • 函数 f00()
      • 函数 f01()
      • 函数 f02()

实验要求

C 程序 homework08.c 的主函数如下:

int main(int argc, char * argv[]) { 
	init_buf(Lbuffer, LEN);
	switch(argc) 
	{
    	case 1: f00(); break;
        case 2: f01(); break;
        case 3: f02(); break; 
        default: f00(); break; 
    } 
    puts("Done.\nThe program exited normally.");
    return 0; 
}

在 32 位的 ubuntu16.04 系统中用 gcc - fno-stack-protector 编译该程序,得到的可执行程序见附件,通过 gdb 调试,对 f00()、f01()和 f02()进行分析:

  1. 函数 f00()、f01()和 f02()是否导致段错误。

  2. 如果函数 f00()、f01()和 f02()导致段错误,计算出被攻击的缓冲区首地址与函数的返回地址所在的栈地址的距离(即偏移 OFFSET), 给出溢出后函数的返回地址(用16 进制数表示)。

实验步骤

  1. 关闭地址随机化机制,执行程序。

输入命令 sudo sysctl -w kernel.randomize_va_space=0 以关闭地址随机化,然后运行编译好的可执行程序 ./homework08,得到 Segmentation fault段错误。

在这里插入图片描述

  1. 为了找出段错误的原因,使用 gdb ./homework08进入 gdb 调试模式,在该模式下使用 r 命令默认运行 f00() 函数,可见函数 f00()发生段错误,为了找出错误原因,继续使用 gdb 调试程序。

    反汇编 main:

在这里插入图片描述
在这里插入图片描述

函数 f00()

反汇编 f00:

在这里插入图片描述

在函数 f00 的入口、对 strcpy 的调用、出口位置设置断点,运行程序并在断点处观察寄存器的值,

在这里插入图片描述

在这里插入图片描述

  • 第一个断点处,函数入口处的堆栈指针 esp 指向的栈(地址为 0xbfffef3c)保存了函数 f00() 返回到调用函数(main)的地址(0x080485a8),即“函数的返回地址” 。

    记录堆栈指针 e s p esp esp 的值,在此以 A A A 标记: A A A = $esp = 0xbfffef3c

  • 第二个断点处,查看执行汇编代码 strcpy@plt 前堆栈的内容。Lbuffer 的地址 0x0804a060 保存在地址为 0xbfffeea4 的栈中, buff 的首地址 0xbfffeeb5 保存在地址为 0xbfffeea0 的栈中。

    C 语言默认将参数逆序推入堆栈,所以 C 函数 strcpy(des, src) 的 src(main() 中变量 Lbuffer 的地址)先进栈(高地址),des ( f00()中 buff 的首地址 )后进栈(低地址)。

    B B B = buff 的首地址,则 buff 的首地址与返回地址所在栈的距离 = A A A - B B B = 0xbfffef3c - 0xbfffeeb5 = 0x87 = 135

    • 因此,如果 Lbuffer 的内容超过 135 字节,则将发生缓冲区溢出,并且返回地址被改写。
    • Lbuffer 的最后的 4 个字节为 FGHI,因此, 执行 strcpy 之后,返回地址由原来的 0x80484d1 变为 FGHI0x49484746),即返回地址被改写。
  • 第三个断点处,执行的指令为 ret。执行 ret 后程序指针 e i p eip eip 的值为 0x49484746,即程序跳转到 0x49484746 去执行,这是不可访问的内存地址,因此发生段错误。

    • 执行 ret 时把堆栈的内容(4个字节)弹出到指令寄存器 e i p eip eip e s p esp esp 的值增加 4,然后跳转到 e i p eip eip 所保存的地址去继续执行: ret 指令让 e i p eip eip 等于 e s p esp esp 指向的内容,并且 e s p esp esp 等于 e s p + 4 esp+4 esp+4

    • 可见,执行ret之前的堆栈的内容为 FGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVWXYZABCDEFGHIJKLMNOPQRSTUVW...,前 4 字节为 0x49484746。可以推断执行 ret 后将跳到地址 0x49484746 去执行。

    • eip = 0x49484746,正好是”FGHI”倒过来,这是由于 IA32 默认字节序为 little_endian(低字节存放在低地址)。

因此,f00 导致段错误,偏移 OFFSET = 0x87 = 135, 溢出后函数的返回地址 = 0x49484746

函数 f01()

反汇编 f01,并打断点:

在这里插入图片描述

同上述函数 f00() 步骤,可得以下步骤:

在这里插入图片描述

  • 记录堆栈指针 e s p esp esp 的值,以 A A A 标记: A A A = $esp = 0xbfffef2c

  • B B B = buff 的首地址 = 0xbfffee2a,则 buff 的首地址与返回地址所在栈的距离 = A A A - B B B = 0xbfffef2c - 0xbfffee2a = 0x102 = 258

  • 执行 ret 后程序指针 e i p eip eip 的值为 0x42415a59,即程序跳转到 0x42415a59 去执行,这是不可访问的内存地址,因此发生段错误。

因此,f01 导致段错误,偏移 OFFSET = 0x102 = 258, 溢出后函数的返回地址 = 0x42415a59

函数 f02()

反汇编 f02,并打断点:

在这里插入图片描述

同上述函数 f00() 步骤,可得以下步骤:

在这里插入图片描述

  • 记录堆栈指针 e s p esp esp 的值,以 A A A 标记: A A A = $esp = 0xbfffef2c

  • B B B = buff 的首地址 = 0xbfffeaa5,则 buff 的首地址与返回地址所在栈的距离 = A A A - B B B = 0xbfffef2c - 0xbfffeaa5 = 0x487 = 1159

  • 执行 ret 后程序指针 e i p eip eip 的值为 0x080485b6,即程序跳转到 0x080485b6 去执行,这是可访问的内存地址,并且正好是 main 中调用 f02() 后的下一条指令的地址,因此未发生段错误,程序执行完正常退出。

因此,f02 未导致段错误

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

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

相关文章

算法-贪心思想

贪心的思想非常不好解释,而且越使用权威的语言解释越难懂。而且做题的时候根据自己的理解可能直接做出来,但是非要解释一下怎么使用的贪心的话,就懵圈了。一般来说,贪心的题目没有固定的套路,一题一样,不过…

高压探头高压衰减棒的使用方法与注意事项

HVP-15HF高压探头最大量测电压为10kV DC / 7kV AC rms / 20kV p-p。 频宽高达40MHz,超低噪声( S/N比 )60dB at 1kHz。 搭配转接器PL-10可连接到电表使用。 操作方法: 1、先将接地线连接在良好的接地点上。 2、将BNC探头连接在示波器的输入端上。 3、设定…

【MarginNote教程】MarginNote2思维导图如何用xmind打开

1. 使用iThoughts打开思维导图 MarginNote2打开需要打印的笔记,左上角分享这里选择iThoughts。iThoughts软件是需要付费,但用iThoughts2go同样可以实现。 (我们提前下载好iThoughts2go) 这里我下载在平板上,图标如图所示 2.进行xmind格式…

BUU LFI COURSE 1

二 打开链接发现有这么一串php代码 阅读发现是GET传参,传入的参数是file 传一下试试 页面会报错 我们知道了他的路径是在/var/www/html/index.php 这个下面 然后想办法返回上一级,就是../ 然后尝试传参 一个../不够 他的父级目录有好几个&#xff0…

每天一点python——day87

#每天一点Python——87 #Pycharm程序调试 #例&#xff1a;【我想输出1-10】 i1 while i<10:print(i) #会一直输出1{我想输出一到十&#xff0c;但是他一直输出1}【如果想找到问题出现在什么地方&#xff1a;就需要一步步调试】 #那么怎么调试呢 #前面声明是没有错的&#x…

【虚拟机】Docker基础 【二】【数据卷和挂载本地目录】

2.2.数据卷 容器是隔离环境&#xff0c;容器内程序的文件、配置、运行时产生的容器都在容器内部&#xff0c;我们要读写容器内的文件非常不方便。大家思考几个问题&#xff1a; 如果要升级MySQL版本&#xff0c;需要销毁旧容器&#xff0c;那么数据岂不是跟着被销毁了&#x…

Toolbox零部件调用深度解析

很多时候我们需要用到SOLIDWORKS设计库中的自带零部件&#xff0c;去完成零部件的调用&#xff0c;或者在它上面的基础之上进行更改&#xff0c;来满足我们的使用要求&#xff0c;但似乎并不怎么可行&#xff0c;很多时候更改过的尺寸和调用的规格会自己乱码&#xff0c;下面介…

if与switch语句的运用—输出成绩

1.给出一个百分制成绩&#xff0c;要求输出成绩等级A、B、C、D、E。90分以上为A&#xff0c;81-89分为B&#xff0c;70-79分为C&#xff0c;60&#xff0d;69分为D&#xff0c;60分以下为E。 if语句实现 #include <stdio.h> int main() { int score; printf(&qu…

同旺科技 USB TO RS-485 定制款适配器--- 拆解(三)

内附链接 1、USB TO RS-485 定制款适配器 ● 支持USB 2.0/3.0接口&#xff0c;并兼容USB 1.1接口&#xff1b; ● 支持USB总线供电&#xff1b; ● 支持Windows系统驱动&#xff0c;包含WIN10 / WIN11系统32 / 64位&#xff1b; ● 支持Windows RT、Linux、Mac OS X、Windo…

报错解决:Fatal error: ‘THC/THC.h‘: No such file or directory

报错解决&#xff1a;Fatal error: THC/THC.h: No such file or directory 报错原因解决方法总结参考文献 报错 博主的软硬件环境&#xff08;供参考&#xff09;&#xff1a; LinuxNVIDIA GeForce RTX 3090CUDA 11.6gcc (Ubuntu 9.4.0-1ubuntu1~20.04.2) 9.4.0Pytorch&#…

Hadoop学习笔记(HDP)-Part.15 安装HIVE

目录 Part.01 关于HDP Part.02 核心组件原理 Part.03 资源规划 Part.04 基础环境配置 Part.05 Yum源配置 Part.06 安装OracleJDK Part.07 安装MySQL Part.08 部署Ambari集群 Part.09 安装OpenLDAP Part.10 创建集群 Part.11 安装Kerberos Part.12 安装HDFS Part.13 安装Ranger …

JDK 9 模块化系统 (Module System) 和 多版本兼容 Jar (Multi-Release Jar)

博文目录 文章目录 Module System原因JDK 模块化模块描述文件关键字 启用模块化测试结论 Multi-Release jar (MRJAR)原因原理结论用 IDEA 创建多版本兼容 Jar项目结构pom.xml测试 Module System 原因 Java 9引入了模块化系统的主要原因是为了解决Java平台面临的复杂性和可维…

12 月 10 日,融云在 Google DevFest 上海站等你!

Welcome to DevFest!RongCloud2023 Google DevFest 上海站关注【融云全球互联网通信云】了解更多 时间&#xff1a;2023 年 12 月 10 日&#xff08;周日&#xff09;地点&#xff1a;上海市浦东新区新金桥路 1599 号&#xff0c;东方万国宴会中心 (下沉式广场)主讲&#xff1a…

反序列化漏洞详解(二)

目录 pop链前置知识&#xff0c;魔术方法触发规则 pop构造链解释&#xff08;开始烧脑了&#xff09; 字符串逃逸基础 字符减少 字符串逃逸基础 字符增加 实例获取flag 字符串增多逃逸 字符串减少逃逸 延续反序列化漏洞(一)的内容 pop链前置知识&#xff0c;魔术方法触…

etcd 与 Consul 的一致性读对比

本文分享和对比了 etcd 和 Consul 这两个存储的一致性读的实现。 作者&#xff1a;戴岳兵&#xff0c;爱可生研发中心工程师&#xff0c;负责项目的需求开发与维护工作。 爱可生开源社区出品&#xff0c;原创内容未经授权不得随意使用&#xff0c;转载请联系小编并注明来源。 本…

vue 过滤器 (filters) ,实际开发中的使用

在实际开发中要判断不同的状态,要写很多重复的代码, 类似这样: 这样学麻烦, 不方便维护, 这时候可以用 filters 过滤器 在页面这样写就可以了

(04730)电路分析基础之基尔霍夫定律

基尔霍夫定律包括基尔霍夫电流定律(KCL)和基尔霍夫电压定律(KVL)。它反映了电路 中所有支路电压和电流所遵循的基本规律&#xff0c;是分析电路的基本定律。基尔霍夫定律与元件 特性构成了电路分析的基础。 电路是由电路元件按照一定的方式组成的系统&#xff0c;因此整个电路…

数据库增删改查(CRUD)进阶版

目录 数据库约束 约束类型 表的设计 1.一对一 2.一对多 3.多对多 增删查改进阶操作 1. 插入查询结果 2.查询 聚合查询 聚合函数 group by having 联合查询 内连接 外连接 自连接 子查询 合并查询 数据库约束 创建表的时候制定的一些规则&#xff0c;在后续…

字符串相似度匹配算法_莱茵斯坦距离算法

package day0330;public class LevenshteinDistanceUtil {public static void main(String[] args) {String a "WN64 F98";String b "WN64 F98 ";System.out.println("相似度:" getSimilarityRatio(a, b));}/*** 获取两字符串的相似度* * par…

MinIo 的操作与使用和避坑

文章目录 一、介绍二、安装三、Client 连通与避坑1. SpringBoot 项目2. 自己的 Maven 项目&#xff08;非 SpringBoot 项目&#xff09;思路1&#xff1a;尝试从 Maven 仓库中替换该 jar 包思路2&#xff1a;改造有问题的 jar 包 四、封装一些简单的方法 官方 API 文档&#xf…