2024UIUCTF
Without a Trace
1 | import numpy as np |
数据自己输入,最简单思路就是用给的server.py跑一遍打印出来找找规律
返回的是np.trace(R),没见过的函数,百度下发现是迹(对角元素之和),传入不同数据相减就能得到明文,传入1,1,1,1,1得到s,传入2,1,1,1,1得到,传入1,2,1,1,1得到以此类推。
1 | from Crypto.Util.number import * |
Determined
1 | from Crypto.Util.number import bytes_to_long, long_to_bytes |
因为fun函数给了我们,自然可以打印出sigma和sign(sigma)查看函数作用,打印出来1和-1交替出现,代入几组curr *= M[sigma[i]][i]查看对应关系,这不就是求det的过程,那么就简单了,取所有数相等时
然后用1和2代入取gcd能得出q-r
1 | from Crypto.Util.number import * |
Naptime
1 | from random import randint |
单看了enc函数就可以得出答案,将flag每个字符的ascii用二进制表示,长度为8刚好和a数组长度相等,依次对应如果是1则相加,0则略过,那么直接爆破即可,8个数字每个2种情况,2**8即可,这样便可得到单字符;再对ct数组里每个用相同的思想,组合在一起即可
1 | if __name__ == "__main__": |
Snore Signatures
1 | #!/usr/bin/env python3 |
加解密的过程如此,确实成立,sha512不像md5一样可以进行碰撞,我们注意到hash函数用的是r+m那么只要满足倍数关系时放入的数字在模p下相等,加密出来肯定是一样的,这样可以构成不同的m
1 | from pwn import * |
Groups
1 | from random import randint |
既非指数又要满足,真是个奇怪的要求,还好题目给了提示Carmichael numbers(卡迈克尔数),既要满足光滑性,又要是卡迈克尔数,程序跑了一个多小时终于出来了一组(感谢石氏是时试师傅指出p_minus_one函数的问题,判断n//6+1是质数确实是无关条件,只会让数据更难生成,所以比赛时才跑了一个多小时)
1 | from random import randint |
然后就是用sage的discrete_log求离散对数,发现用第二组数据代入刚好与c相等
1 | g = 162712147053983529589941603520587292910652437327235076245481396441063599676375258262225388397911669358409989909710123370044848656649806438009689223352999844570370080471 |
*Key in a Haystack
1 | from Crypto.Util.number import getPrime |
一堆大质数里面混入了个小质数,需要将这个小质数解出,虽然yafu可以运作,但yafu没有调试情况,需要算出所有因子后才能输出,这条路明显行不通;等比赛结束后看题解才意识到key非常小,有可能是p-1光滑,而p-1光滑可以用Pollard算出,虽然也得跑个十分钟;但是得到n中的key不一定是光滑的,概率是5%,多尝试几组就有可能可以得到。(ps:discord里出题人说用ecm指令解决,但这个工具着实不会用,教程也没找到)
1 | def pollards_p_minus_1_sage(n, a=2, B=2**13): |
跑了大概六组左右,得到key之后就是常规解密
1 | from Crypto.Cipher import AES |