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