CTF題庫>實驗吧>分道揚鑣 (注意進入正確的流程,用最短的步驟走完迷宮。)

用 IDA 打開 od打開發現不會調試 白學了
找到這兩個關鍵函數
在這裏插入圖片描述
反編譯得到 代碼

char *sub_401020()
{
  char *result; // eax
  char *v1; // [esp+50h] [ebp-CCh]
  char v2; // [esp+54h] [ebp-C8h]
  char v3; // [esp+5Dh] [ebp-BFh]
  char v4; // [esp+94h] [ebp-88h]
  char v5; // [esp+98h] [ebp-84h]
  char v6; // [esp+99h] [ebp-83h]
  __int16 v7; // [esp+10Dh] [ebp-Fh]
  char v8; // [esp+10Fh] [ebp-Dh]
  char v9; // [esp+110h] [ebp-Ch]
  char v10; // [esp+114h] [ebp-8h]
  int v11; // [esp+118h] [ebp-4h]

  v5 = 0;
  memset(&v6, 0, 0x74u);
  v7 = 0;
  v8 = 0;
  strcpy(&v2, "********* *    ** * ** ** * ** ** * #* ** **** **      *********");
  v1 = &v3;
  printf("Please input your key:\n");
  gets(&v5);
  if ( strlen(&v5) != 22 )
  {
    printf("Sorry you are wrong!\n");
    system("pause");
    exit(1);
  }
  v11 = 0;
  do
  {
    v10 = *(&v5 + v11);
    if ( v10 != 'k' && v10 != 'j' && v10 != 'h' && v10 != 'l' )
    {
      printf("Sorry you are wrong!\n");
      system("pause");
      exit(2);
    }
    v9 = *(&v5 + v11);
    switch ( v9 )
    {
      case 'h':
        if ( --v1 < &v2 || v1 > &v4 || (result = (char *)*v1, result == (char *)'*') )
        {
          printf("Sorry you are wrong!\n");
          system("pause");
          exit(3);
        }
        if ( *v1 == '#' )
        {
LABEL_41:
          printf("Good!\n");
          system("pause");
          exit(0);
        }
        break;
      case 'j':
        v1 += 8;
        if ( v1 < &v2 || v1 > &v4 || *v1 == 42 )
        {
          printf("Sorry you are wrong!\n");
          system("pause");
          exit(3);
        }
        result = (char *)*v1;
        if ( result == (char *)'#' )
          goto LABEL_41;
        break;
      case 'k':
        v1 -= 8;
        if ( v1 < &v2 || v1 > &v4 || *v1 == 42 )
        {
          printf("Sorry you are wrong!\n");
          system("pause");
          exit(3);
        }
        result = v1;
        if ( *v1 == '#' )
          goto LABEL_41;
        break;
      default:
        if ( ++v1 < &v2 || v1 > &v4 || *v1 == 42 )
        {
          printf("Sorry you are wrong!\n");
          system("pause");
          exit(4);
        }
        result = v1;
        if ( *v1 == '#' )
          goto LABEL_41;
        break;
    }
    ++v11;
  }
  while ( v11 < 25 );
  return result;
}

對他進行分析
在這裏插入圖片描述
這一串 字符串肯定後面是需要的

在這裏插入圖片描述
我們輸入的key 如果長度不等於 22 會直接跳出錯誤
所以我們應該輸入 length =22

在這裏插入圖片描述
並且輸入的字符必須爲 k j h l 這四個中的某一個 如果不是則報錯跳出

在這裏插入圖片描述
當 h 時 --相當於後退 1 且不能爲* 爲 * 時 跳出

在這裏插入圖片描述
如果爲 # 跳出成功 !!!

在這裏插入圖片描述
當 j 時 跳 8 如果等於* 跳出

在這裏插入圖片描述
當 k 時 -8 如果等於* 跳出

在這裏插入圖片描述
其他情況就是 l 的時候 +1 也是不能等於 *

在這裏插入圖片描述
那麼 我們可以講那一串字符串 換成 8*8的矩陣
在這裏插入圖片描述
起始位置相當於 第一個空值
h相當於左移一位 (–1)
j相當於下移一位 (++8)
k相當於上移一位 (–8)
l相當於右移一位 (++1)

並且不能等於 * 走 22步 最後等於 #
那麼我們直接看圖走

jjjjjlllllkkkkkhhhjjjl
提交即可
在這裏插入圖片描述

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