网络安全缓冲区溢出实验

    • 实验要求
    • 实验步骤
      • 函数 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 未导致段错误

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

STM32F407-14.3.13-01发生外部事件时清除 OCxREF 信号

发生外部事件时清除 OCxREF 信号 对于给定通道,在 ETRF⑧ 输入施加高电平(相应 TIMx_CCMRx 寄存器中的 OCxCE⑦ 使能位置“1”),可使 OCxREF⑨ 信号变为低电平。OCxREF⑨ 信号将保持低电平,直到发生下一更新事件 (UEV)…

LT8668SXC HDMI转edp1.4/VBO 最高支持8k60hz

HDMI2.1 Receiver ▪ Compliant with HDMI2.1, HDMI2.0b, HDMI1.4 and DVI1.0 ▪ Data rate up to 8Gbps ▪ Support HDCP 1.4/2.3 ▪ Support HDCP repeater ▪ Support RGB 8/10/12 bpc, YCbCr4:4:4/ YCbCr4:2:2/ YCbCr4:2:0 /8/10/12 bpc ▪ Support up to 8K3…

【电路笔记】-电位差

电位差 文章目录 电位差1、概述2、电位差示例13、分压网络4、电位差示例2 电路中任意两点之间的电压差称为电位差,正是这种电位差使电流流动。 1、概述 与以电荷形式围绕闭合电路流动的电流不同,施加的电势差不会移动或流动。 两点之间产生的电势差的单…

生成测试数据的4种方法、5种工具介绍

在软件测试中,测试数据是测试用例的基础,对测试结果的准确性和全面性有着至关重要的影响。 因此,在进行软件测试时,需要生成测试数据以满足测试场景和要求。本文将介绍什么情况下需要生成测试数据,如何生成测试数据&a…

MOS管加三个元件就组成BUCK电路,为何说难点在于电感?

只要是电子产品就需要供电,就离不开电源,那什么是电源:小到手表中的电子,遥控器的电源,大到220V家庭用电,都可以看做是电源。然而在我们的电路设计中,会用到各种芯片,各种芯片所需要…

【算法问题】N 皇后问题

目录 1.问题定义2.思路分析2.1.基于数组的回溯2.2.基于集合的回溯2.3.基于位运算的回溯 3.代码实现 (Java)3.1.基于数组的回溯3.2.基于数组的回溯3.3.基于位运算的回溯 4.扩展 参考:52.N 皇后 II 1.问题定义 (1)在国际象棋的规则中&#xff…

操作教程|JumpServer搭载RD Client App,让你的移动办公更轻松

随着信息技术的普及和发展,移动办公逐渐成为新的时代趋势。移动办公又被称为3A办公,即办公人员可在任何时间(Anytime)、任何地点 (Anywhere)处理与业务相关的任何事情(Anything)。 …

2024年软件测试面试八股文

前言 (第一个就刷掉一大批人) 有很多“会自动化”的同学来咨询技术问题,他总会问到我一些元素定位的问题。元素定位其实都不算自动化面试的问题。 一般我都会问:你是定位不到吗?通常结果都是说确实定位不到。 做自…

本地启动tomcat,打印的日志中中文乱码

修改配置文件 /conf/logging.properties 修改配置项 java.util.logging.ConsoleHandler.encoding 从UTF-8改成GBK

solidity案例详解(六)服务评价合约

有服务提供商和用户两类实体,其中服务提供商部署合约,默认诚信为true,用户负责使用智能合约接受服务及评价,服务提供商的评价信息存储在一个映射中,可以根据服务提 供商的地址来查找评价信息。用户评价信息&#xff0c…

今天刷basic

一 在kali里边链接这个服务器 ssh -p 25199 rootnode4.buuoj.cn 然后回车 yes 输入密码123456 ls查看发现什么都没有,cd ..返回上一级目录 ls 发现有flag.txt 查看文件得到flag flag{477f20d3-acd3-46e1-b50a-633e58b769c7}

【Vue3从入门到项目实现】RuoYi-Vue3若依框架前端学习——登录页面

若依官方的前后端分离版中,前端用的Vue2,这个有人改了Vue3的前端出来。刚好用来学习: https://gitee.com/weifengze/RuoYi-Vue3 运行前后端项目 首先运行项目 启动前端,npm install、npm run dev 启动后端,按教程配置…

35亿元!开源类ChatGPT平台Mistral AI,再获巨额融资

12月6日,彭博消息,开源类ChatGPT平台Mistral AI获得4.5亿欧元(近35亿元)融资,估值近20亿美元(142亿元)。本次由英伟达、 Salesforce等投资。 Mistral AI的开源大语言模型Mistral 7B主打参数小、…

Apache Doris 详细教程(一)

1、Doris简介 1.1、doris概述 Apache Doris 由百度大数据部研发(之前叫百度 Palo,2018 年贡献到 Apache 社区后, 更名为 Doris ),在百度内部,有超过 200 个产品线在使用,部署机器超过 1000 台…

PIKA,一个神奇的AI工具

随着人工智能技术的不断发展,越来越多的创新性工具开始涌现,为各行各业带来了巨大的变革。其中,视频生成AI工具PIKA,以其独特的功能和广泛的应用领域,吸引了众多用户的关注。本文将详细介绍PIKA的功能、特点以及应用前…

学习设计模式的网站

Refactoring and Design Patternshttps://refactoring.guru/

前端CSS(层叠样式表)总结

CSS2总结 一、CSS基础 1. CSS简介 CSS 的全称为:层叠样式表 ( Cascading Style Sheets ) 。CSS 也是一种标记语言,用于给 HTML 结构设置样式,例如:文字大小、颜色、元素宽高等等。 简单理解: CSS 可以美化…

运维之远程桌面连接失败问题排查

背景:同一局域网,可以ping通但是远程连接不上,排查一下问题。 1、被远程计算机是否允许远程连接 2、被远程计算机防火墙是否允许 3、被远程计算机远程桌面服务是否正常 4、查看用户权限

openGauss学习笔记-145 openGauss 数据库运维-备份与恢复-备份与恢复概述

文章目录 openGauss学习笔记-145 openGauss 数据库运维-备份与恢复-备份与恢复概述145.1 逻辑备份与恢复145.2 物理备份与恢复145.3 闪回恢复145.4 三种备份恢复类型对比145.5 备份方案与策略 openGauss学习笔记-145 openGauss 数据库运维-备份与恢复-备份与恢复概述 数据备份…

Webgis学习总结

前言: 作者跟随视频学习了webgis内容进行如下学习复习总结 参考:新中地学习笔记 WebGIS第一课:测试高德API并通过: 注册申请高德API成为开发者,创建自己的项目和key进行项目初始化,可以使用JS API官方文…