@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
問題が更新されたら追記します。