首页
社区
课程
招聘
[原创] Android 内存执行ELF研究
发表于: 2022-11-22 14:42 33338

[原创] Android 内存执行ELF研究

2022-11-22 14:42
33338

在Linux系统中,我们可以通过 memfd_create 和 execve 实现内存运行ELF,但是在 Android 中,却遇到了这样的问题

通过 这篇文章 了解到可以通过 LD_DEBUG 环境变量开启 linker 日志,执行

LD_DEBUG=1 /data/local/tmp/memexec

并通过 logcat 抓到了如下日志

看起来是命名空间的问题,我们的 payload 的命名空间为 default,但是为什么会这样呢,明明 memexec 是 unrestricted。

通过 Google 搜索 android linker namespace 看到官方文档 链接器命名空间 ,在 /linkerconfig/ld.config.txt 文件中配置了相关信息

首先我们要知道这个文件可不可以写,查看 mount 信息发现该文件所在的不是只读文件系统,所以可以直接修改

以下使用 /data/adb/magisk/busybox vi /linkerconfig/ld.config.txt 编辑文件

原来命名空间是根据路径来的,于是编辑该文件,在最前面手动加上一行

然后重新执行,问题依旧。

难道是没有路径分割符的问题,于是在代码中给文件名加上一个 /

编译并重新执行,还是一样的报错。

尝试重新编辑,把它设置成根目录

这次报错多了一行

看样子是没办法通过单纯的改配置文件完成了,于是前往阅读linker的源码

由于aospxref服务最近不太稳定,我在看的时候刚好打不开,使用了android官方的源码在线浏览工具,然而这个玩意并不好用

众所周知,linker 的源码在 bionic/linker 目录下。

通过字符串 “Using config section” 定位到 linker_config.cpp 的 parse_config_file 函数,在阅读代码后,我们上面的尝试为什么会失败,就已经有了答案。

line242

因为它不是一个真实存在的目录,在代码中通过 access 函数判断改路径不存在,所以不行

line227

因为代码中删除了末尾所有的/ 符号,传入根目录之后字符串变成了空字符串,于是抛出了那个Warning

修改无非两个思路:

虽然有 magisk,替换 system 分区下文件变得方便了起来,但是替换 linker 依然是一件麻烦事,动态 Hook 对于解决这个问题来说,我觉得更加方便。由于目标代码位置的特殊性,现有 inline hook, plt hook 轮子都不能取得比 linker 更早的执行时机。

也许是我孤陋寡闻,如果有请务必告诉我

最终我选择的方案是先 fork 生成一个子进程,对子进程进行 ptrace,修改逻辑后再 detach 掉。

对于逻辑的修改,主要有两步:

直接编辑该文件添加上述行即可

