Понимание того, как rootadb находит вызов метода в двоичном файле ELF - PullRequest
0 голосов
/ 29 сентября 2019

Демон отладочного моста 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?

...