본문 바로가기
study/mobile

[Mobile] iOS Crackme : Uncrackable L1

by 림나 2026. 5. 12.

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

앱 종료 시 PID 변경됨

 

방법 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!

 

더보기

정답 확인