sif@bctf - 黑箱测试 & 插桩调试

清明研究了点Flash, 但是没啥进展..就讲一讲上次bctf的题好了, 感觉能开拓解题思路.

1. 首先知道RIQS是个啥文件



可以知道是SQUIRREL脚本

2. 下载SQUIRREL3并编译让他跑起来

RIQS 是 SQUIRREL 脚本的编译后的文件.
一开始在 Cygwin 编译不能运行, 查找错的地方发现他是64位的, 而我的 Cygwin 是32位的, 于是滚到 Ubuntu 编译.
运行后提示用法为 sif 文件 key

3. 分析算法

先用 WinHex 围观一下, 发现一堆常数, 在 GayHub 搜索得知是MD5的常数

4. 黑箱测试

使用简单的输入, 观察输出结果来推测规律.
以下分别是内容-key为 1-1, 2-1, 1-2的结果


可以看出前8字节和 key 有关, 然后开始和内容有关.
因为加密后内容没有变大, 所以猜测是异或加密
由上一步得知算法中有 md5 的计算, 因此对 key 进行 md5 然而并不是.

5. 插桩调试

观察源码可以发现 SQUIRREL 是对编译后的文件解释执行,没有用到 JIT , 因此可以在 vm 里添加代码来查看想要的信息. 比如在连接字符串的函数里输出连接后的结果.
运行后发现程序将文件名和 key 连接起来算 md5 , 于是把’11’进行 md5 计算得到 6512bd43d9caa6e02c990b0a82652dca.
前面一半部分就是文件的 前8字节

对内容12345678, key:1进行加密, 得到如下内容

把54b0393f69f03825和3132333435363738进行异或, 结果是65820a0b5cc60f1d
对照MD5: 6512bd43d9caa6e02c990b0a82652dca
可以看出是用异或加密的, 但是除了前4字节就找不到是用什么加密的了
于是继续插 桩, 在所有 运算符中都 输出一下

一开始插桩的代码我是用%x输出数值, 后来发现是64位的整型, 走了点弯路…不过最后还是发现应该是64位.

为了搞清楚程序的流程, 我把所有的 OP 编码都输出了出来, 发现这个运算是在一个生成器里发生的, (操作码里有针对生成器的操作))

6. 总结

黑箱测试能方便的发现程序的特点, 比如初中的时候有个人写出了百度贴吧的验证码识别, 识别率听说是100%, 但是经过黑箱测试, 替换图片后却不能正确识别(hosts), 于是得知是通过URL解码得到的验证码.
插桩调试能得知程序的执行流程, 适合简单的算法, 因为还原需要连蒙带猜所以还需要想象力2333