@ivRodriguezCAさんのiOS CTFを解いた
Twitterに流れてきた。テスト中の勉強の合間に解いた。
https://www.ivrodriguez.com/mobile-ctf
iOS App (.ipa
)を使ったCTF。5つFLAGがあるとのこと(2017/Dec/6現在)。
昔はiOS Appを作る側だったが、解析も面白い。
Xcodeの入ったmacOSがあるとラク。Linuxでできるかどうかはわからない。
Mach-Oとかは見ただけで敬遠してたけど、バイナリに慣れたせいかあんまりコワイ印象を持たなくなっていた。
以下 write-up 。
1つ目
Headbook.ipa
をunzipしたあと、Payload/Headbook.app/Info.plist
を見ると入ってる。
flag-EC840814-CEBA-4731-8620-CB991D850B14
2つ目
$ strings Payload/Headbook.app/Base.lproj/Main.storyboardc | grep flag
で出てくる。
Main.storyboardc
内のBYZ-38-t0r-view-8bC-Xf-vdC.nib
の中にテキストで入っている。
このnibはcompiled nibといって、xib(storyboard)のようにXcodeで直接編集することはできないし、右クリックしてもパッケージの中身を見ることができない。
compiled nibを展開してくれるeditnibというものを見つけたが、結局Xcodeで開くことはできなかった。
flag-5932744F-4810-4A6C-BD8F-66FF3E115ED6
3つ目
Payload/Headbook.app/Assets.car
の中身を見てみたい。
バイナリを読むかぎりflag@3x.png
という画像があるっぽいが...
$ file Assets.car Assets.car: Mac OS X bill of materials (BOM) file
ほう??
macOSに切り替えてXcodeからassetutil
でメタ情報を見た。
$ xcrun --sdk iphoneos assetutil --info Assets.car [ { "StorageVersion" : 14, ...(省略)... "Platform" : "ios" }, { "Compression" : "lzvn", "BitsPerSample" : 8, "LayoutDirection" : "0 - Horizontal", "AssetType" : "Image", "ColorModel" : "RGB", "Name" : "flag", "PixelWidth" : 328, "Graphics" : "GLES2,0", "Subtype" : 0, "PixelHeight" : 56, "SizeClass Horizontal" : "universal", "EdgeInsets" : "top:0 left:0 bottom:0 right:0", "Scale" : 3, "Memory" : "512MB", "Opaque" : false, "DisplayGamut" : "sRGB", "Idiom" : "universal", "Encoding" : "ARGB", "Image Type" : "kCoreThemeOnePartScale", "SizeClass Vertical" : "universal" } ]
flag
があるのは確実だとわかった。
いくつかツールを試すとpngを拾えた。が、.car
というのがどういうファイル形式なのかやっぱりよくわからない。
ツールの方ではCoreUI
を通して展開しているようだが...
https://github.com/Marxon13/iOS-Asset-Extractor
$ ./CARExtractor -i Assets.car -o output 2017-12-05 17:05:47.921 CARExtractor[9493:51744] flag_109x18_@3x.png -> IMAGE
output/flag_109x18_@3x.png
に書かれている。
flag-2F110A91-4BAC-4A18-A680-A6C2987CC2C4
4つ目
otool -ov Payload/Headbook.zip/Headbook
でMach-O形式のファイルで定義されているクラスなどを見ることができる。
$ otool -ov Headbook Headbook (architecture armv7): Contents of (__DATA,__objc_classlist) section 0000c198 0xc950 isa 0xc93c superclass 0x0 cache 0x0 vtable 0x0 data 0xc234 (struct class_ro_t *) flags 0x90 instanceStart 4 instanceSize 4 ivarLayout 0x0 name 0xa6cc LoginViewController baseMethods 0xc1e4 (struct method_list_t *) entsize 12 count 6 name 0xa755 flag types 0xb397 v8@0:4 imp 0x8419 name 0xa75a _BD570736 types 0xb397 v8@0:4 imp 0x841b name 0xa764 _D304 types 0xb397 v8@0:4 imp 0x841d name 0xa76a _400A types 0xb397 v8@0:4 imp 0x841f name 0xa770 _A6B7 types 0xb397 v8@0:4 imp 0x8421 name 0xa776 F61B02173428 types 0xb397 v8@0:4 imp 0x8423
flag
変数の初期値があるのかな??と迷っていたが、flagの形式(flag-xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx
)を思い出してname
の値をくっつければよいことに気づいた。
class-dumpでも同じことができる。見やすい。
$ class-dump Headbook (略) @interface LoginViewController : UIViewController { } - (void)F61B02173428; - (void)_A6B7; - (void)_400A; - (void)_D304; - (void)_BD570736; - (void)flag; @end
http://blog.dornea.nu/2014/10/29/howto-ios-apps-static-analysis/#a1b8dfa3dfb3d0fe8a97725deba497b9
iOS Appの解析の話がまとまってる。
ちなみにotool -tv Headbook
ではMach-Oに含まれるそれぞれのアーキテクチャでの逆アセンブルができる。
flag-BD570736-D304-400A-A6B7-F61B02173428
5つ目
これもMach-Oバイナリの中にある。今度はMachOViewerを使ってみる。
iOS アプリのバイナリを少しのぞいてみる
__cstring
, __cfstring
セクションに文字列が入ってそう(CFString
はNSString
と対応している)。
あった!
またはこんなことしなくても、4つ目と5つ目のflagはstrings
で読めたりする(アーキテクチャがarmv7とarm64の2つあるので2回同じのが出てくる)。
$ strings Headbook | grep -A 5 flag _BD570736 _D304 _400A _A6B7 F61B02173428 -- flag %@-%@-%@-%@-%@-%@ 9861DA53 C08C 47C4 84D6 -- flag _BD570736 _D304 _400A _A6B7 F61B02173428 -- flag %@-%@-%@-%@-%@-%@ 9861DA53 C08C 47C4 84D6
%@-%@-%@-%@-%@-%@
はNSString
で使うフォーマット文字列なので、これをシミュレータ上で実行すれば表示される...のかも(どうやって動かすんだろう?)。
flag-9861DA53-C08C-47C4-84D6-B48463AB738A
問題が更新されたら追記します。