[04] HEVD 内核漏洞之IntegerOverflow
作者:huity
出处:https://www.cnblogs.com/huity35/p/11252574.html
版权:本文版权归作者所有。文章在博客园、看雪、个人博客同时发布。
转载:欢迎转载,但未经作者同意,必须保留此段声明;必须在文章中给出原文连接;否则必究法律责任。
0x00 前言
0x01 漏洞原理
整数溢出
Demo(基于栈的整数溢出)
- #include "stdio.h"
- #include "string.h"
- int main()
- {
- int i;
- char buf[];
- unsigned short int size;
- char overflow[];
- memset(overflow,,sizeof(overflow));
- printf("Input the num:\n");
- scanf("%d",&i);
- size=i;
- printf("size:%d\n",size);
- printf("i:%d\n",i);
- if(size>)
- return -;
- memcpy(buf,overflow,i);//栈溢出
- return ;
- }
上面的demo中,size为无符号短整数(0-65535),当我们输入大于65535是就会造成溢出,例如我们输入65536,最终得到的size为0,从而绕过边界检查,但是在memcpy函数复制数据时,使用的是int类型的i参数,导致栈溢出。
Demo(基于堆的整数溢出)
- #include "stdio.h"
- #include "string.h"
- #include "Windows.h"
- int main()
- {
- int heap;
- unsigned short int size;
- char* v1,*v2;
- HANDLE HeapHandle;
- printf("int put size: \n");
- scanf("%d",&size);
- HeapHandle = HeapCreate(HEAP_GENERATE_EXCEPTIONS,0x100,0xfff);
- if(size <=0x50)
- {
- size-=;
- printf("size:%d\n",size);
- v1=(char*)HeapAlloc(HeapHandle,,size);
- v2=(char*)HeapAlloc(HeapHandle,,0x50);
- }
- HeapFree(HeapHandle,,v1);
- HeapFree(HeapHandle,,v2);
- return ;
- }
上述demo中size为unsigned short int,小于5时,例如,当size=2时,size减去5则得到负数,但size取值范围导致无法识别负数,而得到正数65533,而分配得到大的堆块,从而溢出导致覆盖到后面的堆管理结构。
分析
- __declspec(safebuffers)
- NTSTATUS TriggerIntegerOverflow( _In_ PVOID UserBuffer, _In_ SIZE_T Size)
- {
- ULONG Count = ;
- NTSTATUS Status = STATUS_SUCCESS;
- ULONG BufferTerminator = 0xBAD0B0B0;
- ULONG KernelBuffer[BUFFER_SIZE] = { };//512*4=2048
- SIZE_T TerminatorSize = sizeof(BufferTerminator);//
- PAGED_CODE();
- __try
- {
- //
- // UserBuffer 为Ring3地址 其中前面均用A填充,倒数8字节开始的4字节为Payload地址 最后四字节为0xBAD0B0B0
- ProbeForRead(UserBuffer, sizeof(KernelBuffer), (ULONG)__alignof(UCHAR));
- DbgPrint("[+] UserBuffer: 0x%p\n", UserBuffer);
- DbgPrint("[+] UserBuffer Size: 0x%X\n", Size);
- DbgPrint("[+] KernelBuffer: 0x%p\n", &KernelBuffer);
- DbgPrint("[+] KernelBuffer Size: 0x%X\n", sizeof(KernelBuffer));
- #ifdef SECURE
- //
- // 安全注意:这是安全的,因为开发人员没有对用户提供的值进行任何算术运算。
- //相反,开发人员从KernelBuffer的大小减去ULONG的大小,即x86上的4。 因此,不会发生整数溢出,并且此检查不会失败
- if (Size > (sizeof(KernelBuffer) - TerminatorSize))
- {
- DbgPrint("[-] Invalid UserBuffer Size: 0x%X\n", Size);
- Status = STATUS_INVALID_BUFFER_SIZE;
- return Status;
- }
- #else
- DbgPrint("[+] Triggering Integer Overflow (Arithmetic Overflow)\n");
- // 注意这里是有漏洞的版本
- if ((Size + TerminatorSize) > sizeof(KernelBuffer))//FFFFFFFF+4 = 00000003
- {
- DbgPrint("[-] Invalid UserBuffer Size: 0x%X\n", Size);
- Status = STATUS_INVALID_BUFFER_SIZE;
- return Status;
- }
- #endif
- //实现拷贝操作
- while (Count < (Size / sizeof(ULONG)))
- {
- if (*(PULONG)UserBuffer != BufferTerminator)
- {
- KernelBuffer[Count] = *(PULONG)UserBuffer;
- UserBuffer = (PULONG)UserBuffer + ;
- Count++;
- }
- else
- {
- break;
- }
- }
- }
- __except (EXCEPTION_EXECUTE_HANDLER)
- {
- Status = GetExceptionCode();
- DbgPrint("[-] Exception Code: 0x%X\n", Status);
- }
- return Status;
- }
函数中比较了用户提交缓冲区长度和内核缓冲区长度,在有漏洞的版本中,这一比较采用了:
- if ((Size + TerminatorSize) > sizeof(KernelBuffer))

