アメリカ day 5

またしても4時に目が覚めた。しんどい
偶然同じ学科に日本人でPh.Dの人がいて、詳しく話を聞かせてもらった。とにかく水分補給をこまめにした方が良いと言われた。聞くところによると夏のやばい日は50℃くらいまで上がるらしい。地獄か?

ハンバーガーをお昼ご飯に選んでしまった。 f:id:icchyr:20180408162135j:plain ここに来てからハンバーガーとピザ以外のものを口にしていない気がするのでそろそろなんとかしたい。あとポテトの塩がめちゃくちゃ多くてしょっぱい。
こんな食事をしているのと不自然な生活リズムが合わさって、一日一食というという日が数日発生している。健康にも良くないし早く自炊をベースとした生活に切り替えたい。

先にあげたPh.Dの方のおかげで家問題が解決しそうである。家探しは基本的に自分で契約するか又貸し (subleaseという) する人を探すしかなくて、前者は十分な収入が求められたり契約期間が1年からと決まっていたりして海外から来たばかりの人には難しい。後者も同様にあまり素性の知れない、安定した身分を持っていない人には基本貸さないらしく、知り合い経由などで頼むのが無難とのこと。
そのPh.Dの方の知り合いにちょうど空きがある家を持ってる人がいたので、家主にコンタクトを取ったところ幸運にもすぐにOKが出た。とても感謝している。

アメリカ day 4

夜の10時過ぎに目が覚めた結果、結局朝方まで眠れなくて昼過ぎに起きた。
入国してからずっと休日がなかったので、昨日もらった研究テーマ一覧を眺めながら1日休むことにした。

そろそろ自炊がしたいけど安定した宿が得られるまでは我慢かなあ、外食で所持金が尽きないことを願う。

アメリカ day 3

朝4時くらいに目が覚めた。少しずつ体が慣れていってるのがわかる。
流石に朝食をとりたいので、9時過ぎくらいに宿を出て大学周辺を散策していた。これは歩いてみてわかったことだが、土地が異様に広いので複数の場所を行ったり来たりするだけでかなり疲れる。最終的にChick-fil-Aというハンバーガーショップみたいなところに入ることにした。

f:id:icchyr:20180406160950j:plain

写真にあるハンバーガーとフライドポテトに加え、ドリンクがついて$6.86である。日本円にすると約737円 (4/5時点) で、決して安くはない。
朝食を済ませた後に銀行口座の開設をした。現時点ではSSNが無かったが、パスポートのみで手続きを済ませることができた。たまたま研究室がある建物のすぐ隣にBoA (Bank of America) があって、開設手続きはその場で全て済み、一時的に使えるキャッシュカード (記名無し) を受け取った。やはりカード決済が主流だからかデビットカードの機能が標準でついており、とりあえず有り金をすべて入れるとすぐ店で使えた。レジで現金 (とくに硬貨) を数えるのに毎回手間取っていたのでこういう手軽さは非常にありがたい。
その後は研究室のミーティングに参加し、軽い自己紹介とこれから取り組むテーマの一覧を見させてもらった。正直なところ発音が早過ぎて7, 8割程度しか聞き取れなかったが、いずれのテーマもセキュリティに関連した面白いアイデアで、アカデミックというよりかはハッカー的な、いわゆる純粋に面白さを追求しているものが多いように感じた。

ミーティングのあとは研究室の人に連れられてピザ屋に入った。このピザ屋ではなんとオーダーメイドのピザを作ることができる。ソースや具材を適当に選んで、最終的にできたのがこちら

f:id:icchyr:20180406163216j:plain

なんとこれは一人分である。直径が30cmくらいで、当然全て食べきれなかったので箱に入れて持ち帰った。ちなみに午後5時まで有効なクーポンを使うとこれにフリードリンクがついて$5、流石にこれは結構安いと思う。(もっとも、今回は研究室の人にご馳走になったわけだが)
その後はASUのCTFチームであるpwndevilsのミーティングに出席した。つい先日の0CTFの問題を復習していたので、ezDoorの解法をシェアしたところ好評だった。
いろいろがあってだいぶ疲れてたため、19時くらいに宿に着いたらすぐ眠ってしまった。そして案の定22時過ぎに目が覚めて今に至る。生活リズムの修正にはもうしばらくかかりそうである。

