ABOUT ME

Today
Yesterday
Total
  • 리버스 엔지니어링 - 2
    Security 2021. 2. 7. 01:04

    지난번에 디컴파일 후 분석중이던 원스토어 클라이언트를 계속해서 분석해보았다.

     

    분석해볼 패키지명을 찾던 도중, firebase라는 익숙한 단어가 눈에 들어와 곧장 열어보았다. 실제로 연동해본적은 없지만, firebase를 데이터베이스 관련 회사인것으로 알고 있었다.

     

    궁금해서 찾아보니 앱 개발 플랫폼으로도 다양하게 사용되고 있다는것을 알게되었다.

     

    1. 분석

    오늘 열어본 파일은, 파일 이름이 난독화되어있어 자세항 기능은 알 수 없지만, 상위 패키지명이 messaging이기 때문에

     

    firbase에서 출력하는 메세지들에 관한 파일로 추측되었다.

     

    jadx, visual studio code 화면

    이번에도 smali 코드 - java 코드 간 차이를 보고 smali 코드를 이해하는 방식으로 진행했다.

     

    지난번에 분석했던 파일과 다르게, smali 코드에서 invoke-static,direct,virtual 라는 키워드들이 많이 사용되는것이 눈에 띄었다.

     

    invoke는 단어 뜻 그대로 호출시 사용하는 키워드이다. 함수 호출 시 사용되는데, 위에서 서술하였듯이 static,direvt,virtual와 같은 형태로 사용되며 추가로 invoke-super와 같은 형태로도 사용 할 수 있다.

     

    ex) invoke-virtual {p0, v0}

     

    위와 같은 형태로 사용되며 p0는 클래스 인스턴스를 가리키고 v0는 매개변수로 사용된다. 

     

     

    java 코드

        public static void b(Intent intent) {
            if (intent != null) {
                if ("1".equals(intent.getStringExtra("google.c.a.tc"))) {

     

    smali 코드

    .method public static b(Landroid/content/Intent;)V
        .locals 5
    
        if-eqz p0, :cond_3
    
        const-string v0, "google.c.a.tc"
    
        .line 7
        invoke-virtual {p0, v0}, Landroid/content/Intent;->getStringExtra(Ljava/lang/String;)Ljava/lang/String;
    
        move-result-object v0
    
        const-string v1, "1"

     

    smali 코드는 java 코드와 순서가 다르게 섞여있었기 때문에, java 코드에서 발견한 string을 smali 코드에서 검색해서 같은 코드를 찾아냈다.

     

    이전 분석 때 알게되었듯이 smali 코드 제일 첫줄에 메소드 선언은 .method로 시작하고, java 코드와 같이 접근지정자, static 순서대로 쓰고 마지막에 리턴타입은 void를 대문자 V로 써두었다.

     

    smali 코드는 다른 코드들과 다르게 if문의 조건이 키워드에 들어있다. if-eqz p0는 if p0가 0이면 true를 반환한다는 뜻이다.

     

    따라서 if-eqz p0, :cond_3은 p0가 0이면 :cond_3으로 이동한다는 뜻이다. 

     

     

    smali 코드에서의 cond

    smali 코드 중간중간에는 :cond_숫자 와 같은 코드들이 존재하는데, 이는 분기점으로 사용된다.

     

    마치 다른 코드에서의 goto 문을 보는듯했다.

     

    java 코드의 3번째 줄을보면  equals 메소드를 이용해 두 문자열을 비교하고있다. 이를 smali 코드에서보면 equals 메소드를 사용하기 위해 v0에 "google.c.a.tc"를 넣어놓고, v1에 "1"을 넣어둔것으로 보인다.

     

    smali 코드

        .line 8
        invoke-virtual {v1, v0}, Ljava/lang/String;->equals(Ljava/lang/Object;)Z
    
        move-result v0
    
        const/4 v1, 0x3
    
        if-eqz v0, :cond_2

    이 부분을 보면 v0와 v1에 넣어두었던 두 문자열은 우측에 보이는 equals 메소드에서 사용되는것으로 보인다.

     

    java 코드에서는 "1".equals("google.c.a.tc")와 비슷한 형태로 사용되었으므로, 위에서 서술하였듯이 invoke-kind {p0, v0}와 같은 형식으로 사용된다면 p0는 클래스 인스턴스, v0는 매개변수이다.

     

    따라서 invoke-virtual {v1, v0}는 v1이 1, v0가 google.c.a.tc이므로 java 코드와 맞아떨어진다. 

     

    이후에는 equals 메소드를 실행한 결과를 v0에 넣고나서, if-eqz v0를 이용해 v0가 0이면 :cond_2로 점프하라는 코드가 있다.

     

    v0가 0이면 equals 메소드의 리턴값이 0이므로 두 문자열이 다르면 :cond_2로 점프하라는 내용이다.

     

    마지막으로 const/4 v1, 0x3은 v1 레지스터에 4bit 크기의 값인 0x3을 대입하라는 코드이다.

     

    2. 결론

    오늘 분석한 smali 코드는 대부분 위에서 분석했던 내용의 반복이었다. const 키워드를 이용해 값이나 문자열을 레지스터에 넣고, 메소드를 사용하는 내용이 대부분이었다.

     

    smali 코드를 분석하면서 느끼는 점은, java나 다른 일반적인 언어에 비해 저급언어에 가까운 smali 코드는 기본적인 메

     

    소드를 사용 할 때에도 각 메소드들이 어떤 클래스에 정의되어있는지 자세하게 표시되어있어서 코드에대해 좀 더 생각

     

    해보게 된다는것이다. java에서 흔히 사용하는 equals 메소드도 java/lang/Object 클래스에 정의되어 있다는것을 평소에 

     

    생각하면서 사용하지는 않았기 때문에, 오늘도 코드 분석을 하며 기초를 다지게 되었다.

    'Security' 카테고리의 다른 글

    https에 사용되는 SSL/TLS 인증과정  (0) 2024.02.14
    안드로이드 리버스 엔지니어링  (0) 2021.02.03
Designed by Tistory.