zoukankan      html  css  js  c++  java
  • 实验吧逆向catalyst-system Writeup

      下载之后查看知道为ELF文件,linux中执行之后发现很慢;

      拖入ida中查看发现有循环调用 sleep 函数:

      

      这是已经改过了,edit -> patch program -> change byte 修改一下比较参数可以去除等待时间,总共去除两处;

      运行之后发现是输入 username 和 passsword 的方式;

      那么问题就在两者上面了。

      反编译之后查看源码,v8对应username, v7为password.

      

      点进第一个函数,在 return 中是对用户名的判断,易推断出用户名为 12 位长度( 0b1100 );

      再看第二个函数,也是对用户名进行判断:

      

      

      

        关于v4, v3, v2 的赋值,切到对应汇编代码处看出以4个子节为一个 Int 进行赋值;之后就是一个三元一次方程,可以得到用户名;

        要注意用户名的顺序因为文件是小端序的,所以为 "catalyst_ceo";

      第三个函数也是验证用户名正确性;

      第四个函数,是对密码的验证,由此可以反推出密码;

      

        srand((unsigned int) seed)是C语言中的一个随机数发生器初始化函数,而种子则为用户名所对应的三个 int 值之和,因为种子为定值,所以rand()产生的随机数序列是不变的;之后写CPP文件得出随机值,linux中运行得到10个随机序列(Linux中返回最大32位随机值,而 Windows 最大为16位),还要注意右边比较值有正负之分,得到总共10个与密码相关的数字,这时再注意到每一个 vx 值都为 Int 型,相当于 4 个char型;

      在这里由用户名和密码就可以获得 flag 了,密码每四个逆序排列;

        Welcome to Catalyst systems
        Loading.
        Username: catalyst_ceo
        Password: sLSVpQ4vK3cGWyW86AiZhggwLHBjmx9CRspVGggj
        Logging in.
        your flag is: ALEXCTF{1_t41d_y0u_y0u_ar3__gr34t__reverser__s33}

      最后一个函数是flag生成:

      

        s为密码串,总共为10*4 = 40 个字符;

        双击byte_6020A0 数据处,刚好40个字符与得到的字符进行异或;

      

        选中数据,edit  -> extractdata 得到数组;

        注意因为程序为小端序,所以最后每四个字符逆序异或;

      

     1 _cmp = [
     2     1441465642,
     3     251096121,
     4     -870437532,
     5     -944322827,
     6     647240698,
     7     638382323,
     8     282381039,
     9     -966334428,
    10     -58112612,
    11     605226810
    12 ]
    13 _rand = [
    14     0x684749,
    15     0x673ce537,
    16     0x7b4505e7,
    17     0x70a0b262,
    18     0x33d5253c,
    19     0x515a7675,
    20     0x596d7d5d,
    21     0x7cd29049,
    22     0x59e72db6,
    23     0x4654600d
    24 ]
    25 
    26 _xor = [
    27     0x42, 0x13, 0x27, 0x62, 0x41, 0x35, 0x6B, 0x0F, 0x7B, 0x46, 
    28     0x3C, 0x3E, 0x67, 0x0C, 0x08, 0x59, 0x44, 0x72, 0x36, 0x05, 
    29     0x0F, 0x15, 0x54, 0x43, 0x38, 0x17, 0x1D, 0x18, 0x08, 0x0E, 
    30     0x5C, 0x31, 0x21, 0x16, 0x02, 0x09, 0x18, 0x14, 0x54, 0x59
    31 ]
    32 
    33 p = 0
    34 L = b''
    35 
    36 for i in range(10):
    37     tmp = hex(_cmp[i] + _rand[i])[2:]
    38     # print(tmp)
    39     while tmp:
    40         L += bytes([int(tmp[:2], base=16) ^ _xor[p//4*4 + 3-p%4]])
    41         tmp = tmp[2:]
    42         p += 1
    43 
    44 LL = b''
    45 while L:
    46     LL += L[:4][::-1]
    47     L = L[4:]
    48 print(LL)

      得到flag:ALEXCTF{1_t41d_y0u_y0u_ar3__gr34t__reverser__s33}

  • 相关阅读:
    /etc/fstab详解
    awk的简单用法2
    awk的简单用法3
    linux+nginx+mysql+php高性能服务器搭建
    awk的简单用法1
    ip_conntrack: table full, dropping packet.解决办法
    快速获得 Google Maps 地图页中心位置的经纬度
    Google 地图 教程收集
    第一章 Google Api Key的申请
    第二章 Google 常用功能
  • 原文地址:https://www.cnblogs.com/zUotTe0/p/9535556.html
Copyright © 2011-2022 走看看