0.前言
前不久自己也思考过能不能将热门的AI技术与CTF比赛结合起来,没想到就意外发现了这道题,感觉非常有趣。
1.题目解析
首先,阅读题目,发现模型是使用深度学习来检测一段二进制代码中是否存在函数入口,存在的话将入口点标为1,否则为0。而题目需要我们对模型机进行微调,使得模型能够识别出一段不能识别的二进制代码的入口点。说白就是我们需要造一些样本,重新训练模型使得模型能够识别给定样本的函数入口点并保证不是入口点也能识别正确。题目提供了模型的文件和样本点2个数据。
接着,我们需要看看模型是使用什么框架生成的,查看模型文件的二进制代码,发现是hdf文件:
使用python的h5py工具解析,发现模型是基于theano工具的keras框架生成的,使用的RNN算法:
代码:
之后使用keras自带的模型绘制接口,将模型结构图打印出来:
代码:
知道了模型使用的框架,那么之后重新训练模型就非常方便了,再来看看样本点。观察发现,一段正常二进制代码应该会存在很多个0,而样本点存在很多个1且没有0,同时单字节存在几个256(单字节最大应该只有255),所以这里的二进制代码是经过加1运算后的代码,我们通过减1再进行反汇编,看看函数的入口特征:
题目提示说这一段代码的函数入口点是在下标为40的点,也就是上面所示的 0048E028 地址的 sub esp,0xC 这一句函数的入口点 模型无法识别,这个函数反编译后的结果其实是一个switch结构,类似如下:
题目解析到这里,接下来说说如何解答。
2.解题方法
首先,我们把样本点输入到模型中,看模型预测的结果,发现每个点输出一个包含2个元素的向量,第1个表示不是入口点的概率,第2个表示是入口点的概率。从输出的结果可以看出,除去第40个点的概率是 [0.722,0.278],其他基本都是 [1,0],说明模型差一点就能识别出函数的入口点,而其它的点也没有识别错误。
模型预测的结果:
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)