Linux Syscall manual page(https://man7.org/linux/man-pages/man2/syscall.2.html#NOTES)에 의하면 안드로이드(arm64)에서 syscall instruction은 svc #0이며, x8 레지스터에 전달되는 값에 따라 어떤 system call 인지가 결정됩니다.
예컨데, Linux syscall table arm64(https://chromium.googlesource.com/chromiumos/docs/%2B/master/constants/syscalls.md#arm64-64_bit )에 따르면 x8 == 56 이면 syscall openat, x8 == 48 이면 syscall faccessat, x8 == 63 이면 syscall read, x8 == 78이면 syscall readlinkat 입니다.
uncrackable level 4(r2pay CTF. https://github.com/OWASP/owasp-mstg/tree/master/Crackmes/Android/Level_04 )에 svc 루팅탐지 로직이 구현되어 있습니다.
아래 예시 사진에서 0x992A4 주소에서 x8 레지스터를 관찰하면, 어떤 syscall인지 확인 가능합니다.
x8 레지스터에 전달되는 값은 56이어서 syscall openat을 호출하고 있으며, x1 레지스터(arg1)에는 "/data/local/su", "/data/local/bin/su" 와 같은 루팅탐지 경로가 전달되고 있습니다.
iOS 의 경우에는 syscall instruction이 svc #80 이며 x16 레지스터에 전달되는 값에 따라 어떤 system call 인지가 결정됩니다. iOS의 svc 로직은 실제 앱에도 구현되어 탈옥을 탐지하는 경우가 있습니다. 하지만, 안드로이드의 경우에는 실제 앱에서 만나보지 못했습니다. 안드로이드에서는 구현이 안되는건가...추측만 하고 넘어갔었는데요, 이렇게 "uncrackable level 4(r2pay CTF)" 문제에서 만나게 되는군요.(문제 난이도가 상당합니다. 아직 제 레벨로는...ㅠㅠ)
실제 안드로이드 앱에도 svc 루팅탐지 로직을 얼마든지 구현 가능하다는 의미겠죠? 그렇다면 구현된 앱을 실무에서 마주친다면 상당히 당황스러울 것 같아서, 예방 차원에서 정리해봤습니다.
'Information Security > Android' 카테고리의 다른 글
frida-gum Integration Android (1) | 2022.08.06 |
---|---|
갤럭시 s10(SM-G973N) Android 12 루팅 (9) | 2022.05.21 |
Intent Sniffing (0) | 2022.03.14 |
Android Ptrace Bypass 전략 (2) | 2022.03.09 |
res\xml\locales_config.xml:3: error: unbound prefix (0) | 2022.03.05 |