nul.pw - 漏洞分析
type: channel
link: https://www.nul.pw/category/vunlerability
items: Google Chrome对本地文件进行MIME Sniffing的问题
items: CVE-2016-3267 漏洞细节
items: 从崩溃看起，IE的打印预览是如何工作的？
items: 怎么才能绕过vtguard呢
items: 看看AxMan的源代码是怎么获取COM组件的信息的
items: 360压缩，看来又是个粗制滥造的软件
items: wps这么一推送，又是多少事故
items: XVID整数下溢问题分析
items: Wireshark 2 Preview n*8字节越界读取bug
items: Internet Explorer 11 实例分析 [1]

Google Chrome对本地文件进行MIME Sniffing的问题
type: item
date: 2017-11-12T12:34:19+00:00
description: 偶然发现，不是多严重，本地文件没有MIME，Google Chrome应该只对kSecondaryMappings中的内容进行处理，而其他未知的理应作为plain text处理，但是Chrome却对文件内容进行了嗅探，这导致任何文本文件的内容都可能会被当作脚本执行。63以后版本的Chrome已经修复了此问题。 https://bugs.chromium.org/p/chromium/issues/detail?id=777737

CVE-2016-3267 漏洞细节
type: item
date: 2016-10-13T12:39:00+00:00
description: 几个月前（http://www.nul.pw/2016/03/21/143.html）报告的漏洞，微软现在已经修复。 MS16-119 Microsoft Browser Information Disclosure Vulnerability CVE-2016-3267 Wenxiang Qian of Tencent QQBrowser 今天在seebug看到一篇paper（http://paper.seebug.org/64/），与我报的这个类似。从当时观察res相关处理逻辑的代码来看，这一块就整个是一个大坑。 鉴于这个漏洞十分简单，而且已经超过了6个月的缓和期，我就直接公开了。以下是CVE-2016-3267的细节，也是我报告时的原文（的汉译文）。 PoC by blast(Qian Wenxiang) File Exists: IE11= interactive,interactive IE10- = interactive,complete File Doesn't Exist: IE11= loading,interactive IE10- = interactive,complete so you can tell it in ie11; 漏洞影响 我注意到你们在元素中已经禁止加载res协议的URI了，在CImgHelper::SetImgCtx中有一个检查v31 = CMarkup::CheckForLMZLLoad(v8, 1)会阻止图片的加载，不过攻击者仍然可以通过Iframe来在互联网域下加载一个资源URI。 通过使用readyState属性，攻击者可以检测本地文件是否存在。例如，"interactive,interactive,"代表文件存在并且被载入了iframe，而"loading, interactive"代表文件不存在。 IE11以下的版本(IE5~10)并不受影响，IE5-10不管文件是否存在，readyState状态变化都为"interactive,complete"。也许你们（微软）应该统一IE11为低版本的策略。

