看的这个:BUUCTF 不一样的flag_Afanbird的博客
先查,没壳,32位,打开
ida分析,嗯,啥也看不出来,v12345什么的非常混乱
突破口是这两句
发现49是1
,35是#
,再结合语句和运行exe给的走迷宫提示,可以翻译出:碰到1就是走错了,最后走到#就是走对了,此时输入就是flag
字符里能找到这么一个
有很多1,以#结尾,大胆猜测这就是迷宫地图
正好可以写成5*5的迷宫
*1111
01000
01010
00010
1111#
于是可以走走,序列是
222441144222
flag是对的
分析一下输出和操作这段,v5是输入
v3的字符串后面那段叫它t
v4初值为0
if ( v5 == 2 )//down
{
++*(_DWORD *)&v3[25]; //t++
}
else if ( v5 > 2 )
{
if ( v5 == 3 )//left
{
--v4;
}
else
{
if ( v5 != 4 )//说明大于4
LABEL_13://输入不符,退出
exit(1);
++v4;//right
}
}
else
{
if ( v5 != 1 )//说明小于等于0
goto LABEL_13;
--*(_DWORD *)&v3[25];//up, t--
}
这样一看就还挺清楚的,v4就是横坐标,t就是纵坐标
最后是检查阶段
for ( i = 0; i <= 1; ++i )
{
if ( *(int *)&v3[4 * i + 25] < 0 || *(int *)&v3[4 * i + 25] > 4 )
exit(1);
}
i为0的时候是v3[25]那里,也就是t
i为1时是再下一个int,也就是v4
所以就是每次操作后都要检查x和y坐标是不是在0~4之间
到这里就算是全懂了 撒花——