单仁键 發表於 2024-4-28 23:08:00

[CISCN 2022 东北]hana 题解(易语言逆向)

<h2 id="ciscn-2022-东北hana">hana</h2>
<h3 id="脱壳过程">脱壳过程</h3>
<p>首先看一下程序信息</p>
<p><img src="https://img2024.cnblogs.com/blog/3317193/202404/3317193-20240428230251909-5783330.png" alt="" loading="lazy"></p>
<p>程序检测到了UPX的特征,但是下面的特征又显示是VMP壳</p>
<p>使用010 Editor打开文件</p>
<p><img src="https://img2024.cnblogs.com/blog/3317193/202404/3317193-20240428230212869-1268736186.png" alt="" loading="lazy"></p>
<p>将两个VMP0和VMP1改成UPX0和UPX1并保存文件,接下来使用UPX脱壳</p>
<p><img src="https://img2024.cnblogs.com/blog/3317193/202404/3317193-20240428230237671-1774036723.png" alt="" loading="lazy"></p>
<p><img src="https://img2024.cnblogs.com/blog/3317193/202404/3317193-20240428230543739-649734614.png" alt="" loading="lazy"></p>
<h3 id="分析程序">分析程序</h3>
<p>这里需要用到一个易语言反编译插件以及一个易语言函数查询网站</p>
<p>IDA易语言反编译插件E-Decompiler - 『逆向资源区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn</p>
<p>易语言知识库 - 最新易语言在线帮助手册 (125.la)</p>
<p>把exe用IDA打开,一路动态调试会进入主要函数,位置在<code>0x4010b0</code>(可能会有花指令,不多可以写个脚本或者手动去除)</p>
<p>找到之后用易语言反编译器插件,会将里面的函数重新命名,方便阅读。不过我的IDA伪代码界面好像不支持中文显示,所以代码使用插件后看起来有点抽象(可以点击函数然后按n,这样就能显示了),但是在汇编视图里没有问题</p>
<p><img src="https://img2024.cnblogs.com/blog/3317193/202404/3317193-20240428230612882-485044999.png" alt="" loading="lazy"></p>
<p><img src="https://img2024.cnblogs.com/blog/3317193/202404/3317193-20240428230626822-884704385.png" alt="" loading="lazy"></p>
<p><img src="https://img2024.cnblogs.com/blog/3317193/202404/3317193-20240428230637868-923177797.png" alt="" loading="lazy"></p>
<p>接下来就是函数流程分析了,搭配在线易语言函数查询网站使用。</p>
<p>下面是要用到的结构体</p>
<pre><code class="language-c">typdef struct 字节集
{
   int unkown;
   int length;
   char* bytes;
};
</code></pre>
<p>函数伪代码如下</p>
<pre><code>主函数()
{
    文本 = 标准输入(1);
    文本长度 = 取文本长度(文本);
    缓冲区1 = 到字节集(文本);
    缓冲区2 = 解压数据(&amp;unk_48049D); // unk_48049D是储存密钥的字节集结构体的地址
    密钥 = 到文本(缓冲区2);
    缓冲区3 = 加密数据(缓冲区1, 密钥, 2);
    if(字节集比较(缓冲区1, &amp;dword_4804C3, 文本长度)) // dword_4804C3是储存密文的字节集结构体地址
            标准输出(“Right!”);
    else
            标准输出(“Wrong!”);
   
}
</code></pre>
<p>通过函数查询网站可知,加密数据函数的描述如下</p>
<pre><code>语法:字节集加密数据 (字节集数据, 密码文本, [加密算法])

参数名        描 述
字节集数据        必需的; 字节集。为命令提供所需的字节集数据。
密码文本        必需的; 文本型。
加密算法        可选的; 整数型。指定具体使用的加密算法,可以为以下常量值之一:1: #DES算法; 2: #RC4算法。加密和解密必须使用相同的算法,有关算法的具体说明请参阅有关文献。如果本参数被省略,则默认值为1,即DES算法。
</code></pre>
<p>这里传入的加密算法参数为2,即RC4加密算法。通过动态调试可知密钥的值是 <code>Wrong!</code></p>
<h3 id="编写脚本">编写脚本</h3>
<p>之后我们将密文数据导出然后写个python脚本解密即可</p>
<pre><code>from Crypto.Cipher import ARC4

key = b"Wrong!"
rc4 = ARC4.new(key)
enc = bytes.fromhex("56ECA0DC5707F4A3E977BF93BC8652A5146AA5BDB5D27F0B9B671D08EFC9325D43ED1E014B7B")
flag = rc4.decrypt(enc)

print(flag)
</code></pre><br><br>
来源:https://www.cnblogs.com/S1nyer/p/18164717
頁: [1]
查看完整版本: [CISCN 2022 东北]hana 题解(易语言逆向)