Poc:
ms11-077-fon-exploit
my.fon
解压密码:www.mythhack.com
字体库文件缓冲区溢出漏洞- CVE – 2011 – 2003
进行比较的二进制信息
win32k.dll: 6.1.7601.21744 (win7sp1_ldr.110610-1504) VS 6.1.7601.21811 (win7sp1_ldr.110905-1505) (on Windows 7, 32bit)
说明
这张贴是没有技术分析,但它是由性交和直觉的分析,以1天利用驱动 。
MS11 – 077是在第一时间混乱。因为它涉及到4个不同的漏洞,我们应该尝试,以配合这些漏洞,每当我们进行反向工程的功能。这一次,我将不会显示DarunGrim进行比较的结果会导致显示,约50个不同的功能!不要沮丧。它不会花那么长的时间去看看他们。每个函数的10秒内,你可能能够决定是否功能是有趣的或不。
前的准备细节,你也可以寻找到这些。三大功能似乎与空解引用错误(_NtUserfnINLBOXSTRING(), _NtUserfnSENTDDEMSG(), _InterQueueMsgCleanup())。 _ConvertToAndFromWideChar(),函数,似乎与“win32k中使用后的漏洞 – CVE – 2011 – 2011”。
我想集中在这个岗位是FON的缓冲区溢出错误(CVE – 2011 – 2003)。_BmfdOpenFontContext()从DarunGrim进行比较的结果,显示下面的不同点。

