实训了一个月,一直没参加比赛,这次浅浅做了些题,又是被SU的各位哥哥带飞。
MISC
Mahjoong
在线麻将,可以点击自动对局,打一会儿会弹出flag:ACTF{y@kumAn_1s_incredl3le}
,多么朴实无华的签到题。
emoji
🐨🐧🐧🐨🐨🐨🐧🐧🐨🐨🐧🐨🐧🐧🐨🐧🐨🐨🐧🐨🐨🐨🐧🐧🐧🐨🐨🐧🐨🐨🐧🐧🐨🐧🐧🐨🐧🐧🐨🐧🐧🐨🐨🐧🐨🐧🐨🐧🐨🐧🐨🐨🐨🐨🐨🐧🐨🐨🐧🐧🐧🐨🐨🐧🐨🐧🐨🐧🐧🐨🐨🐧🐧🐨🐨🐧🐧🐧🐨🐧🐨🐨🐧🐨🐨🐧🐨
转为二进制:
100111001101001011011100011011001001001001101010101111101100011010100110011000101101101
转为整数:
94794095464206931577745773
转为十六进制:
0x4e696e3649355f6353316d
即为flag:
m1Sc_5I6niN
signin
又一个签到题,给了个hex文件,观察了下发现是bz2格式,解压多次依次发现了zs、gz、lzma格式;那么应该是四个压缩算法循环压缩了n次,写个while循环解压即可。
1 | import zstandard |
Crypto
impossible RSA
给了ssl格式的公钥,先去在线网站解出n、e。
根据题目条件可推导出这样的关系:
这里直接用求根判别公式去爆破k即可。exp:
1 | from Crypto.Util.number import * |
RSA LEAK
这题一共有两个难点:1.类似于中间相遇的攻击思想求rp和rq 2.用已知条件建立一元二次方程求根
首先根据leak函数来求ra和rb,由于这两者都是(0,2^24)的随机数,要爆破很困难,于是采用中间相遇的思想——以空间换时间:
1 | # 中间相遇攻击 |
对于n=pp.qq,不难发现a.b就等于n开四次根取整,证明如下(rp和rq对于a和b来说相当于一个很小的量):
整理一下所有的已知条件:
如果我们用$r{p}$乘$r{q}$,会出现$n$,$pp.q$,$qq.p$,$p.q$ ,由于 $pp.q$ 是未知的,所以需要构造这个来相消;因此考虑 $r{p}.q$ ,同理$r{q}.p$,消去以后剩下 $p.q$ 和 $n$ ,都是已知量,最后得到:
等式两边同乘qq得到关于qq的一元二次方程,解出来就是qq,完整过程:
1 | from gmpy2 import * |
复现
safer-telegram-bot-1
审计下sage.js,发现两个比较关键的地方:
对js不太熟,读个大概意思就行。对bot发/login他会马上把uid变为0_login_callback:" + msg.chat.id + ":" + msg.message_id
,然后sleep一段随机时间,变为authorizedUids[0].uid + "_login_callback:" + msg.chat.id + ":" + msg.message_id
,然后再马上变成-1_login_callback:" + msg.chat.id + ":" + msg.message_id
,去查了下js的random,发现它是以当前时间为种子进行随机的,不太好预测,但可以多次发/login,每次间隔不同或相同时间点开,可能会在某个时候恰好碰对时间出flag(我觉得完全不可控,凭运气),预期解应该不是这样的。