5.11.1 RetDec

前面介绍过 IDA Pro,其 F5 已经具有巨强大的反编译能力了,但这本书一直到现在,由于本人的某种执念,都是在硬怼汇编代码,没有用到 IDA,虽说这样能锻炼到我们的汇编能力,但也可以说是无故加大了逆向的难度。但现在事情出现了转机,安全公司 Avast 开源了它的反编译器 RetDec,能力虽不及 IDA,目前也只支持 32 位,但好歹有了第一步,未来会好起来的。

RetDec 简介

RetDec 是一个可重定向的机器码反编译器,它基于 LLVM,支持各种体系结构、操作系统和文件格式:

  • 支持的文件格式:ELF,PE,Mach-O,COFF,AR(存档),Intel HEX 和原始机器码。

  • 支持的体系结构(仅限 32 位):Intel x86,ARM,MIPS,PIC32 和 PowerPC。

安装

在 Linux 上,你需要自己构建和安装。

安装依赖:

$ sudo apt-get install build-essential cmake coreutils wget bc graphviz upx flex bison zlib1g-dev libtinfo-dev autoconf pkg-config m4 libtool

把项目连同子模块一起拉下来:

接下来要注意了,由于项目自己的问题,在运行 cmake 的时候一定指定一个干净的目录,不要在默认的 /usr 或者 /usr/local 里,可以像下面这样:

入门

安装完成后,我们用 helloword 大法试一下,注意将其编译成 32 位:

运行 decompile.sh 反编译它,我们截取出部分重要的过程和输出:

总共输出下面几个文件:

可以看到 RetDec 可以分为三个阶段:

  • 预处理阶段:首先检查文件类型是否为可执行文件,然后调用 fileinfo 获取文件信息生成 a.out.c.json,然后调用 unpacker 查壳和脱壳等操作

  • 核心阶段:接下来才是重头戏,调用 bin2llvmir 将二进制文件转换成 LLVM IR,并输出 a.out.c.frontend.dsma.out.c.backend.lla.out.c.backend.bc

  • 后端阶段:这个阶段通过一系列代码优化和生成等操作,将 LLVM IR 反编译成 C 代码 a.out.c,还有 CFG 等。

整个过程的结构如下:

img

decompile.sh 有很多选项,使用 decompile.sh -h 查看。

比如反编译指定函数:

反编译指定的一段地址:

生成函数 CFG 图(.dot格式):

r2pipe decompiler

radare2 通过 r2pipe 脚本,利用 retdec.com 的 REST API 提供了反编译的功能,所以你首先要到网站上注册,拿到免费的 API key。

安装上该模块,当然你可能需要先安装上 npm,它是 JavaScript 的包管理器:

将 API key 写入到 ~/.config/radare2/retdec.key 中,然后就可以开心地反编译了。

还是 helloworld 的例子,用 r2 打开,反编译 main 函数。

每次输入反编译器路径是不是有点烦,在文件 ~/.config/radare2/radare2rc 里配置一下 alias 就好了,用 $decompile 替代:

参考资料

Last updated

Was this helpful?