<?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>Ring3 Circus</title>
	<atom:link href="http://www.ring3circus.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.ring3circus.com</link>
	<description>Diary of a programmer, journal of a hacker.</description>
	<lastBuildDate>Sun, 05 Apr 2009 20:12:46 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>NAS Troubleshooting via the Back Door</title>
		<link>http://www.ring3circus.com/hacking/nas-troubleshooting-via-the-back-door/</link>
		<comments>http://www.ring3circus.com/hacking/nas-troubleshooting-via-the-back-door/#comments</comments>
		<pubDate>Sun, 05 Apr 2009 16:34:38 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[nas]]></category>
		<category><![CDATA[path traversal]]></category>
		<category><![CDATA[samba]]></category>
		<category><![CDATA[smb]]></category>
		<category><![CDATA[smb.conf]]></category>
		<category><![CDATA[sumvision]]></category>

		<guid isPermaLink="false">http://www.ring3circus.com/?p=68</guid>
		<description><![CDATA[I recently bought a NAS enclosure with 1TB of storage for my humble home LAN. While I eventually managed to identify the manufacturer as a firm called &#8216;Sumvision&#8217;, the packaging didn&#8217;t make this obvious and upon opening it up I got that distinct and familiar feeling of &#8216;you&#8217;re on your own from here&#8217;. Of course, [...]]]></description>
			<content:encoded><![CDATA[<p>I recently bought a NAS enclosure with 1TB of storage for my humble home LAN. While I eventually managed to identify the manufacturer as a firm called &#8216;Sumvision&#8217;, the packaging didn&#8217;t make this obvious and upon opening it up I got that distinct and familiar feeling of &#8216;you&#8217;re on your own from here&#8217;. Of course, none of this came as a surprise (given the price I paid) and I was pleasantly surprised to find a fresh set of firmware available on the website (version 2.4.4-Jul 8 2008). What did upset me, though, was the awful performance I experienced when using it over my wireless connection. A short Google later it became apparent that this is a common problem with NAS devices, caused by the typically higher packet-loss experienced on wireless connections. Briefly put, SAMBA (and NFS) transmission units often default to 8192 bytes or more, whereas IPv4 networks without the relatively new jumbo frame support will fragment anything above the 1500-or-so-byte MTU. The suggested fix, for SAMBA devices such as mine, is to tweak this value in the server&#8217;s smb.conf:</p>
<p>
<pre>socket options = TCP_NODELAY IPTOS_LOWDELAY SO_KEEPALIVE SO_RCVBUF=1024 SO_SNDBUF=1024</pre>
</p>
<p>Alas, I found no obvious way to modify these values in the enclosure&#8217;s web interface. Furthermore, extracting the hard-drive and mounting it locally proved that it is used for content storage only &#8211; the OS sits on a ROM, away from the user&#8217;s grubby fingers. And so I was out of luck and was at the point of giving up, until curiosity got the better of me. Taking a look at the &#8217;shares&#8217; page of the admin interface it was pretty clear that this thing was running a Unix-based OS (disclosing local paths such as &#8216;/mnt/C/Media/Music&#8217;), and if their implementation was as flaky as their design there may be another way in.</p>
<p><a href="http://www.ring3circus.com/wp-content/uploads/shares.png" ><img src="http://www.ring3circus.com/wp-content/uploads/shares-300x200.png" alt="Web interface &#039;shares&#039; page" title="shares" width="300" height="200" class="size-medium wp-image-66" /></a></p>
<p>So I tried what any hacker would have done faced with this input field, and tried to traverse the device-local path using some &#8216;../&#8217;s.</p>
<p><a href="http://www.ring3circus.com/wp-content/uploads/traversal.png" ><img src="http://www.ring3circus.com/wp-content/uploads/traversal-300x200.png" alt="Path-traversal attack" title="traversal" width="300" height="200" class="size-medium wp-image-67" /></a></p>
<p>Now I won&#8217;t pretend that it was big, clever or original, but to my surprise it worked. Browsing to &#8216;\\nas\Root&#8217; from my computer landed me right in the device&#8217;s root, with admin read/write privileges. For those wondering, the OS is BusyBox.</p>
<p><a href="http://www.ring3circus.com/wp-content/uploads/samba.png" ><img src="http://www.ring3circus.com/wp-content/uploads/samba-300x258.png" alt="The resulting SAMBA root share" title="samba" width="300" height="258" class="size-medium wp-image-65" /></a></p>
<p>And the rest is history. A couple of words of warning to anybody planning on doing the same:</p>
<ul>
<li>In order to access this root share, the device obviously needs to boot and mount successfully. As such I wouldn&#8217;t be the slightest bit surprised if any undue alterations to the OS or its configuration result in the device being rendered permanently unusable. I never did brick mine and so haven&#8217;t confirmed this, but be very careful what you touch.</li>
<li>/config/smb.conf is presumably kept open at all times, and so you&#8217;ll likely have trouble saving to it. I found that saving as a different file and then renaming them around works fine. Be aware that there is very little excess space to play with (I suspect it&#8217;s mounted as a ramdrive).</li>
<li>The smb.conf, at least, seems quite volatile, in that any changes via the web interface result in the [global] parameters being reset to their defaults. I have observed the alterations to persist across reboots but couldn&#8217;t offer a comprehensive list of actions that result in it being wiped clean, so don&#8217;t be surprised if you find that your fixes disappear when you&#8217;re not looking.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ring3circus.com/hacking/nas-troubleshooting-via-the-back-door/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Strong-Name Signing, AdmiralDebilitate v0.1</title>
		<link>http://www.ring3circus.com/rce/strong-name-signing-admiraldebilitate-v01/</link>
		<comments>http://www.ring3circus.com/rce/strong-name-signing-admiraldebilitate-v01/#comments</comments>
		<pubDate>Mon, 16 Jun 2008 00:00:07 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[RCE]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[AdmiralDebilitate]]></category>
		<category><![CDATA[Dependency Walker]]></category>
		<category><![CDATA[Digital]]></category>
		<category><![CDATA[Signed]]></category>
		<category><![CDATA[Signing]]></category>
		<category><![CDATA[SN]]></category>
		<category><![CDATA[Strong Name]]></category>

		<guid isPermaLink="false">http://www.ring3circus.com/rce/strong-name-signing-admiraldebilitate-v01/</guid>
		<description><![CDATA[Update: It has been pointed out to me that strong naming serves a somewhat more noble purpose than to act as a simple anti-patch mechanism (you can read about it here) and so the tone of this post is perhaps a little inappropriate. However, considering that it is so widely used for exactly this purpose, [...]]]></description>
			<content:encoded><![CDATA[<p><em>Update: It has been pointed out to me that strong naming serves a somewhat more noble purpose than to act as a simple anti-patch mechanism (you can read about it <a href="http://msdn.microsoft.com/en-us/library/h4fa028b(VS.80).aspx" onclick="javascript:urchinTracker('/outbound/article/http://msdn.microsoft.com/en-us/library/h4fa028b(VS.80).aspx');">here</a>) and so the tone of this post is perhaps a little inappropriate. However, considering that it is so widely used for exactly this purpose, the tool&#8217;s usefulness stands.</em></p>
<p>It has taken a little while, but the application of asymmetric cryptography to binary signing is becoming popular. This is reflected in the intrinsic DSA signing mechanism offered by the .NET framework. If you aren&#8217;t familiar with <em>strong name signing</em>, the idea is fairly simple: The creator of a .NET assembly has their own RSA key pair, which they use to encrypt a combination of hashes of the file. The resulting strong-name signature is included in the binary along with the public key and the whole lot is distributed as normal. Now, whenever a user tries to load this assembly, the public key and signature are used to verify the integrity of the file, thus thwarting the attempts of any bad guys to patch the assembly. And of course, because the private key is never published, it is virtually impossible for the file to be re-signed with the same key after its release.</p>
<p>The method of digital signing is remarkably effective at preventing patching and without the use of a hypercomputer, the chances of anyone cracking the key is as good as zero. Also of note is that the code responsible for verifying the signature is part of the system&#8217;s .NET assembly loader, and therein lies both a strength and the weakness of the technique. While this makes it easy for developers to sign their assemblies (very easy indeed using Visual Studio), it also unifies the implementation allowing for automated removal of such signatures. The weak point in the protection is obviously the DSA signature-checking algorithm, but it lies in system code and so for many reverse-engineers, bypassing it is undesirable or impossible. So we target the next best thing &#8211; the metadata in the assembly itself. If the assembly looks like it isn&#8217;t signed then that is exactly how it will be treated.</p>
<p>The exact structure of the relevant metadata is described in the .NET specification, and the steps necessary to remove the signing have been concisely detailed <a href="http://www.codeproject.com/KB/security/StrongNameRemove20.aspx" onclick="javascript:urchinTracker('/outbound/article/http://www.codeproject.com/KB/security/StrongNameRemove20.aspx');">here</a>. Even more generously, Andrea provides us in that article us with a tool to remove the signatures from a single file. Similar programs can be found elsewhere on the web but nowhere did I see a tool that&#8217;s capable of handling complex projects with nested binary dependencies. The problem here is that the public key is stored both in a binary itself and each assembly that references it, so if you&#8217;re patching a DLL deep in a dependency structure, it is nontrivial to isolate and execute all the necessary patches. That&#8217;s why I created AdmiralDebilitate.</p>
<p><a href="http://www.ring3circus.com/source/admiraldebilitate/admiraldebilitate.png" ><img src="http://www.ring3circus.com/source/admiraldebilitate/admiraldebilitate_tn.png" alt="AdmiralDebilitate Screenshot" /></a></p>
<p>If you load up any number of PE files, AdmiralDebilitate will enumerate all .NET dependencies and provide you with a tree, much like the Dependency Walker. From here, you can &#8216;mark&#8217; any and all assemblies that you intend to patch, and all the work of identifying dependants and patching out the headers will be done for you. I provide no further instructions but it should be self-explanatory. As usual, this is a one-man project and the code is correspondingly immature so please report any bugs.</p>
<p><strong>Get the source and binary <a href="http://www.ring3circus.com/downloads/admiraldebilitate/" >here</a>.</strong></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ring3circus.com/rce/strong-name-signing-admiraldebilitate-v01/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>An Introduction To .NET Reversing</title>
		<link>http://www.ring3circus.com/rce/an-introduction-to-net-reversing/</link>
		<comments>http://www.ring3circus.com/rce/an-introduction-to-net-reversing/#comments</comments>
		<pubDate>Fri, 23 May 2008 00:00:10 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[RCE]]></category>
		<category><![CDATA[.NET]]></category>
		<category><![CDATA[CIL]]></category>
		<category><![CDATA[CLR]]></category>
		<category><![CDATA[Cracking]]></category>
		<category><![CDATA[ILAsm]]></category>
		<category><![CDATA[ILDAsm]]></category>
		<category><![CDATA[MSIL]]></category>
		<category><![CDATA[Reflector]]></category>

		<guid isPermaLink="false">http://www.ring3circus.com/rce/an-introduction-to-net-reversing/</guid>
		<description><![CDATA[The first time I saw a .NET application, I was scared. I was scared of the unknown and this fear was only heightened after looking closer with OllyDbg, IDA and LordPE. I imagine that every seasoned reverser out there felt the same way. Well if that&#8217;s you, and you&#8217;re anything like me, then you&#8217;ll have [...]]]></description>
			<content:encoded><![CDATA[<p>The first time I saw a .NET application, I was scared. I was scared of the unknown and this fear was only heightened after looking closer with OllyDbg, IDA and LordPE. I imagine that every seasoned reverser out there felt the same way. Well if that&#8217;s you, and you&#8217;re anything like me, then you&#8217;ll have avoided the .NET paradigm-shift for as long as possible. But after seeing new .NET articles and tools popping up left, right and centre, I decided it was time to face my demons and get comfortable with the inevitable future. This post is aimed at those familiar with native RCE but not with .NET, and forms a distillation of the essential facts you&#8217;ll need to get started.</p>
<p>You probably already know that .NET is a semi-compiled language &#8211; that is, a .NET binary (called an &#8216;assembly&#8217;) exists as bytecode that is compiled into native code just before execution. The bytecode is called Common Intermediate Language, or CIL, (formerly known as Microsoft Intermediate Language &#8211; MSIL) and it is the product of any C#, VB.NET or J# compilation. These exe and DLL assemblies are wrapped up inside regular PE files having only one import &#8211; mscoree.dll &#8211; which acts as the assembly&#8217;s just-in-time (JIT) compiler and its gateway to the .NET Framework and its platform API, the Common Language Runtime (CLR). The PE header&#8217;s data directory contains a .NET directory entry, which points to a new header in the file containing everything the operating system needs to run it.</p>
<p>There are a lot of changes from the familiar native situation, some of which work for us and some against. From a hacker&#8217;s perspective, there are some pros:</p>
<ul>
<li>CIL is reflective, meaning that the structure of the code can be deterministically inferred from its assembly.</li>
<li>For JIT compilation, linking and introspection to work, a considerable amount of type information must remain in the assembly.</li>
<li>.NET assemblies are a few levels of abstraction away from the user-mode platform, so there is far less scope for obfuscation, and anti-debug tricks.</li>
<li>The CLR provides standardised interfaces for a tremendous amount of functionality for standard operations, and this is typically embraced by .NET programmers. The result is short, concise code that can reveal even very complex algorithms at a glance.</li>
</ul>
<p>and, of course, some cons:</p>
<ul>
<li>The assembly effectively runs in a virtual machine, meaning the operations-to-clock-cycles ratio is a few orders of magnitude higher. This is of immediate consequence if you are tracing through the program natively (i.e. debugging the JIT compiler).</li>
<li>The abstracted nature of the program&#8217;s entities means that old friends like Olly&#8217;s &#8216;registers&#8217; and &#8217;stack&#8217; windows are of very little use. In fact, the applicability of a low-level debugger is altogether questionable.</li>
<li>While the relatively small community is making tremendous efforts, the science of .NET RCE is still quite young and so the tools available are correspondingly immature and thin on the ground.</li>
</ul>
<p>So put OllyDbg, LordPE and your hex-editor aside (you may want to keep IDA within reach) and meet your new arsenal:</p>
<ul>
<li><strong><a href="http://www.aisto.com/roeder/dotnet/" onclick="javascript:urchinTracker('/outbound/article/http://www.aisto.com/roeder/dotnet/');">Lutz Roeder&#8217;s .NET Reflector</a></strong> is perhaps the best-known and most advanced .NET reversing tool. It&#8217;s also an invaluable asset for every .NET job, giving you in-depth at-a-glance information about any assembly.</li>
<li><strong>ILDAsm</strong> &#8211; This is Microsoft&#8217;s CIL disassembler and is far more useful than any native equivalent. You can download it from MSDN if necessary, but it comes as a part of Visual Studio (all versions) and can be found either at ($ProgramFiles)\Microsoft SDKs\Windows\[Version]\bin or ($VisualStudioDir)\SDK\2.0\&#8230; depending on your version. Be sure to check your non-x86 Program Files directory if you&#8217;re running Windows x64.</li>
<li><strong>ILAsm</strong> &#8211; As you guessed, this is the CIL assembler. The great thing about this is that in many circumstances, you can pipe ILDAsm&#8217;s output into ILAsm and end up with a fully working assembly.
<li><strong><a href="http://www.ntcore.com/exsuite.php" onclick="javascript:urchinTracker('/outbound/article/http://www.ntcore.com/exsuite.php');">Explorer Suite</a></strong> &#8211; A Swiss Army Knife of .NET-aware tools. This will be your new PE editor for all things .NET.
<p>(I recommend you take a look around <a href="http://www.ntcore.com/articles.php" onclick="javascript:urchinTracker('/outbound/article/http://www.ntcore.com/articles.php');">Dan Pistelli&#8217;s site</a> once you&#8217;re comfortable with the terrain as he&#8217;s produced a lot of marvellous tools that can cut your workload down considerably.)</li>
</ul>
<p>If you were wondering where the debugger is, then my answer is that you&#8217;re probably better off without one, at least for the moment. It would of course be a very handy addition, but I haven&#8217;t found any .NET debuggers that work too well. <a href="http://pzsolt.blogspot.com/" onclick="javascript:urchinTracker('/outbound/article/http://pzsolt.blogspot.com/');">DILE</a> is promising, but it&#8217;s very unstable on my 64-bit Windows, and WinDbg puts in a good effort with the SoS extension running, but you won&#8217;t find anything that&#8217;s a joy to use.</p>
<p>So with all the framework in place it&#8217;s remarkably easy to get going. The first step is to take a look at your target assembly in Reflector and get a feel for the program. If it isn&#8217;t obfuscated then you&#8217;ll probably be surprised how easy this is (in the many cases it&#8217;s just like having the source code). If it <em>is</em> obfuscated then you may need to work a little harder, or perhaps skip straight ahead to the next step:</p>
<p><tt>ildasm Target.exe /out=Target.il</tt></p>
<p>The resulting file contains a complete CIL listing of the assembly, which you can edit at your leisure. You may want to Google &#8216;MSIL&#8217; to get an idea of what all those alien-looking opcodes do, but it&#8217;s really quite straightforward to do the basics:</p>
<ul>
<li>&#8216;Push&#8217; instructions start with ld (load), &#8216;Pop&#8217;s with st (store).</li>
<li>There is no MOV instruction. In order to copy from one place to another, push then pop.</li>
<li>Most manipulation involves arguments and locals, which are referenced by index using a dot, e.g.<br />
<tt>ldarg.1 // Push the second argument<br />
stloc.0 // Pop it into the first local</tt></li>
<li>Constants are pushed using ldc. The size and type of constant must also be specified e.g.<br />
<tt>ldc.i4 12 // Push a 4-byte integer (of value 12)<br />
ldc.r4 33.33 // Push a 32-bit float</tt></li>
<li>The values are returned by pushing them onto the stack prior to a return (ret)</li>
</ul>
<p>Far more complete references exist on the web if you&#8217;re willing to search, but this is enough to short-circuit a function or two. Once you&#8217;re done playing with the CIL, compile it back up, being sure to specify any resource files that were created by the disassembler:</p>
<p><tt>ilasm [/dll] Target.il [/res=Target.res] /out=TargetNew.dll</tt></p>
<p>And you&#8217;re all ready to go. This is sufficient for the most basic cases, but it will only be a matter of time before you encounter an obfuscated assembly (which will cause you problems in Reflector) or one that&#8217;s signed using strong-names (which will refuse to run after compilation). I&#8217;ll discuss both of these situations and any relevant workarounds another day.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ring3circus.com/rce/an-introduction-to-net-reversing/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>D3DLookingGlass v0.1</title>
		<link>http://www.ring3circus.com/gameprogramming/d3dlookingglass-v01/</link>
		<comments>http://www.ring3circus.com/gameprogramming/d3dlookingglass-v01/#comments</comments>
		<pubDate>Mon, 05 May 2008 00:00:42 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Game Programming]]></category>
		<category><![CDATA[RCE]]></category>
		<category><![CDATA[D3D]]></category>
		<category><![CDATA[D3DLookingGlass]]></category>
		<category><![CDATA[direct3d]]></category>
		<category><![CDATA[DirectX]]></category>
		<category><![CDATA[Glass]]></category>
		<category><![CDATA[hook]]></category>
		<category><![CDATA[Injection]]></category>
		<category><![CDATA[Looking]]></category>
		<category><![CDATA[System-Wide]]></category>
		<category><![CDATA[Windowed]]></category>
		<category><![CDATA[Windowed-Mode]]></category>

		<guid isPermaLink="false">http://www.ring3circus.com/gameprogramming/d3dlookingglass-v01/</guid>
		<description><![CDATA[Update: Like all the other Direct3D hooks on the site, this doesn’t actually work anymore. Feel free to use it for reference or kindling or whatever, but don’t expect it to have any practical use. As soon as I get ’round to bring it up to scratch I’ll put out another post. Sorry about that.
The [...]]]></description>
			<content:encoded><![CDATA[<p><em>Update: Like all the other Direct3D hooks on the site, this doesn’t actually work anymore. Feel free to use it for reference or kindling or whatever, but don’t expect it to have any practical use. As soon as I get ’round to bring it up to scratch I’ll put out another post. Sorry about that.</em></p>
<p>The topic of debugging full-screen Direct3D applications came up a little while ago. If you&#8217;ve ever tried it on a single-monitor setup (or even multi-monitor if the app wasn&#8217;t designed to handle it) then you&#8217;ll know how much of a pain it is. Windows just can&#8217;t handle focus being stolen from a suspended exclusive-mode program. The solution&#8217;s exactly what you&#8217;d expect &#8211; to intercept the relevant window- and device-creation calls and coax the debuggee into running in a window. This works, but fiddling with the calls manually each time you restart the process quickly gets boring. So here&#8217;s my first attempt at a generic solution.</p>
<p>D3DLookingGlass is a DLL which, if injected into a Direct3D process early enough, will make sure that all video devices are created in windowed mode, allowing the hosting process to coexist with a debugger without any bother. If you can inject this DLL into the target process before the first call to CreateWindow, then everything <em>should</em> go smoothly. I think. Any later than this and your mileage may vary.</p>
<p>I&#8217;ve also written a &#8216;loader&#8217; program that installs the DLL as a system-wide CBT hook, so that you don&#8217;t need to inject it manually. This <em>kind of</em> worked for my limited set of test-cases, but there seems to be no Windows-hooks method of injecting a DLL globally <em>and</em> beating the call to CreateWindow. Windows installs the DLL containing the hook at the latest possible moment for its function, and I can find no type of hook that needs to be around before a window is created. I&#8217;d love for somebody to prove me wrong (or suggest another way to install the DLL system-wide), but by the looks of things, my loader is of limited use. </p>
<p>In particular, I recall a situation where the game (Call Of Duty 4 Demo, I think) creates a non-overlapped window, which works fine for full-screen mode, but causes problems when you try force the device to bind as windowed. This will still be a problem unless the call to CreateWindow can be intercepted (and a well-formed window induced), which means that D3DLookingGlassLoader will struggle. Confirmation would be nice.</p>
<p>Here&#8217;s the source: <a href="http://www.ring3circus.com/source/D3DLookingGlass_Source.zip" onclick="javascript:urchinTracker('/downloads/source/D3DLookingGlass_Source.zip');"><b>D3DLookingGlass_Source.zip</b></a></p>
<p>Here&#8217;s the binary: <a href="http://www.ring3circus.com/source/D3DLookingGlass_Binary.zip" onclick="javascript:urchinTracker('/downloads/source/D3DLookingGlass_Binary.zip');"><b>D3DLookingGlass_Binary.zip</b></a></p>
<p>Here&#8217;s the small-print:</p>
<ul>
<li>The DLL hooks CreateWindowExW and ShowWindow in its DLLMain. I think this is kosher in terms of loader-lock, but it&#8217;s obviously not too cool with regard to system stability. Especially if it&#8217;s being installed in every running process. If d3d9.dll isn&#8217;t found in the address-space then the hooks fall straight through, so that shouldn&#8217;t be too much of a problem. But if it <em>is</em> found then all attempts to create or show (or hide) a window will be overridden &#8211; possibly to the demise of the process if it&#8217;s doing anything but the basic behaviour. So in all cases, watch out, and make sure you aren&#8217;t running anything important in the background (in particular, I&#8217;ve noticed that it doesn&#8217;t play nice with Firefox).</li>
<li>The loader uses a system-wide hook, and you hate system-wide hooks. I trust that anybody who needs this tool has some degree of technical expertise and is aware of the stability concerns inherent in installing somebody else&#8217;s barely-tested system-wide hook.</li>
<li>This was harder to put together than I anticipated, and that&#8217;s probably evident from the slightly shabby code. Again, I intend for this only to be used for debugging purposes, so you&#8217;ll have to forgive me for the sub-production-quality code.</li>
<li>Despite the focus on Direct3D of this blog, I&#8217;m not really a gamer and I don&#8217;t actually have any commercial games installed on this machine. So I only got a chance to test this against my own programs. Obviously, there are several ways to skin the metaphorical Direct3D-initialisation cat, so please leave a comment when you find a game that this chokes on.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://www.ring3circus.com/gameprogramming/d3dlookingglass-v01/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Tracing Over System Calls In OllyDbg</title>
		<link>http://www.ring3circus.com/rce/tracing-over-system-calls-in-ollydbg/</link>
		<comments>http://www.ring3circus.com/rce/tracing-over-system-calls-in-ollydbg/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 00:00:19 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[RCE]]></category>
		<category><![CDATA[OllyDbg]]></category>
		<category><![CDATA[run-trace]]></category>
		<category><![CDATA[SYSCALL]]></category>
		<category><![CDATA[SYSENTER]]></category>
		<category><![CDATA[system calls]]></category>
		<category><![CDATA[trace]]></category>
		<category><![CDATA[tracing]]></category>
		<category><![CDATA[Trap-flag]]></category>

		<guid isPermaLink="false">http://www.ring3circus.com/rce/tracing-over-system-calls-in-ollydbg/</guid>
		<description><![CDATA[Things have been quiet over here since installing Life 2.0, so to start warming things up again I present a simple trick to counter a frustrating problem. This isn&#8217;t particularly clever, but it didn&#8217;t occur to me first few times &#8217;round so maybe it will save some newbies a little time.
How many times have you [...]]]></description>
			<content:encoded><![CDATA[<p>Things have been quiet over here since installing Life 2.0, so to start warming things up again I present a simple trick to counter a frustrating problem. This isn&#8217;t particularly clever, but it didn&#8217;t occur to me first few times &#8217;round so maybe it will save some newbies a little time.</p>
<p>How many times have you attempted a run-trace in Olly with a break-condition set, only to find that the break never occurs and you have to start over? It happens to me all the time, and it&#8217;s usually my fault. But sometimes the cause isn&#8217;t a poorly thought-out condition, but <em>the presence of a system call during the trace</em>. Being a lowly ring3 process, OllyDbg doesn&#8217;t have permission to follow the CPU&#8217;s execution of your program into kernel space, so when it encounters a SYSCALL, SYSENTER, or CALL/JMP FAR out of the debuggee&#8217;s address-space, no choice remains other than to let the process run away and hope it comes back. As we&#8217;ve established, this doesn&#8217;t always happen.</p>
<p>Now, the most commonly encountered system calls are those in ntdll, but these pose no problem to us. Set &#8216;Always trace over system DLLs&#8217; in Olly&#8217;s &#8216;Trace&#8217; options and you&#8217;ll never need to trace over such an instruction directly. (If this still isn&#8217;t working for you, be sure to &#8216;Mark [ntdll] as system DLL&#8217; in the &#8216;Executable modules&#8217; dialog). But if you play with some nastier targets, such kernel transitions will occur in modules you need the trace data for. </p>
<p>Olly intrinsically supports three modes of tracing (although it doesn&#8217;t give you much control over which it uses): hardware breakpoints, software breakpoints and execution trapping (using the EFlags &#8216;trap bit&#8217;). Unfortunately, given the way Windows implements its kernel transitions, we can&#8217;t use any of these to our advantage. Arguments are passed to these system calls via the general-purpose registers, rather than by the stack-frame system we&#8217;re all used to, and moreover the return address isn&#8217;t always that of the instruction following the system call. Hence without complete knowledge of these &#8216;fastcall&#8217; specifications, there&#8217;s no way to be sure where user-mode execution will resume, and so we&#8217;re at a loss when it comes to placing the next breakpoint. For this reason, there is no one-size-fits-all solution that I&#8217;m aware of, but it <em>is</em> possible to clean up this little mess on a per-case basis with only minimal effort.</p>
<p>Take a look at the run trace produced by your failed run. It&#8217;s probably a lot shorter than you expected, with its dying instructions indicating an upcoming transition to ring0. Scroll up a little and work out a location where execution is very likely to pass through shortly after ring3 execution resumes. This doesn&#8217;t need to be the actual return address, but ideally something that follows soon after. Usually, the saved return-address belonging to the function at the top of the call stack does a good job. Our goal is to trap execution at this point and resume the trace. Of course, we could do this manually by placing a breakpoint and keeping our fingers on ctrl-F11, but that&#8217;s the dumb way. The last piece of the puzzle is to make OllyDbg automate this for us: employ a <em>conditional</em> breakpoint, with an impossible condition (say, 1 == 2). Now our trace executes over the system call flawlessly without the need for us to lift a finger.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ring3circus.com/rce/tracing-over-system-calls-in-ollydbg/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Shellcoding on Windows: Part II &#8211; Stack Overflow Problems</title>
		<link>http://www.ring3circus.com/rce/shellcoding-on-windows-part-ii-stack-overflow-problems/</link>
		<comments>http://www.ring3circus.com/rce/shellcoding-on-windows-part-ii-stack-overflow-problems/#comments</comments>
		<pubDate>Tue, 12 Feb 2008 00:00:24 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[RCE]]></category>
		<category><![CDATA[shellcoding]]></category>
		<category><![CDATA[stack-overflow]]></category>

		<guid isPermaLink="false">http://www.ring3circus.com/rce/shellcoding-on-windows-part-ii-stack-overflow-problems/</guid>
		<description><![CDATA[The stack overflow has been discussed to death. If you don&#8217;t know the basic principle, then you should check out some of the the sixty-eight thousand hits on Google. Many of these descriptions would have you believe that any overflowable stack buffer will immediately allow the attacker to get root (or whatever the Windows equivalent [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://en.wikipedia.org/wiki/Stack_buffer_overflow" onclick="javascript:urchinTracker('/outbound/article/http://en.wikipedia.org/wiki/Stack_buffer_overflow');">stack overflow</a> has been discussed to death. If you don&#8217;t know the basic principle, then you should check out some of the the <a href="http://www.google.com/search?&#038;hl=en&#038;q=Stack-Overflow&#038;btnG=Google+Search" onclick="javascript:urchinTracker('/outbound/article/http://www.google.com/search?&#038;hl=en&#038;q=Stack-Overflow&#038;btnG=Google+Search');">sixty-eight thousand hits</a> on Google. Many of these descriptions would have you believe that any overflowable stack buffer will immediately allow the attacker to get root (or whatever the Windows equivalent might be), but if you&#8217;ve ever tried to exploit a real-world stack overflow vulnerability you&#8217;d realise that it&#8217;s a lot harder than it sounds. Here are some of the more common problems:</p>
<ul>
<li>A user-modifiable stack buffer is usually designed to hold string data, but even when this isn&#8217;t the case, it&#8217;s rare to find a situation where arbitrary input is accepted and blindly copied to the stack. It&#8217;s not infeasible that your shellcode will be restricted to null-terminated printable ASCII (that&#8217;s 0&#215;20-0&#215;7E inclusive), and if you&#8217;ve ever tried to write code that assembles into this range you&#8217;ll realise that it&#8217;s no mean feat. Furthermore, not all strings are ASCII and even a seasoned hacker can have trouble crafting an executable Unicode string.</li>
<li>If you&#8217;re able to provide an arbitrary amount of data then overflowing a return-address is easy. But what&#8217;s not so straightforward is ensuring that the function actually gets a chance to return &#8211; after all, you have just corrupted every stack variable between the buffer and the return-address.</li>
<li>Suppose that your shellcode compiles okay, passes the input filters; no crashes occur and that you now own EIP after the vulnerable function returns. Just where should you make the target return to? Understand that the address from which to commence execution must be known at the time the shellcode is provided, and moreover that &#8211; in the paradigm case &#8211; your shellcode lies &#8217;somewhere&#8217; on the stack. Inherent in the nature of stack-based function architecture is the fact that the same function can execute many times without ever taking the same value of ESP. This problem of <strong>locating your shellcode after injection</strong> is one that never seems to go away and has become the bane of many hackers&#8217; lives.</li>
<li>If we weren&#8217;t already struggling enough, the recent shift in focus towards security has prompted the Windows kernel developers to take more and more precautions regarding the execution of data buffers. Windows XP SP2 introduced DEP (data-execution prevention) for Windows Services, and Vista/Server 2003 extended this to protect all processes by default. This means that as of Windows Vista, any attempts to execute code on the stack will fail with a warning dialog from the OS, provided the system&#8217;s processor supports the <a href="http://en.wikipedia.org/wiki/Nx_bit" onclick="javascript:urchinTracker('/outbound/article/http://en.wikipedia.org/wiki/Nx_bit');">NX/XD bit</a> (Intel and AMD couldn&#8217;t agree on nomenclature, apparently).</li>
<li>Because the OS can only do so much, many compilers now ship with support for automatic security code-generation. In particular, Visual Studio 2005 introduced the GS flag, which creates what Microsoft are calling a Security Cookie (but to everyone else, a <a href="http://en.wikipedia.org/wiki/Stack-smashing_protection#Random_canaries" onclick="javascript:urchinTracker('/outbound/article/http://en.wikipedia.org/wiki/Stack-smashing_protection#Random_canaries');">stack canary</a>) within each function&#8217;s stack frame. With this option enabled, each function will push a pseudo-random dword onto the stack in its prologue, and check that it hasn&#8217;t been modified by the time the epilogue is reached. This way, any attempts to overflow into the return-address will corrupt the canary and alert the program before the RETN occurs.</li>
</ul>
<p>All of these problems can be appeased to a degree through a variety of techniques. Notably, the use of structured exception handling in the target application can make our job as an attacker considerably easier as we may be able to abuse the SEH records and sidestep several of these problems in one go. Details next time.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ring3circus.com/rce/shellcoding-on-windows-part-ii-stack-overflow-problems/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Run-time determination of VC++ virtual member function addresses: Take II</title>
		<link>http://www.ring3circus.com/gameprogramming/run-time-determination-of-vc-virtual-member-function-addresses-take-ii/</link>
		<comments>http://www.ring3circus.com/gameprogramming/run-time-determination-of-vc-virtual-member-function-addresses-take-ii/#comments</comments>
		<pubDate>Wed, 06 Feb 2008 00:00:18 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Game Programming]]></category>
		<category><![CDATA[RCE]]></category>
		<category><![CDATA[address]]></category>
		<category><![CDATA[function]]></category>
		<category><![CDATA[member]]></category>
		<category><![CDATA[resolve]]></category>
		<category><![CDATA[run-time]]></category>
		<category><![CDATA[variadic]]></category>
		<category><![CDATA[virtual]]></category>
		<category><![CDATA[visual c++]]></category>
		<category><![CDATA[visual studio]]></category>
		<category><![CDATA[vtable]]></category>

		<guid isPermaLink="false">http://www.ring3circus.com/gameprogramming/run-time-determination-of-vc-virtual-member-function-addresses-take-ii/</guid>
		<description><![CDATA[I wrote about this tricky little problem a while ago and wasn&#8217;t too happy with the desperate methods that seemed necessary. Since then, I&#8217;ve been shown a much cleaner way to do the same thing, by manipulating the vTable manually. It seems that Microsoft haven&#8217;t changed their vTable implementation since Visual Studio 6 (at least) [...]]]></description>
			<content:encoded><![CDATA[<p>I <a href="http://www.ring3circus.com/gameprogramming/run-time-determination-of-vc-2005-virtual-member-function-addresses/" >wrote about this</a> tricky little problem a while ago and wasn&#8217;t too happy with the desperate methods that seemed necessary. Since then, I&#8217;ve been shown a much cleaner way to do the same thing, by manipulating the vTable manually. It seems that Microsoft haven&#8217;t changed their vTable implementation since Visual Studio 6 (at least) and so with a little modification, the following piece of inline-assembly will do the trick: no muss, no fuss.</p>

<div class="wp_syntax"><div class="code"><pre class="cpp">__declspec<span style="color: #000000;">&#40;</span>naked<span style="color: #000000;">&#41;</span> <span style="color: #0000dd;">void</span>* ResolveVirtualFunction<span style="color: #000000;">&#40;</span>IDirect3DDevice9* pDevice, ...<span style="color: #000000;">&#41;</span> <span style="color: #000000;">&#123;</span>
    __asm <span style="color: #000000;">&#123;</span>
        mov eax, <span style="color: #0000dd;">dword</span> ptr ss:<span style="color: #000000;">&#91;</span>esp+0x08<span style="color: #000000;">&#93;</span>
        add eax, 0x8
        cmp byte ptr ds:<span style="color: #000000;">&#91;</span>eax<span style="color: #0000dd;">-1</span><span style="color: #000000;">&#93;</span>, 0xA0
        mov eax, <span style="color: #0000dd;">dword</span> ptr ds:<span style="color: #000000;">&#91;</span>eax<span style="color: #000000;">&#93;</span>
        je normal_index
        and eax, 0xFF
normal_index:
        mov ecx, eax
        mov eax, <span style="color: #0000dd;">dword</span> ptr ss:<span style="color: #000000;">&#91;</span>esp+0x4<span style="color: #000000;">&#93;</span>
        mov eax, <span style="color: #0000dd;">dword</span> ptr ds:<span style="color: #000000;">&#91;</span>eax<span style="color: #000000;">&#93;</span>
        mov eax, <span style="color: #0000dd;">dword</span> ptr ds:<span style="color: #000000;">&#91;</span>eax+ecx<span style="color: #000000;">&#93;</span>
        retn
    <span style="color: #000000;">&#125;</span>
<span style="color: #000000;">&#125;</span>
&nbsp;
<span style="color: #007f00;">// ...</span>
&nbsp;
<span style="color: #007f00;">// The function should be invoked like this:</span>
<span style="color: #0000dd;">void</span>* address_device_present = ResolveVirtualFunction<span style="color: #000000;">&#40;</span>device, &amp;IDirect3DDevice9::<span style="color: #000000;">Present</span><span style="color: #000000;">&#41;</span>;</pre></div></div>

<p>Thanks go to Vuurvlieg for this function. The beauty (or horror), here, is the use of a variadic parameter-list to overcome C++&#8217;s strong-typing that would otherwise make this operation very difficult. Obviously, this implementation will only work for objects of type IDirect3DDevice9, but the method extends to any other class by simply replacing the class name in the function declaration. Don&#8217;t be tempted to generalise this function to IUnknown or some other common base-class, as you&#8217;ll quickly run into problems with object-slicing. A final warning to those still using Visual C++ 6 (not that you deserve any help for such a crime): you&#8217;ll need to drop the ampersand from the second argument in the function call, as VC++6 handles function pointers slightly differently.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ring3circus.com/gameprogramming/run-time-determination-of-vc-virtual-member-function-addresses-take-ii/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
		<item>
		<title>Direct3D 9 Hook v1.1</title>
		<link>http://www.ring3circus.com/gameprogramming/direct3d-9-hook-v11/</link>
		<comments>http://www.ring3circus.com/gameprogramming/direct3d-9-hook-v11/#comments</comments>
		<pubDate>Fri, 01 Feb 2008 00:00:30 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Game Programming]]></category>
		<category><![CDATA[RCE]]></category>
		<category><![CDATA[direct3d]]></category>
		<category><![CDATA[DirectX]]></category>
		<category><![CDATA[drawing]]></category>
		<category><![CDATA[hooking]]></category>
		<category><![CDATA[overlay]]></category>
		<category><![CDATA[viewport]]></category>
		<category><![CDATA[Vista]]></category>
		<category><![CDATA[window]]></category>
		<category><![CDATA[XP]]></category>

		<guid isPermaLink="false">http://www.ring3circus.com/gameprogramming/direct3d-9-hook-v11/</guid>
		<description><![CDATA[Update: Since new DLLs were pushed out a while back, this doesn&#8217;t work any longer. The function offsets are wrong, and the hook injection method is a little too flaky to be relied upon. Feel free to use this code as a basis, but I&#8217;d recommend the use of Microsoft Detours for the hook injection. [...]]]></description>
			<content:encoded><![CDATA[<p><em>Update: Since new DLLs were pushed out a while back, this doesn&#8217;t work any longer. The function offsets are wrong, and the hook injection method is a little too flaky to be relied upon. Feel free to use this code as a basis, but I&#8217;d recommend the use of Microsoft Detours for the hook injection. One day I&#8217;ll write a new version along these lines but until then you&#8217;re on your own.</em></p>
<p>By popular demand, I&#8217;ve updated the <a href="http://www.ring3circus.com/downloads/direct3d-hooking/" >Direct3D 9 Hooking Sample</a> to accommodate Windows Vista. The same binary should work on both Vista and XP. I&#8217;ve only tested it on Vista 64-bit, so it&#8217;d be nice to know if it works with Vista 32 or not. Other than this, most of the same caveats apply as <a href="http://www.ring3circus.com/gameprogramming/drawing-on-another-direct3d-programs-viewport/" >last time</a>.</p>
<p><a href="http://www.ring3circus.com/images/yrrenderz.png" ><img src="http://www.ring3circus.com/images/yrrenderz_thumb.png" alt="Screenshot" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.ring3circus.com/gameprogramming/direct3d-9-hook-v11/feed/</wfw:commentRss>
		<slash:comments>32</slash:comments>
		</item>
		<item>
		<title>Shellcoding on Windows: Part I</title>
		<link>http://www.ring3circus.com/rce/shellcoding-on-windows-part-i/</link>
		<comments>http://www.ring3circus.com/rce/shellcoding-on-windows-part-i/#comments</comments>
		<pubDate>Tue, 29 Jan 2008 00:00:08 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[Hacking]]></category>
		<category><![CDATA[RCE]]></category>
		<category><![CDATA[shellcoding]]></category>

		<guid isPermaLink="false">http://www.ring3circus.com/rce/shellcoding-on-windows-part-i/</guid>
		<description><![CDATA[If you were wondering why things have been so quiet for the past month, it&#8217;s because I&#8217;ve been spending my every waking hour learning to hack. This explains the presence of a new category here on the site, and the motivation behind some of the upcoming topics. It would be a shame to let January [...]]]></description>
			<content:encoded><![CDATA[<p>If you were wondering why things have been so quiet for the past month, it&#8217;s because I&#8217;ve been spending my every waking hour learning to hack. This explains the presence of a new category here on the site, and the motivation behind some of the upcoming topics. It would be a shame to let January pass us by, so here comes an introductory post on the exciting science of shellcoding. First, some formalities:</p>
<blockquote><p>
<strong>Shellcode</strong> (shĕl&#8217;kōd)<br />
<em>n.</em></p>
<p>A relocatable piece of executable code used as the payload in a software exploit, typically having the purpose of providing the attacker with unauthorised access to the system at which it is directed.</p>
<p><em>v.</em> [shellcod&bull;ing, shellcod&bull;er]</p>
<p>The process of developing shellcode and tailoring it to a particular target.
</p></blockquote>
<p>A piece of software is said to be <em>vulnerable</em> (to exploitation) if it contains a bug which allows a user to cause it to behave in a way unintended by the developers, by supplying appropriately crafted data to one of its normal input mechanisms. The faulty processing of this input is the <em>vulnerability</em>, and any operation that takes advantage of this is an <em>exploit</em>. The data used in such an exploit is the <em>payload</em>, and the executable component of this payload is the <em>shellcode</em>. While a distinction exists between an exploit&#8217;s <em>payload</em> and its <em>shellcode</em>, the two terms are often used interchangeably. The name &#8217;shellcode&#8217; derives from the fact that many Unix exploits would work toward the goal of delivering a shell to the attacker, but this is not a necessary criterion under today&#8217;s usage.</p>
<p>Not all exploits will require shellcode, as certain goals may be achieved without it, but we&#8217;ll primarily concern ourselves with vulnerabilities that lead to <em>execution of arbitrary code</em> (i.e. the shellcode), as that&#8217;s the holy grail of the hacker. While vulnerabilities can fall into many categories, there are a few of particular interest, and these are the ones I&#8217;ll concentrate on. Putting the theory into practice is the real stumbling-block, and so along the way I&#8217;ll discuss common problems the average Windows shellcoder will run into. Here&#8217;s the battle-plan:</p>
<ul>
<li>Stack overflows</li>
<li>Heap overflows</li>
<li>Format-string vulnerabilities</li>
<li>String filters, shellcode-location and other technical problems</li>
<li>Non-executable stacks and stack-canaries</li>
</ul>
<p>I appreciate that this is a lot of material to cover, and that you may be best off buying a book (<a href="http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0764544683.html" onclick="javascript:urchinTracker('/outbound/article/http://eu.wiley.com/WileyCDA/WileyTitle/productCd-0764544683.html');">The Shellcoder&#8217;s Handbook</a> handles this vast subject magnificently), but I aim to spend as little time as possible on the bread-and-butter material that can be found just about everywhere, while putting far more focus on the practical side of things. See you next week.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ring3circus.com/rce/shellcoding-on-windows-part-i/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Collaborative RCE Tool Library</title>
		<link>http://www.ring3circus.com/rce/the-collaborative-rce-tool-library/</link>
		<comments>http://www.ring3circus.com/rce/the-collaborative-rce-tool-library/#comments</comments>
		<pubDate>Sat, 29 Dec 2007 20:11:47 +0000</pubDate>
		<dc:creator>Greg</dc:creator>
				<category><![CDATA[RCE]]></category>

		<guid isPermaLink="false">http://www.ring3circus.com/rce/the-collaborative-rce-tool-library/</guid>
		<description><![CDATA[I had decided to unofficially shut up shop for what remains of the year, but I just can&#8217;t keep quiet about this. For those of you who don&#8217;t already know, dELTA over at Woodmann&#8217;s RCE forums has created what I&#8217;ll describe as the most important RCE development since IDA 4.9. It&#8217;s not a tool, but [...]]]></description>
			<content:encoded><![CDATA[<p>I had decided to unofficially shut up shop for what remains of the year, but I just can&#8217;t keep quiet about this. For those of you who don&#8217;t already know, <em>dELTA</em> over at Woodmann&#8217;s RCE forums has created what I&#8217;ll describe as the most important RCE development since IDA 4.9. It&#8217;s not a tool, but an interactive database of potentially every one you will ever need.</p>
<p><a href="http://www.woodmann.com/collaborative/tools/index.php/" onclick="javascript:urchinTracker('/outbound/article/http://www.woodmann.com/collaborative/tools/index.php/');">The Collaborative RCE Tool Library</a></p>
<p>It&#8217;s already rather complete, but if you feel anything is missing then it needn&#8217;t be for very long. Take a look, download what you need, learn what you can and maybe give something back.</p>
<p>See you in the new year.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.ring3circus.com/rce/the-collaborative-rce-tool-library/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic Page Served (once) in 0.566 seconds -->
<!-- Cached page served by WP-Cache -->
