Hello! 欢迎来到小浪云!


【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题


加入我们,一起探讨ctf比赛的乐趣!

CTF大赛

最近,京东安全与安全界的“黄埔军校”看雪论坛合作举办了一场线上CTF大赛,吸引了近3万人参与。其中,参与解答“京东ai CTF大挑战特别题”的选手有1435人,最终仅有2人成功破解。

解题报告一这是一道非常有趣的题目,成功激发了我的兴趣。尽管我的解法可能不一定是最佳的,但仍希望与大家分享。

一、审题下载附件,解压文件,仔细审题。

1、题目

题目给出了一系列二进制序列的十进制数,共200个数。要求使用机器学习模型判断这些数是否为函数入口,如果是则标记为1。然而,目前模型输出的全是0,缺少唯一的一个1。

2、h5文件

这是keras的模型文件,可以通过load_model加载。

二、环境1、Windows操作系统

2、x32dbg调试器

3、Anaconda3

4、Keras(在Windows下通过pip安装Keras主体没有问题,但可视化部分有缺陷,暂不使用)

5、vscode编辑器

三、手工分析数据题目说明了两百个样本点是“二进制代码”,但数据经过处理,数值在1到256之间。特别是多次出现的256,不在正常的0x00到0xff范围内,因此推测手工分析数据时应全部减1。

处理数据后,输出为可复制粘贴的格式:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题结果:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题将处理后的数据复制到x32dbg中查看:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题发现代码已经可读,位置40(从0开始计数)对应于sub esp,C的指令,符合题目对函数入口的要求。相比其他ret片段,前几段较短且不涉及esp(0x83)的代码不在题目要求范围内,后几段只有add esp的代码显然不是正常函数。

推测:题目要求的“函数入口”需要局部变量平衡操作,特征以0x83为主。

四、模型分析【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题模型包含三层网络,最后输出200*2的结果。将题目样本输入模型,查看结果:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题其中0.999999是我在观察输出后选择的阈值,因为大多数值都接近1。

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题可以看到,只有位置40的概率相对较高,但未超过0.5。另外注意到,0x31对应xor指令,0xb8对应mov指令。

五、目标推测可以看出模型的问题在于1的置信度不足,也就是说,原始样本中的0太多,需要更多1的样例来确定这是“函数入口”。

因此,基于原始样本改造训练样本的思路就形成了。在训练集中增加符合题意的1,我在位置168添加了一个函数入口:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题转换回数据后进行训练:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题这次对原始样本的预测结果:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题结果满足要求,只有一个位置的概率大于50%,并且是正确的位置。

至此,题目按我的理解应该通过了。

六、优化1、构造的数据集可以有更多组合来避免一些误判,如调换add和sub的顺序,降低mov的命中概率等;

2、优化器完全是默认的,还没有进行观察和改造。这部分就不深入研究了。

解题报告二前段时间我也在思考能否将热门的AI技术与CTF比赛结合起来,没想到就发现了这道题,感觉非常有趣。

一、题目解析首先,仔细阅读题目。发现模型使用深度学习来检测一段二进制代码中是否存在函数入口,如果存在则将入口点标记为1,否则为0。题目要求我们对模型进行微调,使其能够识别出一段不能识别的二进制代码的入口点。简单来说,我们需要构造一些样本,重新训练模型,使其能够识别给定样本的函数入口点,同时保证非入口点也能正确识别。题目提供了模型文件和样本点两个数据。

接着,我们需要查看模型是使用什么框架生成的,检查模型文件的二进制代码,发现是hdf文件:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题使用Python的h5py工具解析,发现模型是基于Theano工具的Keras框架生成的,使用的是rnn算法

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题代码:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题之后使用Keras自带的模型绘制接口,将模型结构图打印出来:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题代码:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题知道了模型使用的框架,之后重新训练模型就非常方便了。

再来看看样本点:观察发现,一段正常的二进制代码应该存在很多个0,而样本点存在很多个1且没有0,同时单字节存在几个256(单字节最大应该只有255),所以这里的二进制代码是经过加1运算后的代码,我们通过减1再进行反汇编,看看函数的入口特征:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题题目提示说,这一段代码的函数入口点是在下标为40的点,也就是上面所示的0048E028地址的sub esp,0xC这一句。函数的入口点模型无法识别,这个函数反编译后的结果其实是一个switch结构,类似如下:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题题目解析到这里,接下来说说如何解答。

二、解题方法首先,我们将样本点输入到模型中,看模型预测的结果,发现每个点输出一个包含2个元素的向量,第1个表示不是入口点的概率,第2个表示是入口点的概率。

从输出的结果可以看出,除去第40个点的概率是[0.722,0.278],其他基本都是[1,0],说明模型差一点就能识别出函数的入口点,而其它的点也没有识别错误。

模型预测的结果:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题那么,最简单的办法就是将样本点随便改改,然后输入到模型重新训练,应该就能识别。(这里题目没有要求模型需要保证在原始的样本中保持某一个准确度)

我这里将样本点的第0个点50改成49,也就是将第一句的xor eax,eax改成xor al,al,作为模型的一个训练样本,使用SGD作为优化方法,参数学习率lr=0.0001,动量momentum=0.9,使用了10次迭代,并且冻结除RNN的其他层,再重新训练,结果如下:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题代码如下:

【解题报告】看雪·京东2018CTF—京东AI CTF大挑战特别题>>>> 三、结束语感觉这道题的逆向要求不是很高,然后深度学习算法的要求也不是很高,但是两者结合起来感觉挺有意思的。不过,没有其他限制的话,模型是可以过拟合的(只识别一个提供的样本点),为了避免模型过拟合,主办方其实可以提供一些样本,要求新的模型在这些样本下也能够保持准确度。

相关阅读