Skip to main content

Frida로 시작하는 동적 분석 (Dynamic Analysis with Frida)

동적 분석은 프로그램이 실행 중일 때 그 동작을 관찰하고 수정하는 기법입니다. Frida는 이러한 동적 분석을 위한 강력한 도구로, CTF, 모바일 앱 분석, 취약점 연구 등 다양한 분야에서 활용됩니다.

Frida란?

Frida는 오픈소스 동적 계측(instrumentation) 프레임워크입니다. 실행 중인 프로세스에 JavaScript 코드를 주입하여 함수 호출을 가로채고, 메모리를 읽고 쓰고, 프로그램의 동작을 실시간으로 변경할 수 있습니다.

주요 특징:

  • 다양한 플랫폼 지원 (Windows, macOS, Linux, iOS, Android)
  • JavaScript/Python API로 쉬운 스크립팅
  • 루트/탈옥 없이도 사용 가능 (일부 환경)
  • 실시간 코드 수정 및 후킹

설치 및 기본 사용법

# Python을 통한 Frida 설치
pip install frida-tools

# 실행 중인 프로세스 확인
frida-ps -U # USB 연결된 기기
frida-ps # 로컬 시스템

실전 예제: 함수 후킹

가장 기본적인 사용 사례는 특정 함수의 호출을 가로채는 것입니다.

// hook.js
Java.perform(function() {
var MainActivity = Java.use("com.example.app.MainActivity");

MainActivity.checkPassword.implementation = function(password) {
console.log("Password check called with: " + password);
// 원본 함수 호출
var result = this.checkPassword(password);
console.log("Result: " + result);
return true; // 항상 true 반환하도록 패치
};
});

실행:

frida -U -f com.example.app -l hook.js

CTF에서의 활용

CTF 리버싱 문제에서 Frida는 특히 유용합니다:

1. 안티디버깅 우회

  • 디버거 감지 함수를 후킹하여 항상 false 반환
  • ptrace, isDebuggerPresent 등의 함수 패치

2. 암호화 키 추출

  • 암호화 함수 호출 시 인자와 반환값 로깅
  • 메모리에서 키 값 직접 읽기

3. 네트워크 통신 분석

  • send/recv 함수 후킹으로 트래픽 덤프
  • SSL pinning 우회

고급 기법: 메모리 스캔

특정 패턴이나 값을 메모리에서 검색할 수 있습니다:

var baseAddr = Module.findBaseAddress("libapp.so");
Memory.scan(baseAddr, 0x10000, "41 42 43 44", {
onMatch: function(address, size) {
console.log("Found at: " + address);
},
onComplete: function() {
console.log("Scan complete");
}
});

웹 보안에서의 Frida

브라우저나 웹 앱 분석에도 활용 가능합니다:

  • Electron 앱의 내부 로직 분석
  • WebAssembly 모듈 후킹
  • 클라이언트 사이드 검증 우회

실무 팁

효율적인 디버깅:

  • console.log() 대신 send()를 사용해 Python으로 데이터 전송
  • Interceptor.attach()로 네이티브 함수 후킹
  • Java.choose()로 실행 중인 객체 인스턴스 찾기

주의사항:

  • 과도한 후킹은 앱 속도 저하 유발
  • 멀티스레드 환경에서 동기화 문제 주의
  • 상용 앱 분석 시 법적 리스크 고려

마무리

Frida는 리버싱과 보안 연구의 필수 도구입니다. 정적 분석만으로 파악하기 어려운 런타임 동작을 명확히 볼 수 있고, 복잡한 안티디버깅 기법도 우회할 수 있습니다.

CTF나 실제 보안 감사에서 막혔다면, Frida로 프로그램의 내부를 들여다보세요. 코드는 실행될 때 진실을 말합니다.

참고 자료: