做 iOS 安全測試之前你應該知道的工具 (一)

順便提一句,iOS的國內安全書我也是遍歷了一遍,簡直是shit,我只能遍歷國外的去了,國內的全部放棄。

前言

前言還是讓我吐槽爽一把吧。我已經碰見很多人上來就問我,用什麼工具啊,有沒有掃一下就出來的啊,我真的無力吐槽了。我只想說,那你們就不要學習了,也不要上學,更不要上班,就到處討討飯不是蠻好的么?多省力啊。專項已經不是那種用工具看一下,掃一下就能夠出現結果的了,安全就更不要說了。就一點,要結合產品的業務特性以及技術實現細節、架構等等才能夠分析出來的,不要指望工具,否則你就不要做測試了,做不長久的

idb

第一個來介紹的就是idb,idb可以說是我用過到現在最最友好的了,因為有GUI界面。不過安全貌似不是那麼的方便,大家自己去Google吧。我從來不認為小白就需要手把手。誰都是小白,就看誰會Google,就這句話。

首先我們需要在終端中輸入idb,只要安裝順利的話,大家會看到如下界面:

是不是覺得就很親民,我們通過usb或者ssh連接上之後就可以開始使用idb的功能了。(ssh默認密碼是alpine)我這裡由於之前測試的時候環境沒有了,所以我只能用之前的老圖了,大家見諒。首先來看下這個。

這裡拿點評作為案例,大家可以看到app在device中的基礎信息都是已經顯示了出來。當然這才是開始。

如下圖,我們會看到一個url header的list。這個意思我解釋一下,其實就是說現在應用中很多都是通過scheme喚起容器或者Activity的,又或者直接通過url打開某些web。那麼這裡就是說在這個應用中會調用到的url的header,比如dianping://xxxx這樣一類就是其中的調用。通過idb可以直接去mock這些url。如下圖:

再來看這個,類似於sandbox,從圖中我們也可以看出來ipa沙箱中的目錄結構以及每個文件中的數據結構,當然雙擊這些數據結構中的數據還是能夠看到detail的,大部分是不會加密的。包括欄位名字,長度等。這些信息也是能夠給予我們很大的幫助

Android可以反編譯,iOS也是一樣的。idb可以說集成了iOS反編譯的一些工具讓我們直接可以對ipa進行反編譯,不過這裡都是.h,並沒有.m,我估計應該是調用工具的關係,理論上都是可以反編譯的。

idb還能夠截圖,抓包等,簡直就是多功能一體機啊。我這裡就不多說了,大家自己去體會吧。

otool

好吧,我承認我low了,我以為這是一個要安裝的工具,沒有想到是mac自帶的。

官方描述

The otool command displays specified parts of object files orn libraries. If the -m option is not used the file arguments may be ofn the form libx.a(foo.o), to request information about only that objectn file and not the entire library. (Typically this argument must ben quoted, ``libx.a(foo.o), to get it past the shell.) Otool under-n stands both Mach-O (Mach object) files and universal file formats.n Otool can display the specified information in either its raw (numeric)n form (without the -v flag), or in a symbolic form using macro names ofn constants, etc. (with the -v or -V flag).n

輸入otool我們可以看到很多的參數,如下:

