• 实验吧-catalyst-system


    刚学逆向很多都不懂,本题也是在看了

    http://countersite.org/articles/reverse_engineering/136-revers-s-alexctf-2017.html上的writeup

    后才有点明白,但还有一些不明白的地方,写这个writeup一方面记录自己的思考过程,一方面给别人一点思路。

    首先将题目给的可执行文件拖到IDA中,左侧函数栏找到main函数,F5键可以看到反编译的伪代码:

     

    从上面的变量定义初步判断v7和v8是字符串或是数组之类的变量。

    从上面的伪代码,一般系统中输入用户名和密码就会显示登录,我们可以猜测v8是指username,v7是指pasdword,或者相反。

    五个关键函数:

     

    sub_400C9A()

    可以知道sub_400C9A(v8)返回sub_400C41(i)的返回值,sub_400C9A(i)访问v8的值,当v8中没有值时,记下i,并返回sub_400C41(i),可以判断,i就是v8数组大小而且不会超过49,通过修改sub_400C41(i)如下,可知长度是8或12。

     

    sub_400CDD(v8):

     

    这是对v8的检测,很明显只要解出如下方程就可算出v8.

     

    利用Matlab解方程:

    得到

    V4 = 1635017059

    V3 = 1953724780

    V2 = 1868915551

    转十六进制,再转ASCII码,V8为:catalyst_ceo,应该是用户名,这里需要把字符串反转,可能是因为存储方式的原因,具体不太明,代码如下:

     

    Sub_4008F7是规定字符范围,没什么用,过

    Sub400977(v8,v7)

     

    上面已经计算出v8数组,可以计算srand(a1[1] + *a1 + a1[2])

    再看

     

    由此可计算a2,即v7,密码,用到srand和rand都是在C环境下,需在C中计算。

     

    转ascii码(我不会再C中转无符号整型为ASCII码,因此在python中转):

     

    得到密码为:sLSVpQ4vK3cGWyW86AiZhggwLHBjmx9CRspVGggj

    最后,在linux中执行catalyst这个可执行文件,由于中间用了sleep函数,会较长时间出现填写用户名和密码的提示,然后输入用户名和密码即可。

     

    也可以用最后一个flag生成函数生成flag,sub_400876(),但是这里的问题是s字符串的问题,双击byte_6020A0,会有发现,s的长度为40,具体为啥他是s,我也不太明白,明白的人可以告诉我。

     

    Flag:ALEXCTF{1_t41d_y0u_y0u_ar3__gr34t__reverser__s33}

  • 相关阅读:
    spark内存概述
    Spark Streaming使用Kafka保证数据零丢失
    usbmanger android 底下USB的工作模式
    TextView赋值int型,并显示
    Android jni编辑.so库
    opencv使用convexityDefects计算轮廓凸缺陷
    opencv轮廓处理函数详细
    slam相关知识
    VS2010+PCL+openni配置
    共有65款 计算机视觉库/人脸识别开源软件
  • 原文地址:https://www.cnblogs.com/gwind/p/8093231.html
Copyright © 2020-2023  润新知