异度部落格

学习是一种生活态度。

0%

使用LLM反编译二进制程序

本文介绍的内容仅供学习和娱乐使用,不建议使用在生产环节

前言

偶然间,我读到了一篇名为《LLM4Decompile: Decompiling Binary Code with Large Language Models》的论文,介绍了如何使用大型语言模型(LLM)对二进制程序进行反编译。受此启发,我进行了一个简单的实验,复现了整个反编译过程。

使用 LLM 反编译 Hello World 程序

实验选取了 C++语言编写的 Hello World。大体流程如下: 8d2525def5b2684a71df5e69cee2ed27.png

1.创建 helloworld.cpp 文件

#include <iostream>
using namespace std;

int main() {
cout << "Hello, World!" << endl;
return 0;
}

2.编译程序并运行

g++ helloworld.cpp -o helloworld
./helloworld
Hello, World!

3.反编译得到汇编代码 这里选用的是 objdump 工具

objdump -d -M intel helloworld > helloworld.asm

4.将得到汇编代码贴入 ChatGPT 中,并给出提示词

把下面的汇编还原成C++代码:

Disassembly of section .init:

0000000000001000 <_init>:
1000: f3 0f 1e fa endbr64
1004: 48 83 ec 08 sub rsp,0x8
1008: 48 8b 05 d9 2f 00 00 mov rax,QWORD PTR [rip+0x2fd9] # 3fe8 <__gmon_start__>
100f: 48 85 c0 test rax,rax
1012: 74 02 je 1016 <_init+0x16>
1014: ff d0 call rax
1016: 48 83 c4 08 add rsp,0x8
101a: c3 ret
(省略...)

下面是 ChatGPT 的返回: 3fb2d1c61d6a4645e13ae2e558faef36.png

总结

尽管这个文本反编译程序相对简单,实验过程也不够严谨,但它确实简单地证明了 LLM 反编译代码的可行性。这启发了我们一些其他的思路,例如格式化混淆后的 JavaScript 文件、处理反编译后的 JAR 文件等等。