[MRCTF2020]EasyCpp
详细分析了代码 作个记录
main
这里调用了两个lambda
形式的函数
点进去查看
乍一看什么操作变换都没有 但是你会发现里面又有个lambda1
再次点击查看
这就是作了一个xor 1
的操作
注意这里操作的是输入的9个整数 而不是每一位的数
main继续往下看
看到个depart
查看
相当于把输入分解质因数后拼接成字符串
那我们逆向还原输入整数就逐个乘起来
最后调用了一个lambda2
来check
点开查看
这里最后与一个ans[]
数组进行了比较 但点开ans
发现是空的
猜测是因为这个ans
要等到程序运行才初始化
在string
里找找
找到一些奇怪的字符 查看交叉引用
果然 是一个init
类型的函数对ans
进行了初始化
好 到了这一步 该有的都有了 但是这个奇怪的字符串跟我们拼接成的数字字符串有什么关系呢???
看WP说是z<=>2 l<=>1
这种关系 然后=
就是质因数的分隔...qaq?我怎么知道???
然后逆向思路就是替换后得到每个整数的质因数分解 乘回去 异或1 str拼接成flag md5大写即可
solution.py
from Crypto.Util.number import *
from sympy import *
from primefac import *
from gmpy2 import *
# s = ['=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']
ss = [[293,2,2,2],[1223],[11,7,5,5,3],[2477],[5,5,5,3,3,3],[3011,3],[13,7,3,3,3],[353,5,2],[47,13,11]]
print(ss)
flag = ''
for s in ss:
tmp = 1
for c in s:
tmp*=c
tmp^=1 # don't forget!
flag += str(tmp)
print(flag)
flag : md5(234512225774247633749032245635316720)