网络安全缓冲区溢出实验

    • 实验要求
    • 实验步骤
      • 函数 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.mzph.cn/news/202991.shtml

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

相关文章

国内AI大模型已近80个,哪个最有前途?

目前,国内已经推出了近80个人工智能大模型,这些大模型各有优势,难以直接判断哪个最有前途。然而,以下几个大模型值得关注: 1、华为云盘古大模型:盘古大模型聚焦于为行业服务,包括自然语言、视觉…

出错:I/O文件读取JAVA

I/O文件读取 /** author:xiaowang* date:2023/12/6* demand:读取java1班的数据* * */ package homework;import java.io.FileNotFoundException; import java.io.FileReader; import java.io.IOException;public class FileReadTest {public static void main(String[] args) …

月入9K, 95后夫妻转行网优:人生路远,我们只愿携手前行!

用心专注一门课,让教育改变更多人是优橙教育成立的初心与使命。 在优小橙的教育生涯里,见过许多学生,他们或是因为追求一份美好的前程来优橙;或是想要改变泥泞的现状来优橙;或是因为想要深耕通信行业来优橙……理由很多…

Linux--程序地址空间

📘北尘_:个人主页 🌎个人专栏:《Linux操作系统》《经典算法试题 》《C》 《数据结构与算法》 ☀️走在路上,不忘来时的初心 [TOC](文章目录) 一、程序地址空间回顾 我们在讲C语言的时候,老师给大家画过这样的空间布局…

Qt-Q_OBJECT宏使用与“无法解析的外部符号qt_metacall/metaObject/qt_metacast“

有时候我们编写Qt类的时候,修改代码时直接加上Q_OBJECT宏,然后直接构建,会报如下错误: 这里的几个函数的声明是由Q_OBJECT宏引入的,而其对应的实现是由moc实现的,如果我们更新了代码但是没有执行qmake&…

基于FPGA的图像RGB转CIE-Lab实现,包含testbench和MATLAB辅助验证程序

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 4.1RGB颜色空间 4.2CIE-Lab颜色空间 4.3RGB转CIE-Lab算法原理 5.算法完整程序工程 1.算法运行效果图预览 将FPGA的结果导入到matlab,并和matlab的仿真结果进行对比&#xff1a…

使用TouchSocket适配一个c++的自定义协议

这里写目录标题 说明一、新建项目二、创建适配器三、创建服务器和客户端3.1 服务器3.2 客户端3.3 客户端发送3.4 客户端接收3.5 服务器接收与发送 四、关于同步Send 说明 今天有小伙伴咨询我,他和同事(c端)协商了一个协议,如果使…

【Hadoop_01】Hadoop介绍与安装

1、Hadoop、HDFS、YARN介绍(1)Hadoop简介与优势(2)Hadoop组成(3)HDFS概述(4)YARN概述(5)MapReduce概述 2、安装(1)Centos7.5软硬件安装…

基于jsp+servlet+mybatis的简易在线选课系统

目录 一.数据库 1.数据库和表的创建 2.数据插入 二.代码实现 1.pojo类 (1)Course (2)User (3)Elective 2.mapper接口 (1)UserMapper (2)ElectiveMap…

vs 安装 qt qt扩展 改迅雷下载qt

Qt5.14.2安装教程和VS2019中的qt环境配置-CSDN博客 1 安装qt 社区版 免费 Download Qt OSS: Get Qt Online Installer 2 vs安装 qt vs tools 3 vs添加 qt添加 bin/cmake.exe 路径 3.1 扩展 -> qt versions 3.2 4 新版要源码安装 需要自己安装 安装独立安装的旧版 官网…

D. Jumping Through Segments

显然是一个二分答案,关键是怎么搞判断函数? 我们维护合法的降落区间就好了~ // Problem: D. Jumping Through Segments // Contest: Codeforces - Codeforces Round 913 (Div. 3) // URL: https://codeforces.com/contest/1907/problem/D // Memory Li…

car relative position

如何判断你驾驶的车在路上是否居中 车辆相对位置判断,参考 右侧和路边线交点 看右后视镜,看下大概和边线相差多少

SQL手工注入漏洞测试(Sql Server数据库)-墨者

———靶场专栏——— 声明:文章由作者weoptions学习或练习过程中的步骤及思路,非正式答案,仅供学习和参考。 靶场背景: 来源: 墨者学院 简介: 安全工程师"墨者"最近在练习SQL手工注入漏洞&#…

详解nginx优势以及应用场景,实操编译安装和nginx版本平滑升级

目录 一、nginx的特点 那么nginx有哪些特点? 先讲nginx的优点: 缺点: 二、nginx与Apache的区别 三、nginx的应用场景 四、nginx为什么能支持高并发 五、为什么nginx不使用多线程 六、nginx的两种进程分别有什么作用 七、编译安装ngi…

二叉搜索树——模拟

对于一个无穷的满二叉排序树(如图),节点的编号是1,2,3,…。对于一棵树根为X的子树,沿着左节点一直往下到最后一层,可以获得该子树编号最小的节点;沿着右节点一直往下到最后一层,可以…

【办公软件】Win10/Win11复制粘贴必须刷新才能显示

更换了新的一台电脑,但是发现新建文件夹或是复制粘贴文件时,不管是在桌面还是在其他磁盘中都需要右击刷新一下才显示。让人很郁闷,比如新建一个文件夹不显示以为没有新建成功,导致重复建了好几个。 如何解决? 使用Wi…

一步解决 java.io.FileNotFoundException: 找不到文件异常

1.问题描述 java.io.FileNotFoundException: C:\Users\Administrator\AppData\Local\Temp\localhost\uploads\image\20231206\2843cb16-9654-4e52-a757-76e3ca1f80ff.png (系统找不到指定的路径。) 2.原因分析 文件路径中的文件目录不存在 3.解决方案 方案一:如果…

行业研究:2023年中国游戏陪玩行业市场现状分析

近年来随着我国游戏行业的不断发展,我国游戏用户规模也是随着稳步上升,给游戏陪玩行业带来了稳定的用户基础。在用户规模增长的同时,随着经济、文化的快速发展,我国娱乐技能社交也随之逐渐兴起。而作为我国娱乐技能社交比重较大的…

Vue学习计划-Vue2--Vue核心(七)生命周期

抛出问题&#xff1a;一进入页面就开启一个定时器&#xff0c;每隔1秒count就加1&#xff0c;如何实现 示例&#xff1a; <body> <div id"app">{{ n }}<button click"add">执行</button> </div><script>let vm new …