안드로이드 해킹대회 어플 문제 4

2014. 11. 3. 21:34Security ★ Development/안드로이드 모바일 보안

반응형

문제 http://codeengn.com/challenges/smartapp/04


서명을 하고 설치를 하면 키를 입력하는 에디트 부분이 나오고 확인 버튼이 있습니다.

androlyze로 확인해보면 zFindKey와 MainActivity가 보입니다.  zFindKey 부분은 지금 별 쓸모가 없는 것 같습니다.  MainActivity를 보면 버튼에대한 클릭 메소드가 없습니다.  특별히 암호화된 문자열도 보이지 않습니다.  잘못된 입력을 쳤을 때 Wrong!! try~ 문자열을 보여주는데 이 문자열도 찾을 수 없습니다.

strings 명령어로 classes.dex 파일을 살펴봅니다.  리눅스의 strings는 파일에 사용된 문자열을 보여줍니다.

그럼 긴 문자열 2개가 보입니다. @0c9e...과 6a4989... 그 위에 Wrong!! try~ 문자열도 있습니다.


그리고 문자열들을 계속 보면 onClieck도 있고 helloWorldD도 보입니다.  zFindKey 클래스에는 helloWorldC까지밖에 없었습니다.

의심가는게 많지만 우선 hellowWorldD메소드를 봐야할 것 같습니다.


hex에디터로 classes.dex를 열었을 때에도 helloWorldD메소드는 제대로 보입니다.


그런데 실제 코드를 디컴파일 할 때 안 보이는 것은 디컴파일시 메소드에 대한 메타 데이터가 잘못 되었다고 볼 수 있습니다.  


먼저 zFindKey 클래스의 메소드가 정의되어 있는 부분을 보면 위와 같은 부분이 있습니다.  method_size가 0으로 되어있고 현재 메소드는 a, b, c가 보이고 d가 보이지 않는 상태입니다.  d가 하나 있었다고 할 수 있으므로 method_size는 원래 1의 값을 가지고 있었다고 추측할 수 있습니다.  direct_method_size를 5로 올리게되면 c메소드 아래에 NO METHOD라는 값이 뜨게됩니다.


위 블록이 쳐진 부분이 a메소드의 부분입니다.  맨 앞의 01은 인덱스, 09는 엑세스 플래그, B4 18은 오프셋입니다.

B8 19가 c메소드의 오프셋입니다.  그 다음이 d메소드가 위치할 자리입니다.  d메소드의 엑세스 플래그를 1(public)로 지정해줍니다


다음은 d메소드의 위치입니다.  아래 블록이 쳐진 부분은 c메소드의 위치를 나타냅니다.  오프셋도 0xCB8로 제대로 나타나고 있습니다.  이후 00 00은 메소드의 끝을 의미합니다.

메소드는 a, b, c가 순서대로 왔으므로 d도 다음에 위치할 것이라 짐작할 수 있습니다.  그럼 d메소드의 위치는 0xCD0이 됩니다.


그 전에 우선 index부터 보겠습니다.  

메소드의 인덱스는 앞에서부터 순서대로 되어있습니다.  zFindeKey클래스 뿐만 아니라 이전 클래스의 메소드들을 보면 19, 1A...로 되어있고 zFindKey의 생성자는 위에서 보이는 것처럼 1B로 되어있습니다.  이를 통해 a메소드는 1C, b메소드는 1D라는 것을 알 수 있습니다.  실제 인덱스에 있는 값은 0x1이지만 생성한 가상메소드의 인덱스값을 1C로 하면 템플릿이 a메소드를 보여주는 것을 보고 a메소드의 인덱스가 1B라는 것을 확인할 수 있습니다.  그럼 d메소드는 1F가 됩니다.

다시 d메소드의 주소로 돌아가서, 다른 메소드들은 ubyte val[0]과 [1]의 두 자리수로 되어있는데 d메소드는 한자리입니다.  0xCD0을 넣어줘야하는데 마땅히 조절해 줄 수가 없습니다.  다른 메소드들을 보면 [1]에는 전부 25가 위치해 있고 [0]자리만 숫자가 다릅니다.  모두 0xC로 시작합니다... 찾은 d메소드는 0xCD0으로 다른 메소드들과 마찬가지로 0xC로 시작합니다.  이로써 [1]자리에는 25를 넣어줘야하는데 값을 보면 다른 메소드들의 19로 되어있습니다.  그리고 ubyte val자리에 D0을 넣어주는데 이 값을 넣으면 error가 표시되는걸 볼 수 있습니다.  상관말고 그냥 넣어줍니다.  

다시 classes.dex로 만들어 apk를 생성한 후 폰에서 설치해보려고 하면 설치가 안됩니다...  하지만 androlyze로 실행해보면 이전에 안 보이던 d메소드를 확인할 수 있습니다.


strings 명령어로 본 문자열 중 a498~이 있습니다.  이 메소드가 뭘하는건지 보겠습니다.  먼저 첫 while에서는 저 문자열을 두자리씩 끊어서 1바이트로 붙이고 v4에 넣고있습니다.  겉모양은 앞글자의 값을 16진수의 10진수값으로 바꾸고 4배하고 뒷글자와 더하는 모양입니다.  두번째 while에서는 첫 while에서 구한 값에 0xf0값과 xor연산을 해줍니다.  마지막 while은 이전에서 구한 배열의 각 인덱스에 대해 앞4비트와 뒤4비트의 값을 연결시켜 2자리수를 만들고 이 과정을 배열의 끝까지 해줍니다.

이렇게 나온 문자열은 5468~입니다.

이 값에는 a, f가 들어 있어 16진수라는걸 추측할 수 있습니다.  이 16진수 값을 아스키 문자로 변형합니다.  그럼 키를 얻을 수 있습니다.