作者热门文章
- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在 Android 设备上运行的 android 调试桥守护进程 adbd
可以在没有 root 支持的情况下编译 (ALLOW_ADBD_ROOT=0
)。有一个名为 rootadb
的工具,它能够通过(据我所知)替换对 setuid()
的调用来修补现有的 adbd
二进制文件和带有 NOP 指令的 setgid()
,有效地防止它放弃它的特权。
我不明白the code找到系统调用在二进制文件中的位置。
据我所知,它遍历所有字节并检查字节是否匹配:
u32 *sgid = (u32*)&setgid;
int fd = open( "/sbin/adbd", O_RDWR );
fstat( fd, &st );
buf = memalign( 32, st.st_size );
read( fd, buf, st.st_size );
lseek64( fd, 0, SEEK_SET );
for( start = buf, end = start + st.st_size - 0x20; start < end; start++ )
if( !memcmp( &start[1], &sgid[1], sizeof( u32 ) * 2 ) )
memcpy( &start[1], patch, sizeof( patch ) );
这是如何运作的?sgid
和 __setuid
实际填充了什么样的数据?
最佳答案
我不是 100% 确定,但我有一个合理的想法。
第一行代码加载了一个指向setgid地址的指针,并将其视为一个32位指针。
循环遍历二进制文件,并查找等于 setgid 函数地址的 8 个字节的出现。如果找到一个,它会应用补丁,从该位置的第一个字节开始。
关于android - 了解 rootadb 如何在 ELF 二进制文件中查找方法调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58153620/
我是一名优秀的程序员,十分优秀!