学到了使用sage在一个有限域内求一个矩阵的逆矩阵,也就是hill加密。
其次是对写dfs更熟悉了,且对python3读写文件“wb”与“w”模式理解的更加深入。
最后就是多线程爆破体验极好😂。
stream
开始关键点都没找到,运行了一下程序从报错信息经过搜索知道了这是个rust写程序,且这个错误信息是编写的时候可以定义的,从这也顺藤摸瓜的知道了报错是因为没有flag文件。
程序首先读取flag文件取数据,经过加密后写入output文件。
然后简单分析一下,逻辑什么的很清楚,按照一定的顺序对每一位进行异或加密,但是那个异或的值是随机的,通过前面的数据来初始化的数据流。是一种流密码,但这里想了很久但是不知道怎么逆,后面想到按照题目加密的顺序一位一位的穷举肯定可以,,但是工程量就有点大了。。
最后才想到了python脚本,花了点时间,也改了很多,还有就是这个存在多对一的情况,所以要搜索。。
其次开始怎么也跑不出来,后面调试才发现,程序每次读取的字符都加了回车(’\0xa’),这就导致长度增加,而加密是用到了长度的。。然后就是为什么呢?
最后大量尝试搜索才发现,因为我开始是往flag文件手动输入的,然后脚本里也是先读取flag文件,这就导致开始就多了和一个’\0xa’,而后在写入也是同样有‘\0xa’。其次python2的‘rb’与‘r’模式读取都是str类型,而python3的‘rb’是byte, ‘r’才是str类型。且python若是‘wb’写入那写入数据必须是byte类型,而python2就都可以。
这里执行程序,有3种办法:
- os.system(‘./a’) 这里建议使用这个。
- 使用Popen() python 中subprocess.Popen()详解
- pexpect 如果有交互的话,推荐使用。
10s就得到了结果:
1 | import os |
ChineseGame
读懂游戏怎么玩的后,手动弄了几个数据然后总结规律。
一个长度为10的链表,最后把所有的数据域都变成大于100。
就是不断累加套上去就是了。
赛后看大家很多都是发现了只要那个数据域是0就像向上,1的话就向下,直接paython脚本,真是好。。。
wherekey
就是这个题因为z3没有解,以为我哪里弄错了郁闷半天,最后也没有把题目做出来。
由矩阵的乘法可知,这里算法实际就是用一个固定的5*5矩阵去乘flag组成的5*5矩阵,但是每次都mod了257,所以在一个有限域内。
然后其实可以爆破的,我看爆破的人也挺多的,hhha。。
这里我算了一下,如果常规写5个for循环爆破时间不会少的。。
但是用pwntools的多线程爆破,最多2个多小时就搞定了,也还是可以的。hhh。Crypto常用工具
1 | from pwn import pwnlib |
最后贴一下官方放的使用sage求解,也就是带余的矩阵乘法和逆矩阵。
1 | A = Matrix(GF(257),[[102, 108, 97, 103, 123], [97, 114, 101, 95, 121], [111, 117, 95, 115, 117], [114, 101, 95, 102, 114], [105, 101, 110, 100, 125]]) |
这个找个在线网站解一下就好:sage在线求解
Favourite Architecture flag0
有ghidra9.2就很简单了,查查riscv相关的指令,实在不好理解的方式调试也行。
前半段流加密,只要最后得到最后的异或值就好了。后半段一个tea加密。
这里贴下tea吧:
1 |
|