【Writeup】Bugku-逆向-游戏过关

 

题目来源

运行题目,发现是很经典的关灯游戏:

有一行N行N列的灯,开始时全部是灭的,当你点击其中一盏灯是他的上下左右状态全部改变,现在要求你在限定的时间内以最少地步数,将全制部的灯点亮。

本题中降低了难度,变成一排8盏灯

【Writeup】Bugku-逆向-游戏过关

直接这么玩下去我是做不到的……还是放到IDA看一下吧

查找字符串信息找到了这个:

【Writeup】Bugku-逆向-游戏过关

进去调用的函数看一看,发现定义了一堆char:

【Writeup】Bugku-逆向-游戏过关

根据后面的程序,看出这些其实是两个数组

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……)

上一篇:2020——网鼎杯部分writeup


下一篇:软件测试周刊(第48期):无聊是非常有必要的,一个人在空白时间所做的事,决定了这个人和其他人根本的不同。