您如何优化 AST 或将它们转换为真正的语言

逆向工程 反编译 反编译器 AST
2021-06-18 08:16:55

一段时间以来,我一直对自动漏洞评估和代码反编译感兴趣。因此,我一直在用 Python 构建解析器,它读取一个 bin,在跟踪执行的同时逐条指令反汇编它(IDA 的方式)。

我一直在跟踪被污染的寄存器(在用户输入中被污染)以检查这些寄存器何时允许我们设置调用或跳转。

这项研究已经发展到我想将其转换为反编译器的地步。我查看了回旋镖和其他开源反编译器。我还快速浏览了龙书(我不拥有它)。我想听听你们对这个想法的看法。下面是我的提纲:

  1. 打开二进制文件进行反编译。
  2. 检测文件类型(PE 或 ELF)以选择 EP 和内存布局。
  3. 反汇编时跳转到EP并遵循代码的执行路径。我使用 udis86。这种执行是一种自由的方式。
  4. 将生成的程序集解析为中间语言。为了获得更简单的指令,(例如,总是删除类似的东西SHL EAX, 0x02并将这些东西更改为MUL指令)。
  5. 将其解析为抽象语法树。
  6. 优化 AST(虽然,我不知道如何)。
  7. 将 AST 转换为类似于 C 的东西。

我在最后 2 个步骤中遇到了问题。有人如何将 AST 解析为真正的语言或类似的语言?你如何优化 AST?是否有构建 C 或 Python 库来完成它?

1个回答

反编译方面的经典著作是 Cristina Cifuentes 的博士论文《逆向编译技术》她在第 7 章描述了 C 代码的生成。

REC反编译器的作者也对反编译过程有一个很好的总结,尽管它更非正式:

http://www.backerstreet.com/decompiler/introduction.htm

为了完整起见,这里是 Ilfak 关于 Hex-Rays 反编译器的白皮书,尽管他浏览了这个特定问题,只是提到它“非常简单明了”:):

http://www.hex-rays.com/products/ida/support/ppt/decompilers_and_beyond_white_paper.pdf