-
-
[原创]【2019看雪CTF】Q1赛季 第七题 圆圈舞DancingCircle WP
-
发表于:
2019-3-23 20:58
6114
-
[原创]【2019看雪CTF】Q1赛季 第七题 圆圈舞DancingCircle WP
控制台程序,里面实现了乱序大数,有反调试和花指令。
去花指令后主程序伪代码如下,里面的数据结构调整得比较乱,凑合看:
程序中间部分用了链表类的数据结构,涉及遍历,如果从前住后看要花费很多时间,做题时因为ida反编译问题,后面代码未能显示,大部分时间全花在了中间部分,其实看了前面,然后直接从后住前推应该很快就出来了。
401F58
函数功能是修改data
区段的某一个双字数据,修改值牵扯到某部分代码,实际上就是断点反调试功能。
程序大致意思如下:
n
与d
的组合规则用代码示意如下:
在此中间会有一次转到4B9364
所在分支,调用9个反调试函数,这里反调试函数返回值有8个0,这个值会影响到后面树形链表的遍历。
后面跳过链表部分,转到校验部分,最后输入信息是要异或解码的,与校验正确的字节数异或,直接遍历,得到值79。
再回来看n
,其hex形式的值为0B 07 09 0F 03 0D 04 0B 09 0D 05 0A 06 0B 08 0C 02 03 0B 06 0C 0B 01 0C 03 05 0D 04 0B 05 0A 01 0B 07 0B 02 0F 08 0E 03 05 0B
。
这就决定了l长度为80,取d的长度为58,剩余的22字节就是定值了。校验循环81次,去除0x28
的那次和其减1的操作,实际校验79次,与上面得到的异或值对应。
回到校验部分,检验先取出两个数,一个是idx表示要校验的无序大数l的序号,value表示校验值,校验目标数组为4BC0D4
处数据,l[idx]为序号。中间链表结构的相关代码中有对l的计算,计算代码表示如下:
以上是按字节进行的,所以各字节互不影响,数字0-9经计算后结果为:
目标校验数组中值为0-9的序号为:
再结合动态调试,发现校验时取的idx
和value
其实就是与计算前的l
一一对应(我是看完链表后才发现的。。。)。
下面就好办了,直接OD在4B96FC
和4B9708
下记录断点,获取value
和idx
,然后直接还原输入:
最终flag为CBC25EF8D9F482BC1F3DA3CA1F154EC89FC3F1414EDD93A3
。
另外是,此题在输入上限制较少,存在多解,有两种情况。
第一种情况因为赛制规则,可以不考虑。但第二种情况确实存在,且数量具大。我列了前面加10进制数字1024以内的解如下,前面为加的高位十进制数,后面为对应的正确输入:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)