首页
社区
课程
招聘
《AI辅助下的逆向工程》之:AI给sub_xx()函数批量起名
2023-8-8 10:46 10936

《AI辅助下的逆向工程》之:AI给sub_xx()函数批量起名

2023-8-8 10:46
10936

0.前言:

发现AI辅助起名效果很好,思路也很有意思。本来可以出一个议题。
但考虑到现在AI发展很快,可能很快又过时了(例如:上传二进制,AI给出分析报告或者能编译的、带注释的源代码)。最后还是决定尽早发布出来服务大家吧。
本贴基本上算是把思路、文档和代码部分全部公开了。不明白的,可以跟帖,我有空的时候会回答。
本文思路在内部的研究沙龙发布做过一个思路讲解和操作演示。
在公司M01N Team公众号对外发表:AI辅助下的通用软件与嵌入式固件符号表修复,两者有一点区别,可以对比着看:前者让AI生成的是"0x地址,新函数名",目前修改后让AI生成的格式是"sub_xx(),新函数名"。这样AI可能出错的概率小一点了,理解起来也比较好一点。

1.概述

Claude是一个支持中文、暂时免费的类ChatGPT产品。
最近官网升级到了2.0,向大众开放了100K的功能。
网站的地址如下:https://claude.ai
Claude 100k的强大之处,直接摆脱了Chatgpt 4k到32k的限制,大概一次可以输入75000个单词或者50000个汉字。
个人喜欢claude的原因是它一次性能处理的文字多。
例如:可以用下面的提示词,上传js文件后,给js做代码审计:

1
请深入理解下面的js片段。根据JS逻辑,帮我生成 https://api.test.com 网站API的 curl 测试代码,要求尽量覆盖全面。

这思路审计js的确发现过几个漏洞,水过一篇文章:AI辅助代码审计应用与安全风险
目前上传的文档格式支持很多。包括:
pdf, doc, docx, rtf, epub, odt, odp, pptx, txt, py, ipynb, js, jsx, html, css, php, c, cpp, cxx, h, hpp, rs, r, rmd, swift, go, rb, kt, kts, ts, tsx, m, scala, rs, dart, lua, pl, pm, t, sh, bash, zsh, csv, log, ini, yaml, yml, toml, lua, sql, bat, md, coffee等,未来还有增加的趋势。

最近几天用Claude对嵌入式系统的固件的进行逆向和代码审计,进行了一番研究。其中一个发现是:嵌入式系统固件的符号表恢复问题在AI的帮助下得到了完美的解决,摸索出一套比较完美的解决方案。

当然,不一定嵌入式能用。也适用于其它软件的逆向辅助使用。
AI有时候不靠谱,但让它帮人类给函数起名,还是比较合适的。
即使是人给函数起名,不同的人的风格和起名结果也不尽相同。

2.思路说明

逆向没有符号表的嵌入式固件

逆向没有符号表的嵌入式二进制固件是一个复杂的过程,主要包括以下步骤:

  1. 识别硬件I/O函数:这是逆向分析的第一步,识别硬件I/O函数可以帮助我们理解固件如何与硬件进行交互。

  2. 识别库函数:库函数是预编译的代码块,可以被多个程序共享和使用。识别库函数可以帮助我们理解固件的功能和操作。

  3. 先解码靠近底层的函数:在逆向分析过程中,我们应该首先关注那些靠近硬件或操作系统底层的函数,因为它们通常包含了最重要的信息。

  4. 总结应用层的函数:在理解了底层函数后,我们可以开始总结应用层的函数。这些函数通常负责实现具体的功能,如用户界面,数据处理等。

  5. 使用逆向工程工具:在进行逆向分析时,可以使用一些逆向工程工具,如IDA Pro,Ghidra等,这些工具可以帮助我们更好地理解和分析二进制代码。

  6. 理解固件的结构和工作原理:在逆向分析过程中,我们不仅需要理解各个函数的功能,还需要理解整个固件的结构和工作原理,这对于理解和利用固件的漏洞非常重要。

3.1 预处理&底层I/O函数命名

