[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)