[MRCTF2020]EasyCpp

详细分析了代码 作个记录
main
image
image
这里调用了两个lambda形式的函数
点进去查看
image
乍一看什么操作变换都没有 但是你会发现里面又有个lambda1
再次点击查看
image
这就是作了一个xor 1的操作
注意这里操作的是输入的9个整数 而不是每一位的数
main继续往下看
看到个depart
查看
image
相当于把输入分解质因数后拼接成字符串
那我们逆向还原输入整数就逐个乘起来
最后调用了一个lambda2来check
点开查看
image
这里最后与一个ans[]数组进行了比较 但点开ans发现是空的
猜测是因为这个ans要等到程序运行才初始化
string里找找
image
找到一些奇怪的字符 查看交叉引用
image
果然 是一个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)

posted @ 2023-10-22 14:16  N0zoM1z0  阅读(19)  评论(0编辑  收藏  举报