从崩溃看起，IE的打印预览是如何工作的？
type: item
date: 2016-05-23T07:38:00+00:00
description: IE自5.5开始引入了打印预览以及自定义的打印预览功能。多亏微软的早期文档，我能从中参考到很多有用信息。 打印预览功能位于res://ieframe.dll/preview.dlg与res://ieframe.dll/preview.js中。在测试中发现雅虎日本地图在打印预览中填入666%的时候会产生崩溃。先不着急分析崩溃，让我们先看看预览和预览缩放的方式。 微软推荐使用CSS的zoom属性来为主容器设置百分比的缩放，这在preview.js中得到了良好的体现： （最后一行） function PositionPages(nDispPage) { var fRendering = false; if ((g_fCheckAutoFit || g_fCheckOrphan) && g_nDocsToCalc > 0) { UndisplayPages(); fRendering = true; } var strDispDoc = DisplayDocument(nDispPage); if (g_aDocTree != null && g_aDocTree[strDispDoc] != null && g_aDocTree[strDispDoc].Pages() > 0) { UndisplayPages(); RecalculateZoom(); MasterContainer.style.zoom = g_nZoomLevel + "%"; …… 与： function ChangeZoom() { MasterContainer.style.zoom = g_nZoomLevel + "%"; PositionPages(g_nDispPage); return g_nZoomLevel; } 在preview.dlg的LN253-256，可以看到MasterContainer，是一个DIV，这也与微软的推荐做法一致。 了解了缩放功能的作用之后，让我们再看一看页面是如何被转入预览中的。 在preview.js的CPrintDoc_AddPage()函数中，可以看到如下的代码注入到了MasterContainer的beforeEnd处。 newHTM = " <IE:DeviceRect media=\"print\" class=page id=mDiv" + this._nStatus + this._strDoc + "p" + aPage.length + ">"; newHTM += "<IE:LAYOUTRECT id=mRect" + this._nStatus + this._strDoc + "p" + aRect.length; newHTM += " class='" + classLayoutRect + "' nextRect=mRect" + this._nStatus + this._strDoc + "p" + (aRect.length + 1); newHTM += " onlayoutcomplete=\"OnRectComplete('" + this._strDoc + "', " + g_ObsoleteBar + ")\""; newHTM += " tabindex=-1 onbeforefocusenter='event.returnValue=false;' "; newHTM += " />"; newHTM += " "; newHTM += HeadFoot.HtmlHead; newHTM += " "; newHTM += " "; newHTM += HeadFoot.HtmlFoot; newHTM += " "; newHTM += "</IE:DeviceRect> "; MasterContainer.insertAdjacentHTML("beforeEnd", newHTM); 有一些特殊的元素。IE:DEVICERECT和IE:LAYOUTRECT。DeviceRect、LayoutRect两个元素用来组合展示页面。每个DeviceRect代表一个页面，LayoutRect为DeviceRect的子元素，IE在它里面显示页面预览。因为preview.dlg指定了XML Namespace（ ）所以元素前带有IE:前缀。 与其他元素不同的是，LayoutRect似乎并没有innerHTML属性。IE只是在里面展示页面的预览，页面并不能操作它。那么问题来了，IE怎么产生的预览？ 要知道这个，让我们先完整地跟踪整个流程。首先，因为打印预览是在res: protocol下的，之前的文章我们介绍了CResProtocol是处理Res Protocol的类，…

怎么才能绕过vtguard呢
type: item
date: 2015-06-03T08:00:00+00:00
description: 有一个基于ie 10的use after free，可是vtguard是个麻烦事儿。算了留待周末再看吧。 看起来是一个从ie8就遗留下来的老问题了 20150609 add 但是代码整理起来相当麻烦，看起来还和运行过程中多线程的时序有关，整体崩溃成功率大致在60%左右，五次有三次成功的样子。 本来想尽快整理完出结果，但是精简过程中就出现了时序被破坏之后的各种不稳定情况，很多时候直接变成了无用的空指针解引用，看来这个东西不闹腾个几个月是出不来了，只求这之前还没人报告给微软了 20150630 add 有了点时间 调整了下 目前触发率提升到了100% 无关的参考链接 http://neilscomputerblog.blogspot.com/2014/04/vtguard.html http://ifsec.blogspot.com/2013/11/exploiting-internet-explorer-11-64-bit.html

