网络安全缓冲区溢出实验

    • 实验要求
    • 实验步骤
      • 函数 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.rhkb.cn/news/211218.html

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

相关文章

CompletableFuture异步执行

CompletableFuture异步执行 概念 Java 8引入了一个强大的类:CompletableFuture,它在java.util.concurrent包中。CompletableFuture是Future的增强版本,主要用于实现异步编程。 首先,我们要理解什么是Future。Future是Java5引入的一个接口,代表一个异步计算的结果。你可…

华清远见嵌入式学习——C++——作业6

作业要求&#xff1a; 代码&#xff1a; #include <iostream>using namespace std;class Animal { public:virtual void perform() 0;};class Lion:public Animal { private:string foods;string feature; public:Lion(){}Lion(string foods,string feature):foods(foo…

软件设计模式原则(三)单一职责原则

单一职责原则&#xff08;SRP&#xff09;又称单一功能原则。它规定一个类应该只有一个发生变化的原因。所谓职责是指类变化的原因。如果一个类有多于一个的动机被改变&#xff0c;那么这个类就具有多于一个的职责。而单一职责原则就是指一个类或者模块应该有且只有一个改变的原…

【MySQL】聚合函数和分组(查找)

聚合函数分组分组聚合如何显示每个部门的平均工资和最高工资显示每个部门的每种岗位的平均工资和最低工资显示平均工资低于2000的部门和它的平均工资(SMITH员工不参与)where 和 having 的区别 聚合函数 函数说明COUNT([DISTINCT] expr)返回查询到的数据的 数量SUM([DISTINCT] …

三、DVP摄像头调试笔记(图片成像质量微调整,非ISP)

说明&#xff1a;当前调试仅仅用来测试和熟悉部分摄像头寄存器模式 一、图片成像方向控制&#xff0c;基本每个摄像头都会有上下左右翻转寄存器 正向图片 反向图片 二、设置成像数据成各种颜色&#xff0c;&#xff08;黑白/原彩/黄色等等&#xff09; 在寄存器书册描述中…

【SpringCloud篇】Eureka服务的基本配置和操作

文章目录 &#x1f339;简述Eureka&#x1f6f8;搭建Eureka服务⭐操作步骤⭐服务注册⭐服务发现 &#x1f339;简述Eureka Eureka是Netflix开源的一个基于REST的服务治理框架&#xff0c;主要用于实现微服务架构中的服务注册与发现。它由Eureka服务器和Eureka客户端组成&#…

使用NimoShake将数据从AWS DynamoDB迁移至阿里云MongoDB

本文介绍从AWS DynamoDB到阿里云MongoDB的迁移框架。 它概述了以下步骤&#xff1a; 在阿里云上配置云数据库MongoDB版并应用公网终端节点在 AWS EC2 上安装 Nimoshake将AWS EC2访问阿里云MongoDB版列入白名单配置 Nimoshake 并开始迁移过程验证目标数据库上的增量数据 1. 创…

基于人工智能技术《量化投资AI系统》的集群架构设计与实现

乔总&#xff1a; 前些日子你我的共同朋友潘总&#xff0c;推荐您来聊聊将ChatGPT应用于量化投资的合作。在与您及您的团队进行了超过2个多小时的沟通后&#xff0c;恕我直言&#xff0c;不客气地说&#xff0c;感觉您的团队对人工智能技术几乎是空白。为了让您的团队对人工智…

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具

Spring boot命令执行 (CVE-2022-22947)漏洞复现和相关利用工具 名称: spring 命令执行 (CVE-2022-22947) 描述: Spring Cloud Gateway是Spring中的一个API网关。其3.1.0及3.0.6版本&#xff08;包含&#xff09;以前存在一处SpEL表达式注入漏洞&#xff0c;当攻击者可以访问A…

八、Lua数组和迭代器

一、Lua数组 数组&#xff0c;就是相同数据类型的元素按一定顺序排列的集合&#xff0c;可以是一维数组和多维数组。 在 Lua 中&#xff0c;数组不是一种特定的数据类型&#xff0c;而是一种用来存储一组值的数据结构。 实际上&#xff0c;Lua 中并没有专门的数组类型&#xf…

逢疫读史引以为鉴,防微杜渐警钟长鸣

世事变幻&#xff0c;皆有定数&#xff1b;生死福祸&#xff0c;必有因由。连日来&#xff0c;“多国又爆发大规模传染病”这个话题&#xff0c;不断地出现在网络空间&#xff0c;令人骇然。为此笔者花了很多时间和精力&#xff0c;查阅了许多相关文献、史料&#xff0c;在此仅…

vuepress-----2、初体验

2、初体验 目标 创建GitHub账号创建Github项目初体验vuepress默认主体的首页 初体验 (opens new window) --- home: true heroImage: /hero.png heroText: Hero 标题 tagline: Hero 副标题 actionText: 快速上手 → actionLink: /zh/guide/ features: - title: 简洁至上deta…

ChatGPT哪些行业需要学习?

2023年随着OpenAI开发者大会的召开&#xff0c;最重磅更新当属GPTs&#xff0c;多模态API&#xff0c;未来自定义专属的GPT。微软创始人比尔盖茨称ChatGPT的出现有着重大历史意义&#xff0c;不亚于互联网和个人电脑的问世。360创始人周鸿祎认为未来各行各业如果不能搭上这班车…

30、pytest入门内容回顾

整体结构 解读与实操 pytest30讲主要从四个方面由浅入深的进行解读&#xff0c; 开始 讲解了pytest的概述&#xff0c;安装前的准备工作&#xff08;python,pycharm,pytest&#xff09;&#xff0c;运行方式&#xff08;命令行&#xff09;&#xff0c;断言&#xff08;assert…

算法通关村——原来这就是堆

堆结构是一种非常重要的基础数据结构&#xff0c;也是算法的重要内容&#xff0c;很多题目甚至只能用堆来进行&#xff0c;所以我们必须先明确什么类型的题目可以用堆&#xff0c;以及如何使用堆来解决。由于堆的构造和维护过程都非常复杂&#xff0c;因此面试时一般不需要手写…

漫步者开放式耳机怎么样?南卡、漫步者开放式耳机哪个好?

现在开放式耳机的市场越来越混杂&#xff0c;我们作为消费者在挑选的时候&#xff0c;一定要找准需求点才能把踩坑几率降到最低。实在不会挑选的也不要紧&#xff0c;我最近入了2款目前市面最畅销的百元款开放式耳机&#xff1a;南卡OE CC和漫步者comfo fit&#xff0c;亲身上耳…

【Java Web学习笔记】 1 - HTML入门

项目代码 https://github.com/yinhai1114/JavaWeb_LearningCode/tree/main/html 零、网页的组成 HTML是网页内容的载体。内容就是网页制作者放在页面上想要让用户浏览的信息&#xff0c;可以包含文字、图片视频等。 CSS样式是表现。就像网页的外衣。比如&#xff0c;标题字体、…

虹科干货 | 关于JSON数据库

来源&#xff1a;艾特保IT 虹科干货 | 关于JSON数据库 原文链接&#xff1a;https://mp.weixin.qq.com/s/NutCGWa32rOcEHrk3UDGcQ 欢迎关注虹科&#xff0c;为您提供最新资讯&#xff01; 如何理解JSON数据库&#xff1f;作为NoSQL数据库的一种类型&#xff0c;JSON数据库有哪…

探索 IndexedDB 的世界:大规模数据存储的解决方案

&#x1f90d; 前端开发工程师&#xff08;主业&#xff09;、技术博主&#xff08;副业&#xff09;、已过CET6 &#x1f368; 阿珊和她的猫_CSDN个人主页 &#x1f560; 牛客高级专题作者、在牛客打造高质量专栏《前端面试必备》 &#x1f35a; 蓝桥云课签约作者、已在蓝桥云…

【鸿蒙应用ArkTS开发系列】- 选择图片、文件和拍照功能实现

文章目录 前言创建多媒体Demo工程创建MediaBean 实体类创建MediaHelper工具类API标记弃用问题动态申请多媒体访问权限实现选择图片显示功能打包测试 前言 在使用App的时候&#xff0c;我们经常会在一些社交软件中聊天时发一些图片或者文件之类的多媒体文件&#xff0c;那在鸿蒙…