什么??补丁版本只增加了立即值’5′为某个值(add EAX,5),以及有关决定分配的大小,计算值。看起来有趣,但奇怪的。这是一次看到的细节,理解上下文。这里去改变周围的老WIN32K.SYS的BB拆卸。
.text:90857F82 loc_90857F82: ; CODE XREF: BmfdOpenFontContext(x)+E2j
.text:90857F82 mov eax, [ebp+numElement]
.text:90857F85 add eax, 7
.text:90857F88 shr eax, 3
.text:90857F8B mov [ebp+var_4], ecx
.text:90857F8E cmp eax, 100h
.text:90857F93 jbe short loc_90857FA1
.text:90857F95 add eax, 28h
.text:90857F98 mov [ebp+var_4], 3
.text:90857F9F jmp short loc_90857FA4
.text:90857FA1
.text:90857FA1 loc_90857FA1: ; CODE XREF: BmfdOpenFontContext(x)+E7j
.text:90857FA1 ; BmfdOpenFontContext(x)+FAj
.text:90857FA1 mov eax, [ebp+preDefinedSize]
.text:90857FA4
.text:90857FA4 loc_90857FA4: ; CODE XREF: BmfdOpenFontContext(x)+106j
.text:90857FA4 push 64666D42h ; Tag
.text:90857FA9 push eax ; int
.text:90857FAA push 0 ; char
.text:90857FAC call _EngAllocMem@12 ; EngAllocMem(x,x,x)
,这是这些大会的伪代码 。变量的命名是在我方便。
uint preDefinedSize = 0×28; // mov dword ptr [ebp-14h], 28h
sizeToAllocate = (numElement + 7) / 8;
if( sizeToAllocate < = 0×100)
sizeToAllocate = preDefinedSize;
else
sizeToAllocate += 0×28;
EngAllocMem(0, sizeToAllocate, 0x64666d42);
所有权利。在打了补丁的版本,将计算sizeToAllocate变量“((numElement + 7)/ 8)+ 5”。花一些时间后,我们怀疑一些的值的范围,应采取“其他”分支,误了“,然后”分支。因为它发生“,然后”分支,分配的大小太小,这种分配的体积小,会导致缓冲区溢出后(我们理解这种解释是远从科学或逻辑的逆向工程,但你应该知道,这马虎的逻辑是足够写1日漏洞。)
更具体地说,我们怀疑numElement值,满足0XAA <=(numElement 7)/ 8 <= 0 × 100,会引起麻烦(虽然我们不知道为什么和怎样!)。修补二进制D. Brumeley等人的论文中,我们得到了这种虚假的失败的想法,“基于自动补丁的漏洞生成是可能的:技术和启示”(http://www.cs.berkeley.edu/~dawnsong /论文/ apeg.pdf)。
事情越来越清楚。我们的目标应该是要找到满足上述声明的输入。从微软TechNet上的描述,“特制的。FON字体文件处理不当”,和函数的名称_BmfdOpenFontContext(),这意味着位图字体驱动程序的东西,我们决定来操纵。FON文件。要发挥。FON文件,我们实现了非常简单的“FON”文件格式承认的fuzzer像工具。使用这个工具,我们想通“宽度”字段相关(*详情,请参阅我们的*的fuzzer)控制numElement变量,它会导致“堆溢出”当变量满足弱势群体的状况。有趣的是,你只需要访问直接包含。FON文件触发位图字体驱动程序
我附上。FON字体我们的Python代码(经西门TATHAM mkwinfont)和WinDBG的崩溃转储文件。我们不知道这个错误其实是可以用来执行任意代码,但我们希望你们离开这个问题。
下载MS11 - 077 FON缓冲区溢出漏洞: my.fon.tar.gz
下载喜欢的工具很简单,*. FON的fuzzer: MS11 - 077 - FON exploit.tar.gz
断点1命中
win32k!BmfdOpenFontContext+0xec:
90857f85 83c007 add eax,7
kd> r
eax=00000730 ebx=fe9aacf0 ecx=00000001 edx=00000001 esi=00000028 edi=fe7fc1f8
eip=90857f85 esp=8a2af8d0 ebp=8a2af904 iopl=0 nv up ei pl nz na pe nc
cs=0008 ss=0010 ds=0023 es=0023 fs=0030 gs=0000 efl=00000206
win32k!BmfdOpenFontContext+0xec:
90857f85 83c007 add eax,7
kd> r eax
eax=00000730
kd> p
win32k!BmfdOpenFontContext+0xef:
90857f88 c1e803 shr eax,3
kd> p
win32k!BmfdOpenFontContext+0xf2:
90857f8b 894dfc mov dword ptr [ebp-4],ecx
kd> r eax
eax=000000e6
kd> g
*** Fatal System Error: 0×00000019
(0×00000020,0xFE1ED440,0xFE1ED5A0,0x4A2C000C)
BREAK指令异常 – 代码80000003(第一次机会)
发生致命系统错误
调试器第一次尝试输入错误检查回调没有被引用。
发生致命系统错误。
连接的Windows 7 7600 x86兼容对象(星期三10月12日18:38:42.012 2011(UTC – 4:00)),ptr64 FALSE
加载内核 用户符号 … … … … … … 载入卸载的模块列表 … … ********** ********* * * * * *检测错误分析* * * *********** *******************************
使用!分析- V,以获得详细的调试信息。
检测错误19,{20,fe1ed440,fe1ed5a0,4a2c000c}
可能是由引起:WIN32K.SYS(win32k! EngFreeMem +1 F)
nt!RtlpBreakWithStatusInstruction:
828be394 cc int 3
kd> !analyze -v
************************************ *******************************************
*
* * 检测错误分析
* * *
****************** ******************************
BAD_POOL_HEADER (19)
参数:
Arg1: 00000020
Arg2: fe1ed440
Arg3: fe1ed5a0
Arg4: 4a2c000c
调试的详细信息
: ——
BUGCHECK_STR: 0x19_20
POOL_ADDRESS: fe1ed440 Paged session pool
DEFAULT_BUCKET_ID: VISTA_DRIVER_FAULT
进程名: csrss.exe
CURRENT_IRQL: 2
LAST_CONTROL_TRANSFER: from 8292fe71 to 828be394
STACK_TEXT:
8a2af3b4 8292fe71 00000003 dda0d4a7 00000065 nt!RtlpBreakWithStatusInstruction
8a2af404 8293096d 00000003 fe1ed440 000001ff nt!KiBugCheckDebugBreak+0x1c
8a2af7c8 829721b6 00000019 00000020 fe1ed440 nt!KeBugCheck2+0x68b
8a2af844 9088c189 fe1ed448 00000000 fe7fc1d8 nt!ExFreePoolWithTag+0x1b1
8a2af858 90950204 fe1ed458 90959cdf fe40f480 win32k!EngFreeMem+0x1f
8a2af86c 90959cf5 fe1ed458 8a2af8d8 8a2af8b4 win32k!BmfdCloseFontContext+0×41
8a2af87c 90965501 fe40f480 00000000 8a2af930 win32k!BmfdDestroyFont+0×16
8a2af8b4 90965554 fe40f480 00000000 8a2afc70 win32k!PDEVOBJ::DestroyFont+0×67
8a2af8e4 908d0d1e 00000000 8a2af910 00000001 win32k!RFONTOBJ::vDeleteRFONT+0×33
8a2af928 908d2d15 fe40f480 050a071e 8a2afc70 win32k!RFONTOBJ::bMakeInactiveHelper+0x25a
8a2af984 908fba77 00000000 8a2afc70 00000000 win32k!RFONTOBJ::vMakeInactive+0×72
8a2afa04 908fbd74 8a2afc3c 00000000 00000004 win32k!RFONTOBJ::bInit+0xe3
8a2afa1c 908a4b2b 8a2afc3c 00000000 00000004 win32k!RFONTOBJ::vInit+0×16
8a2afcb8 908a4a2f 69010742 00000340 00000040 win32k!GreGetCharABCWidthsW+0×86
8a2afd14 8289642a 69010742 00000340 00000040 win32k!NtGdiGetCharABCWidthsW+0xf8
8a2afd14 76f864f4 69010742 00000340 00000040 nt!KiFastCallEntry+0x12a
0435e9ac 00000000 00000000 00000000 00000000 ntdll!KiFastSystemCallRet
STACK_COMMAND: kb
FOLLOWUP_IP:
win32k!EngFreeMem+1f
9088c189 5e pop esi
SYMBOL_STACK_INDEX: 4
SYMBOL_NAME: win32k!EngFreeMem+1f
FOLLOWUP_NAME: MachineOwner
MODULE_NAME: win32k
IMAGE_NAME: win32k.sys
DEBUG_FLR_IMAGE_TIMESTAMP: 4a5bc2a2
FAILURE_BUCKET_ID: 0x19_20_win32k!EngFreeMem+1f
BUCKET_ID: 0x19_20_win32k!EngFreeMem+1f