首页
社区
课程
招聘
基于ChatGPT的IDA插件初探(加中文注释、标出可能的漏洞点)
发表于: 2023-2-8 12:11 17733

基于ChatGPT的IDA插件初探(加中文注释、标出可能的漏洞点)

2023-2-8 12:11
17733

目前,ChatGPT火了,各种方式调戏,能辅助编写各种总结。
对程序猿来说:不但能根据需求写代码,看不懂的代码还能帮忙解读代码,写代码注释。以后的开发文档也不愁了。
还可以编写exp和Fuzz代码,总之,能力很强。
听说有IDA插件,小测一下,算是抛砖引玉吧。

 

(1)Geptto是一个IDA插件,它使用了chatGPT的API,通过调用API,能够在IDA中让chatGPT识别函数,对函数实现的功能进行描述,并且根据函数的功能将变量重命名为易于理解的形式。

1
2
https://github.com/JusticeRage/Gepetto
(附件的脚本改为调用GPT-3,改成中文支持)

(2)VulChatGPT是在Geptto的基础上进行了一点小修改,返会函数可能存在的漏洞,还可以生成漏洞的利用脚本。

1
2
https://github.com/ke0z/VulChatGPT
(附件的脚本改为调用GPT-3,改成中文支持)

这两个脚本其实原理相同:都用了使用 OpenAI 的 davinci-003 模型为 IDA Pro 反编译的函数提供分析结果。

 

(3)WPeChatGPT是坛友WPeace在Geptto的基础上做了一些改进,会函数分析、会变量重命名,还能发现可能的漏洞,最后:还可以生成漏洞的利用脚本。
创新点是:可以python还原函数。
v2.0 版本后使用 OpenAI 最新的 gpt-3.5-turbo 模型

1
https://github.com/WPeace-HcH/WPeChatGPT

1.首先安装openai的python依赖库,建议用python3.6或3.8:

1
pip install openai

2.申请或者借一个openai的API Key.
登录openai后,右上角“view API keys”,API keys,创建一个"API keys".
记下API keys(注意:API Keys只能显示一次)。
把 API keys 放入附件的python脚本的第14行。

 

3.复制到IDA目录下的plugins目录中,重新启动IDA pro,看是否正常加载(没有报错信息就没什么大问题)。

 

4.使用方法:使用你的IDA随意打开一个二进制文件,选择一个函数按F5完成反汇编,然后在反汇编窗口右键,会有一个选项卡
选择“VulChat”或“Gepetto”下的子菜单就可以了。

剩下的就是等待了,大约30-60秒,会有返回结果。
函数名称上方增加的注释即是结果。

 

一个不恰当的例子(没找到合适的二进制漏洞演示文件),只是让大家看看效果。
如下:

 

因为脚本很好理解。发送要求和伪代码段给openai的API接口过去,大家可以自行修改。

 

后续改进方向:
1.针对大函数不能解析的问题,发现 code-davinci-002这个模型支持 8000 tokens,建议替换试用效果。

  1. 场景:假设要分析的文件有1000个函数,手动一个一个发送过去让AI分析太累。让程序自动跑,睡一觉后,二进制文件的分析已经分析完毕。懒人才开始进入人工分析阶段。
    实现思路:1.增加“一键分析Sub_开头的所有函数”,2.程序还会判断只有大于100字的函数才做分析。3.多线程或多单线程慢慢解析。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2023-3-10 11:12 被ylml编辑 ,原因:
上传的附件:
收藏
免费 8
支持
分享
最新回复 (16)
雪    币: 1231
活跃值: (1067)
能力值: ( LV7,RANK:155 )
在线值:
发帖
回帖
粉丝
2

例如:Tenda AC15 HTTP setMacFilterCfg 缓冲区溢出与远程代码执行漏洞(CVE-2018-18708)

该路由器/goform/setMacFilterCfg接口对输入的参数没有有效性检查,导致存在缓冲区溢出漏洞。

攻击者在获取登录授权的情况下,可以通过POST方法构造deviceList参数实现远程代码执行。


第一个函数:调用gepetto解释一下函数的意思;

第二个函数:调用VulChatGPT,找漏洞。

关系:第二个函数调用了第一个函数,因此要理解一下第一个函数的意思。