アメリカ day 2

夜10時に寝たにも関わらず12時過ぎに目が覚めて、6時まで全く眠れなかった。多分時差のせいだと思う。その結果今日は15時前に起きてから大学に向かい、HR関連の手続きの準備を進めた。 昨日車道のスケールがデカいという話をしたが、実際に歩いてみるとより身体に響いた。宿から大学が近いから良いものの、少し遠いところまで行くとなると車が欲しい。あとクソ暑い。
あらゆる店でほとんどの人がカード決済をしていて、現金は持たないのが普通らしい。正直硬貨の計算ですらおぼつかないので早くやめたい。
研究室の人に食事に連れて行ってもらった。店は"Hawaiian Barbeque"とのことだったが、僕が食べたのは"TERIYAKI & KAL BI"である。もちろんお米もついていてアメリカ感が全くない。

f:id:icchyr:20180405131602j:plain

明日はミーティングがあるらしいので、今日は普通の時間に寝られることを願っている。

アメリカ day 0, 1

来週の月曜日からアメリカのアリゾナ州にあるASUというところで、ShellphishのYan先生 (a.k.a zardus) の下で9月末まで研究インターンをする予定で、本日現地入りしたので備忘録程度に日記を書こうと思う。
なお日記の類は長続きした試しがないので途中でやめるかもしれない。

day0

羽田 → ロサンゼルス → フェニックス という経路で飛行機に乗った。ちょうどCODEGATE finalsに向かうTokyoWesternsのメンバーがほぼ同じくらいの便で、羽田空港で合流して適当に喋ってた。

航空券はなるべく安く済ませたくて、往復の最安値は10万くらいだったのだが中国南方航空で流石にやめた。次点が14万くらいであまり良い噂を聞かないアメリカン航空だったが、結構快適だったと思う。
SIMはあらかじめ日本で購入したKDDI mobile x H2O Wirelessを契約しておいたので、アメリカに着くとすぐに使えて便利だった。

これは余談だが、クレジットカードの枠が数千円足りなくて航空券が一度キャンセルされかけた。「24時間以内に対処しなければキャンセルされます」というメールが飛んで来て、慌てて繰り上げ返済をした後に電話するとセキュリティコードと日付を口頭で伝える羽目になってちょっとアレだった。

day1

空港からUberを使おうとしたのだけれど、現金に対応してなくてクレカの登録を隅っこでやる羽目になった。あまりこういう情報を外で入力したくない。
宿探しに難航している。最初は銀行口座もSSN (社会保障番号) もないのでcraigslistでコンタクトをとっても返信すらしてもらえず、とりあえずAirbnbで約2週間分予約した。なおチェックインする日付を1日間違えていて、初手ホームレスになりかけたけど運良く前日も空いていたので予約を変更した。急なチェックインのため18時まで待ってくれと言われたので、とりあえずzardusに連絡を取って、軽く大学を案内してもらった。とにかくスケールがデカくて、大学じゃなくて街にすら見える。
スケールがデカいのは大学だけじゃなくて、普通の車道も同様である。
とりあえず適当に食事などを済ませて、今日は早めに寝ようと思う。

今年1年を振り返る

今年もいよいよ終わりということで,なんとなく一年を振り返ってみようと思う.
心なしか2017年は過去と比べて特に動きが多かった一年のように感じていて,今の心境を備忘録的に残しておきたいといった,いわばポエムである.一部を除いて技術的なことはあまり書いていない.あと実際に見てもらえばわかると思うが,大半はCTFチームでの活動*1に関する話である.

1月

