iOS App Hacking


 가끔 앱해킹을 하다보면 특이한 환경 때문에(난독화 등) 사용자 일반 함수를 후킹해야 할 때가 있다.

 When I analysis app, need a hook at user function sometimes in an unusual environment(obfuscation, check jailbreak, etc).



 이럴때 Frida 를 이용해서 후킹이 가능하다. 

 In this case, frida can be used to hook.

 


 후킹은 일반적으로 함수 주소를 구해오는데, 사용자 함수는 심볼이 없으므로 offset 을 동적으로 구해와야 한다.

 Hooking is usually set to function address, the user function must obtain the offset dynamically because there are no symbols.



 결론 : 앱 실행 후 base 주소를 얻고, offset 을 더해준 주소에 후킹을 걸어주면 된다.

 conclusion: after running the app, obtain the base address and add the offset. then you can set a hook to the address.

 

var module_base = Module.findBaseAddress('testapp');  // get base addr
var custom3_5fdfd4 = module_base.add(0x5fdfd4);   // add function offset

 Interceptor.attach(custom3_5fdfd4, {   // set hook
    onEnter: function (args) {
        send("[S] !!!!!!!!!!!!!! custom3() called");  // before call
    },
    onLeave: function (retval) {
        //send("[W] custom3 ret: " + retval.toString() );  // after call
    }
});


 끝~

 the end~

'iOS App Hacking' 카테고리의 다른 글

ios app 복호화 - Clutch 2.x 버전  (0) 2017.02.14
iOS App Debugging - LLDB  (1) 2015.08.18
iOS App Runtime 조작  (0) 2015.08.17
ios app hacking - (1) ios app 의 구조  (0) 2014.02.03


오랫만에 ios 앱 해킹을 다시 하려다 보니 가물가물해서 간단히 다시 정리하기로 했다. 







복호화 - Clutch 

