Season 1/워게임

FridaLab Write Up - Challenge 08. 'Check' 버튼의 텍스트를 'Confirm'으로 변경하라.

작성자 - LRTK

사진과 같이 Button의 값은 여러 파일을 통해 알아낼 수 있다.

res/layout/activity_main.xml에서 정의된 android:text의 값을 confirm으로 변경해야 목표에 도달할 수 있다.

Java.perform(() => { console.log("\n* Hooking Start *") var challenge08 = () => { Java.choose('uk.rossmarks.fridalab.MainActivity', { onMatch: (instance) => { var R_id = Java.use('uk.rossmarks.fridalab.R$id') var string = Java.use('java.lang.String') var button = Java.use('android.widget.Button') var check_button_id = instance.findViewById(R_id.check.value) var check_button = Java.cast(check_button_id, button) check_button.setText(string.$new("Confirm")) }, onComplete: () => console.log("challenge_08 solved!") }) } // Hooking Function Call challenge08() })​

각 파일에서 값을 가져오기 위해 Java.use()을 사용하였다.

그 중 Button 클래스를 가져온 이유는 Button 클래스의 변수 값을 변경하는 것이기 때문에 변경 시 Button 클래스로 변환할 때가 존재하여 가져왔다.

 

 findViewById()를 이용하여 뷰에 표현된 Button 객체를 가져와서 Java.cast()를 이용해 Button 클래스로 변환하였다. 이후 setText()를 이용하여 String 타입의 데이터를 파라미터로 넘겨 Button의 값을 변경하였다.

Java.perform(() => { console.log("\n* Hooking Start *") var challenge01 = () => { var challenge_01 = Java.use("uk.rossmarks.fridalab.challenge_01") challenge_01.chall01.value = 1 console.log("\nchallenge_01 solved!") } var challenge02 = () => { Java.choose("uk.rossmarks.fridalab.MainActivity", { "onMatch": (instense) => instense.chall02(), "onComplete": () => console.log("challenge_02 solved!") }) } var challenge03 = () => { var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity") MainActivity.chall03.overload().implementation = () => true console.log("challenge_03 solved!") } var challenge04 = () => { Java.choose("uk.rossmarks.fridalab.MainActivity", { "onMatch": (instense) => instense.chall04("frida"), "onComplete": () => console.log("challenge_04 solved!") }) } var challenge05 = () => { var MainActivity = Java.use("uk.rossmarks.fridalab.MainActivity") MainActivity.chall05.overload('java.lang.String').implementation = function (arg) { this.chall05("frida") } console.log("challenge_05 solved!") } var challenge06 = () => { Java.choose("uk.rossmarks.fridalab.challenge_06", { "onMatch": (instense) => instense.startTime(), "onComplete": () => { } }) setTimeout(() => { var challenge_06 = Java.use("uk.rossmarks.fridalab.challenge_06") Java.choose("uk.rossmarks.fridalab.MainActivity", { "onMatch": (instense) => instense.chall06(challenge_06.chall06.value), "onComplete": () => console.log("challenge_06 solved!") }) }, 1000) } var challenge07 = () => { var challenge_07 = Java.use("uk.rossmarks.fridalab.challenge_07") Java.choose("uk.rossmarks.fridalab.MainActivity", { "onMatch": (instense) => { var pin = 1000 while (true) { if (String(pin) == challenge_07.chall07.value) { instense.chall07(String(pin)) break } pin++ } }, "onComplete": () => console.log("challenge_07 solved!") }) } var challenge08 = () => { Java.choose('uk.rossmarks.fridalab.MainActivity', { onMatch: (instance) => { var R_id = Java.use('uk.rossmarks.fridalab.R$id') var string = Java.use('java.lang.String') var button = Java.use('android.widget.Button') var check_button_id = instance.findViewById(R_id.check.value) var check_button = Java.cast(check_button_id, button) check_button.setText(string.$new("Confirm")) }, onComplete: () => console.log("challenge_08 solved!") }) } // Hooking Function Call challenge01() challenge02() challenge03() challenge04() challenge05() challenge06() challenge07() challenge08() })​

 

 

이 글이 도움이 되었다면, 응원의 댓글 부탁드립니다.