앱 진단(Android)/Uncrackable 실습

[Uncrackable1] 정보 노출

보안개구리 2024. 6. 27. 13:59

 앱 접속 후 Enter the Secret String이라고 문자열을 입력할 수 있는 공간에 임의의 문자 입력 후 VERIFY 버튼 클릭 시  "That's not it. Try again."이라는 알림 창이 출력되는 것을 확인하였습니다.

 해당 문자열을 jadx에 검색하여 확인해보겠습니다.

 

"That's not it. Try again."이라는 문자열을 검색 후 해당 문자열 값이 존재하는. verify() 메서드를 확인해 보겠습니다. 

 

 verify() 메서드는 우리가 입력창에 입력한 문자열을 'obj'라는 변수에 저장 후 if 문에서 a.a() 메서드를 호출하여 'obj'를 전달합니다. 이 때 'true'값이 반환되면 'Success!"라는 알림창이, 'false'값이 반환되면 "Nope..."이라는 알림창이 출력됩니다.

 해당 반환값을 확인하기 위해서는 a.a()메서드를 확인해야 합니다. 

 

 'a' 메서드 확인 시 해당 메서드는 우리가 입력한 문자열을 'str'인자로 전달받고 있으며 return 값 확인 시 'str' 문자열과 'bArr' 변수의 문자열이 같은지 확인 후 같다면 'true'를 다르다면 'false'를 반환하고 있습니다.

 여기서 bArr 변수는 sg.vantagepoint.a.a.a() 메서드에 인자 2개를 전달 후 호출한 반환값으로 할당을 하는데 sg.vantagepoint.a.a.a() 메서드에 전달되는 인자값 중 하나는 b("8d127684cbc37c17616d806cf50473cc")입니다. 해당 값을 확인하기 위에 아래에 존재하는 b() 메서드를 확인해야 합니다.

 

 b() 메서드는 'str'이라는 인자값을 입력받고 'bArr' 값을 출력하는데 여기서 입력받는 값은 a() 메서드에서 전달된 '8d127684cbc37c17616d806cf50473cc라는 문자열입니다.

 b() 메서드를 통해 입력받은 문자열은 반복문을 통해 16진수 문자를 10진수로 변환하고 변화된 값을 4비트 왼쪽으로 시프트 하여 상위 4비트에 위치시킨 후 다음 16진수 문자를 10진수로 변환한 후 두 값을 더하는 과정을 거칩니다.

 

 해당 과정을 거치면 bArr 변수에는 141, 18, 118, 132, 203, 195, 124, 23, 97, 109, 128, 108, 245, 4, 115, 204 값들이 저장되며 반환됩니다. 그럼 a.a() 메서드에서는 b("8d127684cbc37c17616d806cf50473cc") 값인  [141, 18, 118, 132, 203, 195, 124, 23, 97, 109, 128, 108, 245, 4, 115, 204] Base64.decode("5UJiFctbmgbDoLXmpL12mkno8HT4Lv8dlat8FxR2GOc=", 0) 값인 [229, 66, 98, 21, 203, 91, 154, 6, 195, 160, 181, 230, 164, 189, 118, 154, 73, 232, 240, 116, 248, 46, 255, 29, 149, 171, 124, 23, 20, 118, 24, 231] 값이 sg.vantagepoint.a.a.a() 메서드로 전달됩니다.

 그러면 sg.vantagepoint.a.a.a() 메서드를 확인해 보겠습니다.

 

 해당 메서드는 바이트 배열 bArr과 bArr2를 인가값으로 받고 cipher.doFinal(bArr2) 값을 반환합니다. 여기서 cipher.doFinal(bArr2)는 bArr2의 값을 복호화한 결괏값을 말합니다.

 메서드를 순서대로 보면 입력받은 2개의 인자값을 AES 방식으로 복호화한 결과 I want to believe라는 메시지가 나오는 것을 확인하였습니다.

 

 마지막으로 Uncrackable1 앱으로 돌아가 해당 입력 란에 위에서 획득한 I want to believe라는 문자열을 입력해 보겠습니다. 입력 시 Success!라는 문자열이 출력되는 것을 확인하였습니다.