1、题目
2、工具
- Exeinfo PE:查壳工具。
- IDA:是一款功能强大的反汇编工具,用于分析和逆向工程二进制文件。
- python:编写自动化脚本。
3、方法
- 下载压缩包,解压得到一个没有后缀的文件。
- 用Exeinfo PE查询该文件是否加了壳。
- 发现这是一个64位的.elf文件(linux),并且没有壳。
- 使用64位的IDA将其打开。找到main函数,双击,按F5进行反汇编。
- 主函数中要求输入一个数字,然后该数字被传入了patch_me()函数中。
- 双击patch_me函数。
- 如果该数字为奇数则结束,偶数则返回get_flag()函数。
- 双击get_flag()函数。
- 代码含义:
- switch语句判断的条件,rand()是生成一个随机数,rand()%200则将范围定在了0~199之间。
- switch语句中的case2、case3和default与flag无关排除。
- case1输出的变量s应该就是flag,由f1和f2组成。双击f1得到其值为:GXY{do_not_,f2为空。
- case4对变量s进行了赋值,然后把s拼接给了f2,其中s为十六进制长整型,存储时按照小端方式存储(高位在前),需要逆转过来。
- case5对f2进行了处理,奇数位的字符进行-2操作,偶数位字符进行-1操作。
- 按照题目的意思,应该是给5次机会,每次随机生成一个数字,并且恰好能够按顺序地执行case4,case5和case1。
- 所以只需要编写脚本,顺序执行case4,case5和case1就可以了。
- python脚本:
-
s = [0x69, 0x63, 0x75, 0x67, 0x60, 0x6f, 0x66, 0x7f] # 小端方式 f1 = "GXY{do_not_" flag = f1 for i in range(0, len(s)):if i % 2 == 1:s[i] -= 2else:s[i] -= 1flag += chr(s[i]) print(flag)
- 运行结果:
-
- 以flag{do_not_hate_me}形式提交。