본문 바로가기
보안 및 개발/MOBILE

[Android] frida hooking 연습 문제

by CH@3M 2020. 1. 16.

SECCON Quals CTF 2015 APK1 example 문제이다.

apk는 여기서 다운로드 받을 수 있다 -> download the apk 

nox에 frida server 실행하여 풀이를 진행하였다. nox에서 frida를 사용하는 방법은 다음 글에서 확인할 수 있다.

2019/11/13 - [Mobile/Android] - [Android] nox에 frida 설치

앱 apk 설치 후 실행 화면은 다음과 같다. 가위, 바위, 보를 하는 프로그램이다.

apk를 JEB로 디컴파일해본다.

다음과 같은 조건을 만족시키면 flag를 획득할 수 있는 것으로 보인다.

 if(1000 == MainActivity.this.cnt) {
                ((TextView)v0).setText("SECCON{" + String.valueOf((MainActivity.this.cnt + MainActivity.this.calc()) * 107) + "}");
            }

 

 

rps.js 코드를 실행시키는 python 코드이다. 

import frida
import sys
import threading

PACKAGE = 'com.example.seccon2015.rock_paper_scissors'

def get_device():
    mgr = frida.get_device_manager()
    changed = threading.Event()
    def on_changed():
        changed.set()
    mgr.on('changed', on_changed)
    
    device = None
    while device is None:
        devices = [dev for dev in mgr.enumerate_devices() if dev.type =='usb']
        if len(devices) == 0:
            print ('Waiting for usb device...')
            changed.wait()
        else:
            device = devices[0]
            
    mgr.off('changed', on_changed)
    return device

if __name__ == '__main__':
    jscode = open('rps.js', 'r').read()
    device = get_device()
    print(device)
    process = device.attach(PACKAGE)
    print(process)
    script = process.create_script(jscode)
    script.load()
    sys.stdin.read()

usb로 기기와 연결되어 있으면, get_usb_device( )를 사용한다.

Nox와 같은 에뮬레이터라면 get_device(id,timeout)형식으로 연결한다.

rps.js 코드이다.

Java.perform(function () {
    // Function to hook is defined here
    var MainActivity = Java.use('com.example.seccon2015.rock_paper_scissors.MainActivity');
  
    // Whenever button is clicked
    var onClick = MainActivity.onClick;
    onClick.implementation = function (v) {
      // Show a message to know that the function got called
      send('onClick');
  
      // Call the original onClick handler
      onClick.call(this, v);
  
      // Set our values after running the original onClick handler
      //this.m.value = 0;
      //this.n.value = 1;
      //this.cnt.value = 999;
      this.cnt.value = 1000;
  
      // Log to the console that it's done, and we should have the flag!
      console.log('Done:' + JSON.stringify(this.cnt));
    };
  });

 

풀이 방법은 다양하지만 나는 this.cnt.value 값을 1000으로 변조하는 방법을 사용하였다. python 코드를 실행시키면 다음과 같이 flag를 알려준다.

반응형

'보안 및 개발 > MOBILE' 카테고리의 다른 글

[Android] OWASP UnCrackable 2  (0) 2020.01.20
[Android] OWASP UnCrackable 1  (0) 2020.01.17
[android] 디컴파일 (dex2jar, jd-gui, jadx-gui)  (0) 2019.12.23
[android] 취약점 분석 툴 androbugs  (0) 2019.12.19
[iOS] OWASP ZAP 툴  (0) 2019.11.22