-
Unity Game App Hacking (궁수의 전설)Mobile/Frida 2019. 12. 18. 06:19
페이스북같은 곳에서 궁수가 활을 쏘는 게임 광고 한번씩은 보셨을 것이다. '궁수의 전설'이라는 Unity Engine기반 게임인데 FRIDA를 이용해서 게임해킹을 한번 해볼까한다. 대부분의 게임 해킹은 App을 직접적으로 변조해서 다시 리패키징하는 방식으로 진행된다. 이런 방식을 'Modding'이라고 하는데, 이렇게 하는건 별로 마음이 내키지 않았다. 그래서 App변조가 아닌, FRIDA를 이용해서 동적으로 App을 후킹하는 방식으로 시도해봤다. 우선 시작에 앞서, 궁수의 전설은 싱글 플레이 게임으로 다른 플레이어에게 영향을 끼치지 않는다. 순위나 경쟁 시스템이 없는 오로지 자신만 즐기는 게임이기 때문에 오해 없길 바란다. Method Symbol 궁수의 전설은 il2cpp방식으로 빌드된 게임이다. 따..
-
Runtime Memory PatchMobile/Frida 2019. 12. 17. 07:15
Windows의 CheatEngine처럼 App실행 중에 메모리를 스캔해서 특정 메모리를 패치하는 방법이다. FRIDA의 Process API와 Memory API를 활용하면 된다. Memory Patch Script function memscan() { var patched = false; var scan_result; // 프로세스에서 'rw-'영역 메모리 가져옴 Process.enumerateRanges('rw-', { // 'rw-'영역 Callback함수 정의 onMatch: function(range) { if(!patched) {// pattern: py0zz1 scan_result = Memory.scanSync(range.base, range.size, '70 79 30 7a 7a 31'..
-
Welcome Write-UpSystem/Pwnable.xyz 2019. 12. 8. 04:50
Pwnable.xyz의 첫 번째 문제 Welcome이다. 50점의 점수를 가지고 있기 때문에, 점수 상 그렇게 어려운 문제는 아니다. Binary 바이너리는 64bit 실행파일이며, Shared Object로 PIE가 적용되어 있다. 또한, Stripped상태로 Symbol정보가 모두 지워진 상태다. 또한, 모든 보호기법이 적용된 상태이다. 여기서 살짝 유추해볼 수 있는 것이 '일단 Memory Exploit은 아니겠구나' 이다. 따라서, 일반적인 Exploit방법보다는 Tricky한 방법으로 시선을 맞추는 놓는 것도 좋은 접근법이다. 바이너리도 크게 복잡하지 않다. malloc(0x40000)을 한 뒤, 할당된 주소를 출력해주고 있다. 그 뒤, scanf( )로 malloc( )할 Size를 사용자 입..
-
Unity기반(mono) 게임 App 분석Mobile/Android 2019. 12. 7. 00:38
Unity기반 App은 mono, il2 두 가지 방식 중 하나로 컴파일이 가능하다. 이번 글에서는 mono방식으로 컴파일된 App을 분석하는 방법에 대해 다루도록 하겠다. mono방식으로 컴파일된 App에는 위 3개의 라이브러리 파일이 포함되어 있다. libmono.so 심볼 정보 역시 제거된 상태이지만, il2방식보다 보다 쉽게 심볼정보를 얻어 낼 수 있다. Assembly-CSharp.dll il2방식에서는 Metadata파일을 덤프하는 과정이 있었는데, mono방식은 /assets/bin/Data/Managed 에 위치한Assembly-CSharp.dll 파일을 확인하면 된다. il2에서는 Dump 과정을 거쳐야만 얻을 수 있던 dll파일들이 mono방식에서는 바로 확인이 가능하다. 위 파일 중 ..
-
CTFd 설치법System/CTF 2019. 11. 29. 16:01
환경은 Ubuntu 16.04에서 진행하였다. 패키지 설치 1. git 설치 sudo apt-get install git 2. python3 && pip3 설치 sudo apt-get install python3 python3-pip 3. CTFd git 다운로드 git clone https://github.com/CTFd/CTFd.git 4. CTFd 모듈 설치 sudo pip3 install -r requirements.txt 여기까지 진행했으면 CTFd 설치는 끝났다. 이제 스크립트를 상황에 맞게 수정 해주면 된다. serve.py 수정 vi serve.py #!/usr/bin/python3 # 파일 실행 환경변수 설정 from CTFd import create_app import argparse ..
-
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를 이용한 후킹이..