WUSTCTF2020-funnyre
分析
elf文件,__libc_start_main
函数启动 main 函数,init 函数中执行了三个函数,但对我们要求解的flag无影响,影响的是byte_603049,对应main函数中最后的 puts(s) 中的 s 变量。(废话咯)
直接来看 main 函数,发现存在花指令,如下图所示:
第一处很明显,两个跳转都几乎是零距离跳转且第二个指令永假(根本不会执行),nop掉这两个指令。然后是第二处的call指令,跳转地址很明显是错误的,将其转成data,将call的硬编码(E8)改成90(nop),然后将data转成code(一直转,直到没有代码区没有数据)。最终结果如下图所示:
花指令有五处,但都一样。修改完后,main函数如下图所示:
首先判断flag的格式和长度,然后一堆for循环进行异或、加、取反运算,最后与已知字符串相比较。
整个过程杂而不难。有两种比较推荐的方法。
IDAPython根据指令去逆向
第一种是写代码识别指令来进行响应的逆操作,指令中的操作数都用统一的格式,即byte ptr [rdx + rax +5]
我们要做的就是在main函数范围内一行一行的读取汇编指令,通过byte ptr [rdx + rax +5]
(因为这部分存储了flag)找到对flag进行加密的指令,然后识别操作码以区分不同运算,最后取出另一个操作数进行逆运算。代码如下:
1 |
|
然后再IDA界面中的菜单栏 File ->Script file,执行该py文件。如果识别不出代码中用到的函数,请修改IDA所在目录下的\cfg\idapython.cfg文件,将AUTOIMPORT_COMPAT_IDA695的值修改为YES。(参考关于IDA7.5 IDApython api差异问题及解决办法 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn)
其他指令参考:总结idapython在逆向中的应用 - 『脱壳破解区』 - 吾爱破解 - LCG - LSG |安卓破解|病毒分析|www.52pojie.cn
符号执行工具约束求解
第二种是使用符号执行工具约束求解,简单来讲就是符号化待求解变量,并将这些加密过程等价为方程,然后解这些方程组。
linux下需要用到python的angr库,同时需要配置python虚拟环境。虚拟环境安装的指令如下:
1 |
|
在虚拟环境中下载angr即可正常使用。(参考[环境搭建][Python]Kali中使用venv - 简书 (jianshu.com))
然后是脚本:
1 |
|
angr中更多方法请参考angr 系列教程(一)核心概念及模块解读 - 先知社区 (aliyun.com)。
运行结果如下: