【2021.12.12】缓冲区溢出利用

2024-03-14 13:08
文章标签 溢出 缓冲区 2021.12

本文主要是介绍【2021.12.12】缓冲区溢出利用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 1.1 实验环境和开发工具
  • 1.2 任务描述
  • 1.3 分析过程
  • 1.4 结论
    • 1.4.1 利用漏洞
    • 1.4.2 修复漏洞


1.1 实验环境和开发工具

处理器 i5-8300H
内存(RAM) 8G
硬盘 476G

软件环境:
Windows 10

开发工具:
Visual studio 2019
IDA PRO7.5

1.2 任务描述

提供两个文件 :SSEx.exe : 编译生成的可执行文件
SSEx.pdb: 对应的程序数据库文件
已知所给的代码中存在安全漏洞

  1. 请找到导致漏洞的代码
  2. 分析漏洞的成因
  3. 给出一种成功的利用:显示信息“eXploited!”
  4. 修复该漏洞
  5. 撰写详细的分析利用报告

1.3 分析过程

已知缓冲区漏洞导致的后果为修改邻接变量或修改返回地址或SEH结构覆盖。而形成缓冲区漏洞的原因大多为计算机向缓冲区内填充数据时超过了缓冲区本身的容量,因此重点定位读写操作。

首先进行静态分析,对可执行文件使用IDA进行反汇编。主函数大部分涉及网络编程部分,如请求协议版本,创建套接字等等,与缓冲区溢出关联性不大,直接跳过。发现在子程序中有有recv()的读操作,重点关注该函数。

函数原型int recv( In SOCKET s, Out char *buf, In int len, In int flags).
s为套接字,buf为字符串,len为字符串长度,flags为标识。

导致漏洞的代码
在这里插入图片描述

第一次recv()中,s buf len flags均已确定,服务端需要确认客户端发来的是否为DOWN请求。
第二次recv()s buf len flags均已确定。但发现服务端接收的字符串为下次接收的len(字符串的长度),易知如果该长度超过缓冲区大小则会造成访问越界。

第三次recv()从客户端接收上次recv()规定长度的字符串,只要字符串长度超过缓冲区大小且接受长度超过缓冲区大小,便能形成缓冲区漏洞。

因为利用为显示特定信息,所以程序肯定需要执行具有输出功能的函数。查找发现代码中有一名为display()的函数有输出字符串的功能,其将一为全局变量的字符串进行输出,该字符串一直被赋值为ebp-110h的地址所存放的内容,即第三次输入的字符串。但按正常流程程序是不会执行该函数的。故利用漏洞一定需要修改某一个必经函数的返回地址修改为能执行display()的地址。

定位display()
在这里插入图片描述

其函数入口地址为00401080。服务端程序必执行的函数名为?clientproc@@YAHI@Z,函数栈帧大小为272(110h)。若需要覆盖返回地址,构造的输入必然长度大于272+4+4=280,ebp占四字节,返回地址占四字节。

1.4 结论

1.4.1 利用漏洞

因此我们应该构造三次输入,第一次输入为DOWN,第二次输入为大于280的值,第三次构造的输入为以”eXploited!”开头且以277-280位为display()函数地址结尾。还有别的构造方式吗?答案是有的。因为如果构造的输入修改函数的返回地址继续执行也能执行到display()的地址也能实现利用。比如修改返回地址为0040124D或00401253,但这样就得将[ebp+nSize]修改为0和将被覆盖的ebp恢复原值。

构造输入进行漏洞利用
在这里插入图片描述

利用成功
在这里插入图片描述

1.4.2 修复漏洞

该漏洞的出现归根结底是程序未检查数据长度,使得数据超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。为修复该漏洞,在第二次recv()时对数据长度进行判断即可。
比如在接收到第二次消息后,进行
cmp edx,110h
jz loc_40127E

这篇关于【2021.12.12】缓冲区溢出利用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/808516

相关文章

【0324】Postgres内核 Shared Buffer Access Rules (共享缓冲区访问规则)说明

