首页
社区
课程
招聘
[分享] 看雪.安恒2020 KCTF春季赛 第六题 一尺之棰
发表于: 2020-4-27 06:31 5886

[分享] 看雪.安恒2020 KCTF春季赛 第六题 一尺之棰

2020-4-27 06:31
5886

程序逻辑比较简单,拿 IDA 简单看看,可以看出程序的结构是将输入编码了 16 轮,与固定的输出比较。编码过程中大量用了浮点数。将 F5 出来的验证代码直接复制出来,胡乱改一改,可以整理出还算漂亮的形式:

可以看出在浮点数运算中穿插的 XJBShuffleBit1XJBShuffleBit2 互为逆运算,可以去掉。剩下的部分看起来就是一个用浮点数做的算术编码。
用浮点数做的算术编码一定存在精度问题,整理出程序之后我们首先来尝试把两边的输出对上。随便输入一个数据(比如 0000000000000000000000000000000000000000000000000000000000000000),可以发现上面贴的代码和原始程序的输出并不相符。打印 lowerupperunit 并在调试器里观察对应的值,发现大约第三轮左右开始出现了最低位差 1 的情况。遇到这种东西第一反应自然是 rounding 参数不同。x86 CPU 有两个地方可以控制 rounding mode,一个是 FPU ControlWord,还有一个是 MXCSR。该程序里 x87 指令和 SIMD 指令似乎都有用到(没仔细看),我们把这两个值从调试器里抄出来在自己的程序里设置上:

设置完后会发现编码结果已经可以对上了。

写一个算术编码的解码程序即可。注意不要改变上述的任何计算的形式以免引入数值精度问题。考虑到数据不大,可以写的暴力一点。详细见附件。


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

上传的附件:
收藏
免费 1
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//