ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [2019picoCTF] droids4
    System/CTF 2019. 10. 13. 00:09

    picoCTF - droids4

    picoCTF의 droids 시리즈 중 마지막 문제인 droids4다.

    화면 구성은 다음과 같다.

     

    droids4 실행모습

    마지막 문제도 이전 문제들과 같이 사용자의 입력을 받고, 입력 값에 대한 결과 값을 출력해주는 어플이다.

     

    droids4 - FlagstaffHill.getFlag( )

    어플에서 입력한 값은 getFlag( )의 첫번째 인자로 넘어가는데, equals( )로 검증이 이루어지고 있다.

    빨간 박스에서 어떠한 값이 만들어지는데, 우리의 입력 값이 해당 값과 같아야 한다.

    주황 박스는 Flag값을 생성하는 메소드인데, 전 문제처럼 어떠한 조건에서도 실행되지 않는다.

     

    droids3문제 처럼 바로 cardamom( )을 호출하는 방법을 생각해볼 수 있는데, 바로 메소드를 호출하게 되면 Crash가

    발생하면서 어플이 종료된다.

    따라서, 해당 문제에서는 cardamom( )의 인자로 넘어가는 값이 빨간박스에서 생성된 값과 같아야 한다.

     

    직접 빨간 박스가 어떠한 값을 생성하는지 분석해봐도 되겠지만 그건 너무 귀찮다..

    이번에도 Frida를 이용해서 문제를 해결해보겠다.

    import frida, sys
    
    def on_messaege(message, data):
        print("{} -> {}".format(message, data))
    
    hook_code = """
    Java.perform(function()
    {
        console.log("[*] HOOK START");
        
        var StringBuilder = Java.use("java.lang.StringBuilder");
        
        StringBuilder.toString.implementation = function()
        {
            console.log("[*] toString( ) Hook IN");
            var str = this.toString();
            console.log("[*] Create Str: "+str);
    
            return this.toString();
        }
    });
    """
    
    package_name = "com.hellocmu.picoctf"
    device = frida.get_usb_device(timeout=10)
    pid = device.spawn([package_name])
    process = device.attach(pid)
    device.resume(pid)
    print("ATTACH PROCESS - {}".format(pid))
    
    script = process.create_script(hook_code)
    script.on("message", on_messaege)
    script.load()
    sys.stdin.read()

    위 코드로 droids4를 후킹할 수 있다.

    StringBuilder.toString( )를 후킹해서 생성되는 모든 문자열들을 출력시키는 코드다.

    실행결과는 다음과 같다.

     

    StringBuilder.toString( ) 후킹 결과

    입력박스에 "py0zz1"를 입력한 뒤 버튼을 클릭하였고, "alphabetsoup"라는 문자열이 생성되는걸 확인할 수 있다.

    따라서, 생성된 검증값은 "alphabetsoup"라는 것을 알 수 있다.

    Java.perform(function()
    {
        console.log("[*] HOOK START");
    
        var Target = Java.use("com.hellocmu.picoctf.FlagstaffHill");
        Target.getFlag.overload("java.lang.String","android.content.Context").implementation = function(a,b)
        {
            console.log("[*] getFlag() Hook IN");
            var passcode = "alphabetsoup";
            var retVal = this.cardamom(passcode);
            console.log("retVal: "+retVal);
            return this.getFlag(a,b);
        }
        
    });

    이제 검증 값을 알았으니 해당 값을 cardamom( )의 인자로 넘겨주고 반환값을 가져오면 된다.

    아래는 후킹 결과이며, 성공적으로 Flag값이 출력된 것을 확인할 수 있다.

     

    droids4 Flag

     

    'System > CTF' 카테고리의 다른 글

    CTFd 설치법  (4) 2019.11.29
    [2019picoCTF] droids3  (0) 2019.10.12
    [2019picoCTF] droids2  (1) 2019.10.12
    [2019picoCTF] droids1  (0) 2019.10.12
    [2019picoCTF] droids0  (0) 2019.10.12

    댓글

Designed by Tistory.