(https://github.com/KJCracks/Clutch/releases)




# wget  https://github.com/KJCracks/Clutch/releases/download/2.0.4/Clutch-2.0.4


# chmod 755 ./Clutch-2.0.4


# Clutch -i


Installed apps:

1:   *알리미 <com.*******.smartcaremgr>

2:   Find My iPhone <com.apple.mobileme.fmip1>

3:   Google Authenticator <com.google.Authenticator>

4:   Chrome - web browser by Google <com.google.chrome.ios>

5:   Hangouts <com.google.hangouts>

6:   Google Drive - free online storage <com.google.Drive>

7:   신한S뱅크 <com.shinhan.sbank>

8:   Google Sheets <com.google.Sheets>




# Clutch -b 1


ASLR slide: 0x3a000

Dumping <NotificationService> (armv7)

Patched cryptid (32bit segment)

ASLR slide: 0x8d000

Dumping <NotificationContent> (armv7)

Patched cryptid (32bit segment)

Writing new checksum

Writing new checksum

ASLR slide: 0x19000

Dumping <SMail> (armv7)

Patched cryptid (32bit segment)

Writing new checksum

Finished dumping com.shinhan.smartcaremgr to /var/tmp/clutch/59213352-****-4411-****-1A8D42C57BC5

Finished dumping com.shinhan.smartcaremgr in 2.6 seconds




Clutch 업데이트가 중단된걸로 알았었는데 2.0.4 버전이 작년에 나왔다. -i 로 목록을 본 후 -b 로 번호만 지정해주면 끝.

'iOS App Hacking' 카테고리의 다른 글

ios 앱 사용자 함수 hooking (using frida)  (2) 2017.08.16
iOS App Debugging - LLDB  (1) 2015.08.18
iOS App Runtime 조작  (0) 2015.08.17
ios app hacking - (1) ios app 의 구조  (0) 2014.02.03

iOS App Debugging - LLDB

2015. 8. 18. 14:55


LLDB 를 이용한 리모트 디버깅 간략 정리


출처 원문 : http://versprite.com/og/ios-reverse-engineering-part-one-configuring-lldb/


iOS 8.4 버전으로 넘어오면서 현재 GDB가 정상 동작하지 않는다.(직접 컴파일 해보진 않았다)


실행은 되지만 디버깅 시 뭔가 오류가 발생하며 제대로 동작하지 않으므로 대안으로 LLDB 를 사용할 수 있다.

(몇몇 고수들은 LLDB가 더 좋다는 사람도 있다)



        # hdiutil attach /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneOS.platform/

           DeviceSupport/8.0\\(12A365\)/DeveloperDiskImage.dmg


        # cp /Volumes/DeveloperDiskImage/usr/bin/debugserver /Users/hyunmini/

      

        # vi entitlements.plist


<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/ PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>com.apple.springboard.debugapplications</key> <true/>
    <key>run-unsigned-code</key>
    <true/>
    <key>get-task-allow</key>
    <true/>
    <key>task_for_pid-allow</key>
    <true/>
</dict>
</plist>



# codesign -s - --entitlements entitlements.plist -f debugserver


#  sftp  root@x.x.x.x  

#>  put debugserver

# exit


여기까지 debugserver 를 업로드 하는 과정이다. 이제 iOS 디바이스에서 디버그서버를 실행하고 대기 한 뒤 디버거로 붙으면 된다. 



=========================

# iOS 디바이스에서

=========================

# ps -ef | grep  [process name]      // pid 확인

# ./debugserer *:7777 --attach=[pid]     // debugserver 실행



=========================

# MAC 에서

=========================

(lldb) platform select remote-ios             // 디버깅 플랫폼 지정

(lldb) process connect connect://192.168.20.107:7777            // debugserver 에 접속



이제부터 디버깅을 시작하면 된다. 


(lldb) b objc_msgSend


(lldb) c


(lldb) register read




'iOS App Hacking' 카테고리의 다른 글

ios 앱 사용자 함수 hooking (using frida)  (2) 2017.08.16
ios app 복호화 - Clutch 2.x 버전  (0) 2017.02.14
iOS App Runtime 조작  (0) 2015.08.17
ios app hacking - (1) ios app 의 구조  (0) 2014.02.03

iOS App Runtime 조작

2015. 8. 17. 17:24


iOS 앱을 조작하는 방법에는 여러가지가 있다. 그중 cycript 를 이용한 방법에 대해 알아보자.


먼저 앱에 어떤 클래스가 있는지 어떤 메소드가 존재하는지 확인을 해야 수월한 분석이 가능하다. 하나씩 차분히 확인해 보도록 하자.




1. 클래스 분석


 바이너리 클래스 분석에는 여러가지 툴이 사용되나, 아래 세가지 정도가 주로 사용된다. 


 1) class-dump-z


 2) class-dump


 3) IDA Pro



  공통적으로 위 툴들을 사용하기 위해서는 바이너리 암호화를 먼저 풀어주어야 한다. 수동으로 복호화 할 수도 있지만 


  여기에선 clutch 를 이용한 자동 복호화를 알아 보자.  


  clutch 는 복호화 과정(메모리 덤프 - cryptid 조작)을 편리하게 자동으로 모두 해 준다.


iPhone:~ root# ./Clutch  

2015-08-17 16:16:10.789 Clutch[887:24896] checking localization cache

You're using a Clutch development build, checking for updates.. 

Your version of Clutch is up to date! 

Clutch 1.4.7 (git-2)

---------------------------------

is iOS 8 application listing method brah

is iOS 8 application listing method brah

DEBUG | Preferences.m:42 | preferences_location: /etc/clutch.conf

DEBUG | Preferences.m:43 | {

    RemoveMetadata = YES;

}

