ChatWithBinary
chatwithbinary.com 的重新维护将于 9 月 1 日开始
ChatWithBinary
是一种尖端的软件工具,旨在使用 LangChain(OpenAI API)技术分析二进制文件。它主要帮助 CTF(Capture The Flag)攻防队员深入了解他们正在处理的二进制文件,并提供有价值的帮助,帮助他们更有效地解决挑战 :)
ChatWithBinary
基于人工智能和机器学习的强大基础,能够快速高效地分析复杂的二进制文件。通过利用 OpenAI API
的力量,RET2GPT 可以提供全面且详细的二进制文件分析,使其成为 CTF 攻防队员不可或缺的工具。
ChatWithBinary
的主要目标是简化理解二进制文件的过程,从而使 CTF 攻防队员能够专注于解决挑战而不是陷入二进制分析的复杂性中。该软件通过对二进制文件的结构、逻辑和潜在漏洞进行彻底检查来实现这一目标。这种分析帮助攻防队员识别代码中可能被攻击者利用的任何弱点。
总而言之,ChatWithBinary
包括以下功能:
- 易于使用:无需输入任何其他文件,只需二进制文件 即可
- Langchains:使用
langchain
来分割文件,为您节省大量的标记时间和金钱 - 精确分析:使用 langchain 和 OpenAI API 分析二进制文件,使用我精心设计的提示语获得最佳结果
- 自动化:使用
langchain
和OpenAI API
在没有人工干预的情况下实现二进制文件的自动化分析
安装
Pip
我们的包已经成功上传到 Pypi !!!, 所以你可以通过使用 pip
轻松安装它:
python3 -m pip --index-url=https://pypi.org/simple/ Ret2GPT
此外,如果你还没有安装 retdec
,你可能需要先通过https://github.com/avast/retdec 来安装它,这不会花太长时间,将一劳永逸
在开始之前,你仍然需要在终端中设置你的 OPENAI_KEY
,你可以从这里 获取你的密钥:
export OPENAI_API_KEY="Enter your api_key here"
然后你可以通过在终端中使用 Ret2GPT
来使用它:
Ret2GPT [FILE_PATH]
本地
首先,克隆我们的仓库:
git clone https://github.com/DDizzzy79/Ret2GPT.git
现在,如果你只想尝试 Ret2GPT
,你可以通过使用 python3
运行它:
python3 ret2gpt
然而,如果你想永久使用 Ret2GPT
,你可以通过执行 install.sh
文件轻松安装它:
chmod +x install.sh && ./install.sh
之后,你可以使用 ret2gpt
命令从任何地方运行我们的软件,这简直是奇迹吧?
使用方法
在开始之前,你需要在终端中设置你的 OPENAI_KEY
,你可以从这里 获取你的密钥:
export OPENAI_API_KEY="Enter your api_key here"
首先,在命令行中使用此文件的方法为:
Usage: ret2gpt [FILE_PATH]
现在,您进入了命令行界面,您可以询问您想问的任何问题
例如,如果你想知道程序是否易受缓冲区溢出的影响,你可以问:
What do you want to ask about example2/hacknote.c >>> Are there any buffer overflow based on the program?
🏂 PwnGPT: 100% YES, there are several potential buffer overflow vulnerabilities in this code.
The add_note() function uses the read() function to read user input into a buffer without specifying a maximum buffer size,
which could allow an attacker to overflow the buffer and overwrite adjacent memory locations.
Additionally, the print_note() and del_note() functions also read user input without proper boundary checks, which could result in buffer overflows.
To fix these issues, implement proper input validation and boundary checks before reading user input, and use functions like fgets() or scanf() that allow specifying a maximum buffer size.
你可以使用 help
命令获取帮助信息:
What do you want to ask about example2/hacknote.c >>> /help
/analysis - 从 Pwn 角度获取代码分析提示
/exp - 获取可供 “Pwntools” 使用的 exp 模板
/exit - 退出程序
What do you want to ask about example2/hacknote.c >>>
我相信你自己能弄明白这两个命令的意思
Ret2GPT 如何工作?
要找到这个问题的答案,我们必须分析程序的每个目录和步骤,所以让我们开始吧!
langchain_proprocess/
在这部分代码中,我设计了一系列的函数和实用工具,利用 LangChain(OpenAI API)技术的力量创建一个先进的问题回答系统。该系统专门用于处理和分析文本文件,主要目标是帮助 Capture the Flag (CTF) 攻防队员理解二进制文件并更有效地解决挑战。
我首先导入了必要的模块,并使用 GPT-3.5 Turbo 模型初始化了 ChatOpenAI 模型。接下来,我定义了几个处理文本分析流水线中各种任务的实用函数:
loading
:
该函数接收一个文本文件描述符作为输入,并使用 TextLoader 实用程序将文件加载到内存中。
split_files
:
文件加载后,该函数使用 CharacterTextSplitter 实用程序将文档分成较小的块,使其更易于处理。
def split_files(loader):
document = loader.load()
text_splitter = CharacterTextSplitter(chunk_size=1000, chunk_overlap=0)
return text_splitter.split_documents(document)
create_qa
:
该函数通过将文本块与 OpenAIEmbeddings 和 Chroma 向量存储结合起来创建一个问答系统,从而实现高效的信息检索。
def create_qa(loader):
from langchain.embeddings import OpenAIEmbeddings
from langchain.vectorstores import Chroma
embeddings = OpenAIEmbeddings()
db = Chroma.from_documents(split_files(loader), embeddings)
retriever = db.as_retriever()
return RetrievalQA.from_chain_type(llm=model, chain_type="stuff", retriever=retriever)
此外,我还为 QA bot
使用 GPT3.5
qa_with_docs
:
该函数运行问答链,将查询和文档加载器作为输入以生成有意义的回答。
query_about_files
:
该函数通过提供用户定义的查询来促进问答系统的查询。
summerize_chain
:
该函数负责通过摘要链对文本文件进行摘要,生成文件内容的简洁摘要。
为了确保问答系统能够理解上下文并提供准确且相关的信息,我使用 build_prompt_for_qa()
函数构建了一个详细的提示。此函数采用少样本学习的方法,结合FewShotPromptTemplate类,并包含几个代码分析和漏洞识别的示例。这些示例作为模型的指导,帮助模型理解上下文并做出相应的响应。
def build_prompt_for_qa(query):
from langchain import PromptTemplate
categories = ["Pwn","Reverse"]
main_prompt = """
描述:你是一个正在进行夺旗(CTF)比赛的分析员。
你的任务是帮助参赛者分析他们提供的二进制文件反编译出的 C 文件。
你必须首先提供漏洞的可能性。
请记住,你只能访问 C 语言文件,不能要求关于这些文件的任何额外信息。
当你给出回复时,你必须提供漏洞的位置和为什么这是一个漏洞的原因,否则你不能回复。
运用你的专业知识,彻底分析这些 C 文件,并为参赛者提供宝贵的见解。
提示:一名 CTF 比赛的参赛者刚刚提交了一份反编译的 C 文件以供分析。
他们在寻找任何潜在的漏洞、弱点或可能帮助他们比赛的线索。
使用仅在 C 文件中提供的信息,提供详细的分析,突出任何关注或值得注意的区域。
请勿生成不确定的信息。
以下是一些示例:
"""
examples = [
{
"query": "你能在这段代码中找到任何缓冲区溢出漏洞吗?",
"answer": "是的,通过对代码的分析,我发现了一个潜在的缓冲区溢出漏洞在函数 read_input 中。该函数使用 gets() 来读取用户输入到固定大小的缓冲区中,但没有检查输入长度,导致可能发生溢出。考虑用更安全的替代方法,如 fgets(),并验证输入大小以防止此问题。"
},{
"query": "这段代码中有没有产生竞争条件的漏洞?",
"answer": "是的,通过分析,我发现了一个潜在的竞争条件漏洞在函数 write_to_file 中。该函数使用 fopen() 打开一个文件并执行写操作,而没有适当的同步机制,例如锁。这可能会导致数据损坏或未授权的访问,如果多个进程或线程同时访问该文件。为了减轻这一问题,请考虑实施适当的文件锁定机制或使用原子文件操作。"
},
{
"query": "这段代码中是否有不安全的随机数生成方式?",
"answer": "0%没有,这段代码中使用了安全的随机数生成方法。这段代码使用了 libsodium 库中的 randombytes() 函数,这是一个加密安全的随机数生成器。这确保了代码生成的任何随机值都具有足够的不可预测性和抗攻击性。"
},{
"query": "这段代码中是否存在格式字符串漏洞?",
"answer": "100%是的,print_user_info() 函数中存在格式字符串漏洞。该函数使用 printf() 打印用户输入,而没有指定适当的格式字符串。这可能允许攻击者利用该漏洞读取或写入任意内存地址。修复此问题的方法是使用匹配预期输入的格式字符串,比如 printf(\"%s\", user_input);。"
},
{
"query": "这段代码中是否有任何整数溢出漏洞?",
"answer": "50%可能,我可能检测到计算大小() 函数中出现潜在的整数溢出漏洞。该函数可能在用户提供的整数上执行算术运算而没有适当的边界检查,这可能导致整数溢出。这可能会导致错误的计算、缓冲区溢出或其他意外行为。为减轻此漏洞,请在执行算术运算之前实施适当的输入验证和边界检查。"
}
]
example_template = "用户: {query}(基于代码)\n GPT: {answer}"
example_prompt = PromptTemplate(
input_variables=["query", "answer"],
template=example_template
)
suffix = "用户:{query}\nAI:"
from langchain import FewShotPromptTemplate
few_shot_prompt_template = FewShotPromptTemplate(
examples=examples,
example_prompt=example_prompt,
prefix=main_prompt,
suffix=suffix,
input_variables=["query"],
example_separator="\n\n"
)
return few_shot_prompt_template.format(query=query)
built_in_command/
我认为 Ret2gpt
的这部分不需要过多的解释,这只是一个命令行界面,允许用户与系统进行交互。built_in_command
文件夹包含以下文件:
__init__.py
:此文件负责将built_in_command
文件夹初始化为一个 Python 包。check_for_command.py
:此文件包含check()
和help()
函数,check()
用于检查用户输入是否为命令,并返回不同的提示,help()
则打印帮助信息。command_line.py
:此文件包含command_line()
函数,这是built_in_command
文件夹的主函数。它负责解析用户输入并调用相应的函数。