CANNOT LINK EXECUTABLE "/data/local/tmp/paylaod": library "libicu.so" not found: needed by /system/lib64/libharfbuzz_ng.so in namespace (default)
CANNOT LINK EXECUTABLE "/data/local/tmp/paylaod": library "libicu.so" not found: needed by /system/lib64/libharfbuzz_ng.so in namespace (default)
 
 
W linker  : [ Android dynamic linker (64-bit) ]
W linker  : [ Linking executable "/data/local/tmp/memexec" ]
W linker  : [ Linking "[vdso]" ]
W linker  : [ Reading linker config "/linkerconfig/ld.config.txt" ]
W linker  : [ Using config section "**unrestricted**" ]
W linker  : [ Linking "/data/local/tmp/memexec" ]
W linker  : [ Linking "/system/lib64/liblog.so" ]
W linker  : [ Linking "/apex/com.android.runtime/lib64/bionic/libm.so" ]
W linker  : [ Linking "/apex/com.android.runtime/lib64/bionic/libdl.so" ]
W linker  : [ Linking "/apex/com.android.runtime/lib64/bionic/libc.so" ]
W linker  : [ Linking "/system/lib64/libc++.so" ]
W linker  : [ Linking "/system/lib64/libnetd_client.so" ]
W linker  : [ Linking "/system/lib64/libcutils.so" ]
W linker  : [ Linking "/system/lib64/libbase.so" ]
W linker  : [ CFI add 0x61abb23000 + 0x67000  ]
W linker  : [ CFI add 0x77780d3000 + 0x1000 linux-vdso.so.1 ]
W linker  : [ CFI add 0x7776c48000 + 0x10000 liblog.so ]
W linker  : [ CFI add 0x7773d87000 + 0x37000 libm.so ]
W linker  : [ CFI add 0x7773dc0000 + 0x5000 libdl.so ]
W linker  : [ CFI add 0x7773a1e000 + 0x318000 libc.so ]
W linker  : [ CFI add 0x7776cd2000 + 0xae000 libc++.so ]
W linker  : [ CFI add 0x7773945000 + 0x2b000 libnetd_client.so: 0x777394a000 ]
W linker  : [ CFI add 0x777391b000 + 0x12000 libcutils.so ]
W linker  : [ CFI add 0x77738c4000 + 0x3b000 libbase.so ]
W linker  : [ CFI add 0x777391b000 + 0x12000 libcutils.so ]
W linker  : [ CFI add 0x77738c4000 + 0x3b000 libbase.so ]
W linker  : [ Jumping to _start (0x61abb418e0)... ]
W linker  : [ Android dynamic linker (64-bit) ]
W linker  : [ Linking executable "/memfd:jit-cache (deleted)" ]
W linker  : [ Linking "[vdso]" ]
W linker  : [ Reading linker config "/linkerconfig/ld.config.txt" ]
W linker  : [ Linking "/memfd:/jit-cache (deleted)" ]
F linker  : CANNOT LINK EXECUTABLE "/data/local/tmp/payload": library "libicu.so" not found: needed by /system/lib64/libharfbuzz_ng.so in namespace (**default**)
W linker  : [ Android dynamic linker (64-bit) ]
W linker  : [ Linking executable "/data/local/tmp/memexec" ]
W linker  : [ Linking "[vdso]" ]
W linker  : [ Reading linker config "/linkerconfig/ld.config.txt" ]
W linker  : [ Using config section "**unrestricted**" ]
W linker  : [ Linking "/data/local/tmp/memexec" ]
W linker  : [ Linking "/system/lib64/liblog.so" ]
W linker  : [ Linking "/apex/com.android.runtime/lib64/bionic/libm.so" ]
W linker  : [ Linking "/apex/com.android.runtime/lib64/bionic/libdl.so" ]
W linker  : [ Linking "/apex/com.android.runtime/lib64/bionic/libc.so" ]
W linker  : [ Linking "/system/lib64/libc++.so" ]
W linker  : [ Linking "/system/lib64/libnetd_client.so" ]
W linker  : [ Linking "/system/lib64/libcutils.so" ]
W linker  : [ Linking "/system/lib64/libbase.so" ]
W linker  : [ CFI add 0x61abb23000 + 0x67000  ]
W linker  : [ CFI add 0x77780d3000 + 0x1000 linux-vdso.so.1 ]
W linker  : [ CFI add 0x7776c48000 + 0x10000 liblog.so ]
W linker  : [ CFI add 0x7773d87000 + 0x37000 libm.so ]
W linker  : [ CFI add 0x7773dc0000 + 0x5000 libdl.so ]
W linker  : [ CFI add 0x7773a1e000 + 0x318000 libc.so ]
W linker  : [ CFI add 0x7776cd2000 + 0xae000 libc++.so ]
W linker  : [ CFI add 0x7773945000 + 0x2b000 libnetd_client.so: 0x777394a000 ]
W linker  : [ CFI add 0x777391b000 + 0x12000 libcutils.so ]
W linker  : [ CFI add 0x77738c4000 + 0x3b000 libbase.so ]
W linker  : [ CFI add 0x777391b000 + 0x12000 libcutils.so ]
W linker  : [ CFI add 0x77738c4000 + 0x3b000 libbase.so ]
W linker  : [ Jumping to _start (0x61abb418e0)... ]
W linker  : [ Android dynamic linker (64-bit) ]
W linker  : [ Linking executable "/memfd:jit-cache (deleted)" ]
W linker  : [ Linking "[vdso]" ]
W linker  : [ Reading linker config "/linkerconfig/ld.config.txt" ]
W linker  : [ Linking "/memfd:/jit-cache (deleted)" ]
F linker  : CANNOT LINK EXECUTABLE "/data/local/tmp/payload": library "libicu.so" not found: needed by /system/lib64/libharfbuzz_ng.so in namespace (**default**)
dir.system = /system/bin/
......
dir.unrestricted = /data/nativetest64/unrestricted
dir.isolated = /data/local/tmp/isolated
dir.product = /data/local/tests/product
dir.system = /data/local/tests/system
dir.unrestricted = /data/local/tests/unrestricted
dir.vendor = /data/local/tests/vendor
dir.unrestricted = /data/local/tmp
......
[system]
additional.namespaces = com_android_adbd,com_android_appsearch,com_android_art,com_android_conscrypt,com_android_i18n,com_android_media,com_android_neuralnetworks,com_android_os_statsd,com_android_resolv,com_android_runtime,com_android_tethering,rs,sphal,vndk,vndk_product
namespace.default.isolated = true
namespace.default.visible = true
namespace.default.search.paths = /system/${LIB}
......
dir.system = /system/bin/
......
dir.unrestricted = /data/nativetest64/unrestricted
dir.isolated = /data/local/tmp/isolated
dir.product = /data/local/tests/product
dir.system = /data/local/tests/system
dir.unrestricted = /data/local/tests/unrestricted
dir.vendor = /data/local/tests/vendor
dir.unrestricted = /data/local/tmp
......
[system]
additional.namespaces = com_android_adbd,com_android_appsearch,com_android_art,com_android_conscrypt,com_android_i18n,com_android_media,com_android_neuralnetworks,com_android_os_statsd,com_android_resolv,com_android_runtime,com_android_tethering,rs,sphal,vndk,vndk_product
namespace.default.isolated = true
namespace.default.visible = true
namespace.default.search.paths = /system/${LIB}
......
# cat /proc/mounts | grep linkerconfig
tmpfs /linkerconfig tmpfs rw,seclabel,nosuid,nodev,noexec,relatime,size=5846680k,nr_inodes=1461670,mode=755 0 0
tmpfs /linkerconfig tmpfs rw,seclabel,nosuid,nodev,noexec,relatime,size=5846680k,nr_inodes=1461670,mode=755 0 0
# cat /proc/mounts | grep linkerconfig
tmpfs /linkerconfig tmpfs rw,seclabel,nosuid,nodev,noexec,relatime,size=5846680k,nr_inodes=1461670,mode=755 0 0
tmpfs /linkerconfig tmpfs rw,seclabel,nosuid,nodev,noexec,relatime,size=5846680k,nr_inodes=1461670,mode=755 0 0
dir.unrestricted = /memfd:
dir.unrestricted = /memfd:
memfd_create(“/jit-cache”, MFD_CLOEXEC);
memfd_create(“/jit-cache”, MFD_CLOEXEC);
dir.unrestricted = /
dir.unrestricted = /
WARNING: linker: /linkerconfig/ld.config.txt:1: warning: property value is empty (ignoring this line)
WARNING: linker: /linkerconfig/ld.config.txt:1: warning: property value is empty (ignoring this line)
 

[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

最后于 2022-11-23 17:32 被kanxue编辑 ,原因:
收藏
免费 13
支持
分享
最新回复 (6)
雪    币: 12
活跃值: (1145)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
好文。另:aospxref 有问题可直接联系我。
2022-11-22 17:54
0
雪    币: 147
活跃值: (345)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
非常奈斯的文章
2022-11-22 19:06
0
雪    币: 2731
活跃值: (1651)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
mark . 好文
2022-11-22 21:33
0
雪    币: 2428
活跃值: (10698)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
现在看不懂,先收藏
2022-11-23 09:43
0
雪    币: 324
活跃值: (559)
能力值: ( LV4,RANK:40 )
在线值:
发帖
回帖
粉丝
6
哆啦高产
2022-11-24 09:37
0
雪    币: 20
活跃值: (38)
能力值: ( LV2,RANK:13 )
在线值:
发帖
回帖
粉丝
7

本人新手,想问一下作者,这个技术具体可以有哪些用处吗。注入隐藏痕迹执行?

最后于 2022-12-28 20:44 被垃圾姬可爱妮编辑 ,原因:
2022-12-28 20:43
0
游客
登录 | 注册 方可回帖
返回
//