상세 컨텐츠

본문 제목

FridaLab_05

CTF

by ser-ser 2025. 4. 17. 14:04

본문

FridaLab_05: 메서드에 지속적으로 문자열 전달하기

 

FridaLab의 다섯 번째 문제는 메서드에 특정 문자열을 지속적으로 전달하는 연습을 다룹니다. 이번 포스팅에서는 05번 문제를 풀며 프리다로 chall05() 메서드에 "frida" 문자열을 항상 전송하도록 수정하는 방법을 배워보겠습니다.


문제 설명

문제: Always send 'frida' to chall05()

  • 해석: chall05() 메서드가 호출될 때마다 'frida' 문자열을 지속적으로 전달해야 합니다.

소스코드 분석

chall05() 메서드가 어디에 있는지 확인하기 위해 jadx=gui를 사용합니다.

  • 이전 MainActivity에 chall03~05를 확인했으니 MainActivity > chall05(String)으로 이동합니다.
    public void chall05(String str) {
        if (str.equals("frida")) {
            this.completeArr[4] = 1;
        } else {
            this.completeArr[4] = 0;
        }
    }

    • public: 외부에서 접근 가능한 메서드입니다.
    • String str: 문자열 파라미터를 받습니다.
    • str.equals("frida"): 입력된 문자열이 "frida"와 동일하면 completeArr[4]를 1로 설정하고, 그렇지 않으면 0으로 설정합니다.
  • 목표: chall05() 메서드가 호출될 때 항상 "frida"를 전달하도록 수정하면 문제가 해결됩니다.

프리다 자바스크립트 작성

이전 문제(chall04)와 달리, 이번에는 메서드 호출 시 입력 파라미터를 무시하고 항상 "frida"를 전달하도록 메서드를 재정의합니다.

    var c_05 = Java.use("uk.rossmarks.fridalab.MainActivity");
    c_05.chall05.overload("java.lang.String").implementation = function (arg) {
      this.chall05("frida");
      console.log("movement!!!!");
    };

  • var c_05 = Java.use("uk.rossmarks.fridalab.MainActivity")
    • Java.use를 사용해 MainActivity 클래스를 프리다에서 불러옵니다.
    • c_05 변수에 클래스 객체를 저장해 후킹할 준비를 합니다.
  • c_05.chall05.overload("Java.lang.String").implementation = function(arg){...}
    • overload("Java.lang.String"): chall05() 메서드가 String 타입 파라미터를 받는 버전을 명시적으로 지정합니다.
    • implementation: 원래 메서드의 구현을 새로운 함수로 대체합니다.
    • function(arg): 원래 입력 파라미터(arg)는 무시하고 새로운 로직을 정의합니다.
    • this.chall05("frida"):메서드를 호출하며 "frida" 문자열을 전달합니다.
    • console.log("movement!!!!"):후킹이 성공했음을 확인하기 위해 콘솔에 출력합니다.

실행

  • 스크립트 저장 및 실행
    • 위 코드를  FridaLab_05.js로 저장합니다.
    • CMD에서 py3 환경에 접속한 뒤 frida -U -l FridaLab_05.js FridaLab을 입력합니다.
    • 스크립트가 실행되면 chall05()가 호출될 때마다 "frida"가 전달됩니다.
    • FridaLab 앱에서 'CHECK' 버튼을 클릭합니다.
    • 콘솔에 "movement!!!!" 출력되고, 05번 문제가 초록색으로 바뀌며 해결됨을 확인할 수 있습니다.

문제 해결 과정에서의 주의점

  • Java.use와 implementation 사용
    • chall04에서는 Java.choose를 사용해 인스턴스를 찾아 메서드를 호출했지만, 이번에는 Java.use와 implementation을 사용해 메서드 자체를 재정의했습니다.
    • implementation은 메서드가 호출될 때마다 새로운 로직을 적용하므로, 입력 파라미터를 무시하고 항상 "frida"를 전달할 수 있습니다.
  • overload 명시
    • chall05() 메서드가 문자열 파라미터를 받으므로, overload("java.lang.String")을 명시해 올바른 메서드를 후킹해야 합니다.
  • 문자열 지속 전달
    • 원래 파라미터(arg)를 무시하고 this.chall05("frida")를 호출해 "frida"를 강제로 전달합니다. 이로 인해 앱 내부의 어떤 입력이 들어오더라도 항상 올바른 값이 처리됩니다.

이번 포스팅에서는 FridaLab 05번 문제를 풀며 프리다로 메서드의 동작을 재정의해 특정 문자열을 지속적으로 전달하는 방법을 배웠습니다.

'CTF' 카테고리의 다른 글

FridaLab_07  (1) 2025.04.17
FridaLab_06  (1) 2025.04.17
FridaLab_04  (0) 2025.04.15
FridaLab_03  (0) 2025.04.15
FridaLab_02  (0) 2025.04.10

관련글 더보기