なんといきなりとある病院のベッドの上から僕の2017年は始まる.実をいうと2016年の12/23に自然気胸を発症し,その日のうちから入院していた. 気胸というのは肺に穴が空き,そこから空気が漏れ出して肺がしぼんでしまう状態のことをいう.僕の場合は自然気胸というもので,詳しい原因は未だに不明である.
一説によるとやせ型の人は気胸になりやすいらしいが,これはあくまでも推測である.自然気胸はやせ型で若年男性に多いことから「イケメン病」とも呼ばれるらしいが僕はイケメンではない.
気胸の治療には主にドレーンという医療器具を胸に刺して行う.このドレーンは肺に溜まった空気を体外に排出するためのものであり,胸腔内の気圧を一定に保つことで肺を膨らませ,自然治癒による穴の修復を試みる.しかしこの治療方法では治療が完全でないことが多く,再発率も高い.もっとも,僕はドレーンによる治療では治らなかったので,外科医による胸腔鏡下手術で肺の穴を塞いだ.

入院したのも手術を受けたのも人生初だし,何よりも卒論の締め切りが一ヶ月後に迫っていたため慌ただしい毎日だった.事情を説明して病院側にPCの持ち込みを許可してもらえたこともあり,無事に卒論を完成させることができた.と思う.
あと入院中にお見舞いに来てくれた人が結構いた.精神的に割と参っていたため,彼らには今でも感謝している.

2月

卒論の発表を無事に終えて,まあ卒業できるだろうということで一安心する.
しばらく離れていたCTFを再開する.Codegate 2017 prequalsは15位で本戦へ進めず,Boston Key Party CTF 2017は9位だった.そういえば一度も韓国行ったことがないので来年はなんとか予選通過したい.

CPUエミュレータUnicornを使ったWindows APIトレーサを書いた.ついでにPEのパーサも作った.

icchy.hatenablog.jp

これを公開した後にとあるセキュリティ企業の人から声をかけて頂き,一緒に食事に行くことになった.意外なところで意外な人が見ているものだなあと実感した.

3月

以前運営として関わっていたICTSCに大学のサークルからなるチームで競技者として参加,初出場チームの中で1位だったらしく新人賞をもらった.ネットワーク機器を触ったことのあるメンバーがほぼいなくてしんどかった.あとさくらインターネットのチームがありえないほど強くて,スコアボードから見えなくするChrome extensionを書いたりした.

github.com

0CTF 2017 Qualsは18位だった.去年決勝まで行ったのでまた行きたかったのだが一歩及ばず.あと少しで解けたXSS問を通せていれば予選通過だったぽくてつらい.多分この問題のおかげで<link rel=import href=>は今でも忘れていない. あと卒業式があった.ほとんどの同期は同じ院に進むから来年度以降も会うのだが,やはり大学の卒業式というのは重要な節目で,学部を卒業したんだなあという実感があった.

4月

新年度も始まり修士としての生活がスタートする.とは言うものの学部4年生の時とほとんど変わらず,研究は適当に進めてあとは適当に授業に出るだけ.

CTFの方はASIS CTF 2017 Qualsで3位,PlaidCTF 2017は20位と振るわず,DEF CON CTF Qualifier 2017は15位と予選通過は叶わなかったが,binjaに勝利し日本の中では1位だった.IDA Decompilerは偉大.
また初の試みとして,April Fools' GTF 2017を企画して開催した.その名前の通りジョークCTFであり,全てがエスパーやジョーク問などで構成されている.準備期間は多分数日くらいで,皮肉にも作問メンバーはその大半が数時間やそこらのレベルで問題を生成していた.Tokyo Westerns CTF(後述)もこうだったら良かったのに.あと思いの外参加者が多くて,海外のプレイヤーもこういうノリは好きなんだなあと思った.

5月

ICTSCの合宿で伊東に行った.前回運営に参加した時から2回も空いていたので大半の運営は初めて会う人だった.「今回は特にやることがないな〜」と思っていたらICTSC運営が開発している自作クラウドn0stackのチームにjoinすることになった. github.com

中国のQihoo 360という企業から突然「あなたはWCTFの参加チームに選ばれました.6月末に北京で開催するから来てね」といった明らかにスパムじみたメールが届く.しかし色々調べているとどうやら去年も世界の強豪チームが参加していたちゃんとしたCTFであるということがわかる.普通のCTFとは異なり,各チームが問題を持ち寄ってお互いの問題を解き,最後に自分のチームが作った問題のプレゼンをしてそれらの合計点数を競い合う形式の大会*2だった.賞金の合計はなんと約1000万円.チームで問題を作ることに.うちのチームは7dcsとBackpacker's Cipher -hard mode-を作成し,僕は7dcsのバックエンドを主に実装していた.
CTFはPHDays VII CTF,FAUST CTF 2017でどちらも珍しくAttack & Defense形式のもので,参加チームもそれほど多くなかったためかそれぞれ3位,8位だった.FAUSTの方はFirst Blood*3を取れたらしく,少額だが賞金が降ってきた.

