Демон отладочного моста android adbd
, работающий на устройствах Android, может быть скомпилирован без поддержки root (ALLOW_ADBD_ROOT=0
).Существует инструмент под названием rootadb
, который способен исправлять существующий двоичный файл adbd
путем (как я понял) замены вызовов на setuid()
и setgid()
инструкциями noop, что эффективно предотвращает сброс его привилегий.
Я не понимаю, как код находит место системных вызовов внутри двоичного файла.
Насколько я вижу, он перебирает все байты и проверяетесли байты совпадают:
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
?