[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 ...
随机推荐
- Linux精要
Linux入门精要 Linux历史 1970年: linux元年,起始开发者为 Kenneth Lane Thompson 和 Dernis Ritchie, 现在知道为啥很多计算机是用1970年1月 ...
- Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核
Qemu搭建ARM vexpress开发环境(二)----通过u-boot启动Linux内核 标签(空格分隔): Qemu ARM Linux 在上文<Qemu搭建ARM vexpress开发环 ...
- gitlab安装笔记一_虚拟机中安装Centos7
(为搭建gitlab环境的准备) 环境:vmware workstation 12 pro 系统: CentOS-7-x86_64-Everything-1804.iso (CentOS-7-Min ...
- 曹工说Tomcat1:从XML解析说起
一.前言 第一次被人喊曹工,我相当诧异,那是有点久的事情了,楼主13年校招进华为,14年在东莞出差,给东莞移动的通信设备进行版本更新.他们那边的一个小伙子来接我的时候,这么叫我的,刚听到的时候,心里一 ...
- webapi使用autofac
注意:您的项目中如果使用的是webapi2,此处必须为webapi2而不是webapi,否则在运行时将出现“重写成员“Autofac.Integration.WebApi.AutofacWebApiD ...
- scikit-learn学习笔记-bili莫烦
bilibili莫烦scikit-learn视频学习笔记 1.使用KNN对iris数据分类 from sklearn import datasets from sklearn.model_select ...
- leadcode的Hot100系列--78. 子集--位运算
看一个数组的子集有多少,其实就是排列组合, 比如:[0,1] 对应的子集有:[] [0] [1] [1,1] 这四种. 一般对应有两种方法:位运算 和 回溯. 这里先使用位运算来做. 位运算 一个长度 ...
- 走进python
python史 1.python之父 Guido van Rossum 2.python的优缺点 优点:开发效率高,可跨平台,可嵌入,可扩展,优雅简洁 缺点:运行稍慢,代码不能加密,不能实现真正的多线 ...
- HashMap源码分析(一):JDK源码分析系列
正文开始 注:JDK版本为1.8 HashMap1.8和1.8之前的源码差别很大 目录 简介 数据结构 类结构 属性 构造方法 增加 删除 修改 总结 1.HashMap简介 HashMap基于哈希表 ...
- Qt实现表格控件-支持多级列表头、多级行表头、单元格合并、字体设置等
目录 一.概述 二.效果展示 三.定制表头 1.重写数据源 2.重写QHeaderView 四.设置属性 五.相关文章 原文链接:Qt实现表格控件-支持多级列表头.多级行表头.单元格合并.字体设置等 ...