0. 章节内容 1. 共享磁盘缓冲区访问机制 (shared disk buffers) 共享磁盘缓冲区有两套独立的访问控制机制:引用计数(a/k/a pin 计数)和缓冲区内容锁。(实际上,还有第三级访问控制:在访问任何属于某个关系表的页面之前,必须持有该关系表的适当类型的锁。这里不讨论关系级锁。) Pins 在对缓冲区做任何操作之前,必须“对缓冲区pin”(即增加其引用计数, re

工作集、granule、缓冲区、缓冲池概念及关系?

工作集、granule、缓冲区、缓冲池概念及关系? granule:为了让内存在db_chache_size和shared_pool_size之间高效的移动,oracle在9i重构SGA,使用固定大小的内存块即为granule。这个参数就是为什么当你分配给shared pool值的时候,为什么有时候比你分配的值要大一点,但是granule的整数倍。 缓冲区:内存存放数据的地方,类似于数

堆内存溢出的测试类——JVM学习笔记

记个笔记,手写一个测试类,模拟堆内存溢出。 /*** 堆内存溢出测试类* VM Agrs: -Xms10m -Xmx10m -XX:+HeapDumpOnOutOfMemoryError* @author lixiang* @date 2019年04月12日 - 14:44* @history 2019年04月12日 - 14:44 lixiang create.*/public class

圆形缓冲区-MapReduce中的

这篇文章来自一个读者在面试过程中的一个问题,Hadoop在shuffle过程中使用了一个数据结构-环形缓冲区。 环形队列是在实际编程极为有用的数据结构,它是一个首尾相连的FIFO的数据结构,采用数组的线性空间,数据组织简单。能很快知道队列是否满为空。能以很快速度的来存取数据。 因为有简单高效的原因,甚至在硬件都实现了环形队列。 环形队列广泛用于网络数据收发,和不同程序间数据交换(比如内核与应用

记一次 OOM内存溢出案例

在linux中,出现killed的原因是系统资源不足或内存不足;当系统资源不足时,Linux内核也可以决定终止一个或多个进程,内存不足时会在系统的物理内存耗尽时触发killed,可以利用“dmesg | tail -7”命令来查看killed日志。     linux出现killed的原因是什么 触发Killed常见原因 当系统资源不足时,Linux 内核也可以决定终止一个或多个进程

C/C++堆溢出(stack overflow)的解决

问题 堆溢出(stack overflow) 解决 (1)在VS里面设置 【属性】/【链接器】/【系统】/【堆栈保留大小】 (2)通过代码 //第一个值是堆栈的保留空间//第二个值是堆栈开始时提交的物理内存大小。堆栈改变为100M。#pragma comment(linker,"/STACK:102400000,1024000")

Kafka【五】Buffer Cache (缓冲区缓存)、Page Cache (页缓存)和零拷贝技术

【1】Buffer Cache (缓冲区缓存) 在Linux操作系统中,Buffer Cache(缓冲区缓存)是内核用来优化对块设备(如磁盘)读写操作的一种机制(故而有一种说法叫做块缓存)。尽管在较新的Linux内核版本中,Buffer Cache和Page Cache已经被整合在一起,但在理解历史背景和功能时,了解Buffer Cache仍然很有帮助。 Buffer Cache 的历史和定义

spark内存溢出问题

9090监控页面显示storage都没用(这里似乎只统计persist持久化的): 但是jmap -heap pid显示内存不够了: 然后报错:SparkException: Kryo serialization failed: Buffer overflow 解决办法:加大spark.driver.memory、spark.executor.memory、spark.kryos

EasyExcel导出数据量大导致内存溢出

一次性读入过多数据,如果内存不够大就会导致内存溢出,所以将数据分批处理,最后在EasyExcel导出的时候再汇总导出。至于接口耗时问题,就需要根据实际调整批次的最大数量。 /*** 全量导出工艺工时* @param response 请求信息*/@Overridepublic void exportEngineeringStandardWorkTime(HttpServletResponse

css文字溢出使用省略号

text-overflow: ellipsis;display: -webkit-box;-webkit-box-orient: vertical;-webkit-line-clamp: 1;height: 1.23rem;white-space:pre-wrap;