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

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