简单写一下国赛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的教训,当然有实力的话还可以更新设备)