参考链接:https://blog.csdn.net/weixin_47778392/article/details/141107768
https://www.cnblogs.com/Q7h2q9/p/18590724
LLVM
BC(bitcode)逆向
clang llc llvm 常用编译指令-CSDN博客
将C文件编译为LLVM bitcode 文件
1clang -o3 -emit-llvm hello.c -c -o hello.bc
由于.bc 是bitcode的二进制格式,.ll 文件 llvm bitcode 的可读文本
1clang -o3 -emit-llvm hello.c -S -o hello.ll
llvm-dis 工具反汇编llvm bitcode 文件, 可以将bc文件转为.ll文件
1llvm-dis hello.bc
用 llvm-as 工具通过汇编文件(.ll 文件)得到字节码文件(.bc 文件)
1llvm-as hello.ll hello.bc
.bc编译成.o第一种方法:用clang直接将其编译为可执行文件
1clang a.o.bc -o struct
1第二种方法:用llc先将bc编译为汇编,再用本地的gcc将其编译为可执行文件。
12llc a.o.bc -o hello.sgcc hello.s -o hello
编译生成可执行文件
1clang hello.c -o hello
或者
1clang -emit-llvm -c hello.c
.bc到.s编译指令
1clang -S -fobjc-arc struct.bc -o struct.s
工具clang llvm
12sudo apt updatesudo apt install llvm clang llvm-dev llvm-runtime lldb
检查版本
12llvm-config --versionclang --version
1. 处理.bc文件.bc文件是 LLVM 中间表示(IR)的二进制格式。要逆向分析它,需将其转换为可读的文本格式(.ll)。
a. 转换为 LLVM IR 文本格式使用llvm-dis工具(LLVM 反汇编器):
1llvm-dis input.bc -o output.ll
生成的output.ll是文本形式的 LLVM IR,可用文本编辑器查看。
b. 直接查看.bc文件信息分析.bc文件结构:
1llvm-bcanalyzer input.bc
2. 使用 Clang 编译/反编译a. 将 .bc 编译为可执行文件1clang input.bc -o output
生成的可执行文件output可用逆向工具(如 Ghidra、IDA Pro)分析。
b. 反编译为 C 代码(需额外工具)直接反编译 LLVM IR 到 C 代码需要第三方工具,例如:
RetDec:支持 LLVM IR 反编译。
12345678910# 安装 RetDecgit clone https://github.com/avast/retdec.gitcd retdec./retdec-support.shmkdir build && cd buildcmake .. -DCMAKE_INSTALL_PREFIX=/path/to/installmake && make install# 使用 RetDec 反编译retdec-decompiler.py input.bc
3. 动态分析(调试)使用lli( LLVM 解释器)直接运行.bc文件:
1lli input.bc
结合调试器(如 gdb 或 lldb)跟踪执行流程:
1lldb -- lli input.bc
bc版本兼容问题最好根据原生编译平台去下载
个人做法是查看内容安装对应版本
将 .bc 转换为 .ll(LLVM IR 文本格式),查看头部信息:
12llvm-dis Dragon.bc -o Dragon.llhead -n 20 Dragon.ll
关键信息:
target triple:目标平台(可推断兼容的 LLVM 版本)。
如果文件包含 llvm.ident,会显示 Clang 版本:
是windows下vs生成的,但版本切换麻烦,直接kali安装了
1234wget https://apt.llvm.org/llvm.shchmod +x llvm.shsudo ./llvm.sh 17sudo apt install clang-17
编译时指定目标三元组
1clang-17 -target x86_64-pc-windows-msvc19.39.33522 Dragon.bc -o output
切换版本可以参考这个:https://blog.csdn.net/weixin_45100742/article/details/139897786
遭遇该报错
错误原因
你正在 Linux(Kali)上编译一个面向 Windows(x86_64-pc-windows-msvc)的 LLVM Bitcode 文件。
Clang 默认会尝试调用 Linux 的链接器 ld ,但 .bc 文件包含 MSVC 特有的库依赖(如 libcmt,Windows 的 C 运行时库)。
用vscode配置环境:https://zhuanlan.zhihu.com/p/613922486
llvm下载网址:https://releases.llvm.org/download.html
安装llvm配置环境变量,将mingw64 文件夹中的所有文件拷贝到 LLVM
正式逆向Dragon.bc文件(XYCTF2025–Re)
–target=x86_64-w64-windows-gnu 或 –target=x86_64-w64-mingw
可以vs下载msvc库,但不影响,exe已生成,可以逆向了