[原创]2018看雪&TSRC CTF第三题WP
发表于:
2018-12-7 06:23
4566
程序用的是低版本的编译器,所以IDA7.0把一些库函数都帮我们标出来了。 程序结构也很简单,整个大小只有60KB. 下面是几段关键的代码:
main函数里调用了ctf_get_input来获取输入,顺便校验输入的长度以及字符是否合法(长度为18,合法字符为[0-9A-F]):
变换一:以输入的18个字符的二进制来控制加密流程,18x4=72位.这也是题名七十二冢的由来。共循环72次,每次从72x16的向量表中依次取出一个16字节向量,根据二进制位是否为1,与串s"Perfection is achieved not when you hav..。"异或,并且每次向后位移一个字节。
把72X16的异或密钥向量表用idapython dump下来:
变换二:以长度为138的加密后的串来控制16个字节的密文的加密。每轮变换i中,取16位密文首字节与s[i]异或的值作为从256x16的密钥向量表中去密钥的索引,16位密钥向左循环移位一个字节后与密钥向量异或,完成一轮变换。此题中共138轮变换(加密串的长度)
256*16的异或向量表:
最终的校验(设置初始向量,比对加密后的向量):
整理一下流程:
先提一个很重要的数学性质(被多次利用):
再回来看变换二的异或向量表,把位与位的异或关系以矩阵的形式来表达(矩阵实际上是加法),16列对应16个变换矩阵:(其中I为单位矩阵,O为全零矩阵)
接着再看循环移位的变换:
于是第一轮变换可以表示为:
如此变换138次后:
输出72冢的系数矩阵到文件(128x72):(中间还有一些中途测试用的代码,懒得改了)
利用高斯消元求解线性方程组:(大矩阵M来自上面代码的输出)
结果:
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2018-12-7 11:46
被mratlatsn编辑
,原因: