这道题目比较有趣,首先我们分析它是一个不套壳的程序,然后直接用IDA打开
他的加密逻辑也很直观:
- flag一定十个长度为14的字符串
- judge在这里是一个函数指针,指向judge数组的第一位
可是当我们点击judge
却无法查看它的程序逻辑。
我们注意到在上面有这样一段程序
for ( i = 0; i <= 181; ++i )judge[i] ^= 0xCu;
也就是说我们此时在内存中看到的judge是被异或混淆后的数据,此时我们有两种方法来查看judge的程序内容:
- 动态调试下断点,进入查看逻辑
- 用IDApython解密数组数据,重新进行反编译
方法一:
首先观察数组的起点与数据类型
我们使用IDA内置的python脚本来转换数组数据:
import idc
s = 0x600B00
for i in range(182):idc.patch_byte(s+i,idc.get_bytes(s+i,1)[0]^0xc)
此时数据被转换为正确的形式,我们先用U
对原数组进行解定义,再用C
对数据重新反汇编,最后再用P
实现反编译
最终我们得到程序的逆向逻辑:
我们注意到密文被拆分为v2和v3两个模块,但由于二者在内存上是连续的,所以我们将其作为一个数组处理
我们可以写出以下解密脚本,拿到flag
#include<stdio.h>
int main(){char key[15] = "fmcd k7d;V`;np";key[4] = 127;for(int i =0;i<=13;i++){key[i]^=i;printf("%c",key[i]);}getchar();
}
方法二:
因为文件结构是elf所以我们需要拿到linux上面进行远程的动态调试
我们拿到逆向逻辑之后写出解密脚本即可