首页
社区
课程
招聘
[原创]看雪.TSRC 2017CTF秋季赛第五题 CTF2017-brichfire
发表于: 2017-11-3 10:40 4322

[原创]看雪.TSRC 2017CTF秋季赛第五题 CTF2017-brichfire

2017-11-3 10:40
4322

这题代码比较多,就不贴汇编代码或者伪代码了。主要讲一下涉及到的两个数据结构和思路。

程序定义了一个大整数结构,并定义了相应的加、减、乘、除、模等运算。给一下这个数据结构。

加、减、乘、除、模的相关运算可以自己分析。

比赛规则规定逆向的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

这里再引入一个数据结构。

这个数据结构很大,然而程序是在栈中分配的。
程序将originperm字段初始化为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

 
 
 

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (1)
雪    币: 5
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
用指针来操作数组,刚开始还真不习惯。
矩阵转换没看明白,还需要学习
2017-11-3 13:38
0
游客
登录 | 注册 方可回帖
返回
//