运行题目,发现是很经典的关灯游戏:
有一行N行N列的灯,开始时全部是灭的,当你点击其中一盏灯是他的上下左右状态全部改变,现在要求你在限定的时间内以最少地步数,将全制部的灯点亮。
本题中降低了难度,变成一排8盏灯
直接这么玩下去我是做不到的……还是放到IDA看一下吧
查找字符串信息找到了这个:
进去调用的函数看一看,发现定义了一堆char:
根据后面的程序,看出这些其实是两个数组
1 for ( i = 0; i < 56; ++i ){ 2 *(&v2 + i) ^= *(&v59 + i); 3 *(&v2 + i) ^= 0x13u; 4 } 5 return sub_45A7BE("%s\n");
用键盘上的y键改变数据类型,代码就更容易看了:
1 for ( i = 0; i < 56; ++i ){ 2 v2[i] ^= v4[i]; 3 v2[i] ^= 0x13u; 4 }
输出的flag值是v2和v4先安位异或,之后再与0x13异或,写一个c脚本:
1 #include <stdio.h> 2 3 int main(){ 4 int v2[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}; 5 int v4[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}; 6 7 for(int i=0;i<56;i++){ 8 v2[i]^=v4[i]; 9 v2[i]^=0x13; 10 printf("%c",(char)v2[i]); 11 } 12 return 0; 13 }
编译后得到flag:
zsctf{T9is_tOpic_1s_v5ry_int7resting_b6t_others_are_n0t}
(我合理怀疑这题的考点是怎么正确快速输入两个56位数组……所以我是不是应该去学习一下x64dbg……)