【问题标题】:Create a opcode database创建操作码数据库
【发布时间】:2019-07-31 16:20:59
【问题描述】:

自从 NSA 发布 Ghidra 后,我就对逆向二进制文件更感兴趣了,它有一个内置功能,可以从二进制文件的反汇编中生成伪 C 代码。

我的想法是用相应的汇编和 C 代码构建一个操作码数据库。我想写一个工具,可以转储像 readelf 和 objdump 这样的二进制文件,从 C 源文件中提取符号和函数,并将它们整合在一起

所以,为了更清楚,让我们举一个例子。

我们在 ubuntu 系统上下载 vim 源代码。我们使用 ./configure 和 ./make 编译它。当二进制文件准备好后,我们启动我们的工具,提取符号的操作码,从代码中创建汇编代码,提取 .c 文件的函数和函数体,将它们放在一起并将其写入数据库.

所以数据库应该包含以下内容:

c-function sourcecode like

int main()
{ 
  return 0; 
}

汇编器可能看起来像:

push rbp
mov rbp, rsp
...
ret

和操作码部分:

55 48 89 e5 89 7d ec 89 75 ...

所以我的问题是……对这些数据进行编目以将其用作反汇编程序中的插件是否有意义?这个想法是插件可以将操作码发布到 web 服务并获取可能的 c 源。因此,反编译器可能会使用它来消除伪代码并将其替换为真实世界的代码示例。

我知道这并不容易,因为我们有不同的编译器、架构、版本、字节序等等。但总而言之,有了一个包含每个架构/版本/编译器的操作码的大型数据库,应该可以更容易地对未知二进制文件进行逆向工程。

我昨天把这个代码放在一起,但我不确定这是否有助于扩展反汇编程序。

为了感受一下,这里有一个我用 c 编写的小型计算工具的示例以及我的工具的输出:

|==================================================================|
| Adress             | Function                       | Size       |
|====================|================================|============|
| 0x0000000000000679 | add                            | 33         |
|==================================================================|
| OPCode                                                           |
|==================================================================|
| 55 48 89 e5 89 7d ec 89 75 e8 c7 45 fc 00 00 00 00 8b 55 ec 8b   |
| 45 e8 01 d0 89 45 fc 8b 45 fc 5d c3                              |
|==================================================================|
| Assembler                                                        |
|==================================================================|
| 0x1000  : push        rbp                                |
| 0x1001  : mov         rbp, rsp                           |
| 0x1004  : mov         dword ptr [rbp - 0x14], edi        |
| 0x1007  : mov         dword ptr [rbp - 0x18], esi        |
| 0x100a  : mov         dword ptr [rbp - 4], 0             |
| 0x1011  : mov         edx, dword ptr [rbp - 0x14]        |
| 0x1014  : mov         eax, dword ptr [rbp - 0x18]        |
| 0x1017  : add         eax, edx                           |
| 0x1019  : mov         dword ptr [rbp - 4], eax           |
| 0x101c  : mov         eax, dword ptr [rbp - 4]           |
| 0x101f  : pop         rbp                                |
| 0x1020  : ret                                            |
|==================================================================|
| Source                                                           |
|==================================================================|
| int add(int a, int b)                                            |
| {                                                                |
|   int c = 0;                                                      |
|   c = a + b;                                                      |
|   return c;                                                       |
| }                                                                |
|                                                                  |
|==================================================================|

【问题讨论】:

  • 不确定这里的问题是什么。有几个人/公司生产了反汇编器,并取得了不同程度的成功。如果你想成为下一个尝试它的人,那就去尝试吧。
  • 很好的问题。但是:很难。请继续。 (你研究过自修改代码吗?)
  • 不,我还没有这样做。你有任何代码示例以便我可以使用它吗?

标签: python c reverse-engineering


【解决方案1】:

此类操作码数据库已在各种编译为本机代码的编译器中实现。

例如,LLVM 具有 TableGen 语言文件形式的此类数据库。后端反汇编程序大多是从这些描述中自动生成的。例如,看看Sparc backend

Capstone Disassembler 这样的项目使用 LLVM 来反汇编各种 CPU 的代码。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-12-12
    • 1970-01-01
    • 2012-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-03
    相关资源
    最近更新 更多