-
-
[原创]CTF2019参赛题:圆圈舞DancingCircle
-
发表于:
2019-3-5 14:00
3508
-
[原创]CTF2019参赛题:圆圈舞DancingCircle
圆圈舞DancingCircle
一起跳着圆圈舞啊,跳啊跳啊一二一……算法题+轻度ANTI,祝玩的开心!
简单说一下程序流程,初始化一个数独游戏,使用DancingLinks算法计算出答案,与用户输入值比较,正确后输出“Well Done!”。
具体实现比较绕,希望这种隐藏思路的方式能带给大家一点惊喜。
第一步,对程序二处位置进行数据校验,生成大数Num1。
第二步,用Num1与一固定大数Num2相乘,得到数独初始化数据Data1。
第三步,对Data1进行解析并填入DancingLinks初始化数据DLX,同时用户输入16进制数据转换成10进制数后按位置填入一个九宫格UserData1中,一共80位。数独数据最中间位没有直接提供,根据9个CheckDebug()调试检查函数返回值计算得出,必须为7。
第四步,DLX开始Dancing,同时在DLX的cover()函数中对用户数据UserData1进行转置。转置方法为,把数据交换操作拆分为5个小步骤,每一次cover()执行一个小步骤,执行60次交换后,九宫格数据向右旋转90度。一共执行4次旋转,最后用户数据转了一圈Circle后回到原位置,只是每一位进行了6次数据变换操作,生成用户数据UserData2。一共需要执行5*60*4=1200次操作,也就是说DLX.cover()操作要多于1200次。
第五步,对UserData2查表与DLX运算结果按位比较,得到完全匹配的位数总和cnt,必须为79(比较到中间位时cnt--)。
第六步,用cnt对一个数据进行解码并计算校验值,当校验值正确时输出解码数据,正确时输出“Well Done!”。
最后修改程序,添加花指令和自校验,方法为:
1.在代码中加了一些标志数据,用python把这些标志数据替换成花指令。
2.在代码中加了一个大段数据的空函数,在python中把自校验代码添加花指令后填入这个空函数。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!