进行这个实验缘起于看到了宝玉xp分享的技术文章”OpenAI 官方提示工程指南 [译]“, 又想起了WPeace分享的ida插件”WPeChatGPT“
PS:我是穷逼所以目前使用都是免费的模型
PS:文章还没有写完,清华✌就推出了逆向大模型,可惜我没有申请~~>_<~~
约定
根据提示工程指南我设计的promot如下:
1 | 你需要扮演一位资深的软件逆向工程师并执行以下任务: |
选取的逆向代码为
1 | 请分析以下代码: |
本次评测参与的模型有:
模型 | 文心一言 | 通义千问 | ChatGPT3.5 |
---|---|---|---|
版本 | 2.5.2 | 2.1.1 | text-davinci-002-render-sha |
对比大模型的反编译能力
文心一言的表现
通义千问的表现
ChatGPT3.5的表现
结果
首先,分析我们的任务要求。我们的任务要求包括三部分,一是对汇编代码的进行提升,二是总结代码功能,三是推测函数的来源,细节上我们还要求“用少于等于100字”进行归纳总结。
三个模型的完成情况如下(-
表示没有识别到任务,0
表示未完成,0.5
表示完成的一般,1
表示基本完成):
文心一言 | 通义千问 | ChatGPT3.5 | |
---|---|---|---|
提升 | - | - | 0 |
总结 | 1 | 1 | 1 |
推测 | - | 0.5 | 0.5 |
100字内 | 1 | 1 | 1 |
三个模型基本都能做到对代码的总结(虽然接近对汇编代码的逐行翻译了),也能控制字数在指定范围内,但两个国产模型没有识别到提升任务,此外文心一言还没有完成推测任务。可能由于信息缺失,导致推测任务对于大模型而言比较困难,所以我进行了补充信息的尝试,补充的信息如下:
1 | 接下来我将补充关于函数sub_1400144C0的内容。补充完全后,你需要重新分析sub_1400145B0函数。 |
囿于篇幅,不展示具体的结果仅作口头描述。
三个模型均首先提升了新补充的函数,并没有重新分析目标函数,总结功能上更加具体了一些,但仍不能推测函数的出处,需要指出的是ChatGPT的没有真正提升至高级语言。
对比不同大模型的推测分析能力
在本part中,我尝试直接提供ida pro反编译的结果给大模型,让他们重新分析,promot与上一个实验一致。
提供的反编译代码如下:
1 | unsigned __int64 sub_1400144C0() |
文心一言的表现
通义千问的表现
ChatGPT3.5的表现
结果
三个模型的完成情况如下(-
表示没有识别到任务,0
表示未完成,0.5
表示完成的一般,1
表示基本完成):
文心一言 | 通义千问 | ChatGPT3.5 | |
---|---|---|---|
总结 | 1 | 0.5 | 1 |
推测 | 0 | 1 | 0.5 |
三个模型的表现各有亮点,文心一言和ChatGPT3.5都在总结中指出了函数用于防御缓冲区溢出;在预测部分中,通义千问给出了函数名(实际查询后发现给出的函数名是错误的,但有一定参考价值),而ChatGPT注意到了该函数和Windows相关。
以WPeChatGPT插件为例,对比不同提示的效果
通过阅读WPeChatGPT的源码,我将其逆向部分使用的Promot提取如下(原插件中还设计了漏洞分析和利用的promot)
1 | 下面是一个C语言伪代码函数,分别分析该函数的预期目的、参数的作用、详细功能,最后取一个新的函数名字。(用简体中文回答我,并且回答开始前加上'---GPT_START---'字符串结束后加上'---GPT_END---'字符串 |
这个提示包括两部分,第一部分是逐步分析,第二部分是总结(反复确认是为了减少错误)。
让我发送测试中的伪C代码,以下是Chat-GPT3.5 Turbo的响应
1 | # PART 1 |
可能是由于目标代码比较简单,并没有比较出明显差距。但WPeChatGPT所使用的提示也启发了我们:
- 还应该让大模型关注参数和返回值
- 逐步完成任务,先仔细分析,再综合分析。
总结
大模型在逆向任务中大有用处,但也存在能力边界
大模型目前不能帮助我们完成反编译工作,IDA Pro这样的专业逆向工具还是非常强力的。
大模型具有丰富的知识,其在函数名恢复和函数库推测上有优势。
大模型对函数功能的总结可以帮助我们快速理解函数功能或对我们的猜测工作给予指引,这将节省我们非常多的时间。
合理设计Promot‘
- 让模型扮演一个角色
- 指引大模型分步骤完成任务
- 设计良好的格式
- 补充必要的知识/上下文:在使用时应该提供伪C代码并尽量补充涉及的函数的实现。
逆向任务中ChatGPT3.5 > 通义千问 > 文心一言