从ELF抠代码

💡 原文中文,约9600字,阅读约需23分钟。
📝

内容提要

文章讨论了如何从ARM64的ELF文件中提取特定函数,以便进行静态分析和符号执行。首先设置交叉编译环境,然后通过自制测试用例和Python脚本手动构造新的ELF文件,保留目标函数并修改跳转指令,以便于后续分析。

🎯

关键要点

  • 文章讨论如何从ARM64的ELF文件中提取特定函数进行静态分析和符号执行。
  • 首先设置交叉编译环境,使用gcc工具链进行ARM64版本的编译。
  • 自制测试用例hello.c包含多个目标函数,确保它们在ELF中保留。
  • 手工构造ELF文件,提取目标函数并修改跳转指令以便于分析。
  • 使用Python脚本处理ELF文件,构建新的ELF文件以供IDA静态分析和Angr模拟执行。
  • 提供了hello_arm64.json文件,记录了目标函数的偏移和大小信息。
  • 通过skeleton.c编译生成libskeleton.so,作为构造新ELF的基础。
  • 使用smallelf_arm64_1.py脚本将目标函数和stub函数合并到新的ELF文件中。
  • 参考资源包括Arm GNU工具链下载链接和LIEF库的相关文档。

延伸问答

如何从ARM64的ELF文件中提取特定函数?

可以通过设置交叉编译环境,使用gcc工具链编译自制测试用例,并手动构造新的ELF文件来提取特定函数。

在提取过程中需要使用哪些工具和脚本?

需要使用gcc工具链、Python脚本(如smallelf_arm64_1.py)以及LIEF库来处理和构造ELF文件。

如何确保目标函数在ELF文件中保留?

可以通过在函数定义中使用特定的属性,如`__attribute__((used))`,来确保目标函数在ELF文件中保留。

构造新的ELF文件时需要注意哪些跳转指令的修改?

需要修改所有的bl指令,使其跳转到只含有ret指令的stub函数,以便于后续的静态分析。

hello_arm64.json文件的作用是什么?

hello_arm64.json文件记录了目标函数的偏移和大小信息,供后续处理和分析使用。

如何使用Python脚本处理ELF文件?

可以使用smallelf_arm64_1.py脚本来加载JSON文件,准备函数信息,并构建新的ELF文件。

➡️

继续阅读