【发布时间】:2020-01-28 21:44:30
【问题描述】:
在 Android 设备上运行的 android 调试桥守护程序 adbd 可以在没有 root 支持的情况下编译 (ALLOW_ADBD_ROOT=0)。
有一个名为rootadb 的工具可以通过(据我了解)用 NOP 指令替换对setuid() 和setgid() 的调用来修补现有的adbd 二进制文件,从而有效地防止它放弃其权限。
我不明白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 究竟填充了什么样的数据?
【问题讨论】:
标签: android c arm adb reverse-engineering