IPSJのOS研究会に参加し,沖縄で発表をしてきた.雨が降っていてプールや海で泳げなかったのが残念だった.
binjaのpotetisenseiと新しく日本のCTFを立ち上げよう,ということでCBCTFが発足する.11月に開催される日本発の情報セキュリティ国際会議CODEBLUEにて,binjaとTokyoWesternsでCTFを開催することに.

codeblue.jp

6月

Google Capture The Flag 2017 (Quals)に参加.今年はFinalsをやるらしく,8位で無事予選通過.これは終了後にわかったことだが,決勝戦の場所はこの時点では決まっておらず,参加チームにアンケートを取っていた.Googleのオフィスがある国がいくつか提示され,その中から選んだ.うちのチームはスイスを選び,アンケートの結果もスイスに決まった.
Trend Micro CTF 2017 - Raimund Genes Cup - Online Qualifier (長い) に参加.通称Trend Micro CTF.現状では唯一の日本企業が開催するCTFである.なんとか10位で予選通過.OSINTがしんどかった.

5月に招待メールがきたWCTF 2017に参加するため北京へ.幸運にも2位を取ることができ,賞金30000$ゲット.ちなみに7dcsはPPCパートすら解かれなかった.

7月

投票を経てTokyoWesternsの正式なリーダーになる.とはいえ今までまとめ役っぽいことをしていたので特に変わったことはない.
Tokyo Westerns CTF 3rd 2017 (通称TWCTF) とICTSC8に向けて忙しく動き始める.

ICTSC8では中国の金盾を模した問題を作った.初めてLinuxのLKM (Loadble Kernel Module) を書いたためデバッグが非常にしんどかった. icttoracon.net

ACM-ICPCの国内予選に参加する.かなり上手くいって,全体5位,大学別2位*4という過去最高の結果に終わる.詳しいことは以前書いた記事を参照して欲しい.

icchy.hatenablog.jp

なおこの成果により海外のアジア地区大会へ参加する際の補助金が出る.紆余曲折を経てタイのナコーンパトム大会へ参加することになった.

8月

9月初めに迫ったTWCTFの作問が燃え始める.やはりみんな忙しい中時間を割くのはなかなかに難しい. ICTSC8のホットステージが始まる.家からだとやはり六本木のCiscoは遠い.作業はまあまあ順調で,途中多少のトラブルはあったもののタスクを適当につぶしていく.本番は電通大なので家が近くて助かる.ちなみに本番は電源が足りなくてインフラが止まったりした.今となってはいい思い出である.

icttoracon.net

NRI Secureが主催するSANS Netwars Tournamentに参加する.チーム戦とは聞いていたがまさかの大学ベースでまとめられていたので結局MCCとして出場.普段CTFチームとして組んでいる電通大MMAの主戦力からなるチームに負けて2位.

9月

Tokyo Westerns 3rd 2017を開催する.全世界から901チームが参加し,CTFTimeにおける評価は80.08を獲得.

久しぶりにCTFに参加する.ASIS CTF Finals 2017は5位で残念ながら賞金獲得ならず*5,EKOPARTY CTF 2017は2位で200$獲得.

CODEBLUE CTF 2017に向けて動き始める.問題はもちろんインフラやスコアサーバーや諸々の調整などをbinjaと協力して進めていく.正式にCODEBLUE CTF 2017をアナウンスする.CODE BLUE CTF 2017

NTTセキュアプラットフォーム研究所でインターンをさせてもらう.業務として研究を行なっている企業での仕事は初めてだったが,非常に有意義な時間を過ごせた.詳しいことは書けないが,ある技術についての調査を一から行い,それが研究に応用できるかの検討などをしていた.

10月

情報科学若手の会に参加する.自分の研究やCTFの話などについて発表した. wakate.org

