RE刷题记录 —— 01
1. [SUCTF2019]hardcpp
这题是一道非常经典的混淆题目,将附件下载后我们来查看这个附件的信息:

die非常的智能已经分析出来的用来LLVM的保护器了,然后文件是elf 64位文件。直接用ida64打开,打开后直接先看一眼main函数,发现这个流程图非常的恶心,再结合之前die给出的保护器就可以判断这个用到的是ollvm的保护了:

这个ollvm的开始就是main函数,此时我们可以通过deflat来处理掉这些个控制流平坦化。(deflat具体安装步骤自行前往网上查找),接着就是直接使用deflat.py来去掉这个控制流平坦化,通过汇编代码找到函数开始的地址为0x4007E0:

直接启动defluat.py:
1 | python deflat.py -f ../hardCpp --addr 0x4007e0 |
-f:后面跟的是要修改的文件的路径--addr:文件修改的起始地址(ida中的地址)
成功后就会生成一个hardCpp_recovered文件。此时再通过ida打开这个文件就可以看到已经去掉了控制流平坦化了,接下来就可以分析了。

函数开始就有挺多疑点的,看到puts了一串东西,这串看起来像是hex、或者md5,拿去md5查询看看先,通过最终发现确实是md5,而且明文为#,

接着,下面就紧接着一个输入一个s了,那么这个应该就是#,(怀疑一下),然后输入了v24,长度21字节,但是是包含最后一个0的,所以有效明文应该是s + v24这样子 (因为查看内存后这两个地址是相连的)。还有这两个time,作用是获取输入时的时间间隔,然后相减赋值给21,那就猜一下按照出题人的想法应该是0,接着继续往下分析。

可以看到啊,有一堆意义不明的y和x在做条件判断,点进去看看内存是在.bss段,那么这个段是用来存放未初始化的全局变量的,这下子基本就可以判断是混淆了,我们在分析的时候就可以不用判断这些。还有一个v19 < 21,这个应该就是循环的轮数,但是是从1开始的,也就是20次。接着就可以分析while循环中了。

来到循环后发现貌似是有两段加密,但是仔细分析后发现只有上面的是有用的,为什么呢?因为这里的while(1),那说明混淆的地方是一定要执行break的,不然程序就无法出去,接着一堆意义不明的函数名,我们点击进去就可以发现其实只是一些操作而已。

这些就是分析后的函数,其中有几个内部的逻辑看起来好像很抽象,实际上没什么,就例如add这个函数:

但其实只需要先看到最下面的ret v15然后再往上看看,就能够发现整个函数只是a1 + a2也就是实现了相加的功能,其他的函数分析也是如此。
根据这几个函数就能够写出一个等式:
1 | (s[cnt] + (s[cnt - 1] % 7)) ^ ((s[cnt - 1] ^ 18) * 3 + 2) == enc[cnt - 1] |
由于第一个元素是#,那我们就可以将enc扒出来,然后写出脚本
1 | char enc[] = { 0xF3, 0x2E, 0x18, 0x36, 0xE1, 0x4C, 0x22, 0xD1, 0xF9, 0x8C,0x40, 0x76, 0xF4, 0x0E, 0x00, 0x05, 0xA3, 0x90, 0x0E, 0xA5 }; |
flag:flag{mY-CurR1ed_Fns}
