ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [FridaLab] 환경 구축 / Challenge 1·2·3·4
    모바일 앱 해킹 2024. 4. 10. 15:22

     

     

    Frida 환경 구축

    모바일 앱 해킹 공부의 첫 시작으로 Frida를 배워보려 한다. 먼저 Frida를 사용하기 위한 설정을 해야 하는데 windows를 사용하고, 모바일 기기 대신 녹스 플레이어를 사용한다면 다음 블로그를 참고해서 쉽게 Frida 환경을 구축할 수 있다.

     

    Frida 환경 구축

    이 글에서는 Frida에 대해 알아보고 개발 환경을 구축합니다.

    velog.io

    Frida를 설치하기 위해 구글링하면서 여러 글을 참고했는데, 위의 블로그가 한 번도 막힘 없이 상세하게 설명해주는 유일한 블로그였다. Frida 관련해서 기본적인 설명도 해주니 환경 구축을 끝낸 후에도 참고하면 좋을 것 같다.  

     

     

     


    [FridaLab]

    위의 블로그를 따라 설치를 마쳤다면 바로 문제를 풀어보겠다. 1번부터 8번까지의 문제풀이도 위의 블로그를 참고했으니 자세한 설명을 원하면 해당 블로그를 참고하면 된다.

     

    녹스 플레이어를 실행해보면 바탕화면에 FridaLab이 깔려 있는 걸 볼 수 있다. FridaLab을 클릭해 들어가보자.

     

     

     

    어플은 매우 간단하게 구성되어있다. 8개의 Challenge를 보여주고 CHECK 버튼 하나 있는 게 끝이다. CHECK 버튼을 누르면 Challenge 클리어 상태를 볼 수 있다. 현재는 클리어한게 없는 상태다. 그럼 1번부터 풀어보겠다.

     

     

     

     


    [Challenge 1] Change class challenge_01's variable 'chall01' to: 1

    해석해보면 challenge_01 클래스의 chall01 변수 값을 1로 바꾸는 문제다. 먼저 challenge_01 클래스부터 살펴보자.

    jadx를 설치했다면 FridaLab.apk 파일의 코드를 분석할 수 있다. 클래스를 살펴보면 chall01 변수가 선언되어 있고 그 값을 출력하는 getChall01Int() 메소드가 선언되어 있다. 

     

     

     

    그럼 코드를 살펴봤는데 이제 어떻게 chall01의 변수 값을 변경해야 할까.

     

     

     

    답은 "후킹(hooking)" 이다.

     

     

     

    후킹이란 "운영 체제나 응용 소프트웨어 등의 각종 컴퓨터 프로그램에서 소프트웨어 구성 요소 간에 발생하는 함수 호출, 메시지, 이벤트 등을 중간에서 바꾸거나 가로채는 명령, 방법, 기술이나 행위" 를 말한다.

     

     

     

    간단히 말하면 FridaLab.apk에 변화를 주는 코드를 작성해서 기기에 삽입한 후 실행시키는 것이다. 후킹으로 chall01 변수 값을 변경시키는 코드는 다음과 같다.

    // fridalab.js
    setImmediate(function() {
      // challenge 1
      Java.perform(function() {
        let challenge_01 = Java.use('uk.rossmarks.fridalab.challenge_01');
        challenge_01.chall01.value = 1;
        console.log('Challenge 1 clear!');
      });
    });

    fridalab.js

     

     

     

    setImmediate() 는 이벤트 루프에서 사용되는 함수 중 하나로, 현재 실행되고 있는 함수에 이어 setImmediate() 함수 안의 코드를 실행시키는 함수다. 자세한 건 아직 모르지만 setImmediate()를 사용해야 Frida가 종료되지 않고 후킹할 수 있다고 한다. 어쨌든 기억해야 할 건 후킹하는 함수를 setImmediate() 안에 넣을 것.

     

     

     

    그 안에 Java.perform() 함수를 보면 FridaLab.apk의 패키지 안에서 challenge_01 클래스를 가져와 따로 저장하는 걸 볼 수 있다.

    let challenge_01 = Java.use('uk.rossmarks.fridalab.challenge_01');

     

     

     

    그리고는 그 안의 chall01 값을 1로 바꿔준다.

    challenge_01.chall01.value = 1;

     

     

     

    마지막으로 변경을 확인하는 문구를 출력하는 것으로 코드는 끝난다.

    console.log('Challenge 1 clear!');

     

     

     

    코드를 작성했으니 이제 FridaLab 어플 프로세스에 삽입해서 실행시키도록 하겠다. 

     

     

     

    cmd에서 명령어를 통해 방금 작성한 코드를 기기로 삽입할 수 있다.

    frida  -U  FridaLab  -l  "삽입할 프로그램"

    삽입된 프로그램은 기기 안에서 실행되며, 이미지에서 완료 문구가 출력된 것을 보아 정상적으로 실행됐음을 확인할 수 있다.

     

     

     

    다시 녹스 플레이어의 FridaLab 어플에 들어가 CHECK 버튼을 눌러보면, 첫 번째 Challenge를 클리어했다고 표시된다.

     

     

     

     


    [Challenge 2] Run chall02()

    두번째 과제는 chall02() 메소드를 실행시키는 것 같다. 일단은 FridaLab.apk 안에서 chall02()를 찾아보자. 

    chall02() 메소드는 MainActivity 클래스 안에 정의되어 있었다. 그럼 이전 문제처럼 chall02()를 실행시키는 코드를 작성해서 후킹하면 문제가 풀리는 건가 싶겠지만, 그렇게 간단하게 풀리지 않는 이유가 있다.

     

     

     

    1번 과제에서는 chall01 변수가 static 선언되어 있었지만, chall02() 메소드는 static으로 선언되지 않은 점이다. 함수가 static으로 선언되어 있다는 것은 메모리에 저장될 때 자동으로 생성된다는 뜻이다. 그래서 Java.use() 함수로 메모리에 생성된 정적 함수를 불러올 수 있는 것인데, chall02() 메소드는 그렇지 않으니 다른 방법을 사용해야 한다.

     

     

     

     

    // fridalab.js
    setImmediate(function() {
      Java.perform(function() {
        // challenge 2
        Java.choose('uk.rossmarks.fridalab.MainActivity', {
          onMatch: function(instance) {
            instance.chall02();
          },
          onComplete: function() {
            console.log('Challenge 2 clear!');
          }
        });
      });
    });

     

    그 방법은 Java.choose() 함수를 이용해서 chall02() 메소드를 포함하는 인스턴스를 생성시키는 것이다. Java.choose() 함수는 첫번째 인자에서 찾고자 하는 인스턴스를, 그리고 두번째 인자에서는 각각 해당하는 인스턴스를 찾았을 때, 찾기를 끝냈을 때 실행할 함수를 넣는다.

     

    Java.choose('찾고자 하는 인스턴스', {onMatch: function(){실행할 함수1}}, onComplete: function(){실행할 함수2}});

     

     

     

     

     

    이제 이 코드를 FridaLab 어플에 삽입하면 정상적으로 코드가 실행된 것을 확인할 수 있다. (출력된 문구를 보면 Challenge 1 클리어 문구도 함께 나오는데, 이것은 작성한 코드에 Challenge 1을 클리어하는 코드도 포함했기 때문이다. 위의 코드를 삽입하면 Challenge 2 clear!만 나오는 것이 정상이다.)

     

     

     

     

    FridaLab 어플에 가서 체크해보면 2번까지 클리어된 걸 확인할 수 있다.

     

     

     

     


    [Challenge 3] Make chall03() return true

    chall03() 함수의 반환값을 true로 만들어라. 바로 chall03() 함수부터 찾아보겠다.

     

     

     

     

    MainActivity 클래스의 가장 위쪽에 자리잡고 있었다. 현재 return 값은 false. 그럼 이제 이 함수를 후킹을 통해 재정의하면 된다.

     

     

     

     

    // fridalab.js
    setImmediate(function() {
      Java.perform(function() {
        // challenge 3
        let challenge_03 = Java.use('uk.rossmarks.fridalab.MainActivity');
        challenge_03.chall03.implementation = function() {
          return true;
        };
        console.log('Challenge 3 clear!');
      });
    });

     

    1번 문제와 방식은 같다. Java.use() 함수를 통해 클래스를 가져오고 재정의한다.

     

     

     

     

    challenge_03.chall03.implementation = function(){
      return true;
    };

    다만 이번에는 변수가 아닌 함수를 재정의한다. 그 때는 implementation을 사용한다.

     

     

     

     

     

    이대로 스크립트를 삽입해보면 클리어된 걸 확인할 수 있다.

     

     

     

     


    [Challenge 4] Send "frida" to chall04()

    이번 문제는 좀 다르다. 이전까지는 값이나 내용을 변경하는 문제였다면 4번 과제에서는 함수에 값을 전달하는 것이다. 일단은 먼저 chall04()부터 살펴보자. 

     

     

     

     

    chall04() 함수는 MainActivity 클래스 안에 있었고, 호출 형태를 보니 String을 인자로 받는 것을 볼 수 있다. 그리고 받은 인자값이 "frida"와 같다면 4번 과제를 클리어하는 걸로 보인다. 이제 후킹하는 코드를 작성해보자.

     

     

     

     

    // fridalab.js
    setImmediate(function() {
      Java.perform(function() {
        // challenge 4
        Java.choose('uk.rossmarks.fridalab.MainActivity', {
          onMatch: function(instance) {
            instance.chall04("frida");
          },
          onComplete: function() {
            console.log('Challenge 4 clear!');
          }
        });
      });
    });

     

    인자값을 전달하기 위해서는 함수를 호출해야 해서 Java.choose() 함수를 사용한다. 인스턴스를 찾은 후 chall04() 함수를 실행시킬 때 "frida" 를 인자로 넣어주면 된다.

     

     

     

     

    그리고 확인해보면 4번 과제가 클리어된다. 이제 좀 후킹에 익숙해지는 것 같다.

     

     

     

     


    참조 

     

    FridaLab 1~8 문제 풀이

    이 글에서는 FridaLab 문제를 1번부터 8번까지 풀이합니다.

    velog.io

     

    '모바일 앱 해킹' 카테고리의 다른 글

    [FridaLab] Challenge 5·6·7·8  (0) 2024.04.11
Designed by Tistory.