Hack The Box: SeeTheSharpFlag
apk 파일을 디컴파일 해보면 흔히 보던 형식이 아닙니다. mono, xamarin 이라는 단어들이 보이며 많은 메서드들이 native로 구현되어 있습니다.
xamarin은 오픈소스 크로스플랫폼 모바일 개발 framework라고 하네요.(출처: https://docs.microsoft.com/ko-kr/xamarin/get-started/what-is-xamarin )
so 파일을 뒤져봐도 딱히 플래그에 대한 단서를 찾을 수 없었으나, "unknown/assemblies/" 디렉터리에 dll 파일들이 잔뜩 들어있습니다.
유니티 모노타입도 디컴파일 하게되면 dll 파일들을 볼 수 있습니다. 상당히 유사해서 찾아봤더니, Xamarin.Android의 경우 Mono 환경에서 실행된다고 합니다.(출처: https://docs.microsoft.com/ko-kr/xamarin/get-started/what-is-xamarin )
음...유니티의 경우 모노타입은 arm64를 지원하지 않아 플레이스토어에 올라갈 수가 없어서 모노 환경은 더 이상 만날 일이 없을 줄 알았는데, Xamarin에서 보게 되는군요.
의심가는 dll 파일들(SeeTheSharpFlag.Android.dll, SeeTheSharpFlag.dll) 이 보이는데, dnSpy에서 열리지가 않습니다.
dll파일을 hex 에디터로 열어보면 XALZ라는 파일 헤더를 가지고 있는데, https://www.x41-dsec.de/security/news/working/research/2020/09/22/xamarin-dll-decompression/ 에 의하면 2020년 5월 이후에 xamarin개발자들이 APK파일 사이즈를 줄이기 위해 LZ4 Compression을 도입하였고, 현재는 default로 활성화가 되어 있다고 합니다.
https://github.com/x41sec/tools/blob/master/Mobile/Xamarin/Xamarin_XALZ_decompress.py 에서 Xamarin decompress python 파일을 받을 수 있습니다.
Decompress를 진행하고 다시 dnSpy로 열어보면, SeeTheSharpFlag.MainPage.Button_Clicked 메서드에서 secret에 대한 단서를 찾을 수 있습니다.
사용자 입력값을 streamReader.ReadToEnd 메서드(암호화된 secret의 복호화된 값)과 비교하여 일치하면 "Congratz! You found the secret message" 출력, 불일치하면 "Sorry. Not correct password" 출력하고 있습니다.
모노타입도 프리다 후킹이 가능은 합니다만, 모노타입 모의해킹시 주로 쓰는 방식인 dll파일 변조를 통해서 플래그를 획득해보겠습니다.
dnSpy를 이용해서 틀린 secret을 입력해도 secret을 출력하도록 소스코드를 변조합니다.
해당 변조된 dll 파일을 포함하여 apk 파일 리패키징 및 설치 후 임의의 문자열을 입력하면 플래그 획득이 가능합니다.