問題

在Android裝置上執行的android debug bridge daemon adbd可能在沒有root支援的情況下編譯(ALLOW_ADBD_ROOT=0). 有一個名為rootadb的工具,可以透過(我的理解是)用noop指令替換對setuid()setgid()的呼叫來修補現有的adbd二進位制檔案,從而有效地防止它刪除其特權.

我不明白程式碼如何在二進位制檔案中找到syscalls的位置.

據我所見,它遍歷所有位元組並檢查位元組是否匹配某些東西:

 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個位元組的出現.如果找到一個,它應用補丁,從該位置的第一個位元組開始.

  相同標籤的其他問題

androidcarmadbreverse-engineering