해당 CTF는 직접 참여한 것이 아닌 Writeup이 제공 되어 이후에도 문제를 풀이할 수 있게 되었습니다.

공식 링크는 아래에 첨부되어있고, 해답을 이해하며 생각을 해보면서 풀이 해보시길 바랍니다.

문제 분석

You are stuck in a Pokeball, break out!

Hint: I do not mean exit the app

Download File: pokeball_escape.apk

앱 실행 시 일정 시간동안 !! CONDITIONS NOT MET TO ESCAPE Toast 메세지가 발생하고 있다.

해당 앱은 JEB을 통해 확인해보록 하겠습니다.

newGame() 함수를 보면 ` if(Intrinsics.areEqual(this.systemInfo(), “Devon Corporation”))를 통해 **system.Info()**가 **Devon Corporation**면 imageView.setImageBitmap(BitmapFactory.decodeFile(v2.getOutputFile().getAbsolutePath()));` 함수를 통해 어떠한 이미지 파일을 비트맵으로 보여주고 있다.

하지만 system.Info()Devon Corporation가 아니라면 Toast.makeText(((Context)this), "!! CONDITIONS NOT MET TO ESCAPE !!", 0).show();를 통해 처음 실행한 화면을 보여주게 된다.

해당 함수에 대해서 Frida를 이용한 값을 변경하기엔 void 리턴 타입이라 리턴 값 변경도 어려울 것으로 판단하며 앱 변조로 해결하고자 한다.

Smail Manipulation

newGame() 함수의 Smali 코드를 보면 if-eqz 분기를 통해 system.Info()Devon Corporation를 비교하여 해당 플래그 값을 기준으로 Toast 메세지를 보여주거나 새로운 비트맵 이미지를 보여주는 것으로 되어 있다.

현재 해당 값을 v0와 같지 않기에 Toast 메세지가 나오므로 if-eqz가 아닌 if-nez로 변경한다.

또한 해당 앱은 System.loadLibrary("pokeballescape");를 통해 외부 라이브러리를 사용하고 있기에 앱 업데이트 시에 .so 파일을 복사하는 것을 방지해서 앱 업데이트 시에 용량이 적어지는 이점을 얻기 위해 False 설정 되어 Install 하려고 하면 Failed to extract native libraries 에러가 발생하기에 이 값을 true로 변경하여 리사이닝 이후 설치하면 정상 실행된다.

실행하게 되면 system.Info()Devon Corporation가 아니어도 내부 분기로 이동하게 되기에 이 처럼 플래그가 등록된 비트맵 이미지가 보이게 되며 해결이 가능하다.