Daum maps HyundaiAppCard kbbank-ios kbminibank MiniSmartShinhan ShcTopsClub ShinhanCard SHRNDCard SHSmartPay YelloJihachul  


 옵션없이 실행하면 위와 같이 현재 설치된 앱들 목록이 출력된다. 해당 앱을 선택하면 간단히 크랙(복호화)된다. 


gimmanbog-ui-iPhone:~ root# ./Clutch ****bank


Clutch 1.4.7 (git-2)

---------------------------------

is iOS 8 application listing method brah

DEBUG | Preferences.m:42 | preferences_location: /etc/clutch.conf

DEBUG | Preferences.m:43 | {

    RemoveMetadata = YES;

}

DEBUG | main.m:609 | app to crack {

    ApplicationBasename = "kbminibank.app";

    ApplicationBundleID = "com.kbstar.minibank";

    ApplicationContainer = "/var/mobile/Containers/Bundle/Application/B8D46E0B-28D6-482F-8A23-C610A127DF90/";

    ApplicationDirectory = "kbminibank.app";

    ApplicationDisplayName = "\Uc2a4\Ud0c0\Ubc45\Ud0b9\Ubbf8\Ub2c8";

    ApplicationExecutableName = kbminibank;

    ApplicationName = kbminibank;

    ApplicationVersion = "1.0.5.1";

    MinimumOSVersion = "5.1.1";

    PlugIn = 0;

    RealUniqueID = "B8D46E0B-28D6-482F-8A23-C610A127DF90";

}

     

                                    ...(중략)...


DEBUG | Binary.m:1291 | 32-bit Region Size: 16384 5242880

DEBUG | Binary.m:1291 | 32-bit Region Size: 5242880 5242880

dumping binary: performing dump 

dumping binary: patched cryptid 

 [====================================================>] 100%

 dumping binary: writing new checksum 


                                     ...(중략)...


DEBUG | Cracker.m:326 | Saved cracked app info!

/User/Documents/Cracked/**뱅킹미니-v1.0.5.1-no-name-cracker-(Clutch-1.4.7).ipa

elapsed time: 7.26s 


Applications cracked:

 

****bank


Total success: 1   Total failed: 0  



2. Cycript 연결


 cycript 연결은 단순히 PID 값만 옵션으로 주면 된다.  ps -ef 를 이용하여 확인한 PID 를 넣어 주도록 하자.


# ps -ef


                ...  

    0   865     1   0   0:00.00 ??         0:00.03 /System/Library/PrivateFrameworks/CoreSymbolication.framework/c

    0   881     1   0   0:00.00 ??         0:00.28 sshd: root@ttys001 

  501   892     1   0   0:00.00 ??         0:00.97 /var/mobile/Containers/Bundle/Application/240AD9E1-8F55-4A99-9E

              ...  


immanbog-ui-iPhone:~ root# cycript -p 892

cy#


cy# UIApp.delegate

#"<RnDCardAppDelegate: 0x17e7ee70>"


cy# var m = [[MainViewController alloc ] init ]            // 변수 m 에 메인 뷰 할당

#"<MainViewController: 0x17df3530>"


cy# UIApp.keyWindow.rootViewController = m        // 현재 뷰를 강제로 메인 뷰로 바꿈

#"<MainViewController: 0x17df3530>"


 => 로그인 절차 등을 우회하여 메인 뷰 강제 이동 가능. 다만 로그인이 되지 않은 상태로 강제 이동이므로 사용에 제한이 있을 수 있음




cy# var m = [[LoginViewController alloc ] init ]        // 로그인 뷰 할당

#"<LoginViewController: 0x17db21b0>"


cy# UIApp.keyWindow.rootViewController = m     // 현재 뷰를 로그인 뷰로 바꿈 

#"<LoginViewController: 0x17db21b0>"


 => 루팅, 무결성 탐지창이 뜨고 화면이 멈춘 상태에서 cycript 를 이용하여 강제로 로그인 화면으로 전환


cy# app.keyWindow.recursiveDescription   // 관련 윈도우 등 출력


+ Recent posts