상세 컨텐츠

본문 제목

FridaLab_07

CTF

by ser-ser 2025. 4. 17. 19:57

본문

FridaLab_07: 브루트포스로 PIN 찾기 및 확인

 

FridaLab의 일곱 번째 문제는 check07Pin() 메서드를 브루트포스하여 올바른 4자리 PIN 코드를 찾고, chall07() 메서드로 확인하는 연습을 다룹니다. 이번 포스팅에서는 07번 문제를 풀며 프리다로 check07Pin()을 브루트포스하고 chall07()를 호출하는 방법을 알아보겠습니다.


문제 설명

문제: Bruteforce check07Pin() then confirm with chall07()

  • 해석: check07Pin() 메서드를 브루트포스하여 올바른 4자리 PIN 코드를 찾은 뒤, chall07() 메서드에 해당 PIN을 전달하여 확인해야 합니다.

소스코드 확인

chall07() 메서드가 어디에 있는지 확인하기 위해 jadx-gui를 사용하겠습니다.

  • 이전 문제들에서 MainActivity 클래스에 메서드가 포함되어 있었으므로, chall07()도 uk.rossmarks.fridalab.MainAtivity에서 확인합니다.


  • 소스코드 확인 (chall07)
    public void chall07(String str) {
        if (challenge_07.check07Pin(str)) {
            this.completeArr[6] = 1;
        } else {
            this.completeArr[6] = 0;
        }
    }

🔶 핵심 내용

  • challenge_07.check07Pin(str)
    • 입력 문자열 str이 check07Pin()에서 true를 반환하면 completeArr[6]을 1로 설정합니다.
  • 목표
    • check07Pin()이 true를 반환하도록 4자리 PIN 코드(문자열)를 찾아 chall07()에 전달합니다

  • 소스코드 확인 (challenge_07)
    package uk.rossmarks.fridalab;
    
    public class challenge_07 {
        static String chall07;
    
        public static void setChall07() {
            chall07 = BuildConfig.FLAVOR + (((int) (Math.random() * 9000.0d)) + 1000);
        }
    
        public static boolean check07Pin(String str) {
            return str.equals(chall07);
        }
    }

🔶 핵심 내용

  • static String chall07
    • 정적 변수로, check07Pin()에서 비교 대상인 4자리 PIN 코드(문자열)입니다.
  • setChall07()
    • chall07 값을 BuildConfig.FLAVOR와 1000~9999 사이의 랜덤 4자리 숫자로 설정합니다.
  • check07Pin(String str)
    • 입력 문자열 str이 chall07과 동일하면 true를 반환합니다.
  • 목표
    • 1000~9999 사이의 숫자를 브루트포스하여 chall07과 일치하는 PIN을 찾습니다.
    • 찾은 PIN을 MainActivity.chall07()에 전달하여 확인합니다.

프리다 자바스크립트 작성

브루트포스 방식으로 1000~9999 사이의 숫자를 시도하여 check07Pin()이 true를 반환하는 PIN을 찾고, 이를 chall07()에 전달하겠습니다

    var c_07 = Java.use("uk.rossmarks.fridalab.challenge_07");

    //후킹 및 PIN 설정
    c_07.setChall07.implementation = function () {
      this.setChall07();
      return;
    };
    
    // 먼저 setChall07 호출하여 PIN 초기화
    c_07.setChall07();

    // 브루트포스 check07Pin
    var pin;
    for (var i = 1000; i <= 9999; i++) {
      var pinStr = i.toString();
      console.log("PIN 확인 중: " + pinStr); // 확인 과정 출력
      if (c_07.check07Pin(pinStr)) {
        pin = pinStr;
        break;
      }
    }

    // MainActivity.chall07 호출
    Java.choose("uk.rossmarks.fridalab.MainActivity", {
      onMatch: function (instance) {
        if (pin) {
          instance.chall07(pin);
          console.log("PIN True: " + pin);
        } else {
          console.log("PIN을 찾지 못했습니다.");
        }
      },
      onComplete: function () {
        console.log("movement!!!!!!");
      },
    });

 

🔶 추가된 코드 설명

  • var c_07 = Java.use("uk.rossmarks.fridalab.challenge_07")
    • challenge_07 클래스를 프리다에서 불러옵니다.
  • c_07.setChall07.implementation = function() {...}
    • setChall07() 메서드를 후킹하여 원래 동작을 유지합니다. 이는 PIN 초기화 과정을 제어하기 위함입니다.
  • c_07.setChall07()
    • setChall07()을 호출하여 chall07에 랜덤 4자리 PIN을 설정합니다.
  • for (var i = 1000; i <= 9999; i++) {...}
    • 1000~9999 사이의 숫자를 문자열로 변환하여 check07Pin()에 전달, true를 반환하는 PIN을 찾습니다.
    • console.log("PIN 확인 중: " + pinStr): 브루트포스 진행 상황을 출력합니다.
    • if (c_07.check07Pin(pinStr)): PIN이 맞으면 pin 변수에 저장하고 루프를 종료합니다.
  • Java.choose("uk.rossmarks.fridalab.MainActivity", {...})
    • MainActivity 인스턴스를 찾아 chall07(pin)을 호출합니다.
    • onMatch: PIN이 존재하면 chall07(pin)을 실행하고, PIN을 출력합니다. PIN이 없으면 오류 메시지를 출력합니다.
    • onComplete: 실행 완료 시 "movement!!!!!!"를 출력합니다.

실행

  • 스크립트 저장 및 실행
    • 위 코드를 FridaLab_07.js로 저장합니다.
    • CMD에서 Py3 환경에 접속한 뒤 frida -U -l FridaLab_07.js FridaLab을 입력합니다.
    • 스크립트 실행 후 브루트포스가 진행되며, 콘솔에 PIN 확인 과정이 출력됩니다.
    • 올바른 PIN이 발견되면 chall07(pin)이 호출되고, "PIN True: <PIN>"과 "movement!!!!!!"가 출력됩니다.
    • FridaLab 앱에서 'CHECK' 버튼을 클릭하면 07번 문제가 초록색으로 바뀌며 해결됨을 확인할 수 있습니다.

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

  • PIN 초기화
    • setChall07()을 호출하여 chall07 값을 설정해야 브루트포스가 올바르게 작동합니다.이
  • 값 일치
    • check07Pin()이 true를 반환하려면 입력 문자열이 chall07과 정확히 일치해야 합니다.

이번 포스팅에서는 FridaLab 07번 문제를 풀며 프리다로 브루트포스를 통해 4자리 PIN 코드를 찾고, 이를 메서드에 전달하는 방법을 배웠습니다.

'CTF' 카테고리의 다른 글

루팅 탐지 우회  (0) 2025.04.19
FridaLab_08  (0) 2025.04.18
FridaLab_06  (1) 2025.04.17
FridaLab_05  (0) 2025.04.17
FridaLab_04  (0) 2025.04.15

관련글 더보기