코드 분석

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

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

Write Up

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의 값을 변경하였다.

최종 Write Up Code

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()
})​

 

 

복사했습니다!