puuctf-re-不一样的flag

直接上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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章