突然アナウンスされたKaspersky Industrial CTF Quals 2017に参加.なんと3位で予選を通過してしまい,また北京にいくことに.なんと日程が急で,予選からわずか2週間程度で決勝を迎える.毎年行われているGeekPwnというイベントの中で決勝戦を行い,産業系システムを模した装置に対して侵入できたら勝ちというタイプの問題だった.気づいたら2位になっており,副賞としてDJI製のドローンをもらった.ちなみにこのイベントで韓国のCykorの人と初めて話した.
北京から戻って来たら次はGoogle Capture The Flag 2017 (Finals)に参加するためスイスへ.帰りにフランスを観光するためパリを経由地にして乗り継いだ.問題は結構面白いものが多く,南京錠をピッキングツールで開けるものもあった.結果は5位で入賞はならなかったが,Googleのオフィスツアーなどが企画されており,イベントとしてもかなり楽しめた.

11月

月初めにHITCON CTF 2017 Qualsに参加し,3位で無事予選通過.
6月に参加したTrend Micro CTFの決勝戦に参加.僕からのコメントは特にないが,参考情報としてチームメンバーが書いた記事を貼っておく. hama.hatenadiary.jp

Trend Micro CTFの決勝は新宿で行われていたが,それが終わるとそのまま西新宿のCODEBLUE CTFの運営会場に移動.CODEBLUE CTFの準備が大詰めを迎える.オンサイトで参加するチームを事前に募集したのだが,いざ蓋を開けてみるとドタキャンするチームが大量に発生した.仕方ないので余った席を飛び入り枠として解放することにしたら,たまたまCODEBLUEに参加していた台湾の217のメンバーが数人いたため飛び入り参加することに.事前募集の段階で確定していたチームのうち普段からCTFに参加しているチームはCykorのみだったので,これはオンサイト優勝チームは確定かな…と思っていたのだが217の参加によってなかなか盛り上がった.

12月

TwitterSh1n0g1さんにお声がけ頂き,濱せっくで登壇することに. hamasec.connpass.com

少し話題になっているXXE攻撃の少し発展的な攻撃方法について発表した. docs.google.com これは以前参加したASIS CTF 2017 QualsのInternal attackという問題をベースにしているが,実際に使われた攻撃でもあるらしい.

IPSJのOS研究会ComSys2017で発表し,併設イベントであるBitVisor Summit 2017でも発表してきた.自分が取り組んでいる研究においてBitVisorを使っており,その過程で得られた知見などをまとめた.

www.slideshare.net

ComSysの3日目はあのBash on Ubuntu on macOSの凱旋発表があったのだが,残念ながら参加できず.HITCON CTF 2017 Finalに参加するため台湾へ.

HITCON CTF 2017 Final参加記

この記事はCTF Advent Calendar 201711日目の記事です.3週間の遅刻になります.

今年のHITCONはCapture the Foodという面白いテーマがあって,なんと問題を解くとフラグと同時に食事が得られる.裏を返せばフラグを取らないと食事が得られないということである.   もちろん菓子類や飲み物は既に提供されているため,人間的な食事を望まなければ空腹を満たすことはできる.ちなみに問題を解くことで得られる食事は全て台湾名物である.以下に軽く紹介する.

  • 珍珠奶茶 (タピオカミルクティー)

    • タピオカが入ったミルクティー.タピオカのサイズがとても大きく歯ごたえがあった. f:id:icchyr:20171211234255j:plain
  • 魯肉飯 (そぼろご飯)

    • ご飯の上に味付けしたそぼろが乗ったもの. f:id:icchyr:20171211233958j:plain
  • 牛肉麺 (牛肉麺)

今回はAttack & Defense形式であることには変わりないが,パッチをバイナリ形式で適用し,他のチームがあてたパッチをダウンロードすることができるようになっていた.おそらくDEFCONと同じ形式だと思う. この形式だと今回はWeb問題は無いのかな…?と思っていたが,実際にはopenresty+lua+nsjailでC言語製の標準入力を受け取るパッチを書き,それをパッチサービス側でコンパイルしてもらって適用するという形式だった.そのため自前でHTTPのリクエストパーサを書く必要があり,かなり苦労した.