// 
// 新名称:check_macfilter_rule()
// 使用环境:该函数可能是cgi中的一个函数,它需要从a1字符串中解析出mac地址和名字并将其拷
// 贝到a2空间里。不过当解析时会有某些异常情况(如文件格式错误、文件包含回车字符、文件内容太大导致覆盖栈上的变量等)会造成栈溢出。
//
// 预期目的:该函数主要用来对mac地址进行过滤条件校验并检测是否存在可能造成栈溢出的危险情况。
signed int __fastcall check_macfilter_rule(const char *a1, char *a2)
{
  int v2; // r3
  int v6[4]; // [sp+10h] [bp-34h] BYREF
  int s2[4]; // [sp+20h] [bp-24h] BYREF
  char v8; // [sp+32h] [bp-12h]
  char v9; // [sp+33h] [bp-11h]
  char *src; // [sp+34h] [bp-10h]

  src = strchr(a1, 13);
  if ( src )
  {
    *src++ = 0;
    v6[0] = 0;
    v6[1] = 0;
    v6[2] = 0;
    v6[3] = 0;
    if ( GetValue("cgi_debug", v6) && !strcmp("on", (const char *)v6) )
    {
      v9 = 1;
      printf("%s[%s:%s:%d] %s", off_1018C8[0], "cgi", "parse_macfilter_rule", 807, off_1018C0[0]);
      printf("parase rule: name == %s, mac == %s\n\x1B[0m", a1, src);
    }
    strcpy(a2 + 32, a1);
    strcpy(a2, src);
    v2 = 0;
  }
  else
  {
    s2[0] = 0;
    s2[1] = 0;
    s2[2] = 0;
    s2[3] = 0;
    if ( GetValue("cgi_debug", s2) && !strcmp("on", (const char *)s2) )
    {
      v8 = 2;
      printf("%s[%s:%s:%d] %s", off_1018C8[0], "cgi", "parse_macfilter_rule", 803, off_1018C4[0]);
      printf("source_rule error: %s!\n\x1B[0m", a1);
    }
    v2 = 2;
  }
  return v2;
}
// 
// 漏洞:
// sub_C24C0函数中存在栈溢出,当a2参数传入大小超过128B时,由于程序并没有对长度进行判断和限制,将会引发栈溢出。
// 利用方法:通过向a2参数传入大量的特定字符对目标内存区域覆盖执行特定代码来达成将任意shellcode注入内存并执行的功能。
int __fastcall sub_C17A0(int a1, const char *a2, int a3)
{
  int v7[4]; // [sp+1Ch] [bp-1E0h] BYREF
  int v8[4]; // [sp+2Ch] [bp-1D0h] BYREF
  int s2[4]; // [sp+3Ch] [bp-1C0h] BYREF
  char v10[128]; // [sp+4Ch] [bp-1B0h] BYREF
  char s[128]; // [sp+CCh] [bp-130h] BYREF
  char v12[176]; // [sp+14Ch] [bp-B0h] BYREF

  memset(s, 0, sizeof(s));
  memset(v10, 0, sizeof(v10));
  s2[0] = 0;
  s2[1] = 0;
  s2[2] = 0;
  s2[3] = 0;
  if ( GetValue("cgi_debug", s2) && !strcmp("on", (const char *)s2) )
  {
    v12[163] = 1;
    printf("%s[%s:%s:%d] %s", off_1018C8[0], "cgi", "set_macfilter_rules_by_one", 667, off_1018C0[0]);
    printf("set macfilter rules by one, source_rule == %s, index == %d\n\x1B[0m", a2, a3);
  }
  memset(v12, 0, 160u);
  check_macfilter_rule(a2, v12);// 漏洞点
  v8[0] = 0;
  v8[1] = 0;
  v8[2] = 0;
  v8[3] = 0;
  if ( GetValue("cgi_debug", v8) && !strcmp("on", (const char *)v8) )
  {
    v12[162] = 1;
    printf("%s[%s:%s:%d] %s", off_1018C8[0], "cgi", "set_macfilter_rules_by_one", 671, off_1018C0[0]);
    printf("get rule%d: name == %s, mac == %s\n\x1B[0m", a3, &v12[32], v12);
  }
  snprintf(s, 0x80u, "macfilter.%s.list%d", (const char *)a1, a3);
  snprintf(v10, 0x80u, "%s", v12);
  v7[0] = 0;
  v7[1] = 0;
  v7[2] = 0;
  v7[3] = 0;
  if ( GetValue("cgi_debug", v7) && !strcmp("on", (const char *)v7) )
  {
    v12[161] = 1;
    printf("%s[%s:%s:%d] %s", off_1018C8[0], "cgi", "set_macfilter_rules_by_one", 675, off_1018C0[0]);
    printf("set rule: %s == %s\n\x1B[0m", s, v10);
  }
  SetValue(s, v10);
  if ( v12[32] )
    sub_C6D58(&v12[32], v12);
  return 0;
}
最后于 2023-2-8 13:00 被ylml编辑 ,原因:
2023-2-8 12:48
0
雪    币: 14484
活跃值: (17483)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
3
chatGPT不是关闭访问了么?这插件还能用?
2023-2-8 14:16
0
雪    币: 203
活跃值: (1052)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
4
测试了下.还可以.
但是如果函数过大,就提示无法分析了
2023-2-8 14:52
0
雪    币: 638
活跃值: (6477)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
pureGavin chatGPT不是关闭访问了么?这插件还能用?
重新登录还是能用
2023-2-8 14:52
0
雪    币: 2225
活跃值: (1154)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
6
请问一下,怎么返回中文
2023-2-8 16:42
0
雪    币: 246
活跃值: (4427)
能力值: ( LV4,RANK:45 )
在线值:
发帖
回帖
粉丝
7
大大部分情况他都是没用的
2023-2-8 16:49
0
雪    币: 9348
活跃值: (1825)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
报错 davinci-003 could not complete the request: Error communicating with OpenAI
2023-2-9 04:33
0
雪    币: 1231
活跃值: (1067)
能力值: ( LV7,RANK:155 )
在线值:
发帖
回帖
粉丝
9
pureGavin chatGPT不是关闭访问了么?这插件还能用?

附件我在开源的基础上做了点修改,以应对国内不能访问的情况。实际调用API Keys用的GPT-3,而不是最新的GPT-3.5.

实际上,调用GPT-3.5的效果比现在要惊艳。

最后于 2023-2-9 14:47 被ylml编辑 ,原因:
2023-2-9 13:30
0
雪    币: 1231
活跃值: (1067)
能力值: ( LV7,RANK:155 )
在线值:
发帖
回帖
粉丝
10
用我帖子里的附件,就可以返回中文。
原来的Github下载的文件,返回的是英文。
2023-2-9 13:31
0
雪    币: 1231
活跃值: (1067)
能力值: ( LV7,RANK:155 )
在线值:
发帖
回帖
粉丝
11
Lunction 报错 davinci-003 could not complete the request: Error communicating with OpenAI
我也报过这类错错,我修改了请求的字数以后,就不报错了,可以参考我发的附件的脚本。
2023-2-9 13:48
0
雪    币: 1231
活跃值: (1067)
能力值: ( LV7,RANK:155 )
在线值:
发帖
回帖
粉丝
12

缺点1:现在API只能接收不超过4000字左右的请求。
缺点2:返回需要时间,大概30-60秒,有点慢!
如果以后不受字数限制了,或者国内掌握了这种技术可以秒返回结果了,那么实用性就大大提高了。
例如:可以瞬间分析完整个二进制文件,然后,输出一篇人类容易理解的、可行性高的漏洞报告,再自动生成exp脚本。

最后于 2023-2-9 13:49 被ylml编辑 ,原因:
2023-2-9 13:48
0
雪    币: 9348
活跃值: (1825)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
ylml 缺点1:现在API只能接收不超过4000字左右的请求。缺点2:返回需要时间,大概30-60秒,有点慢!如果以后不受字数限制了,或者国内掌握了这种技术可以秒返回结果了,那么实用性就大大提高了。例如:可以 ...
用的就是帖子里的附件 添加了key
2023-2-9 14:12
0
雪    币: 14484
活跃值: (17483)
能力值: ( LV12,RANK:290 )
在线值:
发帖
回帖
粉丝
14
ylml pureGavin chatGPT不是关闭访问了么?这插件还能用? 附件我在开源的基础上做了点修改,以应对国内不能访问的情况。实际调用API&a ...
有办法走sock5代理之类的吗?毕竟我会魔法 
2023-2-9 14:51
0
雪    币: 1231
活跃值: (1067)
能力值: ( LV7,RANK:155 )
在线值:
发帖
回帖
粉丝
15

在每个人所在的领域,用ChatGPT搞点创新,提高工作效率,还是有点意思的。

最后于 2023-3-11 05:45 被ylml编辑 ,原因:
2023-2-9 17:07
0
雪    币: 4002
活跃值: (3047)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
16
实验了下,不错。
2023-3-15 08:53
0
雪    币: 4002
活跃值: (3047)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
17
请使用这个proxy设置
proxies = {'http':"http://xxxx:xxx", 'https':"http://xxxx:xxx"}
openai.proxy = proxies
2023-4-5 15:25
0
游客
登录 | 注册 方可回帖
返回
//