• 攻防世界 CTF RE 新手区 logmein 题解


    这个题目本来不应该会很难的,主要是这个题目用 ida 转伪代码的时候,伪代码过于奇葩,导致题目卡在了最后一步。

    不说了上题解。

    我们首先将程序丢进ida,然后找到main函数后按住F5翻译成伪代码。然后得到了这个代码。

    为了方便阅读,部分代码的变量被我重新命名过

    void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
    {
      size_t len; // rsi
      int i; // [rsp+3Ch] [rbp-54h]
      char input[36]; // [rsp+40h] [rbp-50h]
      int v6; // [rsp+64h] [rbp-2Ch]
      __int64 v7; // [rsp+68h] [rbp-28h]
      char target[8]; // [rsp+70h] [rbp-20h]
      int v9; // [rsp+8Ch] [rbp-4h]
    
      v9 = 0;
      strcpy(target, ":"AL_RT^L*.?+6/46");
      v7 = 28537194573619560LL;
      v6 = 7;
      printf("Welcome to the RC3 secure password guesser.
    ", a2, a3);
      printf("To continue, you must enter the correct password.
    ");
      printf("Enter your guess: ");
      __isoc99_scanf("%32s", input);
      len = strlen(input);
      if ( len < strlen(target) )
        sub_4007C0();                              
      for ( i = 0; i < strlen(input); ++i )
      {
        if ( i >= strlen(target) )
          sub_4007C0();                             // 输出错误提示
        if ( input[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ target[i]) )// v6就是7
          sub_4007C0();                             // 输出错误提示
      }
      sub_4007F0();                                 // 输出正确提示
    }
    

    这个伪代码貌似也没啥,主要是最后判断密码正确性的时候,出现的这个表达式是啥:

    (char)(*((_BYTE *)&v7 + i % v6) ^ target[i])
    

    首先 v7 估计是一个long long类型的变量,那么在这个表达式中,最诡异的是*((_BYTE *)&v7 + i % v6)这部分。我们猜测(_BYTE *)估计是将这个v7的地址转换为某个1字节类型的变量的指针,可以等价看成是(char *)。所以,很显然这个地方是将v7所存储的数据看成字符数组。

    由于在内存中存储一个整数数据,数据的高位存在地址更大的内存处,所以v7在内存中的存储结构是这样的

    v7 的 16 进制为 65626d61726168

    image.png

    所以最后在这个表达式中,v7等价于这样的数组:

    char v7[] = {0x68, 0x61, 0x72, 0x61, 0x6d, 0x62, 0x65};
    

    刚好数组大小为7个1字节变量,和 v6 的值吻合。到这里就差不多了,应该能看懂剩下的东西了。

  • 相关阅读:
    Linux Shell系列教程之(十七) Shell文件包含
    Linux Shell系列教程之(十六) Shell输入输出重定向
    Linux Shell系列教程之(十五) Shell函数简介
    Linux Shell系列教程之(十四) Shell Select教程
    Linux Shell系列教程之(十三)Shell分支语句case … esac教程
    Linux Shell系列教程之(十二)Shell until循环
    Linux Shell系列教程
    算法系列:链表
    C++ 系列:Boost Thread 编程指南
    C++:多线程002
  • 原文地址:https://www.cnblogs.com/Node-Sans-Blog/p/14285636.html
Copyright © 2020-2023  润新知