問題の構成はWeb1問 (2種類のアプリケーションを含む), Pwnable4問の計5問.今回は去年と異なり,それぞれの問題はリリース後は最後まで動き続けていた.

問題 ジャンル 概要
mimiku (warmup) web pingをコマンドから打つことができるだけのサービス
mimiku (messup) web ファイルをアップロードしたり上書きしたりすることのできるサービス
rcgi pwnable Rust製のHTTPサーバ
seccomp-tools pwnable seccomp filter
food_store pwnable heap問
alchemy pwnable

僕がメインで取り組んでいたのはmimikuの攻撃部分.2日目は防御部分のパッチを書いていた.上にも書いたが,パッチに渡ってくる入力はHTTP header+bodyである.これに加えてWebアプリケーション側はGET, POST両方の形式でリクエストを受け付けたりするのでリクエスト先のURIまでしっかり見る必要がある.
実際に書いたことがある人ならわかると思うが,C言語でHTTP Requestのパーサを書くのはそれほど難しくない.しかしヘッダの内容によってBody部分の処理を変えるとなると話は別である.なぜかというとそれはHTTPの範囲を超えて対応する必要があり,例えばContent-Typeでapplication/jsonが指定されていたらBody部分のデータをJSONとして解析しなければならない.今回の問題ではPHPのSlimを使っていたので当然APIJSONを受け付ける.これに加えてWAFのソースコードには8KBというサイズ制限があり,とてもではないがまともに解析するパッチを書くことはできない.というわけで正確なvalidationは諦めて,攻撃が刺さりそうなリクエストのみをブロックできそうなWAFを書こうとした.もちろん最後まで攻撃は防げなかった.

最初のwarmupはpingを打つことができるだけのサービスで,OSコマンドインジェクションの脆弱性があった.これを防ぐのはそこまで難しくなくて,単純に入力に含まれている文字を検証すれば良いだけである.最終的にはblacklist形式のvalidationに落ち着いた.ちなみにTokyoWesternsはnomeaningさんがいち早く自動化するスクリプトを書いたため,mimikuでなんとFirst Bloodを取ることができた. しばらくするとESPRがリクエストを分割してWAFを回避する攻撃を完成させ,多くのチームが一斉にフラグを取られた.これを防ぐのもそこまで難しくなくて,リクエストサイズをきちんと検証すれば良い.   ところがmessupが公開されると上述した問題に直面し,どのチームも完全にパッチを当てることができずに最後まで攻撃の打ち合いになった.

バイナリパッチ形式のWAFなので他のチームのバイナリをコピーする機能が与えられており,例えばバックドアをこっそり忍ばせておくこともできる.これはおそらくDEFCONの形式と同じだと思うが,Web問に適用できるよううまく構成されており,Orangeはとても良い問題を作ったなあと思った.

結果は6位とそこそこなものになってしまったが,個人的にはかなり面白い競技形式だった.WebのA&Dにおける一つのデファクトスタンダードに成りうると思う.

ちなみに帰りに空港で中学高校時代の部活の先輩と久しぶりに再会して,雑に忘年会やるぞという話をした.

話は戻って12月の振り返りへ.

ACM-ICPCのアジア地区予選つくば大会へ参加するも,34位と振るわず.不安の中アジア地区ナコーンパトム大会へ参加するためタイへ向かう.
なんと結果は8位.World Finalsに進めない順位ではあるものの,入賞して3000baht獲得した.ちなみにこの大会で僕はかなり良いパフォーマンスが出せていて,実装はしていないがI問題のFA*6を取ることができた.あとはH問題の方針を考え直してACした.
大会後は以前うちの大学にきていた留学生と再会することができて,バンコクを案内してもらったりした.タイは物価が安くて良いなあと思った.

タイから戻ると高校時代の部活の先輩達と忘年会をやって,久しぶりに同級生にも会った.やたら「背が大きくなった」だの「声が低くなった」だの言われて,自分の成長の遅さを実感した.

最後の締めくくりには34C3 CTFに参加した.なんかめちゃくちゃ難しい問題セットで,Web問に置いては全ての問題の解答チーム数が10チームを超えなかった.なお結果は7位とまあまあ良い成績だったが,特に決勝があるわけではない.

