1、题目
2、工具
- Exeinfo PE:查壳工具。
- IDA:是一款功能强大的反汇编工具,用于分析和逆向工程二进制文件。
- python:编写自动化脚本。
3、方法
- 下载压缩包并解压,得到一个没有后缀的文件。
- 用Exeinfo PE查询该文件是否加了壳。
- 发现这是一个64位的Mac系统的文件,并且没有壳。
- 使用64位的IDA将其打开。找到main函数,双击,按F5进行反汇编。
- 先将代码中的ASCII值转换为字符。选中后按r。
- 转换后发现是 !,这与代码中的逻辑不相符。所以这里的33应该不是ASCII值,应该就是数字。把它改回去。
- 代码审计:
- 第8行,要求输入flag,v5就是我们输入的flag。
- 第9行,如果v5的长度不等于33,则跳转到第16行,输出Failed。说明,v5的长度一定是33。
- 第12、13行,进行了一个异或操作。从v5的第二位开始,每一位都与上一位进行异或,并将值改为异或后的结果。
- 【注】异或xor:相同为0,不同为1,即1 ^ 1 = 0;0 ^ 0 = 0;1 ^ 0 = 1。
- 第14行,如果v5和global相等,则输出Success,否则输出Failed。
- 所以global是flag进行异或操作后的结果。
- 双击查看global的值。
- 双击aFKWOXZUPFVMDGH,得到一串有趣的字符。
- 选中,按shift+E输出,将其转换为16进制。
-
0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11, 0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F, 0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F, 0x47, 0x32, 0x4F, 0x00
- 编写python代码,将这个字符串还原。
-
_global = [0x66, 0x0A, 0x6B, 0x0C, 0x77, 0x26, 0x4F, 0x2E, 0x40, 0x11, 0x78, 0x0D, 0x5A, 0x3B, 0x55, 0x11, 0x70, 0x19, 0x46, 0x1F, 0x76, 0x22, 0x4D, 0x23, 0x44, 0x0E, 0x67, 0x06, 0x68, 0x0F, 0x47, 0x32, 0x4F, 0x00] flag = chr(_global[0]) for i in range(1, len(_global)-1): flag += chr(_global[i] ^ _global[i - 1]) # 再次与上一个字符异或即可恢复原值 print(flag)
- 【注】chr():输入一个整数[0,255],返回其对应的ASCII字符。
-
- 运行结果: