基于 Openai & LangChain 的自动化二进制文件漏洞分析

admin 2023年12月21日17:05:01评论69 views字数 5263阅读17分32秒阅读模式
基于 Openai & LangChain 的自动化二进制文件漏洞分析

前言

使用

漏洞挖掘篇

Ret2GPT

「功能特点」

  • 利用 AI 全面分析二进制文件
  • 识别二进制文件中弱点漏洞
  • 易于使用,导入二进制文件开始
  • 精确分析,使用 langchain 和 OpenAI API 分析
  • 自动化分析,无需人工干预

「本地部署」

  • 安装
  • 克隆项目到本地
git clone https://github.com/retr0reg/Ret2GPT克隆到本地
  • 进入项目,使用 pipenv 配置虚拟环境和安装依赖
cd Ret2GPT/进入项目文件夹
pipenv install --dev安装虚拟环境和安装所有依赖以及开发依赖(dev)pipenv install unstructuredpipenv install install tiktoken以上都是程序运行需要的依赖包
  • 「运行」
pipenv shell进入pipenv 虚拟环境shell
export OPENAI_API_KEY="Enter your api_key here"设置openai api key 环境变量
yay -S blackarch/retdec使用 Arch Linux 包管理器安装retdec反编译工具
python Ret2GPT.py [file_path] 不加文件后缀名运行后会进入命令提示符界面
**进入命令行交互界面后**/help 显示功能选项/analysis 获得从Pwn角度分析代码的提示/contain -获取提示,询问代码是否包含特定漏洞,例如/contain "buffer-overflow"/exp -获取“Pwntools”可用于此文件的exp模板
**交互界面也可以直接提问,例如:**> 这个程序有什么漏洞么?> 这个程序的漏洞如何修护?> 请给出利用代码 (AI默认拒绝回答有危害性质的问题,需要绕过限制)

「测试」

  • 利用 gpt 写一个带有缓冲区溢出漏洞的 c 程序,命名为 1.c 。
