这题代码比较多,就不贴汇编代码或者伪代码了。主要讲一下涉及到的两个数据结构和思路。
程序定义了一个大整数结构,并定义了相应的加、减、乘、除、模等运算。给一下这个数据结构。
加、减、乘、除、模的相关运算可以自己分析。
比赛规则规定逆向的flag只能包含字母和数字,也就是0-9A-Za-z
。因此程序把一个只包含字母和数字的字符串当成62进制的整数,转换成整数后用bignum
结构保存。转换规则是0-9, A-Z, a-z
对应0-9, 10-35, 36-61
。 例如KanXueCrackMe2017
转换成十进制的整数为334476251944397096847543189896
。
然后程序再利用字符0-9A-H
将整数转换成18进制,转换规则是0-9, A-H
对应0-9, 10-17
。例如十进制数334476251944397096847543189896
转换成18进制为EDAHE450C741GH441E11BH84
。
这里再引入一个数据结构。
这个数据结构很大,然而程序是在栈中分配的。
程序将origin
和perm
字段初始化为0-0x2f
,即
将6个0x30*0x30
的矩阵也初始化,用于置换操作。其中matrix[0]
矩阵初始化如下
置换操作的过程就是perm
字段的第i
个元素是perm
字段和某个矩阵第i
列点积。所以矩阵0的置换操作用轮换来表示就是
可以发现这个置换操作的周期为4,其他置换操作与之类似,其周期也为4。
经过以上分析,就可以还原程序的思路了。
首先程序经过进制转换将KanXueCrackMe2017
转换为EDAHE450C741GH441E11BH84
。然后取EDAHE450C741GH441E11BH84
每一位来进行置换操作,例如第一位E
,表示十进制数14。那么就使用14/3
矩阵进行14%3 + 1
次置换。
将EDAHE450C741GH441E11BH84
转换位(d/3, d%3 + 1)
的形式为:
因为周期为4,所以可以求逆操作,又因为flag的长度限制为12,KanXueCrackMe2017
长度为17,所以还要化简。求逆就是反着开始,(1, 2)->(1, 2)
, (2, 3)->(2, 1)
, 化简就是(4, 3)(4, 2)->(4, 5)->(4, 1)
。求得逆操作为:
将逆操作转换成18进制数为46F9C1H147E25CFAE
,再转换为62进制,也就是最终flag为CcLaoE37J45Y
。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课