zoukankan      html  css  js  c++  java
  • 攻防世界 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 的值吻合。到这里就差不多了,应该能看懂剩下的东西了。

  • 相关阅读:
    How to function call using 'this' inside forEach loop
    jquery.validate.unobtrusive not working with dynamic injected elements
    Difference between jQuery.extend and jQuery.fn.extend?
    Methods, Computed, and Watchers in Vue.js
    Caution using watchers for objects in Vue
    How to Watch Deep Data Structures in Vue (Arrays and Objects)
    Page: DOMContentLoaded, load, beforeunload, unload
    linux bridge
    linux bridge
    EVE-NG网卡桥接
  • 原文地址:https://www.cnblogs.com/Node-Sans-Blog/p/14285636.html
Copyright © 2011-2022 走看看