题目描述:下载附件,得到一个exe程序,运行该程序,可以看到如下的界面
根据描述信息说明:
a. 这是一个电路,有8个开关,只有8个开关全部闭合,才能够获取到flag;
b. 其中n表示开关的编号,我们输入n就可以改变第n个开关的状态,但是第n个开关改变状态时,其相邻两个开关的状态也会发生变化。
c. 刚开始,所有的开关都是开启状态,我们需要做的就是改变开关的状态,使得所有开关都关闭
1. 思路分析
这道题其实有两种思路:
1.1 按照规则来,不断输入n,最后使得开关都闭合
1.2 flag就在这个exe文件中,对这个程序进行逆向分析即可
2. 解题过程
2.1 输入n的次序有多种,我这边成功的一个序列为 2->5->8->1->4->7->3->6
2.2 对exe进行逆向
使用ida对这个exe文件进行逆向
我们找到这个main函数,函数中当8个开关开启后,会进入到 sub_457AB4这个函数中,对这个函数进行跟踪,最后会跳转到sub_457AB4这个函数中
对这个函数进行分析:
写程序获取到flag:
#include<stdio.h>
int main(){
int b[56] = {18,64,98,5,2,4,6,3,6,48,49,65,32,12,48,65,31,78,62,32,49,32,1,57,96,3,21,9,4,62,3,5,4,1,2,3,44,65,78,32,16,97,54,16,44,52,32,64,89,45,32,65,15,34,18,16};
int a[56] = {123,32,18,98,119,108,65,41,124,80,125,38,124,111,74,49,83,108,94,108,84,6,96,83,44,121,104,110,32,95,117,101,99,123,127,119,96,48,107,71,92,29,81,107,90,85,64,12,43,76,86,13,114,1,117,126};
for(int i = 0;i < 56; i++) {
a[i] ^= b[i];
a[i] ^= 0x13;
printf("%c", a[i]);
}
}
运行程序:
最终flag为:zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
总结:这道题第二种方法仅适用于练习,第二种方法相比于第一种要复杂很多。但是用作练习是合适的,因为第二种解法中涉及到了逆向,字符编码转换等知识点。