简单写一下国赛2024的wp(带*的题目表示没做出来)
hash
1  | #!/usr/bin/python2  | 
题目说是python 2.7的hash函数,先去找这个函数实现的原理
1  | def hash27(msg):  | 
开始的想法是把异或操作看成一个较小的加减变化,用参数
根据hash函数,有
其中 
1  | p = 1000003  | 
虽然跑出了
anyway,换思路,一共7个字节,直接爆破,利用miss in the middle,建字典碰撞,发现时间有点长,开多线程(比赛的时候脚本出现一点问题,忘记long_to_bytes()不补前缀,跑2h没跑出来,赛后发现了改完跑出来了,呜呜~
1  | from Crypto.Util.number import *  | 
ovo
1  | from Crypto.Util.number import *  | 
根据位数大小关系,直接e//n 就可以得到rr。
然后两边同乘p,得到一个只关于p的二次方程
根据高中知识,这个根为:
由于e的低200位未知,那么这个解出来的p是近似的,但高位是准确的,利用coppersmith解出正确p解密。
1  | from Crypto.Util.number import *  | 
古典密码
密文:AnU7NnR4NassOGp3BDJgAGonMaJayTwrBqZ3ODMoMWxgMnFdNqtdMTM9
先尝试base64解码,解出来乱码,判断在base64之前还进行了一步加密。
经过测试,发现需要先Atbash解码
1  | import string  | 
再来个栅栏
flag{b2bb0873-8cae-4977-a6de-0e298f0744c3}
ezrsa
1  | from Crypto.Util.number import *  | 
pem
1  | -----BEGIN RSA PRIVATE KEY-----  | 
enc
1  | 55149764057291700808946379593274733093556529902852874590948688362865310469901900909075397929997623185589518643636792828743516623112272635512151466304164301360740002369759704802706396320622342771513106879732891498365431042081036698760861996177532930798842690295051476263556258192509634233232717503575429327989  | 
首先得通过pem文件拿到数据。
显然,这个pem文件是被加密后的数据,根据DEK-Info
加密模式:DES-EDE3-CBC iv向量:435BF84C562FE793
去翻翻源码
1  | def encode(data, marker, passphrase=None, randfunc=None):  | 
根据题目,passphrase比较小,根据正常pem文件开头,开爆
1  | from binascii import a2b_base64, b2a_base64, hexlify, unhexlify  | 
再根据解密出来的格式,确定 i = 483584
拿到解密数据
1  | salt = unhexlify(tobytes('435BF84C562FE793'))  | 
根据pem的格式,可以拿到n,e,dq,invq = inverse(q,p)
不过dq只能拿到低48位(由于CBC模式)
1  | from tqdm import tqdm  | 
这就跟蓝帽2022初赛的题目一样了
2022蓝帽杯初赛密码wp(复现)_2023蓝帽杯wp初赛-CSDN博客
anyway,换思路,保留原本的k 
1  | from tqdm import tqdm  | 
本地可以自己生成数据,来测试beta和epsilon参数需要多少能跑出来。
(由于最坏需要跑65537个格子,建议用较高配置的设备跑
what mouth *
用户信息访问控制 *
平台可信认证 *
这三题暂时还没有什么思路,后续看看大佬wp再复现吧(逃
总结
今年国赛全程参与,坐两天牢~,做出来的几道赛题题目还是思路还是很清晰的,由于需要爆破,需要提升一下优化时间复杂度的能力(当然爆破之前还得对每一个小部分进行本地测试——来自hash的教训,当然有实力的话还可以更新设备)