LSPlant 学习
LSPlanthttps://github.com/LSPosed/LSPlant
基本原理修改 ArtMethod 的 entry_point_from_quick_compiled_code_ ,这里原先是 dex2oat 优化后的本机代码,现在指向我们控制的代码。同时通过各种手段使调用方法时走本机代码 。
为此,hook 一个 method 需要另外两个 method ,一个作为 hook 的 stub ;另一个 method 用于备份被 hook 的方法。LSPlant 使用 DexBuilder 生成包含这两个方法的辅助类。
ArtMethod 调用约定我们可以从反射执行看 oat 后 ArtMethod 的本机代码是如何调用的。
ArtMethod::Invoke
根据方法是否为 static ,执行一段汇编编写的代码 art_quick_invoke_stub 或 art_quick_invoke_static_stub ,其代码位于:
art/runtime/arch/{arch}/quick_entrypoints_{arch ...
Android 系统属性
系统属性Android Property 实现解析与黑魔法 - 残页的小博客
bionic属性系统概述bionic/libc/bionic/system_property_api.cpp
bionic/libc/include/sys/_system_properties.h
属性系统实际上就是一个整个系统共享的键值对存储器,通过共享文件内存映射实现。
存放属性的文件位于 /dev/__properties__ ,这下面的多个文件,实际上是将属性按照前缀划分为不同的 SELinux 上下文,存放在对应的文件中。
划分的规则可以在 /{system,vendor,...}/etc/selinux/{plat,...}_property_contexts 等文件找到。
init 进程负责初始化属性存储区域,且是系统中唯一能够修改属性的进程(当然,只要某个进程能 rw 映射存放属性的文件,也是可以修改的),其他进程通过属性服务(一个名为 property_service 的 sock ...
Android ptrace
Android 上的 ptrace 实践前篇
dlopen获取 dlopen 有两种方法:
从 linker 获取 __loader_dlopen (或者 __dl___loader_dlopen),需要提供 caller_addr
从 libdl.so 获取 dlopen
详细代码:
https://github.com/5ec1cff/ptrace-examples/tree/android
实现了注入到任意进程,调用 __loader_dlopen 打开指定路径的 lib ,或者调用 __loader_dlclose 关闭指定 handle 的 lib 。目前只支持 x86-64 和 arm64 。
对齐问题一开始总是得到 SIGSEGV ,并且 fault addr 为 0 。出现问题的时候注入信号并 detach ,观察 crash dump :
123456789101112131415161718192005-02 13:13:59.534 18907 18907 F DEBUG : *** *** *** *** *** *** *** *** *** * ...
ptrace
ptraceptrace(2) - Linux manual page
wait(2) - Linux manual page
本文相关代码都在下面的仓库:
https://github.com/5ec1cff/ptrace-examples
tracee execve 时的行为当被跟踪者(tracee)进程成功调用 execve 后,会立即产生一个 SIGTRAP ,并进入 signal-delivery-stop 状态,允许我们在进程的所有新代码执行之前进行处理。
这个状态不好辨识,在 man ptrace 中已经不建议使用。我们可以用 PTRACE_O_TRACEEXEC 选项,这样当成功 execve 的时候,原先的 SIGTRAP 不会产生,取而代之的是另一个 stop ,status 满足 status >> 8 == (SIGTRAP | (PTRACE_EVENT_EXEC << 8)) ,并且我们可以通过 PTRACE_GETEVENTMSG 获得 execve 之前的 pid (在多线程中有用,因为在非主线程进行 execve ,pid 会发 ...
pwn-tv
Konka TV PWN
原文作于 2023.01.27, 整理于 2023.11.21
老家的 Konka 电视是个 Android 系统,曾经 nmap 扫描过,发现 adb 是开放的,这次过年回去研究了一下,发现可以提权。
分析使用 adb 是可以直接连接的,uid 是 shell ,不需要在 TV 上进行任何授权。
看看系统属性:
12345678910111213141516[ro.adb.secure]: [0][ro.allow.mock.location]: [1][ro.board.platform]: [bigfish][ro.boot.selinux]: [enforcing][ro.build.tags]: [release-keys][ro.build.type]: [user][ro.build.version.all_codenames]: [REL][ro.build.version.base_os]: [][ro.build.version.codename]: [REL][ro.build.version.incremental]: [eng. ...