-
[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으로 변환하는 작업이 있기 마련이다. 이런 상황에서 문자..
-
[FRIDA] App 변수 후킹하는 법Mobile/Frida 2019. 10. 7. 20:17
Frida로 App의 변수값에 접근하여 값을 출력하고 수정하는 법에 다루도록 하겠다. App을 JEB로 열어보면 위 그림처럼 변수들이 사용되고 있는 것을 확인할 수 있다. Frida Javascript API 중 'Java.choose("class",Callback)'API를 이용해서 위 변수들에 접근할 수 있는데, 여기서는 MainActivity에 선언된 lose변수에 접근해서 값을 출력하고 원하는대로 조작하는 것을 목표로 해보겠다. Java.choose("com.example.HOOKAPP.MainActivity", { onMatch: function(instance) { HOOKING CODE~~~ }, onComplete: function() { HOOKING CODE~~~ } }); Java.c..
-
DLL 바이너리 수정으로 BreakPoint 걸기System/Reversing 2019. 10. 7. 19:23
프로그램을 분석하다보면, 안티디버깅의 탐지로 인해일반적인 디버거(x64dbg, windbg...)의 동적분석이 불가능한 경우가 있다.디버거로 탐지를 우회하는 방법도 있지만, CheatEngine은 탐지 안하는 경우가 많기 때문에해당 툴로 동적분석을 진행할 수 있다. CheatEngine자체의 BP기능을 사용할 수도 있지만, 이것 또한 사용하지 못하는 경우에는아래와 같은 방법으로 BP를 걸 수 있다. [ DLL 바이너리 수정 ]DLL의 2Byte opcode를 "EB FE"로 수정하면 해당 부분에서 BP가 걸린듯한 효과를 볼 수 있다. 또한, "int3"(CC) Interrupt를 탐지하는 안티 디버깅도 우회할 수 있다. "EB FE"는 자기 자신으로 JMP하는 opcode로서, CheatEngine으로 ..
-
[FRIDA] Android HashMap 오브젝트 출력하는 법Mobile/Frida 2019. 10. 4. 10:59
Frida로 HashMap 오브젝트의 값을 출력해야 할 때가 있다. var HashMapNode = Java.use('java.util.HashMap$Node'); var iterator = hashmap.entrySet().iterator(); while (iterator.hasNext()) { var entry = Java.cast(iterator.next(), HashMapNode); console.log(entry.getKey()); console.log(entry.getValue()); } 그럴 때는 위 코드로 HashMap 오브젝트에 접근할 수 있다. 2020.04.03 추가 - java.util.Map 오브젝트도 위와 동일한 방법으로 출력할 수 있다. 출처 - https://github.co..