まとめ

今年はとにかく色々なことがあった.入院から始まりCTFで賞金を取ったり,初めてヨーロッパ圏に行ったり,最後のICPCで海外遠征して入賞できたり,いきなり高校時代の人たちと再会したり.
特にTokyoWesternsとしてはWCTFでの成果をはじめとした大躍進の年だった.来年こそはDEFCON行きたい.

最後までお読み頂きありがとうございました.それではみなさん良い年の瀬をお迎えください.

*1:僕はTokyoWesternsというチームに所属している.

*2:Belluminarという.

*3:全チームの中である問題を一番最初に解くこと

*4:一位はもちろん東大である.

*5:TokyoWesternsは過去2年間にASIS CTFで賞金を獲得している.

*6:First Acceptedの略.全チームの中で一番最初にその問題を解くこと

IDA Proを使い始めた

およそ2ヶ月前くらいにIDA Proのメジャーアップデートが行われ,7.0がリリースされた.約一年ぶりのアップデートとなったが,もっとも大きな変更点はついにIDA Proそのものが64bitアプリケーションになったことである.かねてより購入機会を伺っていた僕は,これを機にMac版のNamed Licenseを購入することにした.

IDA Pro Named License購入チャレンジ

ところがquotation systemを見ればわかる通り,現在IDA Pro Named Licenseは全てのプラットフォームにおいて販売されていない.詳しいことは不明だが,知り合い曰くバージョン7.0がリリースされた直後に本体およびデコンパイラのライセンスがリークされ,それを受けての対応ではないかとのこと.
当初Google CTFのfinalsが直前に迫っており,せっかくならここに間に合わせたいということで急遽メールで交渉することにした.

欲しいライセンスは IDA Pro Named License [Mac] なんだけど,
なんか今全部のNamed Licenseが買えないみたいなんですよ.
新しくNamed License売ってくれない?w

みたいなことを書いて sales[at]hex-rays.com にメールを送った. すると半日くらいで返信が来て,

会社のメールアドレスから送ってくれや.

僕はまだ学生なわけで当然会社のメールアドレスは持っていない.とりあえず大学のメールアドレスを使って再度送信.

OKわかった.欲しいライセンスはお前に紐付く個人ライセンスでいいんだな?
quoteは用意できる.請求先住所を教えてくれ.

とまあ意外とすんなり通った.
あとはメールアドレスを変えたい旨を伝えたら最初のメールアドレスで手続きしてもらえたので,そのまま普段のメールアドレスをライセンスに紐づけることができた.

とにかくHex-Raysの人の対応が早くて,営業時間内なら1,2時間程度で返事が返ってきた.おかげで東京を出発する日にメール手続きを始めたにも関わらずフランスでのトランジット中にダウンロードリンクが降ってきて,そのまま空港の回線を使ってIDAを雑にインストールするといったことをしてた (回線を圧迫したけど深夜だったし許して) . 実はクレカの限度額が足りなくて急遽デビッドカードに切り替えたり,3Dセキュアに対応してないカードはrejectされるため羽田空港の搭乗口で3Dセキュアを有効化したりドタバタしていたんだけどそれはまた別の話.

エクストリームIDA購入チャレンジめいたものに見事勝利したわけだが,結局Google CTFでは使わなかった.

macOSでIDA Pythonをいい感じに使いたい

話は変わって,現実逃避をするために最近少し余裕が出て来たのでIDA Pluginをいくつか試してみることにした. まず最初に試そうと思ったのはPonceだったがこれはまだ7.0に対応しておらず,僕自身プラグイン開発の知見も全くないので諦めた.他に何かないか探していたところ,たまたまTwitterkeypatchが流れてきたのでまずこれを導入することにした.keypatchにはkeystoneが必要なので,まずIDA Pythonでkeystoneを使えるようにする.

