2020网鼎杯青龙组 部分wp
程序员文章站
2022-05-19 10:49:59
...
1.you_raise_me_up
文件下载打开是py文件
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from Crypto.Util.number import *
import random
n = 2 ** 512
m = random.randint(2, n-1) | 1
c = pow(m, bytes_to_long(flag), n)
print ('m = ' + str(m))
print ('c = ' + str(c))
print(n)
# m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
# c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499
重点就这行
c = pow(m, bytes_to_long(flag), n)
离散对数求解
直接放到 sage 做
m = 391190709124527428959489662565274039318305952172936859403855079581402770986890308469084735451207885386318986881041563704825943945069343345307381099559075
c = 6665851394203214245856789450723658632520816791621796775909766895233000234023642878786025644953797995373211308485605397024123180085924117610802485972584499
n = 2**512
discrete_log(c,mod(m,n))
得到
56006392793405651552924479293096841126763872290794186417054288110043102953612574215902230811593957757
然后根据原先代码的 bytes_to_long
再使用 python 的 Crypto.Util.number 模块去转回去
from Crypto.Util.number import long_to_bytes
long_to_bytes(56006392793405651552924479293096841126763872290794186417054288110043102953612574215902230811593957757)
得到 flag
>>> long_to_bytes(56006392793405651552924479293096841126763872290794186417054288110043102953612574215902230811593957757)
b'flag{5f95ca93-1594-762d-ed0b-a9139692cb4a}'
我这里使用的是 网页版Sage
Crypto.Util.number 模块在 pycryptodome 库里
可去 python官方第三方库下载 对应的版本
或者 pip install pycryptodome
2.boom
吼吼吼 收到收到
按任意键后得到一串 md5
继续,靠妖,解方程
上一题用的 sage 也能做 (真好使
var('x y z')
solve([3*x-y+z==185,2*x+3*y-z==321,x+y+z==173],[x,y,z])
得到
[[x == 74, y == 68, z == 31]]
输入后,又来?
那继续用 sage 做
解出后输入
?! 嗯…直接关闭了
应该要在cmd里打开这个文件的
重新来一遍
打开cmd,boom.exe拖进去运行
得到 flag
补充个法子:用 OD 反汇编工具调试可以直接得到 flag