Android 모바일 해킹 - FridaLab(8), END

Woongmur·2025년 1월 12일

8번째 과제

이제 FridaLab의 대망의 마지막 과제... 문제를 보도록 하자

check 버튼을 Confirm으로 바꿔라 라는 과제이다.
오호... 이건 또 처음 보는 느낌의 문제이다.
웹 에서는 그냥 간단하게 할 수 있는 거지만, 모바일에서는 어떤지 한번 보도록 하자 우선 오늘도 jadx로 가서 메서드를 확인해보자!

MainActivity 클래스에 있는 chall08()메서드이다.
내용을 보면 findViewById라는 메서드가 있는데 이는 안드로이드의 뷰를 검색하는 메서드이다.
이를 이용해서 R클래스의 check의 id를 불러오고 Button타입으로 캐스팅 한다.
getText()메서드로 버튼에 표시된 문자를 불러오고 그 문자가 Confirm과 같으면 true 아니면 flase를 반환한다.

check의 id값은 0x7f07002f이다.
마지막 문제라서 그런지 그저 간단하게 chall08()을 true로 변환해서 되는건 아닐것 같다...
그렇다면 어떻게 해야하는가?

고려해야 하는 몇가지 사항이 있는데
먼저, MainActivity의 chall08을 호출하고 checkid값을 불러온다.
그리고, checkid를 Java.cast API를 이용하여 버튼으로 변환한다.
마지막으로, 버튼에 들어갈 문자열을 "Confirm"으로 지정하여준다.

여기에서 Java.cast라는 새로운 개념이 등장하는데

Java.cast?

자바에서 사용되는 캐스팅이라는 개념으로 형 변환, 타입 변환을 해주는 API이다.
이번에는 위에서 말한것 처럼 findViewById에서 가져온 check의 id를 button으로 캐스팅해주는 작업을 해줄것이다.

Java.perform(function(){
    var NewButton = Java.use("android.widget.Button");
    Java.choose("uk.rossmarks.fridalab.MainActivity",{
        onMatch:function(instance){
            var checkid = instance.findViewById(0x7f07002f);
            var check = Java.cast(checkid, NewButton);
            check.setText("Confirm");
        },
        onComplete:function(){
            console.log("[+]chall08버튼을 Confirm으로 바꾸었습니다.");
        }
    })
})

찾아본 결과 안드로이드에서 버튼을 캐스팅 해주려면 Java.use를 이용해서 andrid.widget.Button클래스를 사용하고 Java.cast로 캐스팅 해줘야 한다고 한다.
그래서 이 코드로 실행을 했을때는 결과가 어떻게 되느냐..

???????????????????
뭐시여 이게 무슨...
아차차.... 이 오류는 setText()에서 타입을 지정하지 않아 발생되는 오류다. setText를 사용할때는 인자 타입을 지정해주어야 한다는 것을 잊고 있었다.
다시말해서 인자로 들어온 값의 오버로드딩된 함수들 중에서 매칭할 수 없어서 이러한 오류가 발생한 것이다.

오류 해결을 위해 Java.use("java.lang.String")함수로 String 클래스의 객체로 가져온 뒤에 $new() 함수로 인스턴스화 시켜주면 해결된다.

결과적으로 수정된 코드를 보면 다음과 같다.

Java.perform(function(){
    var NewButton = Java.use("android.widget.Button");
    Java.choose("uk.rossmarks.fridalab.MainActivity",{
        onMatch:function(instance){
            var checkid = instance.findViewById(0x7f07002f);
            var check = Java.cast(checkid, NewButton);
            var string = Java.use("java.lang.String");
            check.setText(string.$new("Confirm"));
        },
        onComplete:function(){
            console.log("[+]chall08버튼을 Confirm으로 바꾸었습니다.");
        }
    })
})

이제 이 chall08.js 코드를 이용해서 frida -U -l chall08.js FridaLab 명령어를 실행시켜주면

오류가 안뜬다..!! 에뮬레이터에서 확인하여보면...!!

조아쓰!!!! 정상적으로 작동되어 버튼이 confirm으로 바뀐것을 볼 수 있다!

소감

8번 도전과제를 마지막으로 FridaLab을 마무리하였다.
처음에는 모바일 앱 해킹 실습을 기대하기는 했지만 조금은 자신없던 코딩을 해야 한다는 생각에 걱정이 되었다.
하지만 하다보니까 이렇게 재미있을수가 없다!!
기초를 배울때는 "그래서 이걸 어따 쓴다고..?"와 같은 의문점이 들어 머리에 잘 안들어오는 반면 지금과 같이 결과물이 눈에 보이니까 아주 머리에 잘들어오고 재미있다!!
그 덕에 FridaLab의 문제를 해결하는 중에도 어려운 부분에서도 포기하게 되지 않고 모르는 것을 즐겁게 찾아보며 적용하고, 시행착오를 격는 과정도 즐겁게 했던것 같다.
다음 포스트는 Uncrackable로 돌아오도록 하겠다!!

- FridaLab END -

profile
Pentest Study & Life Blog

0개의 댓글