[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)
posted @ 2021-01-11 22:37  PYozo_free  阅读(325)  评论(0编辑  收藏  举报