更新日時で差をつけろ

もはや更新日時でしか差を付けられない

@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/HeadbookMach-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セクションに文字列が入ってそう(CFStringNSStringと対応している)。

あった!

またはこんなことしなくても、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

問題が更新されたら追記します。