BC文件逆向

参考链接:https://blog.csdn.net/weixin_47778392/article/details/141107768

https://www.cnblogs.com/Q7h2q9/p/18590724

LLVM

BC(bitcode)逆向

clang llc llvm 常用编译指令-CSDN博客

  1. 将C文件编译为LLVM bitcode 文件
1
clang -o3  -emit-llvm hello.c -c -o hello.bc
  1. 由于.bc 是bitcode的二进制格式,.ll 文件 llvm bitcode 的可读文本
1
clang -o3  -emit-llvm hello.c -S -o hello.ll

llvm-dis 工具反汇编llvm bitcode 文件, 可以将bc文件转为.ll文件

1
llvm-dis hello.bc
  1. 用 llvm-as 工具通过汇编文件(.ll 文件)得到字节码文件(.bc 文件)
1
llvm-as hello.ll hello.bc
  1. .bc编译成.o
    第一种方法:用clang直接将其编译为可执行文件
1
clang a.o.bc -o struct
1
第二种方法:用llc先将bc编译为汇编,再用本地的gcc将其编译为可执行文件。
1
2
llc a.o.bc -o hello.s
gcc hello.s -o hello
  1. 编译生成可执行文件
1
clang hello.c -o hello

或者

1
clang -emit-llvm -c hello.c
  1. .bc到.s编译指令
1
clang -S -fobjc-arc struct.bc -o struct.s

工具

clang llvm

1
2
sudo apt update
sudo apt install llvm clang llvm-dev llvm-runtime lldb

检查版本

1
2
llvm-config --version
clang --version

1. 处理.bc文件

.bc文件是 LLVM 中间表示(IR)的二进制格式。要逆向分析它,需将其转换为可读的文本格式(.ll)。

a. 转换为 LLVM IR 文本格式

使用llvm-dis工具(LLVM 反汇编器):

1
llvm-dis input.bc -o output.ll

生成的output.ll是文本形式的 LLVM IR,可用文本编辑器查看。

b. 直接查看.bc文件信息

分析.bc文件结构:

1
llvm-bcanalyzer input.bc

2. 使用 Clang 编译/反编译

a. 将 .bc 编译为可执行文件

1
clang input.bc -o output

生成的可执行文件output可用逆向工具(如 Ghidra、IDA Pro)分析。

b. 反编译为 C 代码(需额外工具)

直接反编译 LLVM IR 到 C 代码需要第三方工具,例如:

RetDec:支持 LLVM IR 反编译。

1
2
3
4
5
6
7
8
9
10
# 安装 RetDec
git clone https://github.com/avast/retdec.git
cd retdec
./retdec-support.sh
mkdir build && cd build
cmake .. -DCMAKE_INSTALL_PREFIX=/path/to/install
make && make install

# 使用 RetDec 反编译
retdec-decompiler.py input.bc

3. 动态分析(调试)

使用lli( LLVM 解释器)直接运行.bc文件:

1
lli input.bc

结合调试器(如 gdb 或 lldb)跟踪执行流程:

1
lldb -- lli input.bc

bc版本兼容问题

最好根据原生编译平台去下载

个人做法是查看内容安装对应版本

将 .bc 转换为 .ll(LLVM IR 文本格式),查看头部信息:

1
2
llvm-dis Dragon.bc -o Dragon.ll
head -n 20 Dragon.ll

关键信息:

  • target triple:目标平台(可推断兼容的 LLVM 版本)。

  • 如果文件包含 llvm.ident,会显示 Clang 版本:

是windows下vs生成的,但版本切换麻烦,直接kali安装了

1
2
3
4
wget https://apt.llvm.org/llvm.sh
chmod +x llvm.sh
sudo ./llvm.sh 17
sudo apt install clang-17

编译时指定目标三元组

1
clang-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已生成,可以逆向了


BC文件逆向
https://alenirving.github.io/2025/04/06/BC文件逆向/
作者
Ma5k
发布于
2025年4月6日
许可协议