zoukankan      html  css  js  c++  java
  • [MRCTF2020]EasyCpp

    没怎么逆过C++,所以这道题看到后面有一个地方没懂,看了别的师傅wp才知道是什么意思

    流程分析

    主函数

     第一部分

    这里还是很清楚的,就是程序刚刚运行需要初始化的操作,不过一开始这个basic_string没看明白是什么,后面想到了拷贝构造函数

    第二部分

    输入9个数字,并且连接起来,再将输入的数字放入vector中

     第三部分

    lambda函数,多亏一个神仙,以前天天让我逆他的y组合字,所以对这个函数比较敏感

     跟进去一看,循环加lambda函数

     然后接着跟,发现就是与1异或,虽然不知道while的意思,但看到这,猜测是把每个数进行异或1(其实也可以看汇编,不过准备学完C++和seh异常处理,在好好逆一下C++)

     第四部分

    这里很容易知道只要v6=0就可以了

     depart

    将每个数字的,质因子分解出来,并合并为字符串

     lambda函数,这个lambda没看明白,是个string类的函数,不过后面看了YenKoc师傅wp,就知道原来是将我们前面形成的字符串,如果是O就变成了0类似这样的意思(78='O'   '0'=48致敬某ylb的验证码吗)

     下面那个就是检查函数了,可以发现等于0就是让自己等价替换后的函数等于这个全局变量的函数,只是这个全局变量函数,也是在另一个函数里初始化的,直接交叉引用去找

     全局变量初始化函数

     接下来就是写脚本解密了

    exp

    所以我们只需要先把数字替换,然后把相乘拼接好后,在与1异或,在md5加密一下就可以获得flag了

    这里借了一下YenKoc师傅的exp

    strs=["=zqE=z=z=z","=lzzE","=ll=T=s=s=E","=zATT","=s=s=s=E=E=E","=EOll=E","=lE=T=E=E=E","=EsE=s=z","=AT=lE=ll"]
    def replacediy(str):
        str=str.replace("O","0")
        str=str.replace("l","1")
        str=str.replace("z","2")
        str=str.replace("E","3")
        str=str.replace("A","4")
        str=str.replace("s","5")
        str=str.replace("G","6")
        str=str.replace("T","7")
        str=str.replace("B","8")
        str=str.replace("q","9")
        str=str.replace("="," ")
        return str
    flag=""
    for i in strs:
        tmp=replacediy(i).split(" ")[1:]
        print(tmp)
        sum=1
        for j in range(len(tmp)):
            sum*=int(tmp[j],10)
        sum^=1
        flag+=str(sum)
    print(flag)
  • 相关阅读:
    XRP共识算法
    瑞波币交易
    Bitcoin区块验证
    Bitcoin挖矿
    Bitcoin区块链攻击方式
    Bitcoin交易及验证
    C# 《编写高质量代码改善建议》整理&笔记 --(五)类型设计
    C# 《编写高质量代码改善建议》整理&笔记 --(五)成员设计
    C# 《编写高质量代码改善建议》整理&笔记 --(四)资源管理&序列化
    C# 《编写高质量代码改善建议》整理&笔记 --(三)泛型&委托&事件
  • 原文地址:https://www.cnblogs.com/pppyyyzzz/p/14264784.html
Copyright © 2011-2022 走看看