我已经实现了 x86_64 共享库的打包程序。简而言之,加载器被注入共享库,并且 rela.dyn 条目被修改,使其指向加载器的地址。一旦加载器被触发,它就会解密 .text 部分并最终跳转到 .text 部分的地址。
该机制适用于 x86_64 共享库。但是它在 aarch64 共享库上失败了。
问题:
- 我是否错过了专门针对 aarch64 的任何步骤?
- 有没有其他方法可以打包 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
如您所见,第一个条目被加载程序的地址覆盖。
- - - - - - 更新 - - - - -
- 如果我对 .text 部分进行异或运算,则会绕过异或加载器
- 我收到了非法指令(核心转储),因为 xor-loader 尚未解密 .text 部分。(通过 gdb 检查 .text 部分确认)
- 我有 objdump 加载器,加载器完好无损。
- 如果我不对 .text 部分进行异或,则会调用异或加载器并正常工作。(但解密是错误的,因为 .text 部分没有事先进行异或运算)。
由于共享库没有入口点。我覆盖了 frame_dummy 指针,以便程序可以跳转到 .text 部分,基于这个项目
https://github.com/0xN3utr0n/Noteme/blob/master/injection.c
我的loader的机制灵感来自 https://github.com/sebastiencs/Packer_ELF