通过覆盖 aarch64 上的 rela.dyn 条目未能触发打包程序的加载程序

逆向工程 部件 小精灵 包装工 海湾合作委员会 aarch64
2021-07-03 01:29:16

我已经实现了 x86_64 共享库的打包程序。简而言之,加载器被注入共享库,并且 rela.dyn 条目被修改,使其指向加载器的地址。一旦加载器被触发,它就会解密 .text 部分并最终跳转到 .text 部分的地址。

该机制适用于 x86_64 共享库。但是它在 aarch64 共享库上失败了。

问题:

  1. 我是否错过了专门针对 aarch64 的任何步骤?
  2. 有没有其他方法可以打包 aarch64 共享库?

结果readelf如下。 libtest.so是打包前的库。虽然libtest_packed.so是包装后的库。

这是结果 readelf --relocs libtest.so

Relocation section '.rela.dyn' at offset 0x550 contains 7 entries:
000000010df0  000000000403 R_AARCH64_RELATIV                    780
000000010df8  000000000403 R_AARCH64_RELATIV                    738
000000011018  000000000403 R_AARCH64_RELATIV                    11018
000000010fc8  000300000401 R_AARCH64_GLOB_DA 0000000000000000 _ITM_deregisterTMClone + 0
000000010fd0  000400000401 R_AARCH64_GLOB_DA 0000000000000000 __cxa_finalize@GLIBC_2.17 + 0
000000010fd8  000500000401 R_AARCH64_GLOB_DA 0000000000000000 __gmon_start__ + 0
000000010fe0  000700000401 R_AARCH64_GLOB_DA 0000000000000000 _ITM_registerTMCloneTa + 0

与前 3 个条目对应的函数是:

0000000000000780 t frame_dummy
0000000000000738 t __do_global_dtors_aux
000000000011018 d __dso_handle

这是结果 readelf --relocs libtest_packed.so

Relocation section '.rela.dyn' at offset 0x550 contains 7 entries:
  Offset          Info           Type           Sym. Value    Sym. Name + Addend
000000010df0  000000000403 R_AARCH64_RELATIV                    11028
000000010df8  000000000403 R_AARCH64_RELATIV                    738
000000011018  000000000403 R_AARCH64_RELATIV                    11018
000000010fc8  000300000401 R_AARCH64_GLOB_DA 0000000000000000 _ITM_deregisterTMClone + 0
000000010fd0  000400000401 R_AARCH64_GLOB_DA 0000000000000000 __cxa_finalize@GLIBC_2.17 + 0
000000010fd8  000500000401 R_AARCH64_GLOB_DA 0000000000000000 __gmon_start__ + 0
000000010fe0  000700000401 R_AARCH64_GLOB_DA 0000000000000000 _ITM_registerTMCloneTa + 0

如您所见,第一个条目被加载程序的地址覆盖。

- - - - - - 更新 - - - - -

  1. 如果我对 .text 部分进行异或运算,则会绕过异或加载器
  • 我收到了非法指令(核心转储),因为 xor-loader 尚未解密 .text 部分。(通过 gdb 检查 .text 部分确认)
  • 我有 objdump 加载器,加载器完好无损。
  1. 如果我不对 .text 部分进行异或,则会调用异或加载器并正常工作。(但解密是错误的,因为 .text 部分没有事先进行异或运算)。

由于共享库没有入口点。我覆盖了 frame_dummy 指针,以便程序可以跳转到 .text 部分,基于这个项目

https://github.com/0xN3utr0n/Noteme/blob/master/injection.c

我的loader的机制灵感来自 https://github.com/sebastiencs/Packer_ELF

0个回答
没有发现任何回复~