RE-实验吧分道扬镳/Just Click

Alikas-0x07

题目:
实验吧分道扬镳
实验吧Just Click

分道扬镳:

file rev2.exe
rev2.exe: PE32 executable (console) Intel 80386, for MS Windows

拖进IDA看一下。

核心代码及分析如下:

  v3 = 0;
  memset(&v4, 0, 0x74u);
  v5 = 0;
  v6 = 0;
  strcpy(v2, "********* *    ** * ** ** * ** ** * #* ** **** **      *********");
  v1 = &v2[9];//这里我修改了v2的类型,char v2 -> char v2[65],便于理解
  printf("Please input your key:\n");
  gets(&v3);
  if ( strlen(&v3) != 22 )                      // key长度为22
  {
    printf("Sorry you are wrong!\n");
    system("pause");
    exit(1);
  }
  v9 = 0;
  do
  {
    v8 = *(&v3 + v9);
    if ( v8 != 'k' && v8 != 'j' && v8 != 'h' && v8 != 'l' )// 以照迷宫图,这个就应该是上下左右的意思
    {
      printf("Sorry you are wrong!\n");
      system("pause");
      exit(2);
    }
    v7 = *(&v3 + v9);
    switch ( v7 )
    {
      case 'h':                               
        if ( --v1 < v2 || v1 > &v2[64] || (result = (char *)*v1, result == (char *)'*') )//   后退一步,判断越界 or 撞墙
        {
          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 > &v2[64] || *v1 == '*' )//越界 or 撞墙
        {
          printf("Sorry you are wrong!\n");
          system("pause");
          exit(3);
        }
        result = (char *)*v1;
        if ( result == '#' )
          goto LABEL_41;
        break;
      case 'k':
        v1 -= 8;                                // 后退八步
        if ( v1 < v2 || v1 > &v2[64] || *v1 == '*' )//越界 or 撞墙
        {
          printf("Sorry you are wrong!\n");
          system("pause");
          exit(3);
        }
        result = v1;
        if ( *v1 == 35 )
          goto LABEL_41;
        break;
      default:
        if ( ++v1 < v2 || v1 > &v2[64] || *v1 == 42 )// 前进一步,再判断撞墙 or 越界否
        {
          printf("Sorry you are wrong!\n");
          system("pause");
          exit(4);
        }
        result = v1;
        if ( *v1 == '#' )
          goto LABEL_41;
        break;
    }
    ++v9;
  }
  while ( v9 < 25 );
  return result;

函数说明:strcpy是一种C语言的标准库函数,strcpy把含有’\0’结束符的字符串复制到另一个地址空间,返回值的类型为char。*

分析代码后,这里就两种方法:
第一种遍历,求出所有可能性来求出最优解,但既费时又费力。

故我采取了第二种方法。

由于题目strcpy(v2, "********* * ** * ** ** * ** ** * #* ** **** ** *********");已经将迷宫的大致情况给了我们,那我们直接手动还原这个8*8的迷宫即可。

********
* *    *
* * ** *
* * ** *
* * #* *
* **** *
*      *
********

而”j前进八步“可理解为向前,”k后退八步“理解为向后,”l前进一步“为向右,”h后退一步“为向左

目测解题法:key:jjjjjlllllkkkkkhhhjjjl

Just Click:

题目要求:拿到答案需要正确地点击按钮

拿到题后我瞎按了一下,发现,只能按9下,9下后程序会退出。

File一下:

file rev4.exe
rev4.exe: PE32 executable (GUI) Intel 80386 Mono/.Net assembly, for MS Windows

.Net文件反编译,那就用dnSpy反编译一下咯!
RE-实验吧分道扬镳/Just Click
然后就看到这个…
照着按一下…

flag就出来了。

RE-实验吧分道扬镳/Just Click

总结:这两道题都不是很难。知道方法就很简单。
迷宫一开始我就想到直接还原迷宫样子,结果被我猜对了。
而click则是我第一次遇到反编译.Net文件,故一开始在IDA里懵逼了好久。后来才意识到这应该是.Net文件,才去找反编译工具…tcl,学到了!