실 프로젝트를 경험하면서 모바일 진단을 위해서 꼭 필수적인 요소로 자리매김한 게 Frida이다.
강력한 솔루션을 사용하거나 또는 여러 겹의 루팅 체크, 무결성, 백신 등의 검증을 통과해야 하는 경우가 대다수이고 모바일 진단은 특히 기간 상의 문제 때문에 솔루션이 벗겨진 상태로 진단 대상을 받아도 문제가 발생할 가능성이 높다.
그래서 유연하고 강력한 Hooking이 주목받고 대세로 떠오르는 것이다.
하지만 다른 공격 기법이나 방법처럼 많이 퍼져있는 게 아니기 때문에 처음 배워야지 배워야지 하는데 어디서 막상 어떻게 배워야 하는지도 의문이었다.
그래서 나 혼자서 배움을 정리하고자 또 글을 쓴다.
우선은
에서 받은 튜토리얼 문제인
2015 CTF 문제인 가위바위보에서 1000번 이기기 문제부터 풀었다.
[문제] 1000번의 가위바위보를 진행하는데 1000 전부 다 이기게 동적 메모리 후킹해야 한다.
[환경 및 사용 툴]
OS : Win 10 / Device : Nox_6.3.0.9
Frida 12.7.16 / Sublime / JEB2
Ctn의 값이 1000이 넘어야 하며 승리할 때마다 Ctn의 값의 카운팅 되게 로직이 짜여 있다.
또한 1000이 넘었을 경우 Flag 값이 보이도록 로직이 짜여 있다.
그러면 동적 메모리 후킹을 통해 임의적으로 Ctn 값을 999로 변조하여 한 번만 이기도록 한다.
import frida, sys
def on_message(message, data):
if message['type'] == 'send':
print("[*] {0}".format(message['payload']))
else:
print(message)
jscode = """
Java.perform(function () {
var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
// onClick 메서드 생성하여 함수를 호출할 때를 보여준다.
var onClick = MainActivity.onClick;
onClick.implementation = function (v) {
send('onClick');
// Call the original onClick handler
onClick.call(this, v);
// onClick 메서드에 정의된 값을 변조
this.m.value = 0;
this.n.value = 1; //M에 보자기로 고정 N에 주먹으로 고정
this.cnt.value = 999;
// 로그
console.log('Done:' + JSON.stringify(this.cnt));
};
});
"""
process = frida.get_usb_device().attach('com.example.seccon2015.rock_paper_scissors')
script = process.create_script(jscode)
script.on('message', on_message)
print('[*] Running CTF')
script.load()
sys.stdin.read()
이 코드를 Frida로 돌려주면
python ctf.py
보이는 것과 같은 Flag 값을 얻을 수 있다.
FRIDA를 잘 쓰기 위해서는 코드 읽는 능력이 필수다.
틀릴 가능성이 농후하기 때문에 지적해줬으면 좋겠다.