2020年 网鼎杯 Crypto you raise me up WriteUp

Tips

Hello 这里是宁宁
2020年 网鼎杯 Crypto you raise me up WriteUp
这一题的解题要求CTFer有丰富的Crypto知识和数学软件的使用技巧

先放上代码 这是一段Python2的代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Util.number import *
import random

n = 2 ** 512  /* 2的512次方 */
m = random.randint(2, n-1) | 1 /*随机数*/
c = pow(m, bytes_to_long(flag), n) /*把flag值转换为long 然后m的flag次方 模运算 n值 得到c值*/
print 'm = ' + str(m) /*打印m*/
print 'c = ' + str(c) /*打印c*/

# m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
# c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499

这是一道求 离散对数 题 可以使用BSGS算法进行返求 n的值

这里使用SageMath这款软件, 使用discrete_log这个函数 代码见下方
import binascii
#n = 2 ** 512
m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499
ZmodN = Zmod(2^512)
m = ZmodN(m)
c = ZmodN(c)
flag = c.log(m)
flag = hex(flag)
flag = flag[2:]
print (str(binascii.unhexlify(flag)).strip('b'))
SageMath在线平台  https://sagecell.sagemath.org


得到Flag

flag{5f95ca93-1594-762d-ed0b-a9139692cb4a}

后记

也算是非常有技巧性的一道题
要求CTFer对离散对数有了解 且会使用算法去逆向这个过程
但是这个题和WEB1的反序列化一样被打成了入门题?
源程序见下方地址

云盘下载 c6eh

 

发表评论

电子邮件地址不会被公开。必填项已用 * 标注