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
提交即可
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值