对应上面思路说明的1-3:用传统方法手工对固件进行处理。
例如这篇文章:《IOT设备逆向工程中的函数识别》。常用的有导入芯片的SVD文件(Edit->Plugins->SVD file management)和用预先制作的签名文件(file->Load file->FLIRT Signature file),对部分底层函数进行识别。此时,能识别部分偏向底层的I/O操作函数和库函数,识别后,导出C伪代码。
运气好的时候,大概能解决1/5函数命名问题。剩下的函数命名我交给AI.

3.2 提取sub_xxx()函数。

按照AI能处理的大小(大概在120K-150K左右)分为多个文件.方便分别向AI上传后提问。

用附件的 python3 脚本 01_findSubFunc.py 来实现。
01_findSubFunc.py 用正则实现了提取,因为IDA 导出的C伪代码格式固定。
前一行带sub_字样,后一行以"{"开头,就是一个函数的开头。
某一行以"}"开头,中间没有任何空格,可以肯定是函数的结尾。

3.3 让AI给函数重命名

记得说明一下背景,让AI理解大概的用途。例如:说明芯片类型,直到用途的话,可以说一下大致的用途。我向 claude.ai 提问的提示词如下:

1
2
3
4
5
下面是一个stm32f103RCT6固件二进制文件的伪C代码,请你给函数重新命名。
例如:原函数sub_AAD8()重命名为:set_motor_speed()。则输出如下:
sub_AAD8,set_motor_speed
一个函数输出一行后就换行。
注意:只对sub_XXX类型的函数进行重命名,不要和已有命名冲突。不用你进行任何解释。

提问情况如下:先上传.c文件到claude,再针对文件给claude提问。

3.4 把重命名的函数名导入IDA

通过附件的 python脚本 02_reNameFunc.py 实现。
运行脚本前,把AI输出结果合并后,放入:config.txt(去掉空格和多余文字)中。
运行脚本方式: file->Script file
运行脚本后,函数重命名完成。

4.Demo文件夹说明

附件 stm32f103RCT6.bin 从本论坛其它帖子下载的用于CTF的STM32固件(没有符号表),也可以避嫌效果作假。
附件 stm32f103RCT6.old.idb 用传统方法处理后的idb文件(我用IDA pro7.5打开)
附件 stm32f103RCT6.new,用传统方法处理后,识别出部分函数名的idb文件(我用IDA pro7.5打开)
附件 stm32f103RCT6.c Ctrl+F5处理后,导出的C文件(用IDA pro7.5导出)
附件 stm32f103RCT6.ok.idb,最终成果,导入AI重命名后的识别出所有函数名的idb文件(我用IDA pro7.5打开)

python脚本说明

脚本: 01_findSubFunc.py 提取出sub_XXX函数。
脚本: 02_reNameFunc.py 把重命名后的函数导入IDA pro.


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

最后于 2023-8-9 15:32 被ylml编辑 ,原因:
上传的附件:
收藏
点赞7
打赏
分享
最新回复 (6)
雪    币: 1322
活跃值: (1052)
能力值: ( LV7,RANK:155 )
在线值:
发帖
回帖
粉丝
ylml 2 2023-8-8 13:03
2
0

效果如下:

雪    币: 4357
活跃值: (2176)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
whitehack 2023-8-8 19:30
3
1
干货.感谢分享.已经用上了
雪    币: 8091
活跃值: (4376)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
sunsjw 1 2023-8-8 22:43
4
0
网站打不开
雪    币: 19431
活跃值: (29092)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
秋狝 2023-8-9 14:16
5
1
厉害了
雪    币: 1322
活跃值: (1052)
能力值: ( LV7,RANK:155 )
在线值:
发帖
回帖
粉丝
ylml 2 2023-8-9 15:15
6
0

@sunsjw

这个网站(https://claude.ai)在国内打不开是正常的。美国人才能用。

因为众所周知的原因,国内需要用特殊方法才能访问。

最后于 2023-8-14 19:00 被ylml编辑 ,原因:
雪    币: 2
能力值: ( LV1,RANK:0 )
在线值:
发帖
回帖
粉丝
mb_bldmrjwl 2024-2-26 22:44
7
0
AI写代码不行,但是做注释什么的还是不错的。
游客
登录 | 注册 方可回帖
返回