看看AxMan的源代码是怎么获取COM组件的信息的
type: item
date: 2015-02-17T14:26:00+00:00
description: 主要看AxMan枚举所有ActiveX的属性的地方。 是个坑，但是偶尔也会填填。 1、如何确定机器上有哪些ActiveX已经装上了？ 很明智的做法： RegOpenKeyEx(HKEY_LOCAL_MACHINE, TEXT("Software\\Classes\\CLSID"), 0, KEY_READ, &hKey); RegQueryInfoKey( hKey, // key handle NULL, // buffer for class name NULL, // size of class string NULL, // reserved &cSubKeys, // number of subkeys NULL, // longest subkey size NULL, // longest class string NULL, // number of values for this key NULL, // longest value name NULL, // longest value data NULL, // security descriptor NULL // last write time ); for (j = 0; j<cSubKeys; j++) { cbName=MAX_PATH; achKey[0] = '\0'; RegEnumKeyEx(hKey, j, achKey, &cbName, NULL, NULL, NULL, &ftime); _ftprintf(output, _T("\t'%s'%s\n"), achKey, j == (cSubKeys-1) ? _T("") : _T(",")); fflush(output); scan_clsid(achKey); } 针对找到的每个CLSID主键都调用一次“自己 GO {CLSID}”，很明智的递归方式，因为我发现在枚举的时候它就崩了无数次了。搁在一个进程里面估计这程序就完了。 2、看看GO CLSID的时候它做了啥： （a）先设置一个异常处理程序，以便出错的时候做报告。 虽然我一次都没见它报告过。 （b）调用CLSIDFromString将传来的CLSID转为CLSID类型，简单来说就是转成这样： typedef struct { unsigned long Data1; unsigned short Data2; unsigned short Data3; byte Data4[ 8 ]; } GUID; （c）读取HKLM\SOFTWARE\CLASSES\CLSID{SOME-CLSID}\的默认值，通常它像是： HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000000-12C9-4305-82F9-43058F20E8D2} (默认) QQDownload IE Left Helper REG_SZ 是的，这里有描述。 （d）再读HKLM\SOFTWARE\CLASSES\CLSID{SOME-CLSID}\ProgId的默认值，通常它的值像是： 还是上面的例子， HKEY_LOCAL_MACHINE\SOFTWARE\Classes\CLSID\{00000000-12C9-4305-82F9-43058F20E8D2}\ProgID (默认) QQIEHelper.QQCycloneHelper.1 REG_SZ 对，就是ProgId，字面意思。 （e）再读HKLM\SOFTWARE\CLASSES\CLSID{SOME-CLSID}\InProc32的默认值，通常它就是要加载的DLL，至于ThreadingModel，大家不是都默认Both或者Apartment了吗，它也没管。 （f）然后就到了最重要的部分，它怎么枚举属性和方法？ [I] 先CoCreateInstance创建一个实例，查询其IObjectSecurity接口； [II] 如果实现了这个接口，查询是否设置了Safe for init和Safe for script位，这个是它待会儿要写到测试的配置里面去的； [III] 调用IDispatch中的GetTypeInfo获取ITypeInfo接口用来展开相关的内容； The ITypeInfo interface provides access to the following: The set of function descriptions associated with the type. For interfaces, this contains the set of member functions in the interface. T…

360压缩，看来又是个粗制滥造的软件
type: item
date: 2014-11-30T16:17:04+00:00
description: 不下两分钟已经弄崩四五次了，出现这么个栈调用，大家也都知道是什么情况了吧： 0:000> kvn # ChildEBP RetAddr Args to Child 00 00128688 7c92de5c 7c801e3a ffffffff c0000409 ntdll!KiFastSystemCallRet (FPO: [0,0,0]) 01 0012868c 7c801e3a ffffffff c0000409 001289d4 ntdll!ZwTerminateProcess+0xc (FPO: [2,0,0]) 02 0012869c 004c9453 ffffffff c0000409 310a3291 kernel32!TerminateProcess+0x20 (FPO: [Non-Fpo]) WARNING: Stack unwind information not available. Following frames may be wrong. 03 001289d4 004712e9 0000011e 0324028a 00000109 360zip+0xc9453

wps这么一推送，又是多少事故
type: item
date: 2014-11-14T10:24:00+00:00
description: 打开wps就崩溃，看看啥原因呗，为了防止被它的异常上报程序捕获，首先先挂上调试器 (1e60.1a6c): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. *** ERROR: Symbol file could not be found. Defaulted to export symbols for D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4867\office6\officespace.DLL - eax=00000000 ebx=00000011 ecx=0036ee80 edx=003428c3 esi=776a8ad0 edi=00000000 eip=7748f3c4 esp=09b3fd00 ebp=09b3fd0c iopl=0 nv up ei pl nz na po nc cs=0023 ss=002b ds=002b es=002b fs=0053 gs=002b efl=00010202 officespace!KActiveLoginInfoCache::vipUrl+0x9e8: 7748f3c4 8b480c mov ecx,dword ptr [eax+0Ch] ds:002b:0000000c=???????? 看看栈 0:017> kvn # ChildEBP RetAddr Args to Child WARNING: Stack unwind information not available. Following frames may be wrong. 00 09b3fd0c 7749235b acc53f64 00000000 09b3fd8c officespace!KActiveLoginInfoCache::vipUrl+0x9e8 01 09b3fd40 77491f93 09b3fd5c acc53f74 06b50300 officespace!KActiveLoginInfoCache::vipUrl+0x397f 02 09b3fd74 774996cf acc53f9c 06b50220 06b50300 officespace!KActiveLoginInfoCache::vipUrl+0x35b7 *** ERROR: Symbol file could not be found. Defaulted to export symbols for D:\Program Files (x86)\Kingsoft\WPS Office\9.1.0.4867\office6\QtCore4.dll - 03 09b3fdb8 668fb948 00000000 00000000 09b3fe00 officespace!KActiveLoginInfoCache::vipUrl+0xacf3 04 09b3fdc8 57b7c556 06b50300 acb26a30 00000000 QtCore4!QThread::setPriority+0x25d 05 09b3fe00 57b7c600 00000000 09b3fe18 76a0338a MSVCR100!_endthreadex+0x3f (FPO: [Non-Fpo]) 06 09b3fe0c 76a0338a 06cc4178 09b3fe58 771c9f72 MSVCR100!_endthreadex+0xce (FPO: [Non-Fpo]) 07 09b3fe18 771c9f72 06cc4178 2660fcd4 00000000 kernel32!BaseThreadInitThunk+0xe (FPO: [Non-Fpo]) 08 09b3fe58 771c9f45 57b7c59c 06cc4178 00000000 ntdll!__RtlUserThreadStart+0x70 (FPO: [Non-Fpo]) 09 09b3fe70 00000000 57b7c59c 06cc4178 00000000 ntdll!_RtlUserThreadStart+0x1b (FPO: [Non-Fpo]) 看看出错的东西是哪儿来的吧 7748f3a7 55 push ebp 7748f3a8 8bec mov ebp,esp 7748f3aa 51 push e…

XVID整数下溢问题分析
type: item
date: 2014-10-18T15:24:00+00:00
description: 先埋坑，旧的那些IE的坑填完了再写这篇好了。 漏洞作者：blast 来源：http://nul.pw/ 0:012> g (2e40.2d4c): Access violation - code c0000005 (!!! second chance !!!) *** ERROR: Symbol file could not be found. Defaulted to export symbols for F:\Windows\system32\xvidcore.dll - xvid是一种规范的编码格式，它属于mpeg4 part 2规范。那开源的xvid解析器在解析所有的mp4时都是正确的吗？显然不是，看看这一个例子吧。 xvidcore在解析一个畸形的mp4文件时，处理vop可能发生整数下溢。vop可以极为简化的理解为帧，当然两者还是有区别的。一个vop的结构看起来像是： vop_start_code (32 bits - 0x000001B6) vop_coding_type (2 bits - 0=I, 1=P, 2=B, 3=S) modulo_time_base (length varies) marker_bit (1 bit - always 1) vop_time_increment (length varies) marker_bit (1 bit - always 1) vop_coded (1 bit - 0 for NVOPs, 1 otherwise) 0x000001b6 是mpeg4 , part 2 规定的startcode。 在AVS流中，start code是一个特殊的bit形式，每组start code都有start code prefix和start code value。start code prefix是由23个0位和1个1位组成，也即0x00 00 01。所有的start code都是按字节对齐的。 0x000001b6是pb_picture_start_code，这代表了一个P图或者B图的开始。前导帧间预测（P图）和双向帧间预测（B图）由一个2位无符号字符表示，01==P图，02==B图。 一个NAL单元结构如下： 1bit 2bits 5bits payload information |-----|----------|-------------------|----------------- FZB NRI NUT RBSP ^---------------header---------------^ forbidden-zero-bit NAL-ref-ide NAL-unit-type NAL是网络抽象层的缩写，这个东西主要是为了向网络友好的环境传输数据用的。要把AVS视频流映射成NAL单元，只要把每个0x000001的数据映射到NAL单元中，然后在start code之前增加一个1字节的NAL单元头即可。 如果对这个有兴趣的话，可以参考一下这本书： http://books.google.com.hk/books?id=6wfGBAAAQBAJ&pg=PA71&lpg=PA71&dq=0x000001b6&source=bl&ots=ZKA_0DM5aF&sig=WJo619-gGY188gxxDUKaX4z0HJI&hl=zh-CN&sa=X&ei=kUpsVO6wFISlmQXl5oDoDw&ved=0CDMQ6AEwAzgK#v=onepage&q=0x000001b6&f=false

Wireshark 2 Preview n*8字节越界读取bug
type: item
date: 2014-10-05T13:43:05+00:00
description: 此bug已提交至官方论坛，bugtrack id 10529，https://bugs.wireshark.org/bugzilla/show_bug.cgi?id=10529。 漏洞作者：blast（http://nul.pw） 事发此崩溃： (14b4.1dd8): Access violation - code c0000005 (first chance) First chance exceptions are reported before any exception handling. This exception may be expected and handled. *** ERROR: Symbol file could not be found. Defaulted to export symbols for F:\Program Files\Wireshark\Qt5Core.dll - *** WARNING: Unable to verify checksum for qtshark.exe *** ERROR: Module load completed but symbols could not be loaded for qtshark.exe Qt5Core!QPersistentModelIndex::row: 00000000`5f2d5bd0 488b01 mov rax,qword ptr [rcx] ds:baadf00d`baadf00d=???????????????? （注：上面这个崩溃是从调试器启动的，所以堆上未初始化的数据是以baadf00d这个填充模式填入的，实际运行时应该是00000000`00000000，上面是越界8字节的情况） 查看崩溃附近的代码： 0:000> ub . Qt5Core!QPersistentModelIndex::operator!=+0x58: 00000000`5f2d5bc8 cc int 3 00000000`5f2d5bc9 cc int 3 00000000`5f2d5bca cc int 3 00000000`5f2d5bcb cc int 3 00000000`5f2d5bcc cc int 3 00000000`5f2d5bcd cc int 3 00000000`5f2d5bce cc int 3 00000000`5f2d5bcf cc int 3 0:000> u . Qt5Core!QPersistentModelIndex::row: 00000000`5f2d5bd0 488b01 mov rax,qword ptr [rcx] 00000000`5f2d5bd3 4885c0 test rax,rax 00000000`5f2d5bd6 7403 je Qt5Core!QPersistentModelIndex::row+0xb (00000000`5f2d5bdb) 00000000`5f2d5bd8 8b00 mov eax,dword ptr [rax] 00000000`5f2d5bda c3 ret 00000000`5f2d5bdb 83c8ff or eax,0FFFFFFFFh 00000000`5f2d5bde c3 ret 00000000`5f2d5bdf cc int 3 崩溃发生在Qt5Core!QPersistentModelIndex::row的第一行，函数试图将第一个参数（rcx）解引用给eax时崩溃。 0:000> .frame /c 1 01 00000000`001da420 00000000`5f8755e6 qtshark+0x90612 rax=baadf00dbaadf00d rbx=00000000001da6e8 rcx=baadf00dbaadf00d rdx=0000000002c04e00 rsi=0000000000000014 rdi=00000000001da630 rip=000000013f820612 rsp=00000000001da420 rbp=00000000001da589 r8=0000000000008000 r9=0000000000000008 r10=0000000000350268 r11=00000000001d9d88 r12=0000000002d3f300 r13=0000000000000003 r14=0000000002d49d30 r15=0000000002d3f300 iopl=0 nv up ei pl nz na po nc cs=0033 ss=002b ds=002b es=002b fs=00…

Internet Explorer 11 实例分析 [1]
type: item
date: 2014-10-01T03:52:00+00:00
description: 介绍了很多Internet Explorer的函数、类的东西了，让我们实战演练一下，分析一个至2014年10月3日微软尚未修复的Internet Explorer 11中存在的空指针引用问题。 ... 等5天后发布