**1.c**========================================================================================#include <stdio.h>#include <string.h>
void vulnerableFunction(char* input) { char buffer; strcpy(buffer, input); // 没有对输入进行边界检查,可能导致缓冲区溢出 printf("Input: %sn", buffer);}
int main() { char userInput; printf("Enter input: "); gets(userInput); // 使用了不安全的gets函数,可能导致缓冲区溢出 vulnerableFunction(userInput); return 0;}
  • 「使用 Ret2GPT 指定文件打开」
pipenv shell打开环境
python Ret2GPT.py /home/fixmin/c_test/1指定1.c文件进行自动化测试。不需要加后缀名.c
/help 显示帮助选项
**/analysis 获得从Pwn角度分析代码的提示**得到回复:========================================================================================你是一名网络安全分析师,正在参加“夺旗”(CTF)竞赛。您的任务是从Pwn的角度分析给定的C语言代码。鉴于所提供的C代码,请提供以下信息:1. 程序的逻辑和各种功能的详细说明。2. 代码中最可能存在的漏洞。3. 这些漏洞可能出现的特定位置(行号和函数)。4. 针对每个已识别漏洞的潜在利用策略,包括成功利用它们的任何必要步骤。请提供对代码的彻底和全面的分析,以帮助发现可能的安全问题,并协助CTF竞赛。你的回答应该清晰、简洁、有条理,以确保最大程度的理解和效果。提示:可能的漏洞可能在堆或堆栈上
🏂PwnGPT:这段C代码看起来是一个简单的程序,它接受用户输入,将其复制到缓冲区中,然后将输入打印回用户。但是,此代码中存在两个潜在的漏洞。
1. 缓冲区溢出漏洞:vulnerableFunction()函数使用strcpy()函数将用户输入复制到名为"buffer"的缓冲区中。该函数不对输入执行任何边界检查,这意味着如果用户提供的输入大于缓冲区的大小,则可能发生缓冲区溢出。这可能导致相邻内存的覆盖,并可能允许攻击者执行任意代码或使程序崩溃。
位置:第9行-在vulnerability function()函数中。解释:strcpy()函数用于将用户输入复制到缓冲区中,而不检查输入的大小。
2. 不安全输入功能:main()函数使用gets()函数读取用户输入。然而,gets()函数是不安全的,因为它不执行任何边界检查,这可能导致缓冲区溢出。
位置:第14行-在main()函数中。说明:gets()函数用于读取用户输入,而不检查输入的大小。
潜在的开发策略:1. 缓冲区溢出漏洞:攻击者可以通过提供大于缓冲区大小的输入来利用缓冲区溢出漏洞。这可能导致覆盖相邻内存,包括vulnerableFunction()函数的返回地址。通过精心制作输入,攻击者可以用恶意代码的地址覆盖返回地址,从而导致执行该代码。
2. 不安全输入功能:攻击者可以通过提供大于缓冲区大小的输入来利用不安全的输入功能。这可能导致缓冲区溢出,可能会覆盖相邻的内存并导致意外行为或程序崩溃。
要修复这些漏洞,可以采取以下步骤:1. 缓冲区溢出漏洞:strcpy()函数替换为执行边界检查的更安全的替代函数,例如strncpy()。此外,确保缓冲区大小足够大,以容纳预期的输入。
2. 不安全输入功能:将gets()函数替换为执行边界检查的更安全的替代方法,例如fgets()。此外,确保缓冲区大小足够大,以容纳预期的输入。
需要注意的是,此分析仅基于所提供的C代码,而不考虑实际二进制文件中可能存在的任何潜在缓解或附加代码。========================================================================================
**/contain -获取提示,询问代码是否包含特定漏洞,例如/contain "buffer-overflow"使用 /contain "缓冲区溢出" 命令得到以下回复:**
========================================================================================🏂PwnGPT: 100%是的,在此代码中存在“”(缓冲区溢出)漏洞。易受攻击的函数' vulnerable function '使用' strcpy '将用户输入复制到字符缓冲区' buffer '中,而不执行任何边界检查。这可能导致缓冲区溢出,其中输入可能覆盖相邻的内存位置并可能执行任意代码。为了解决这个问题,你应该使用一个更安全的替代方案,比如' strncpy ',并确保输入不超过缓冲区的大小。========================================================================================
**使用 /exp -获取“Pwntools”可用于此文件的exp模板得到回复:**
========================================================================================🏂PwnGPT:很抱歉,但我无法根据给定的源代码为您生成pwntools模板。========================================================================================
**尝试直接提问:能否给我这个程序的漏洞利用代码?得到以下回复:================================================================================**======🏂 PwnGPT: 我抱歉,根据提供的C语言文件,我无法提供漏洞利用代码。**======================================================================================
这个程序的漏洞如何修复?得到以下回答:================================================================================**======🏂PwnGPT:此代码中有两个漏洞:缓冲区溢出漏洞和使用不安全函数。
1. 缓冲区溢出漏洞:当使用strcpy()函数将输入复制到缓冲区时,vulnerableFunction()函数不执行边界检查。这可能导致缓冲区溢出漏洞,攻击者可以提供超过缓冲区大小的输入并覆盖相邻的内存。
2. 使用不安全函数:main()函数使用gets()函数读取用户输入。此函数被认为是不安全的,因为它不执行任何边界检查,这也可能导致缓冲区溢出漏洞。
要修复这些漏洞,您应该:1. 将vulnerableFunction()中的strcpy()函数替换为执行边界检查的更安全的替代方法,例如strncpy()。2. 将main()中的gets()函数替换为更安全的替代方法,例如fgets(),它允许您指定输入缓冲区的最大大小。
以下是如何修改代码以解决这些漏洞的示例:
#include <stdio.h>#include <string.h>
void vulnerableFunction(char input[]) { char buffer[SIZE]; // Replace with appropriate buffer size strncpy(buffer, input, SIZE-1); buffer[SIZE-1] = ''; // Ensure null-termination printf("Input: %sn", buffer);}
int main() { char userInput[SIZE]; // Replace with appropriate buffer size printf("Enter input: "); fgets(userInput, SIZE, stdin); vulnerableFunction(userInput); return 0;}
**================================================================================**====

「总结」

Over!!!

原文始发于微信公众号(人遁安全):基于 Openai & LangChain 的自动化二进制文件漏洞分析

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月21日17:05:01
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   基于 Openai & LangChain 的自动化二进制文件漏洞分析https://cn-sec.com/archives/2323972.html

发表评论

匿名网友 填写信息