如何通过 IDAPython 获取 elf 标头?

逆向工程 艾达 蟒蛇 静态分析
2021-06-13 15:33:40

在IDAPython中,我们可以用.获得段。idautils.Segments()但是,结果并没有覆盖整个输入文件,第一个段是“.init”。我的问题是,如何在输入文件中获取其他内容,如 elf 标题或其他部分,如“.dynsym”?
在大多数 elf 文件中,elf 标头可以通过 address 定位0x400000但是如果地址改变了呢?我可以直接从二进制文件中读取它吗?

2个回答

您实际上在这里问了多个问题:

  • 如果您在创建 IDB 时选中“手动加载”,并在 IDA 询问您是否要加载标题时回答“是”,则您应该有一个“HEADER”部分,其中包含标题数据作为您的第一个 Segment。这是非常通用的,应该适用于任何二进制格式。

  • 我确实相信,如果当 IDA 询问您是否要解析标题时回答“是”,则 ELF 的其他部分可能会以这种方式加载。

  • 要获取程序的基地址,您可以使用 IDAPython 调用 get_imagebase ()但这应该是大多数二进制格式的第一部分(即,如果您加载了标头)

  • 如果您已加载标头,则可以使用常用的 IDAPython 函数直接从 IDA 读取它。

使用LIEF,您可以按照以下方式进行操作:

import lief
elf = lief.parse("my_binary")
init_section = elf.get_section(".init")
dynsym_section = elf.get_section(".dynsym")
print(init_section)
print(dynsym_section)

源代码可在此处获得:https : //github.com/lief-project/LIEF