이 포스팅은 Dreamhack 챌린지 문제 중 ‘[CodeEngn] Mobile App L01’에 대해 설명한다. 플래그는 노출하지 않았다.

포스팅에 앞서, 이 문제를 출제 해주신 저자님께 감사말씀 드리고 싶다. 레벨 1로 설정되어 있는 것을 보고 단순히 실행만 하면 플래그 획득이 가능할 것이라고 생각하고 ‘ADB INSTALL’ 명령어를 수행하면서 많은 배움을 얻었기 때문이다. 이 문제를 푼 방법은 총 2가지이다. 그중 오늘은 주어진 APK 파일을 수정하는 방법에 대해 서술해보고자 한다.

만약 에뮬레이터나 물리적 디바이스를 가지고 있다면, ADB(Android Debug Bridge) 어플리케이션을 통해 APK 파일을 설치할 수 있다. 하지만, 우리는 가끔 APK의 API 버전도 고려해야할 때가 있다. API 버전이 지나치게 높을 경우 현존하는 가상 에뮬레이터 (’NOX’) 에서 동작할 수 없다. 왜냐하면 NOX에는 최신 안드로이드 이미지가 존재하지 않기 때문이다. 그러나 이번 챌린지의 경우 생성된지 오래된 안드로이드 파일이기 때문에 가상 에뮬레이터에서도 동작될 거라고 판단된다. 필자는 NOX를 사용하지 않고, 안드로이드 스튜디오를 이용하여 직접 가상 에뮬레이터를 생성하는 방향으로 진행하였다.

먼저, 누구나 다 APK 파일을 소지하고 있을 때 다시 말해 타깃 APK 파일을 안드로이드 디바이스에 설치하고 싶을 때 ‘adb install’ 명령어를 사용한다. 필자 역시 동일한 방법으로 시작하였다. 하지만, ‘INSTALL_FAILED_INVALID_APK’라는 에러 문구가 표출되면서 프로그램이 비정상 종료되었다.

Untitled

필자의 경우, 이제 껏 안드로이드 APK 파일을 설치해서 포렌식 연구를 진행할 때 해당 에러는 본적이 없었다. 잠시 당황했다가 stackoverflow를 통해 이유를 짐작할 수 있었다. 첫째로 AndroidManifest.xml이 언급되었고, 무엇인가 “같음”을 재증명하라는 의도로 보여졌다. 이말인 즉슨, 주어진 문제파일에서 강제적으로 어떤 값을 바꿔서 정상적인 안드로이드 파일이 되지 않게 조작했다는 것을 의미한다.

Untitled

스택오버플로우의 말을 신뢰해보기로 하고, 압축 해제 프로그램 (’반디집’)을 통해 파일을 들여다보았다. 문제를 분석할 때 컨디션이 좋지 않았기 때문에 파일의 이름이 일반적인 안드로이드 파일과 다른점을 상당히 늦게 알아차렸다.

Untitled

아래의 목록은 일반적인 안드로이드 파일에 종속된 파일명과 다른 부분을 보여준다.

resource.arsc
class.dex
AndroidManlfests.xml 

실제 파일명은 resources.arsc, classes.dex 그리고 AndroidManifest.xml 이다. 가볍게 파일 명을 수정할 수 있다.

Untitled

과연 현재의 행위만으로 파일이 정상동작하였을까? 안타깝게도 나의 수정된 안드로이드 파일은 동작하지 않았다. 다시 말해, 파일명을 변경하는 것 만으로는 이슈 해결이 되지 않았다.

Untitled

생각을 조금 하다가 이유를 인지할 수 있었다. 사실 포렌식 관점에서 무결성은 상당히 중요한 요소로 작용한다. 뿐만 아니라, 파일 내 데이터 값이 변경되지 않는다면 파일 명 변경 만으로는 무결성이 손상되지 않는다. 하지만, ZIP (PK 구조)는 다르다. ZIP의 경우 CRC 값으로 검증하게 되는데 ZIP 내부가 1바이트라도 변경된다면 해쉬값이 변경되게 된다. 아래에 증명 사진 2개를 첨부하였다. 첫 번째 사진은 apk 내부의 파일 명을 수정 이전과 수정 이후를 나타내는 것이고, 두번째 사진의 경우 데이터는 hello로 동일하면서 파일명만 바꾸는 실험이다.

Untitled