我们在Windbg中同样可以看到这一问题:
- 97c4ba9f 8b450c mov eax,dword ptr [ebp+0Ch]
- 97c4baa2 0345d4 add eax,dword ptr [ebp-2Ch]
- 97c4baa5 3d00080000 cmp eax,800h
- kd> r eax
- eax=
- kd> r
- eax= ebx= ecx=ffffffff edx=0000004d esi=86e61528 edi=860fff80
- eip=97c80adb esp=9398f268 ebp=9398fab0 iopl= nv up ei ng nz na pe cy
- cs= ss= ds= es= fs= gs= efl=
- HEVD!TriggerIntegerOverflow+0x16b:
- 97c80adb 8b450c mov eax,dword ptr [ebp+0Ch] ss::9398fabc=ffffffff
- kd> dd 9398fab0
- 9398fab0 9398fad4 97c80956 ffffffff
- 9398fac0 c0000001 ffffffff
- 9398fad0 9398fafc 97c800ae 86e6a870
- 9398fae0 86e6a8e0
- 9398faf0 c00000bb 86e6a8e0 9398fb14
- 9398fb00 83e7f593 86e61528 86e6a870 86e6a870
- 9398fb10 86e61528 9398fb34 8407399f 860fff80
- 9398fb20 86e6a870 86e6a8e0 0498fbac
0x02 漏洞利用


0x03 漏洞反思
0x04 链接
[04] HEVD 内核漏洞之IntegerOverflow的更多相关文章
- [02] HEVD 内核漏洞之栈溢出
作者:huity出处:http://www.cnblogs.com/huity35/版权:本文版权归作者所有.文章在看雪.博客园.个人博客同时发布.转载:欢迎转载,但未经作者同意,必须保留此段声明:必 ...
- [03] HEVD 内核漏洞之UAF
作者:huity出处:https://www.cnblogs.com/huity35/p/11240997.html版权:本文版权归作者所有.文章在博客园.个人博客同时发布.转载:欢迎转载,但未经作者 ...
- 内核漏洞学习—熟悉HEVD
一直以来内核漏洞安全给很多人的印象就是:难,枯燥.但是内核安全是否掌握是衡量一个系统安全工程师水平的标准之一,也是安全从业人员都应该掌握的基本功.本文通过详细的实例带领读者走进内核安全的大门.难度系数 ...
- 【翻译】 Windows 内核漏洞学习—空指针解引用
Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/windo ...
- Windows 内核漏洞学习—空指针解引用
原标题:Windows Kernel Exploitation – NullPointer Dereference 原文地址:https://osandamalith.com/2017/06/22/w ...
- CVE-2014-0038内核漏洞原理与本地提权利用代码实现分析 作者:seteuid0
关键字:CVE-2014-0038,内核漏洞,POC,利用代码,本地提权,提权,exploit,cve analysis, privilege escalation, cve, kernel vuln ...
- Android内核漏洞利用技术实战:环境搭建&栈溢出实战
前言 Android的内核采用的是 Linux 内核,所以在Android内核中进行漏洞利用其实和在 一般的 x86平台下的 linux 内核中进行利用差不多.主要区别在于 Android 下使用的是 ...
- Linux kernel pwn notes(内核漏洞利用学习)
前言 对这段时间学习的 linux 内核中的一些简单的利用技术做一个记录,如有差错,请见谅. 相关的文件 https://gitee.com/hac425/kernel_ctf 相关引用已在文中进行了 ...
- 初识linux内核漏洞利用
0x00 简介 之前只接触过应用层的漏洞利用, 这次第一次接触到内核层次的,小结一下. 0x01 概况 这次接触到的,是吾爱破解挑战赛里的一个题,给了一个有问题的驱动程序,要求在ubuntu 14.0 ...
随机推荐
- C语言实现常用排序算法——插入排序
插入排序是最基础的排序算法,原理: 首先1个元素肯定是有序的,所以插入排序从第二个元素开始遍历:内循环首先请求一个空间保存待插入元素,从当前元素向数组起始位置反向遍历:当发现有大于待插入元素的元素,则 ...
- SpringCloud-分布式配置中心【加密-非对称加密】
案例代码:https://github.com/q279583842q/springcloud-e-book 非对称加密 一.什么是非对称加密(Asymmetric encryption) 二.Jav ...
- Spring Boot2(四):使用Spring Boot多数据源实现读写分离
前言 实际业务场景中,不可能只有一个库,所以就有了分库分表,多数据源的出现.实现了读写分离,主库负责增改删,从库负责查询.这篇文章将实现Spring Boot如何实现多数据源,动态数据源切换,读写分离 ...
- Loadrunner做性能测试的主要步骤
Loadrunner做性能测试的主要步骤: Loadrunner将性能测试过程分为计划测试.测试设计.创建VU脚本.创建测试场景.运行测试场景和分析结果6个步骤. 1) 计划测试:主要进行测试需求的收 ...
- java小数保留位数四舍五入
方法一:四舍五入 double f = 111231.5585; BigDecimal b = new BigDecimal(f); double f1 = b.setScale(2, Roundin ...
- Storm 学习之路(三)—— Storm单机版本环境搭建
1. 安装环境要求 you need to install Storm’s dependencies on Nimbus and the worker machines. These are: Jav ...
- 重磅发布:阿里开源 OpenJDK 长期支持版本 Alibaba Dragonwell
原文地址:https://yq.aliyun.com/articles/694603 本文作者:阿里开源 本文来自云栖社区合作伙伴"阿里系统软件技术",了解相关信息可以关注&qu ...
- SpringBoot 缓存注解 与EhCache的使用
在SpringBoot工程中配置EhCache缓存 1.在src/main/resources下新建ehcache.xml文件 eternal=true //缓存永久有效,false相反 maxEle ...
- 【转载】一起来学Spring Cloud | Eureka Client注册到Eureka Server的秘密
LZ看到这篇文章感觉写得比较详细,理解以后,便转载到自己博客中,留作以后回顾学习用,喝水不忘挖井人,内容来自于李刚的博客:http://www.spring4all.com/article/180 一 ...
- Programming In Lua 第八章
1, 也就是说,lua虽然会把代码预编译成中间码,以提高运行速度.但其会在程序运行过程中需要编译器,所以其仍然是解释型语言.loadfile会加载一个文件并将其编译成中间码,并返回一个函数. 2, 3 ...