直接上ida 函数都正常,没加壳
找到main函数直接f5
看了一下代码逻辑
拷贝字符串*11110100001010000101111#到esp+17h
定义v4 =[esp+30h] ;
v5 = [esp+34h]
v6为用户输入
v4[i] <0 || v4[i] > 4 exit
v6<1 ||v6>4 exit
v6 == 1 v4--
v6 == 2 v4++
v6 == 3 v5--
v6 == 4 v5++
这些就是大致条件
然后最关键的代码
if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49 )
exit(1);
if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 )
{
puts("\nok, the order you enter is the flag!");
exit(0);
}
这个v8只做了定义没有做初始化啊
int v8; // [esp+40h]
请注意看代码 *( (_BYTE *)&v8 +5*v4 +v5 -41 );41=0x29
相当于 *( (_BYTE *)[esp+40h] +5*v4 +v5 -41 )
再合并一下变成 *( (_BYTE *)[esp+17h] +5*v4 +v5 );
esp+17h是啥就是v3也就是字符串开始位置,然后根据5*v4 + v5很容易就猜出是二维数组
*1111
01000
01010
00010
1111#
再根据if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 49 );49=ascii‘1‘所以不能过1
exit(1);
再根据if ( *((_BYTE *)&v8 + 5 * v4 + v5 - 41) == 35 );35=ascii'#' 所以要到#位置
{
puts("\nok, the order you enter is the flag!");
exit(0);
}
初始化时v4= v5 =0
v6 == 1 v4--
v6 == 2 v4++
v6 == 3 v5--
v6 == 4 v5++
从而得出答案222441144222