zoukankan      html  css  js  c++  java
  • 菜鸡开始接触一些基本的算法逆向了

    在Exeinfo PE下进行查看(发现是Linux下的可执行文件)

    在linux下进行查看(发现是64位)

    用IDA打开后进入main函数F5查看伪代码

    void __fastcall __noreturn main(__int64 a1, char **a2, char **a3)
    {
      size_t v3; // rsi
      int i; // [rsp+3Ch] [rbp-54h]
      char s[36]; // [rsp+40h] [rbp-50h]
      int v6; // [rsp+64h] [rbp-2Ch]
      __int64 v7; // [rsp+68h] [rbp-28h]
      char v8[8]; // [rsp+70h] [rbp-20h]
      int v9; // [rsp+8Ch] [rbp-4h]
    
      v9 = 0;
      strcpy(v8, ":"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", s);
      v3 = strlen(s);
      if ( v3 < strlen(v8) )
        sub_4007C0();
      for ( i = 0; i < strlen(s); ++i )
      {
        if ( i >= strlen(v8) )
          sub_4007C0();
        if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )
          sub_4007C0();
      }
      sub_4007F0();
    }
    

      

    先对以上关键的代码进行分析

    ①、strcpy()

    C 库函数 char *strcpy(char *dest, const char *src) 把 src 所指向的字符串复制到 dest

    ②、for ( i = 0; i < strlen(s); ++i )

    例如:for(i=0;i<10;++i){}
       for(i=0;i<10;i++){}

    因为是单个表达式,所以它们循环的次数都是一样的,放在一起两个是没有区别

    如果分开放意义就变了

    例如:

      int p;
      p=i++;
      和
      int p
      p=++i;代表的意义就是不同的了。

    通过上面的代码分析,发现前几行都是对字符长度的判断,唯有if ( s[i] != (char)(*((_BYTE *)&v7 + i % v6) ^ v8[i]) )行是进行算法,如果不等于就代表错误,如果等于则代表正确

    将代码进行整理

    #include<stdio.h>
    #include<string.h>    //字符串的调用有关
    #define BYTE unsigned char  //定义一个byte数据类型
    __int64 v7 = 28537194573619560LL;
    int v6=7;
    char v8[18]=":"AL_RT^L*.?+6/46";
    char s[36];
    int main(){
        for(int i=0;i<strlen(v8);i++){
            s[i]= (char)(*((BYTE *)&v7 + i % v6) ^ v8[i]);
        }
        printf("%s",s);
    }

    编译运行后flag就显示出来了

    RC3-2016-XORISGUD

  • 相关阅读:
    云平台架构架构调整路线图
    python3生成测试数据,并写入ssdb
    关于因各种原因,造成LINUX主机不能通过域名访问自己的解决办法
    学习OpenResty编程
    在WINDOWS2008 Server 中创建NFS服务器,使用LINUX的MOUNT命令去加载网络盘
    云平台资源挂盘办法V1.2
    VMware安装Centos7超详细过程(图文)
    VMware配置网络的3种方式:NAT、Host-Only、Bridged
    vmware12安装centos7系统详解
    AMQP && MQTT comparision
  • 原文地址:https://www.cnblogs.com/nmlwh/p/13415178.html
Copyright © 2011-2022 走看看