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로 프로그램의 내부를 들여다보세요. 코드는 실행될 때 진실을 말합니다.
참고 자료:
- Frida 공식 문서
- Frida CodeShare - 커뮤니티 스크립트 모음
- Awesome Frida - 리소스 큐레이션