-
-
[分享] 看雪.安恒2020 KCTF春季赛 第六题 一尺之棰
-
发表于: 2020-4-27 06:31 5898
-
程序逻辑比较简单,拿 IDA 简单看看,可以看出程序的结构是将输入编码了 16 轮,与固定的输出比较。编码过程中大量用了浮点数。将 F5 出来的验证代码直接复制出来,胡乱改一改,可以整理出还算漂亮的形式:
可以看出在浮点数运算中穿插的 XJBShuffleBit1
和 XJBShuffleBit2
互为逆运算,可以去掉。剩下的部分看起来就是一个用浮点数做的算术编码。
用浮点数做的算术编码一定存在精度问题,整理出程序之后我们首先来尝试把两边的输出对上。随便输入一个数据(比如 0000000000000000000000000000000000000000000000000000000000000000),可以发现上面贴的代码和原始程序的输出并不相符。打印 lower
、upper
、unit
并在调试器里观察对应的值,发现大约第三轮左右开始出现了最低位差 1 的情况。遇到这种东西第一反应自然是 rounding 参数不同。x86 CPU 有两个地方可以控制 rounding mode,一个是 FPU ControlWord,还有一个是 MXCSR。该程序里 x87 指令和 SIMD 指令似乎都有用到(没仔细看),我们把这两个值从调试器里抄出来在自己的程序里设置上:
设置完后会发现编码结果已经可以对上了。
写一个算术编码的解码程序即可。注意不要改变上述的任何计算的形式以免引入数值精度问题。考虑到数据不大,可以写的暴力一点。详细见附件。
[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课
赞赏
他的文章
谁下载
看原图
赞赏
雪币:
留言: