01. UnCrackable App이란?
▶ OWASP MAS Crackme
- OWASP Mobile Application Security(MAS) 프로젝트에서 공식 배포하는 모바일 보안 실습용 앱
- 실제 앱에서 발견되는 보안 기법들을 의도적으로 구현해둔 취약점 실습 환경
- iOS / Android 각각 Level 1 ~ 3까지 제공하며 난이도가 올라갈수록 복잡한 보안 기법이 적용됨
▶ UnCrackable App for iOS Level 1
- 목표 : 앱 내부에 하드코딩된 시크릿 문자열을 찾아내는 것
- 앱 실행 시 탈옥 탐지(Jailbreak Detection) 로직이 동작해 탈옥 기기에서는 정상 실행이 차단됨
- 탈옥 탐지를 우회한 뒤 Frida를 활용해 시크릿 문자열을 추출하는 것이 최종 목표
02. 환경 준비
▶ .ipa 다운로드
iOS Crackmes - OWASP Mobile Application Security
iOS Crackmes iOS UnCrackable L1 A secret string is hidden somewhere in this binary. Find a way to extract it. The app will give you a hint when started. Download Installation Open the "Device" window in Xcode and drag the IPA file into the list below "Inst
mas.owasp.org
▶ 아이폰에 설치 (Sideloadly)
① Sideloadly 다운로드
Sideloadly - iOS, Apple Silicon & TV Sideloading
Sideloadly is a tool for sideloading apps on iOS, Apple Silicon Macs, and Apple TV without jailbreak. Free, no developer account needed.
sideloadly.io
② Apple ID 로그인

③ ipa 파일 드래그 → 아이폰 선택 → Start

+) guru meditation login failed 404 에러 해결
① iTunes 완전히 종료 → 작업 관리자에서 iTunes 프로세스 종료
② Win + R → %ProgramData% 입력 → Enter
③ Apple Computer → iTunes 폴더 진입
④ adi 폴더 찾아서 → 이름을 adi.bak 으로 변경 (또는 그냥 삭제)
⑤ Sideloadly 다시 실행→ Apple ID 입력 → Start
④ 아이폰 홈 화면에서 앱 설치 확인

⑤ 개발자 신뢰 설정 및 앱 실행
설정 → 일반 → VPN 및 기기 관리 → 개발자 앱 → Apple ID 선택 → 해당 계정 신뢰 설정 → 앱 재실행




03. 앱 분석하기
▶ 앱 실행 및 동작 확인
① 앱 실행 시 A Secret Is Found In The Hidden Label!이라는 문자열과 함께, 입력창과 Verfiy 버튼 출력

② 입력 창에 임의의 문자열 'aaa' 입력 후 Verify → 인증 실패 (Verification Failed)


⚠️ 입력 창에 입력할 Secret 값 찾기
▶ Frida로 분석하기
아이폰에서 Uncrackable1 앱 실행 → 앱 프로세스 이름 확인
frida-ps -U | findstr UnCrackable

방법 1) 뷰 계층 구조 확인하기
- iOS 앱의 UI는 계층 구조로 구성되어 있음
- UIWindow → UIViewController → UIView → UILabel, UITextField, UIButton 등으로 이루어짐
- 숨겨진 UI 요소(hidden label 등)도 뷰 계층에는 존재하기 때문에 Frida로 전체 뷰 목록을 조회하면 찾을 수 있음
[Apple iPhone::PID::1144 ]-> var windows = ObjC.classes.UIApplication.sharedApplication().windows()
[Apple iPhone::PID::1144 ]-> var window = windows.objectAtIndex_(0)
[Apple iPhone::PID::1144 ]-> console.log(window.recursiveDescription().toString())
<UIWindow: 0x157d0a170; frame = (0 0; 375 667); autoresize = W+H; gestureRecognizers = <NSArray: 0x2836c35a0>; layer = <UIWindowLayer: 0x2836c36c0>>
| <UIView: 0x157e0d470; frame = (0 0; 375 667); autoresize = W+H; layer = <CALayer: 0x2838d6d60>>
| | <UILabel: 0x157d0d260; frame = (0 40; 81.5 20.5); text = 'i am groot!'; hidden = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x281bc66c0>>
| | <UILabel: 0x157d0c840; frame = (0 110.5; 375 20.5); text = 'A Secret Is Found In The ...'; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x281bc6990>>
| | <UITextField: 0x158023400; frame = (8 141; 359 34); opaque = NO; autoresize = RM+BM; gestureRecognizers = <NSArray: 0x2836cfe40>; borderStyle = RoundedRect; background = <_UITextFieldSystemBackgroundProvider: 0x2838d4360: backgroundView=<_UITextFieldRoundedRectBackgroundViewNeue: 0x157e0d0d0; frame = (0 0; 359 34); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x2838d77e0>>, fillColor=(null), textfield=<UITextField 0x158023400>>; layer = <CALayer: 0x2838cf5e0>>
| | | <_UITextFieldRoundedRectBackgroundViewNeue: 0x157e0d0d0; frame = (0 0; 359 34); opaque = NO; autoresize = W+H; userInteractionEnabled = NO; layer = <CALayer: 0x2838d77e0>>
| | | <_UITextLayoutCanvasView: 0x157e0ca50; frame = (7 2; 345 30); userInteractionEnabled = NO; layer = <CALayer: 0x2838c3700>>
| | | | <_UITextLayoutFragmentView: 0x157e19210; frame = (0 19.5; 0 1); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x2838dda00>>
| | <UIButton: 0x157d08680; frame = (8 195; 359 30); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x2838ce960>>
| | | <UIButtonLabel: 0x157e18420; frame = (159.5 6; 40 18); text = 'Verify'; opaque = NO; userInteractionEnabled = NO; layer = <_UILabelLayer: 0x281bceb20>>
| | <_UILayoutGuide: 0x157e0d5e0; frame = (0 0; 0 20); hidden = YES; layer = <CALayer: 0x2838d5be0>>
| | <_UILayoutGuide: 0x157e0d770; frame = (0 667; 0 0); hidden = YES; layer = <CALayer: 0x2838d0160>>
방법 2) UI Label 텍스트 추출
- iOS에서 텍스트를 화면에 표시하는 UI 컴포넌트를 UILabel이라고 함
- hidden = true 로 설정된 UILabel은 화면에 보이지 않지만 메모리에는 존재함
- Frida의 ObjC.chooseSync 를 이용하면 현재 메모리에 올라와 있는 모든 UILabel 인스턴스를 조회할 수 있음
- 각 UILabel의 text() 값을 출력하면 숨겨진 라벨의 텍스트도 확인 가능
[Apple iPhone::PID::1144 ]-> var views = ObjC.chooseSync(ObjC.classes.UILabel); views.forEach(function(v){ try { console.log(v.text().toString()); } catc
h(e) {} })
Verify
A Secret Is Found In The Hidden Label!
i am groot!
정답 확인

'study > mobile' 카테고리의 다른 글
| [Mobile] SSL Pinning (0) | 2026.05.11 |
|---|---|
| [Mobile] iOS 탈옥 : 앱 진단 환경 세팅 (0) | 2026.05.11 |
| [Mobile] iOS 탈옥 : Palera1n (0) | 2026.05.07 |
| [Mobile] MASTG-KNOW-0001 : Biometric Authentication (0) | 2026.04.30 |
| [Mobile] Android APK 정적 분석 : 실습 환경 세팅 (0) | 2026.04.28 |