분류 전체보기
-
Unity기반(il2) 게임 App 분석Mobile/Android 2019. 11. 24. 05:52
요즘 재밌고 인기있는 게임들은 대부분 Unity Engine으로 개발되고 있다. 대표적으로 포켓몬Go, 궁수의전설, 거지키우기 등 이 있다. Unity기반의 게임들은 JVM이 아닌 Native에서 코드가 구현되어 실행된다. JVM단에서는 Native라이브러리를 로드만 해주고, 실질적인 게임기능들은 Native단에 로드된 라이브러리에서 처리된다. 해당 라이브러리들은 '/lib'에 위치하고 있다. Unity게임 개발자들은 컴파일 방식을 'mono'와 'il2cpp' 두 가지 방식 중 선택해서 빌드가 가능한데, 예전에는 대부분 게임들이 Interpreter처리방식으로 속도가 빠른 'mono'를 선호했다. 하지만, 안정성 이슈와 보안적인 부분이 미흡하여 'il2cpp'로 많이 개발되는 추세이다. 따라서, 이번 ..
-
[2019picoCTF] droids4System/CTF 2019. 10. 13. 00:09
picoCTF의 droids 시리즈 중 마지막 문제인 droids4다. 화면 구성은 다음과 같다. 마지막 문제도 이전 문제들과 같이 사용자의 입력을 받고, 입력 값에 대한 결과 값을 출력해주는 어플이다. 어플에서 입력한 값은 getFlag( )의 첫번째 인자로 넘어가는데, equals( )로 검증이 이루어지고 있다. 빨간 박스에서 어떠한 값이 만들어지는데, 우리의 입력 값이 해당 값과 같아야 한다. 주황 박스는 Flag값을 생성하는 메소드인데, 전 문제처럼 어떠한 조건에서도 실행되지 않는다. droids3문제 처럼 바로 cardamom( )을 호출하는 방법을 생각해볼 수 있는데, 바로 메소드를 호출하게 되면 Crash가 발생하면서 어플이 종료된다. 따라서, 해당 문제에서는 cardamom( )의 인자로 ..
-
[2019picoCTF] droids3System/CTF 2019. 10. 12. 23:27
picoCTF droids 시리즈 중 4번째 문제다. 화면 구성은 다음과 같다. 이번에도 사용자의 입력을 받고, 버튼을 누르면 입력 값 처리 후 결과 값을 "i'm a flag!"위치에 출력해준다. 우리가 입력한 값은 getFlag( )의 첫 번째 인자로 넘어가는데, 입력된 값에 상관없이 nope( )가 실행된다. 빨간박스 nope( )는 단순히 "don't wanna"문자열을 반환하는 메소드이기 때문에 어떠한 값을 입력해도 결과는 똑같다. 주황박스 yep( )은 이전 문제들에서 Flag값을 얻어올 때와 같은 행동을 하고 있다. 하지만, yep( )는 어떠한 조건에서도 호출되지 않기 때문에 일반적인 방법으로는 yep( )의 실행값을 확인할 수 없다. 이때 사용할 수 있는 방법이 Frida를 이용한 후킹이..
-
[2019picoCTF] droids2System/CTF 2019. 10. 12. 23:04
picoCTF의 droids 시리즈 중 3번째 문제다. 어플 화면 구성은 다음과 같다. 전 문제들과 똑같이 사용자의 입력을 받고 내부에서 처리하며, 처리된 결과를 출력해주는 어플이다. 조금 귀찮은 문제다.. String[] v0 = {"weatherwax", "ogg", "garlick", "nitt", "aching", "dismass"} 위와 같은 Array변수에서 concat( )으로 각 인덱스를 이어붙인 문자열과 입력값이 같으면 Flag값을 출력해주는 로직이다. 소스대로 문자열들을 이어붙이면 "dismass.ogg.weatherwax.aching.nitt.garlick" 해당 문자열이 완성된다. adb shell input text "dismass.ogg.weatherwax.aching.nitt...
-
[2019picoCTF] droids1System/CTF 2019. 10. 12. 22:47
droids시리즈 두 번째 문제다. 어플의 화면 구성은 다음과 같다. 사용자의 입력을 받고 버튼을 누르면 입력된 값이 어플 내부에서 처리된다. 처리된 결과값이 "i'm a flag"위치에 출력된다. 입력 값은 getFlag( )의 첫 번째 인자로 넘어가며, 입력값이 arg3.getString(0x7F0B002F)과 같으면 Flag값을 반환해준다. 어플에서 참조하는 리소스에 대한 정보는 res/values/public.xml에 존재한다. 0x7F0B002F ID값을 가진 리소스는 String타입의 password이다. String에 대한 리소스들은 res/values/strings.xml에 존재한다. password(0x7F0B002F)의 값은 "opossum"인 것을 확인할 수 있다. 해당 값을 텍스트 ..
-
[2019picoCTF] droids0System/CTF 2019. 10. 12. 22:28
이번에 진행된 picoCTF에서 안드로이드(.apk) 문제가 있어서 한번 풀어봤다. 뉴비들 상대로 진행된 CTF이기 때문에 난이도는 쉬운 편에 속한다. 우선 어플을 실행하면 입력박스/버튼/텍스트뷰 3가지로 구성된 화면을 볼 수 있다. 우리가 입력한 값이 어플 내부에서 검증된 값이면 "I'm a flag!"위치에 Flag값이 출력되는 구조이다. JEB로 어플의 MainActivity를 보면, 주황박스에서는 버튼을 눌렀을 때의 처리를 하고 빨간박스에서는 hellojni.so를 로드하는 모습을 볼 수 있다. 우선 버튼을 눌렀을 때의 동작을 살펴보자 getFlag( )의 첫 번째 인자에는 우리가 텍스트박스에 입력한 값이, 두 번째 인자에는 어플의 Context값이 넘어간다. 우리가 입력한 값(arg2)를 pap..
-
[FRIDA] 실행되지 않는 메소드 호출하기Mobile/Frida 2019. 10. 12. 01:34
Frida로 App의 후킹포인트를 잡을 때 특수한 조건에만 실행이 되거나, 아예 실행되지 않는 메소드들을 후킹해야 할 때가 있다. 위 그림으로 예시로 들면, 빨간박스 yep( )는 중요한 값을 반환해주는 메소드인데 어느곳에서도 호출되지 않는다. 이때는 아래 코드로 간단하게 yep( )를 호출해줄 수 있다. Java.perform(function() { var Target = Java.use("com.hellocmu.picoctf.FlagstaffHill"); Target.getFlag.overload("java.lang.String","android.content.Context").implementation = function(a,b) { var retVal = this.yep(a); console.lo..
-
[FRIDA] App String Trace (모든 문자열 출력)Mobile/Frida 2019. 10. 12. 00:44
Java.perform(function () { const StringBuilder = Java.use('java.lang.StringBuilder'); StringBuilder.toString.implementation = function () { var retVal = this.toString(); console.log("StringBuilder.toString(): " + retVal); return retVal; }; }); java.lang.StringBuilder의 toString( )를 후킹해서 App내부에서 생성되는 모든 문자열을 트레이싱 할 수 있다. App내부에서 SecretKey값을 아무리 암호화해도 결국엔 복호화하여 String으로 변환하는 작업이 있기 마련이다. 이런 상황에서 문자..