<?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 4mN3s14 | CTF Player &amp; Student</title><link>https://john-jkar.github.io/myblog/tags/ctf/</link><description>Recent content in Ctf on 4mN3s14 | CTF Player &amp; Student</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Thu, 12 Mar 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://john-jkar.github.io/myblog/tags/ctf/index.xml" rel="self" type="application/rss+xml"/><item><title>Daily Alpacahack - XOR (Crypto / Easy) Writeup</title><link>https://john-jkar.github.io/myblog/posts/xor/</link><pubDate>Thu, 12 Mar 2026 00:00:00 +0000</pubDate><guid>https://john-jkar.github.io/myblog/posts/xor/</guid><description>&lt;h1 id="daily-alpacahack-writeup-xor-crypto--easy"&gt;Daily Alpacahack Writeup: XOR (Crypto / Easy)&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&lt;br&gt;
&lt;strong&gt;Difficulty:&lt;/strong&gt; Easy&lt;/p&gt;
&lt;h2 id="challenge-description"&gt;Challenge Description&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re given a Python encryption script and a ciphertext hex string.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; os
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; secrets
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; string
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;from&lt;/span&gt; itertools &lt;span style="color:#f92672"&gt;import&lt;/span&gt; cycle
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;flag &lt;span style="color:#f92672"&gt;=&lt;/span&gt; os&lt;span style="color:#f92672"&gt;.&lt;/span&gt;getenv(&lt;span style="color:#e6db74"&gt;&amp;#34;FLAG&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;Alpaca&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{FAKEFAKEFAKEFAKE}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;encode()
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;assert&lt;/span&gt; flag&lt;span style="color:#f92672"&gt;.&lt;/span&gt;startswith(&lt;span style="color:#e6db74"&gt;b&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;Alpaca{&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#75715e"&gt;# key = b&amp;#34;???????&amp;#34;, e.g, abcdefg&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;key &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;b&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;.&lt;/span&gt;join(secrets&lt;span style="color:#f92672"&gt;.&lt;/span&gt;choice(string&lt;span style="color:#f92672"&gt;.&lt;/span&gt;ascii_letters)&lt;span style="color:#f92672"&gt;.&lt;/span&gt;encode() &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; _ &lt;span style="color:#f92672"&gt;in&lt;/span&gt; range(&lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;))
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;assert&lt;/span&gt; len(key) &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;7&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;c &lt;span style="color:#f92672"&gt;=&lt;/span&gt; bytes([c1 &lt;span style="color:#f92672"&gt;^&lt;/span&gt; c2 &lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; c1, c2 &lt;span style="color:#f92672"&gt;in&lt;/span&gt; zip(flag, cycle(key))])
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(c&lt;span style="color:#f92672"&gt;.&lt;/span&gt;hex())
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Ciphertext:&lt;/strong&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;031b13072d280a2c1816392f3b041d07020d2f1619232817153b24141d000c3925281a3704161b
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="analysis"&gt;Analysis&lt;/h2&gt;
&lt;p&gt;The encryption scheme is a &lt;strong&gt;repeating-key XOR cipher&lt;/strong&gt;:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;A random 7-byte key is generated using &lt;code&gt;secrets.choice(string.ascii_letters)&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;The flag is XOR&amp;rsquo;d against the key, repeating the key cyclically with &lt;code&gt;itertools.cycle&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;XOR has the useful property:&lt;/p&gt;</description></item><item><title>pyjs — CTF Writeup</title><link>https://john-jkar.github.io/myblog/posts/pyjs/</link><pubDate>Mon, 02 Mar 2026 00:00:00 +0000</pubDate><guid>https://john-jkar.github.io/myblog/posts/pyjs/</guid><description>&lt;h1 id="pyjs--daily-alpacahack-writeup"&gt;pyjs — Daily Alpacahack Writeup&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;CTF&lt;/strong&gt;: AlpacaHack / SECCON&lt;br&gt;
&lt;strong&gt;Category&lt;/strong&gt;: Misc&lt;br&gt;
&lt;strong&gt;Difficulty&lt;/strong&gt;: Hard&lt;br&gt;
&lt;strong&gt;Author&lt;/strong&gt;: minaminao&lt;/p&gt;
&lt;h2 id="challenge"&gt;Challenge&lt;/h2&gt;
&lt;p&gt;We connect to a server running this code:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;import&lt;/span&gt; subprocess
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;code &lt;span style="color:#f92672"&gt;=&lt;/span&gt; input(&lt;span style="color:#e6db74"&gt;&amp;#34;Enter your code: &amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;res1 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;run([&lt;span style="color:#e6db74"&gt;&amp;#34;runuser&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-u&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;nobody&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;--&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;python3&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-c&amp;#34;&lt;/span&gt;, code], capture_output&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;assert&lt;/span&gt; res1&lt;span style="color:#f92672"&gt;.&lt;/span&gt;returncode &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;and&lt;/span&gt; res1&lt;span style="color:#f92672"&gt;.&lt;/span&gt;stdout&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip() &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;b&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;I LOVE ALPACA&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;res2 &lt;span style="color:#f92672"&gt;=&lt;/span&gt; subprocess&lt;span style="color:#f92672"&gt;.&lt;/span&gt;run([&lt;span style="color:#e6db74"&gt;&amp;#34;runuser&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-u&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;nobody&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;--&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;, &lt;span style="color:#e6db74"&gt;&amp;#34;-e&amp;#34;&lt;/span&gt;, code], capture_output&lt;span style="color:#f92672"&gt;=&lt;/span&gt;&lt;span style="color:#66d9ef"&gt;True&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;assert&lt;/span&gt; res2&lt;span style="color:#f92672"&gt;.&lt;/span&gt;returncode &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;0&lt;/span&gt; &lt;span style="color:#f92672"&gt;and&lt;/span&gt; res2&lt;span style="color:#f92672"&gt;.&lt;/span&gt;stdout&lt;span style="color:#f92672"&gt;.&lt;/span&gt;strip() &lt;span style="color:#f92672"&gt;==&lt;/span&gt; &lt;span style="color:#e6db74"&gt;b&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;I LOVE SECCON&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;print(&lt;span style="color:#e6db74"&gt;&amp;#34;Wow... Alpaca&lt;/span&gt;&lt;span style="color:#e6db74"&gt;{REDACTED}&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Goal&lt;/strong&gt;: Submit a single line of code that prints &lt;code&gt;I LOVE ALPACA&lt;/code&gt; when run as Python and &lt;code&gt;I LOVE SECCON&lt;/code&gt; when run as Node.js.&lt;/p&gt;</description></item><item><title>Local File Inclusion (LFI) - CTF Writeup</title><link>https://john-jkar.github.io/myblog/posts/lfi/</link><pubDate>Fri, 27 Feb 2026 00:00:00 +0000</pubDate><guid>https://john-jkar.github.io/myblog/posts/lfi/</guid><description>&lt;h1 id="alpaca-rangers--daily-alpacahack-write-up"&gt;Alpaca Rangers — Daily Alpacahack Write-up&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Web &lt;strong&gt;Difficulty:&lt;/strong&gt; Medium &lt;strong&gt;Topic:&lt;/strong&gt; Local File Inclusion (LFI)&lt;/p&gt;
&lt;h2 id="description"&gt;Description&lt;/h2&gt;








&lt;blockquote class="blockquote-regular"&gt;
 &lt;p&gt;Hero of Justice, Alpaca Rangers!&lt;/p&gt;

&lt;/blockquote&gt;
&lt;p&gt;We&amp;rsquo;re given a PHP image viewer that loads files via a &lt;code&gt;?img=&lt;/code&gt; GET parameter.&lt;/p&gt;
&lt;h2 id="source-code-analysis"&gt;Source Code Analysis&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-php" data-lang="php"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;$targetPath &lt;span style="color:#f92672"&gt;=&lt;/span&gt; $_GET[&lt;span style="color:#e6db74"&gt;&amp;#39;img&amp;#39;&lt;/span&gt;] &lt;span style="color:#f92672"&gt;??&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;if&lt;/span&gt; (&lt;span style="color:#a6e22e"&gt;str_starts_with&lt;/span&gt;($targetPath, &lt;span style="color:#e6db74"&gt;&amp;#39;/&amp;#39;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str_starts_with&lt;/span&gt;($targetPath, &lt;span style="color:#e6db74"&gt;&amp;#39;\\&amp;#39;&lt;/span&gt;) &lt;span style="color:#f92672"&gt;||&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;str_contains&lt;/span&gt;($targetPath, &lt;span style="color:#e6db74"&gt;&amp;#39;..&amp;#39;&lt;/span&gt;)) {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $errorMessage &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;Invalid path.&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;} &lt;span style="color:#66d9ef"&gt;else&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $contents &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#f92672"&gt;@&lt;/span&gt;&lt;span style="color:#a6e22e"&gt;file_get_contents&lt;/span&gt;($targetPath);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;...&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; $dataUri &lt;span style="color:#f92672"&gt;=&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;data:&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; $mimeType &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#e6db74"&gt;&amp;#39;;base64,&amp;#39;&lt;/span&gt; &lt;span style="color:#f92672"&gt;.&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;base64_encode&lt;/span&gt;($contents);
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The app tries to block path traversal by rejecting anything that:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Starts with &lt;code&gt;/&lt;/code&gt; or &lt;code&gt;\&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Contains &lt;code&gt;..&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;However, it passes the raw user input directly into &lt;code&gt;file_get_contents()&lt;/code&gt; — which in PHP supports &lt;strong&gt;stream wrappers&lt;/strong&gt; like &lt;code&gt;php://&lt;/code&gt;, &lt;code&gt;file://&lt;/code&gt;, &lt;code&gt;http://&lt;/code&gt;, etc.&lt;/p&gt;</description></item><item><title>Dancing Cursor - Daily Alpacahack Writeup</title><link>https://john-jkar.github.io/myblog/posts/missing-cursor/</link><pubDate>Fri, 20 Feb 2026 06:00:00 +0000</pubDate><guid>https://john-jkar.github.io/myblog/posts/missing-cursor/</guid><description>&lt;h1 id="dancing-cursor--daily--alpacahack-writeup"&gt;Dancing Cursor — Daily Alpacahack Writeup&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Challenge:&lt;/strong&gt; Dancing Cursor&lt;br&gt;
&lt;strong&gt;Category:&lt;/strong&gt; Rev / Misc&lt;br&gt;
&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium&lt;/p&gt;
&lt;h2 id="the-challenge"&gt;The Challenge&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re handed a single command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;echo SGVyZSBpcyB0aGUgZmxhZzo... | base64 -d
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Running it in a terminal flashes the message:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Here is the flag:
Xiqxox{==============================================}
... but it has been wiped away.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Clearly &lt;code&gt;Xiqxox{===}&lt;/code&gt; is a decoy. The real flag was written and then erased before we could see it.&lt;/p&gt;
&lt;h2 id="understanding-the-trick"&gt;Understanding the Trick&lt;/h2&gt;
&lt;p&gt;Decoding the base64 gives raw bytes that are mostly &lt;strong&gt;ANSI terminal escape sequences&lt;/strong&gt;. The structure is:&lt;/p&gt;</description></item><item><title> Disappeared (Daily Alpacahack) Writeup</title><link>https://john-jkar.github.io/myblog/posts/diappeared/</link><pubDate>Wed, 18 Feb 2026 06:00:00 +0000</pubDate><guid>https://john-jkar.github.io/myblog/posts/diappeared/</guid><description>&lt;h1 id="disappeared--daily-alpacahack-writeup"&gt;Disappeared — Daily Alpacahack Writeup&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Pwn · &lt;strong&gt;Difficulty:&lt;/strong&gt; Medium ·&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="overview"&gt;Overview&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re given source code and a netcat address. The code looks safe at first glance — there&amp;rsquo;s a bounds check on the array index before any write. The trick is in the compile command:&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gcc -DNDEBUG -o chal main.c -no-pie
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Two flags matter: &lt;code&gt;-DNDEBUG&lt;/code&gt; and &lt;code&gt;-no-pie&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h2 id="the-vulnerability"&gt;The Vulnerability&lt;/h2&gt;
&lt;h3 id="-dndebug-silently-deletes-assert"&gt;&lt;code&gt;-DNDEBUG&lt;/code&gt; silently deletes &lt;code&gt;assert()&lt;/code&gt;&lt;/h3&gt;
&lt;p&gt;The C standard specifies that when &lt;code&gt;NDEBUG&lt;/code&gt; is defined, every &lt;code&gt;assert()&lt;/code&gt; call is &lt;strong&gt;completely removed by the preprocessor&lt;/strong&gt; — not weakened, not skipped at runtime. Deleted.&lt;/p&gt;</description></item><item><title>AAAAAAAAEEEEEEEESSSSSSSS - CTF Writeup</title><link>https://john-jkar.github.io/myblog/posts/aes/</link><pubDate>Sun, 15 Feb 2026 06:00:00 +0000</pubDate><guid>https://john-jkar.github.io/myblog/posts/aes/</guid><description>&lt;h1 id="aaaaaaaaeeeeeeeessssssss---alpacahack-challenge-writeup"&gt;AAAAAAAAEEEEEEEESSSSSSSS - Alpacahack challenge writeup&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Crypto&lt;br&gt;
&lt;strong&gt;Difficulty:&lt;/strong&gt; Medium&lt;br&gt;
&lt;strong&gt;Author:&lt;/strong&gt; hiikunz&lt;/p&gt;
&lt;h2 id="challenge-description"&gt;Challenge Description&lt;/h2&gt;
&lt;p&gt;We&amp;rsquo;re given a Python script that encrypts a flag using AES-ECB mode with a twist - each character of the flag is repeated 8 times before encryption. We can also query an encryption oracle with arbitrary plaintexts.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#66d9ef"&gt;for&lt;/span&gt; c &lt;span style="color:#f92672"&gt;in&lt;/span&gt; flag:
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; ffffffffllllllllaaaaaaaagggggggg &lt;span style="color:#f92672"&gt;+=&lt;/span&gt; bytes([c] &lt;span style="color:#f92672"&gt;*&lt;/span&gt; &lt;span style="color:#ae81ff"&gt;8&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;ciphertext &lt;span style="color:#f92672"&gt;=&lt;/span&gt; cipher&lt;span style="color:#f92672"&gt;.&lt;/span&gt;encrypt(ffffffffllllllllaaaaaaaagggggggg)
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="initial-analysis"&gt;Initial Analysis&lt;/h2&gt;
&lt;p&gt;Let&amp;rsquo;s break down what the code does:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Flag format&lt;/strong&gt;: 32 bytes total, format &lt;code&gt;Alpaca{...}&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Character repetition&lt;/strong&gt;: Each character is repeated 8 times&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Total plaintext&lt;/strong&gt;: 32 characters × 8 repetitions = 256 bytes&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Encryption&lt;/strong&gt;: AES-ECB mode (Electronic Codebook)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Blocks&lt;/strong&gt;: 256 bytes ÷ 16 bytes per block = 16 blocks&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="understanding-the-encoding"&gt;Understanding the Encoding&lt;/h3&gt;
&lt;p&gt;If the flag is &lt;code&gt;Alpaca{test_flag_here______}&lt;/code&gt;, the plaintext becomes:&lt;/p&gt;</description></item><item><title>Simple ROP Writeup</title><link>https://john-jkar.github.io/myblog/posts/rop/</link><pubDate>Sun, 15 Feb 2026 06:00:00 +0000</pubDate><guid>https://john-jkar.github.io/myblog/posts/rop/</guid><description>&lt;h1 id="simple-rop-alpacahack--writeup"&gt;Simple ROP Alpacahack — Writeup&lt;/h1&gt;
&lt;p&gt;&lt;strong&gt;Category:&lt;/strong&gt; Pwn&lt;br&gt;
&lt;strong&gt;Difficulty:&lt;/strong&gt; Hard&lt;br&gt;
&lt;strong&gt;Goal:&lt;/strong&gt; Call&lt;/p&gt;
&lt;p&gt;&lt;code&gt;win(0xdeadbeefcafebabe, 0x1122334455667788, 0xabcdabcdabcdabcd)&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;to spawn a shell and read &lt;code&gt;/flag.txt&lt;/code&gt;.&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="understanding-the-binary"&gt;Understanding the Binary&lt;/h1&gt;
&lt;p&gt;The vulnerable code:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;char buffer[64]; gets(buffer);&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;gets()&lt;/code&gt; allows unlimited input → &lt;strong&gt;buffer overflow vulnerability&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;win()&lt;/code&gt; function checks 3 arguments:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;param1 == 0xdeadbeefcafebabe param2 == 0x1122334455667788 param3 == 0xabcdabcdabcdabcd&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;If all pass → &lt;code&gt;/bin/sh&lt;/code&gt; is executed.&lt;/p&gt;
&lt;hr&gt;
&lt;h1 id="security-protections"&gt;Security Protections&lt;/h1&gt;
&lt;p&gt;From &lt;code&gt;checksec&lt;/code&gt;:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;Arch: amd64 RELRO: Full RELRO Stack: No canary NX: Enabled PIE: Enabled SHSTK: Enabled IBT: Enabled&lt;/code&gt;&lt;/p&gt;</description></item></channel></rss>