Android Root 방법 원리 분석 및 Hook (1) adbd 구멍

에서:http://blog.csdn.net/jackaduma/article/details/7286334
구멍 은 Android 소스 코드 의 adb. c 파일 에 있 습 니 다. 중.
 
int main(){  
  •     ...  

  •     ...  
  •     setgid(AIL_SHELL); // 실패  

  •     setuid(AIL_SHELL);  //위 와 같다  
  •     ...  

  •     ...  
  •     }  
  • int main(){
    	...
    	...
    	setgid(AIL_SHELL); //      
    	setuid(AIL_SHELL);	//  
    	...
    	...
    	}
    

    adbd 프로 세 스 가 시 작 됩 니 다. 시작 할 때 루트 권한 으로 초기 화 작업 을 수행 한 후 현재 셸 사용자 권한 으로 내 려 갑 니 다. 그러나 내 려 가기 에 실패 하면 adbd 프로 세 스 가 종료 되 지 않 고 시작 합 니 다. 이때 루트 권한 의 adbd 프로 세 스 입 니 다.
     
    공격 코드 원리:
          끊임없이 fork 서브 프로 세 스 (사실은 손 프로 세 스) 를 종료 하고 좀 비 프로 세 스 를 생 성하 여 현재 셸 사용자 의 pid 수 를 상한 에 이 르 게 한 다음 에 kill 에서 adbd 프로 세 스 를 제거 합 니 다.      나중에 하나 더 빠르게 fork 를 사용 하여 상한 선 에 도달 하면 현재 사용자 에 게 프로 세 스 를 만 들 수 없습니다.
          시간 이 지나 면 init 프로 세 스 는 현재 adbd 프로 세 스 가 없 음 을 감지 하고 adb. c 를 실행 합 니 다. 구멍 을 이용 하여 루트 권한 을 가 진 adbd 프로 세 스 입 니 다.
    [cpp] view plain copy print ?
    ...  
  •     for(;;)  

  •     {  
  •         if ((p=fork())==0){  

  •             exit(0);  
  •         }  

  •         else if(p<0){  
  •             ...  

  •         }  
  •         else{  

  •         ...  
  •         }  

  •     }  
  •     ...  
  • ...
    	for(;;)
    	{
    		if ((p=fork())==0){
    			exit(0);
    		}
    		else if(p<0){
    			...
    		}
    		else{
    		...
    		}
    	}
    	...
    

    Myhook code:
    logcat 출력
    [cpp] view plain copy print ?
    #include    
  • #define LOG_TAG "adb hooker"   

  •   
  • int main(){  

  •     ...  
  •     ...  

  •       
  •     if(setgid(AIL_SHELL)!=0){  

  •         LOGE("failed to setgid for shell user");  
  •         exit(0);  

  •     }  
  •     if(setuid(AIL_SHELL)!=0){  

  •         LOGE("failed to setuid for shell user");  
  •         exit(0);  

  •     }  
    #include <cutils/log.h>
    #define LOG_TAG "adb hooker"
    
    int main(){
    	...
    	...
    	
    	if(setgid(AIL_SHELL)!=0){
    		LOGE("failed to setgid for shell user");
    		exit(0);
    	}
    	if(setuid(AIL_SHELL)!=0){
    		LOGE("failed to setuid for shell user");
    		exit(0);
    	}
    

    좋은 웹페이지 즐겨찾기