しかしこれがなかなかやっかいで,IDA Pythonはシステム標準のもの (/usr/bin/python) を使う.僕は普段pyenvを使っているためmacOSのpipを一切整えておらず,いざ導入してもSIP (System Integrity Protection) に阻まれて一切のパッケージをインストールできない.もちろんSIPを無効化する方法 (http://icchy.hatenablog.jp/entry/2016/05/16/121630) もあるのだが,なんだか面倒なのでpyenvをうまく使う方法を考えた.

まずIDA Pro本体のディレクトリ (macOSでは/Applications/IDA Pro 7.0/ida.app/Contents/MacOS) におけるファイル・ディレクトリは次のようになっている.

...
cfg/ # 各バイナリ用のIDA設定ファイル
dbgsrv/ # 各種アーキテクチャ用のdbgsrvバイナリ
ida # 32bitバイナリ用IDA
ida64 # 64bitバイナリ用IDA
idc/ # idcスクリプト
plugins/ # プラグイン
python/ # IDA Python用ライブラリ
sig/ # シグネチャデータ
...

プラグインにとって重要なのはpluginsおよびpythonディレクトリで,pluginsにはプラグイン本体のプログラムが,pythonにはIDA Pythonから使用するライブラリが入っている. 原理的にはpythonにimportしたいものがあれば良いので,そこに~/.pyenv/versions/2.7.14/lib/python2.7/site-packages/keystoneへのシンボリックリンクを張ればちゃんとimportできる.ただしライブラリをインストールするたびに作業が発生するので面倒だし,大量のライブラリに依存するパッケージがあったらかなり手間がかかる.

そこでpyenv-virtualenvに着目する.virtualenvは本来特定のディレクトリ以下にpythonのライブラリを閉じ込めるもので,site-packagesの位置をコントロールすることでライブラリの名前空間を切り替えている.普通はshellのsourceコマンドなどでactivateするが,もちろんpythonのプログラム中からvirtualenvをactivateする方法はあって,bin/activate_this.pyを実行すればよい. これでida用のvirtualenvを切って,そこに必要なライブラリを入れていけば普段の環境は汚さずに済むしちゃんとpipでインストールできるので解決する. あとはこれをidaの起動時に実行されているようにしなければならないが,python以下を眺めていたらinit.pyというファイルを見つけた.このファイルの最後の方に

# Load the users personal init file
userrc = os.path.join(ida_diskio.get_user_idadir(), "idapythonrc.py")
if os.path.exists(userrc):
    ida_idaapi.IDAPython_ExecScript(userrc, globals())

こんなコードがあって,いろいろ調べるとどうやら起動時に$HOME/.idapro/idapythonrc.pyを実行してくれることがわかった.あとはこのファイルの中にpyenv-virtualenvの適当な環境をactivateするコードを書けばよい.

activate_this = '/Users/icchy/.pyenv/versions/2.7.14/envs/ida/bin/activate_this.py'
execfile(activate_this, dict(__file__=activate_this))

これでpyenvのidaという名前の環境がIDA Pythonに適用され,無事にkeypatchを導入することができた. ただし一つだけ注意しておく必要があるのはIDA Pythonの実行バイナリが変わっていないため,実行されるpythonのバージョンが必ずしもライブラリの導入環境と一致するわけではないということ.もちろんpyenv側でsystemと同じものを用意して,その下にvirtualenvを切ればよい話なんだけどまあ2.7系だし多分大丈夫でしょう.みたいな気持ち.

idasecを導入する

あとntddkのブログにidasecの7.0用パッチを書いた話をたまたま見かけて,貼られていた動画が面白そうだったので導入することにした.

これもハマりまくって結構時間を溶かしたんだけど,細かく書くのが面倒になってきたので要点だけ述べると,

  • binsecを動かすのに結構ライブラリが必要なのでntddk/binsec-vagrantを丸パクリしてbinsec-dockerを書いた
  • PyQt5の導入をするときにbrewでやるとpython3用が入ってIDAから使えなくなるのでbrew install pyqt5 --without-python3でやるとうまくいく
  • idasecのディレクトリでmakeを叩くのを忘れない (UIが生成されない)
  • pip install protobuf pyzmq capstone graphviz pyparsing enum path.py plotly
  • idasecはライブラリになっていないのでIDAのpython以下にidasecを配置しておく

ちなみに適当なバイナリでidasec試したんだけど,pythonが途中でUnicodeEncodeError吐いてIDAがハングアップした.pythonはカス