Usage: /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otool [-arch arch_type] [-fahlLDtdorSTMRIHGvVcXmqQjCP] [-mcpu=arg] [--version] <object file> ...n -f print the fat headersn -a print the archive headern -h print the mach headern -l print the load commandsn -L print shared libraries usedn -D print shared library id namen -t print the text section (disassemble with -v)n -p <routine name> start dissassemble from routine namen -s <segname> <sectname> print contents of sectionn -d print the data sectionn -o print the Objective-C segmentn -r print the relocation entriesn -S print the table of contents of a libraryn -T print the table of contents of a dynamic shared libraryn -M print the module table of a dynamic shared libraryn -R print the reference table of a dynamic shared libraryn -I print the indirect symbol tablen -H print the two-level hints tablen -G print the data in code tablen -v print verbosely (symbolically) when possiblen -V print disassembled operands symbolicallyn -c print argument strings of a core filen -X print no leading addresses or headersn -m dont use archive(member) syntaxn -B force Thumb disassembly (ARM objects only)n -q use llvms disassembler (the default)n -Q use otool(1)s disassemblern -mcpu=arg use `arg as the cpu for disassemblyn -j print opcode bytesn -P print the info plist section as stringsn -C print linker optimization hintsn --version print the version of /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/otooln

這裡不難看出,原來是xcode自帶的commond tool。首先我們來看下怎麼用,開始其實我並不知道這個命令後面到底跟的是什麼文件類型。然後otool一直提示需要提供object file,最後我才明白這個object file是個什麼東西,這裡以JD的ipa為例。

如果是debug簽名的.app那麼我們右鍵之後可以看到包的展開,但線上下來的.app默認是沒有這個選項的。我們需要先解壓縮之後看到如下的界面,這個.app是可以有包展開的。

展開之後我們可以看到很多文件,需要找到如下高亮的文件,這個文件就是otool可以識別的object file,這點大家要注意。

找到了這個可以執行的文件之後,我們就開始落地嘗試了。首先我們輸入

otool -L ~/Payload/JD4iPhone.app/JD4iPhone

這條命令可以讓我們知道這個ipa中引用了哪些庫並且是什麼版本的,結果如下:

/usr/lib/libstdc++.6.dylib (compatibility version 7.0.0, current version 104.2.0)n /System/Library/Frameworks/LocalAuthentication.framework/LocalAuthentication (compatibility version 1.0.0, current version 1.0.0)n /System/Library/Frameworks/CoreData.framework/CoreData (compatibility version 1.0.0, current version 519.15.0)n /System/Library/Frameworks/AdSupport.framework/AdSupport (compatibility version 1.0.0, current version 1.0.0)n /System/Library/Frameworks/Foundation.framework/Foundation (compatibility version 300.0.0, current version 1144.17.0)n /System/Library/Frameworks/CoreAudio.framework/CoreAudio (compatibility version 1.0.0, current version 1.0.0)n /usr/lib/libicucore.A.dylib (compatibility version 1.0.0, current version 53.1.0)n /System/Library/Frameworks/CoreTelephony.framework/CoreTelephony (compatibility version 1.0.0, current version 2651.0.0)n /System/Library/Frameworks/Accelerate.framework/Accelerate (compatibility version 1.0.0, current version 4.0.0)n /System/Library/Frameworks/CoreImage.framework/CoreImage (compatibility version 1.0.0, current version 4.0.0)n /System/Library/Frameworks/CoreMotion.framework/CoreMotion (compatibility version 1.0.0, current version 1756.0.20)n /System/Library/Frameworks/AssetsLibrary.framework/AssetsLibrary (compatibility version 1.0.0, current version 1.0.0)n /System/Library/Frameworks/AddressBookUI.framework/AddressBookUI (compatibility version 1.0.0, current version 33.0.0)n /System/Library/Frameworks/AddressBook.framework/AddressBook (compatibility version 1.0.0, current version 30.0.0)n /System/Library/Frameworks/CoreLocation.framework/CoreLocation (compatibility version 1.0.0, current version 1756.0.20)n /System/Library/Frameworks/MessageUI.framework/MessageUI (compatibility version 1.0.0, current version 1.0.0)n /usr/lib/libiconv.2.dylib (compatibility version 7.0.0, current version 7.0.0)n /System/Library/Frameworks/CoreText.framework/CoreText (compatibility version 1.0.0, current version 1.0.0)n /System/Library/Frameworks/ImageIO.framework/ImageIO (compatibility version 1.0.0, current version 1.0.0)n /System/Library/Frameworks/UIKit.framework/UIKit (compatibility version 1.0.0, current version 3347.44.0)n /System/Library/Frameworks/CoreGraphics.framework/CoreGraphics (compatibility version 64.0.0, current version 600.0.0)n /System/Library/Frameworks/QuartzCore.framework/QuartzCore (compatibility version 1.2.0, current version 1.11.0)n /usr/lib/libsqlite3.dylib (compatibility version 9.0.0, current version 169.2.0)n /System/Library/Frameworks/SystemConfiguration.framework/SystemConfiguration (compatibility version 1.0.0, current version 700.20.6)n /System/Library/Frameworks/CFNetwork.framework/CFNetwork (compatibility version 1.0.0, current version 711.3.18)n /usr/lib/libz.1.dylib (compatibility version 1.0.0, current version 1.2.5)n /usr/lib/libxml2.2.dylib (compatibility version 10.0.0, current version 10.9.0)n /System/Library/Frameworks/Security.framework/Security (compatibility version 1.0.0, current version 0.0.0)n /System/Library/Frameworks/MobileCoreServices.framework/MobileCoreServices (compatibility version 1.0.0, current version 66.0.0)n /System/Library/Frameworks/OpenGLES.framework/OpenGLES (compatibility version 1.0.0, current version 1.0.0)n /System/Library/Frameworks/AudioToolbox.framework/AudioToolbox (compatibility version 1.0.0, current version 492.0.0)n /System/Library/Frameworks/OpenAL.framework/OpenAL (compatibility version 1.0.0, current version 1.0.0)n /System/Library/Frameworks/AVFoundation.framework/AVFoundation (compatibility version 1.0.0, current version 2.0.0)n /System/Library/Frameworks/CoreMedia.framework/CoreMedia (compatibility version 1.0.0, current version 1.0.0)n /System/Library/Frameworks/CoreVideo.framework/CoreVideo (compatibility version 1.2.0, current version 1.8.0)n /System/Library/Frameworks/MapKit.framework/MapKit (compatibility version 1.0.0, current version 14.0.0)n /usr/lib/libobjc.A.dylib (compatibility version 1.0.0, current version 228.0.0)n /usr/lib/libSystem.B.dylib (compatibility version 1.0.0, current version 1214.5.1)n /System/Library/Frameworks/CoreFoundation.framework/CoreFoundation (compatibility version 150.0.0, current version 1144.17.0)n

當然,這些是不夠的,我們繼續來看一下這條命令。

otool -v -arch armv7 -s __TEXT __cstring ~/Payload/JD4iPhone.app/JD4iPhone > ipa_Str.txt

我們打開txt之後可以看到如下的內容:

0187be4a addNewAddressn0187be58 addressDefaultn0187be67 kShowPickSitesMapn0187be79 kPickViewWillApperNotifactionn0187be97 kPickViewWillDisapperNotifactionn0187beb8 kOrderPaymentTypeChangedNotificationn0187bedd OrderPickSieTypeChangedNotificationn0187bf01 kToOrderPickSieTypeVcNotificationn0187bf23 kSelectedPickSiteNotificationn0187bf41 PayAndShipmentTypeViewControllern0187bf62 DeliveryPayType_Confirmn0187bf7a complatePayAndShimentn0187bf90 OrderInfoViewControllern0187bfa8 pickSitesn0187bfb2 kUpdatePickSiteLocationn0187bfca paymentTypen

這其實是會將ipa中在代碼中hard code或者配置文件中的字元串都拉出來,一般有幾萬行,這裡的字元串其實就如同Android中我們查看logcat中有沒有敏感詞是一樣的,這裡我們也可以去看看在代碼中有沒有什麼私鑰或者其他的敏感信息。我們可以通過一些小技巧來做過濾,比如我們在sublime text中find的時候打開正則匹配,使用正則表達式之後可以簡單的找到一些符合我們規律的字元串


推薦閱讀:

如何使用MATLAB寫測試(1)初識unittests
某測試模擬器性能優化-選對你的庫
論文導讀 | DeepXplore:深度學習系統的自動化白盒測試
移動無線測試技能樹

TAG:APP测试 | 自动化测试 | 软件测试 |