解答編
昨日に投稿した記事の読み方です。
-1. 環境
Xubuntu 14.04。色んなものAPTで入れてるからかなりカオスになってる。
GCC,GFortranは4.8.2で、Rubyは2.1.2、Pythonは2.7.6と3.4.0。Node.jsは0.11.13だったと思います。
0. zipファイルを落としてくる
ここにも書いておきましたが、これは普通に落としてくるだけです。
# git clone https://gist.github.com/b35c5a5aa6f54b7faebb.git seccamp2014 && cd seccamp2014 Cloning into 'seccamp2014'... remote: Counting objects: 28, done. remote: Compressing objects: 100% (27/27), done. remote: Total 28 (delta 0), reused 20 (delta 0) Unpacking objects: 100% (28/28), done. Checking connectivity... done. # unzip seccamp2014.zip Archive: seccamp2014.zip inflating: seccamp2014.py
するとseccamp2014.py
というファイルができると思います。
ちなみにこのファイルを素直にPython(2.x、3.xどちらでも実行できます)として実行すると……、
# python seccamp2014.py > seccamp2014.2.py # diff seccamp2014.py seccamp2014.2.py
Quineになっています。
1. Rubyとして実行する→7zファイルの取得
さて、seccamp2014.py
を素直にPythonとして実行してもQuineなので、あまり意味がありません。なので、少しコードを眺めてみます。
seccamp2014.py(冒頭部分)
__END__=0;s=1//2or'''/.to_s[1..0].gsub(/^$/){require'base64';Base64.decode64 (([*DATA][3..-2]*'').tr("lkjhgfdsamnbvcxzpoiuytrewq","qwertyuiopasdfghjklzxcvbnm"))}.display.to_i.succ __END__ =1;'use strict';$=+[];____=$++;___$=$++;__$_=$++;__$$=$++;_$__=$++;_$_$=$++;_$$_=$++;_$$$=$++;$___=$++;$__$=$++;$_=({}+$)[_$_$]+({}+$)[___$]+([][$]+[])[___$]+(!$+[])[__$$]+({}+[])[_$$_]+(!!$+[])[___$]+(!!$+[])[__$_]+({}+$)[_$_$]+({}+[])[_$$_]+({}+[])[___$]+(!!$+[])[___$];$$=$[$_][$_];$$($$((!!$+[])[___$]+(!!$+[])[__$$]+(!!$+[])[____]+(!!$+[])[__$_]+(!!$+[])[___$]+$_[__$_]+'"'+([][$]+[])[_$_$]+(!$+[])[____]+'\\'+____+_$_$+____+(!!$+[])[____]+'\\'+___$+_$$$+___$+'\\'+___$+_$$_+____+(!!$+[])[__$$]+$_[___$]+(!$+[])[____]+'\\'+____+_$__+____+(!!$+[])[__$$]+$_[__$_]+$_[____]+(!!$+[])[___$]+'\\'+___$+_$$$+___$+'\\'+___$+_$$_+____+(!!$+[])[____]+(!!$+[])[__$$]+([][$]+[])[__$_]+(まだまだ続く)
何となくですが、1行目のto_s
とかrequire
からしてRubyのように見えませんか?
というわけでRubyとして実行してみます。すると、
# ruby seccamp2014.py
何だかバイナリのようなものが一気に出力されたと思います。さすがに全体を吐かれてもわけが分からないので適当に先頭の100byteくらい見てみると、
# ruby seccamp2014.py | head -c100
とかすると7z
という文字が見えるので多分7zip形式のアーカイブなんじゃないかと当たりを付けて保存します。
で、7z
コマンドで解凍を試みるのですが……。
# ruby seccamp2014.py > seccamp2014.7z # 7z x seccamp2014.7z Processing archive: seccamp2014.7z Enter password (will not be echoed) :
パスワードの入力を求められました。次はこのパスワード探しです。
2. Node.jsで実行→ブラウザで実行→パスワードのヒントを取得
もう一度ソースコードをよく観察してみます。すると'use strict';
やfunction
からJavaScriptとしても実行できるのではないかと推測できます。
というわけでとりあえずNode.jsで実行してみると、
# node seccamp2014.py $ cp seccamp2014.py seccamp2014.html && open seccamp2014.html
何やらコマンドラインらしき文字列が出力されました。これを、少し変えて(HTMLをブラウザで開く的な意味でopen
コマンドが使えるのはOS Xとかなので)実行してみます。
# cp seccamp2014.py seccamp2014.html && xdg-open seccamp2014.html
すると次のようなページが開きます。
「Hint: Pa-tto! Pa-tto! Hareyakani!」と表示されていますね。
「ぱーっとぱーっと晴れやかに」と言ったらハナヤマタしかないので、先程の7zのパスワードに「hanayamata」と入力してみます。
# 7z x seccamp2014.7z Processing archive: seccamp2014.7z Enter password (will not be echoed) :hanayamata Extracting seccamp2014.gz,v Everything is Ok Size: 32148 Compressed: 32025
というわけでseccamp2014.7z
が解凍されて、seccamp2014.gz,v
というファイルが現れました。
3.gz,v
って何の拡張子だよ→RCSで取り出す
gz,v
というか末尾に,v
が付いているものはRCSといういにしえのバージョン管理システムのファイルになります。
バージョン管理システムというと、最近で言えばGitとかMercurialみたいなものですね。
とりあえずログを見てみます。
# rlog seccamp2014.gz RCS file: seccamp2014.gz,v Working file: seccamp2014.gz head: 1.3 branch: locks: strict access list: symbolic names: keyword substitution: o total revisions: 3; selected revisions: 3 description: Compressed file ---------------------------- revision 1.3 date: 2014/08/20 01:44:46; author: alucky0707; state: Exp; lines: +1 -115 Third version ---------------------------- revision 1.2 date: 2014/08/20 01:44:46; author: alucky0707; state: Exp; lines: +115 -1 Second version ---------------------------- revision 1.1 date: 2014/08/20 01:44:46; author: alucky0707; state: Exp; Initial revision =============================================================================
何だか色々出てきましたが、ぱっと見て1.1
、1.2
、1.3
という3つのリビジョンがあり、1.1
から1.2
になるときに+115
行されていることなんかが分かります。
まあ行が増えてる方が正解かなーと(実際は試行錯誤するかもしれない)考えて、リビジョン1.2
のファイルを取り出して、解凍します。
# co -l1.2 seccamp2014.gz # gzip -cd seccamp2014.gz program seccamp2014 implicit none (まだまだ続く)
出てきたファイルはどうもFortran 95っぽいです。implicit none
って言ったらFortranですよね?
4. Fortranとしてコンパイルして実行→C言語でコンパイルして実行
# gzip -cd seccamp2014.gz > seccamp2014.f90 # gfortran -o seccamp2014f seccamp2014.f90 # ./seccamp2014f const char main[] = (まだまだ続く)
するとC言語っぽいソースコードが出てくるので、今度はC言語としてコンパイルして実行します。
# ./seccamp2014f > seccamp2014.c # .gcc -o seccamp2014c seccamp2014.c # ./seccamp2014c
これでMarkdownっぽいファイル——つまり私のセキュリティ・キャンプの参加記が取り出せるはずです。
一つ注意するべき点は、seccamp2014.f90
は少なくともリトルエンディアンで32bit以上な環境じゃないと上手く動かないと思うのと(私はx86_64なLinuxでしか試してません)、seccamp2014.c
は機械語をハードコーディングしているので間違いなくx86_64なLinuxじゃないと動かないと思います。
感想
考えたネタはなるべく実装しようと思ったので公開までに結構時間がかかってしまいました。
本当はもっと色々やってみたいことがあったのですが……(最初のpolyglotコードの言語数を増やしたり)。
ちなみに、私が知る範囲で解読してくださったのは@tyage氏だけでした。誰も解読してくれなかったらどうしようと思っていたので、読んでくださる方がいてよかったです、ありがとうございます。
以下、解読されたtext.md
です。また、生成スクリプトなどを含めたリポジトリはalucky0707/seccamp2014 - Githubに置いてあります。
セキュキャンに行ってきた
セキュリティ・キャンプ全国大会2014(以下、セキュキャン)に参加してきたので、その感想とか色々をだらだらと綴っていきたいと思います。
応募のきっかけ
それは6月中旬のこと。
先輩「セキュリティ・キャンプって知ってる?」
あらっきぃ「一応知ってますけど」
先輩「応募してみれば? あらっきぃの実力なら受かるんじゃない?」
あらっきぃ「……(自分より実力ある先輩にそんなこと言われると謙遜するにもしにくい)」
先輩「あ、サイボウズスポンサーだしRed Bull飲み放題かもよ」
あらっきぃ「しゃあっ! 行くしかない!」
多少の語弊はありますが大体こんな感じだったような気がします。ぶっちゃけセキュリティに興味があったのかと言うとそんなことはあまり無かったかもしれない……。むしろ脆弱性を突かれる側だった……。
ちなみにRed Bull飲み放題じゃなかったです。先輩許しません。
また、なぜWebクラスに参加したのかというと、実はセキュアなシステムを作ろうクラスにするかでかなり悩んだのですが、Webクラスの講師にはせがわようすけさんがいたのが決定打でした。はせがわさんは主に「JavaScript関連」「Eject関連」で私がとても尊敬している人です。
セキュキャンの流れ
1日目
埼玉の僻地から幕張までやって来ました。
会場に着くと早速名刺交換です。実は私は名刺を持っていなかったので、セキュキャンのためにわざわざ作ってきました。当然名刺交換も初めてだったので、他人に名刺を渡す手がぎこちなかった気がします。最初の何人かは名刺を渡す向きが反対だったりして失礼しました。ごめんなさい。
そのあとは昼食を取って、全体でセキュリティについて考えさせられる講義を受けて、ゲストのソフトイーサ株式会社の登大遊さんの話を聞きました。 この登さんのことは——筑波大学のシステムをハッキングしたことなど——はいくつか知っていたのですが、他にも面白そうなことをいくつもやっているんだな、と思いました。また、そう言った面白いことは、最大限の計算の上で成り立つものなのだとも思いました。
夕食後はゲストの警察庁(警視庁ではない)の萬谷さんの話を聞きました。自分の無知を晒すようであれなんですが、私はこのとき初めてフォレンジックという言葉を聞きました。自分の知らない方面の技術もまだまだたくさんあるんだな、と再確認させられました。
そのあとの専門講義では、初めてFirefox OSの実機(検定シールの不備で回収されたことで有名なFlame)に触れました。
2日目
この日の朝は確か、早起きしてErlangでQuineを書いていた記憶があります。完全に趣味の話なのであまり気にしないで下さい。
専門講義ではMozilla Japanの方の話を聞いたりして、Firefox OSについて何となく詳しくなったような気がします。
専門講義が終わるとチュータさんの成果発表を聞いたり、BoFというものをやったりしました。
BoFというのは「ブレスオブファイア」の略……じゃなくて、Bird of Featherの略だそうです。Bird of Featherというのは英語の慣用句で日本語にすると「同じ穴のむじな」という意味です。要するに興味がある人同士が集まってする座談会みたいなものです。 私はBoFでアニメ好きな人と集まって話したのですが、その際に@ntddk氏から東方などゲームのハッキングの話を少し聞きました。とても興味深かったです。
3日目
この日の朝は確か二度寝して7時に起きました。ごめんなさい。
3日目の午前中は企業訪問ということでウイルスバスターで有名なトレンドマイクロさんにお邪魔させていただきました。
トレンドマイクロさんがお盆中だというのにわざわざ説明等していただきありがとうございます。
感想としては、トレンドマイクロが日本に本社を持つ企業だということと、トレンドマイクロと言えばウイルスバスターがメインのイメージがあったのですが、そうではなくて企業のセキュリティサポートなどをやっていることが多いことに驚きました。
午後からは、講師の用意したFirefox OSアプリの脆弱性探し(バグ探しではない)という実習を行いました。「Cross」「Site」「Scripting」という三つのチームに別れて探したのですが、私は「Scripting」チームでした。
アプリの中にはXSS等の脆弱性も含まれていて、探すのはとても楽しかったです。
4日目
もう半分以上経過してしまったんだなぁ、と思いながら起床しました。
4日目の午前中は昨日探した脆弱性の発表をチームでしました。
その後は世界のKinugawaさん(このページの会社名がバグハンターの人です)の話を聞いたり、講師陣のセキュリティに対する姿勢などを伺ったりしました。人によって色々な考え方があり興味深かったです。
午後は楽しみにしていたCTFです。CTFというのはCapture the Flagの略で、(本来の趣旨とは違うらしいですが)出されたコンピュータに関わる問題をチームで解いて、その点数で競うといった内容のものです。 私は「レイジェン74」というチームで参加しました。このチーム名は確か、会場のテーブルに置いてあったルーターの名前から取ったはずです。
CTFは自分はWeb系の100点200点の問題しかほとんど解くことができず、チームに迷惑をかけたと思います。自分の実力を何度も呪いました。
ただ、一問だけ全体の中で自分しか解いた人がいなかった問題もありました。「GIFのみがアップロードできるサービスの脆弱性を探す」というもので、バイナリエディタを使ってがんばって脆弱性を突くようなGIFファイルを作ることで問題を解くことができました。 この一問を解いたおかげで何人かの講師やチューターの方の印象に残ることができたみたいだったのでとてもよかったです。がんばった甲斐がありました。
ちなみにCTFの結果は9位でした。まあどうにか一桁の順位に収まることができたのでよかったかなと思います。でももっと上にいきたかった気持ちもなくもないです。
5日目
気が付いたら最終日になってました。
まずグループワークの発表をしました。グループワークはCTFと同じチームで行っていました。
「セキュアな育毛」や「家具インジェクション」など面白そうなテーマの発表が行われる中、自分達は「POLTER GEIST」というテーマで家電製品のハッキングの危険性とその対策について発表しました。準備期間がとても短かったので、内容をまとめるのがとても大変でした。
その後は全体の成果発表があったりして、閉会式でした。
最後に本を二冊貰えるとのことだったので、私はやさしいインタープリタの作り方入門とBareMetalで遊ぶRaspberryPiの薄い本を貰ってきました。 実のところを言うと[リンカ・ローダ実践開発テクニック]が欲しかったのですが、目の前で最後の一冊を取られたんですよね…。くやしい。どなたか送ってください。
帰り道に駅のホームを間違えて帰るのが30分くらい遅くなるハプニングはありましたが、無事帰宅。本当にあっという間の5日間でした。
総括して
今までネットワーク上でしか交流のなかった[@mpyw]氏などや、何度か名前の聞いたことのある方々と実際に会って話すことができてとても大きな刺激になりました。
また、Firefox OSの実機にも触れることができてよかったです。
セキュリティについてはそこまで興味があったわけではないのですが、実際に行って講義を受けて、色々と考えることがあるんだな、と実感させられました。
セキュリティについて考えたこと
私がセキュリティについて思うことは色々とあるのですが、例えば上にさりげなく書いた「脆弱性探し(バグ探しではない)」という部分が大事なんじゃないなぁ。
「脆弱性探し(バグ探しではない)」というのは、言葉の通りなんですが、脆弱性=セキュリティ上の欠陥というのは、単なる実装上のバグではないということです。
これはつまりどういうことなのかというと、セキュリティというとぱっと出てくるのはXSSやSQLインジェクションなどですが、そのような技術的側面だけでなくセキュリティ・ポリシーのような考え方もあります。 セキュリティ・ポリシーはユーザーに対して企業/サービスがセキュリティに対してどのような姿勢を持っているかを示すというものです。このように、セキュリティとは技術面のみの問題ではないのです。
技術力を磨くことも当然大事ですが、セキュリティについて考えるのであれば、それ以上に技術以外の知識を学ぶ必要もあるのかな、と感じました。
応募用紙に書いたこと
来年以降の応募者のために書いておきます。
って言っても何書いたっけなぁ……。
確か「継続Webフレームワーク作りたいんだけど、実際に作るときにはセキュリティ面での配慮も必要だから勉強しておきたい」とか大言壮語を吐いたような気がします。他にもSOPについて自分の言葉で語れってところでは「Chromeはfileスキームのときファイル単位でオリジンが管理されるからハマってウザい」とかそんなことを書いたような……。
冷静に考えるとあんなものでよく通ったなぁ……。
とりあえず、こういうものに書く内容は基本的に過去の経験に裏付けられるので、色んなことを経験してそれを言葉に纏めておくことが大切だと思います。まったく、ブログの更新サボってる奴が言うセリフじゃねぇんですが。
事前にやっておくといいこと
事前課題をしっかりやるとか……。 それ以外にも自分で勉強しておくとか……。
そんな有り体なことを書いても面白くないし見飽きているでしょうし、そんなこと別にセキュキャンに行っていない人でも想像して書けるでしょう。なので、私が実際に行った経験から書いていきたいと思います。
1. 淫夢ネタに慣れておく
セキュキャンでは無駄に淫夢ネタが飛び交います。「こ↑こ↓」とか「ファ!?」とか。
これが参加者だけならいいのですが、困ったことに一部の講師まで淫夢ネタを常用します。
なので、淫夢ネタを把握していないと、周りにノリに置いていかれる恐れがあります。これは結構つらいです。
対策としては、語録をググって「あのさぁ」「いいよ!来いよ!」など汎用性の高いものから使っていくようにするなどするといいでしょう。
淫夢ネタを把握していると、日常的な会話の中で「うわっ、アイツホモビのネタを平然と使ってやがるよ…」と残念な奴を見抜くことができるようにもなりますし、一石二鳥です。
2. Twitterをやる
最近はバカッターなどと言われ世間でのTwitterの批判が大きく、やらない方がよいような気もしますが、セキュキャンに応募するような意識の高いあなたなら問題なくTwitterを使えるはずです。
今回のセキュキャンでは運営側がTwitterでの呟きをまとめてTogetterにまとめたりしていました。
名刺に書くネタも増えますし、セキュキャンが終わったあとも連絡を取りやすくなるかもしれません。かもしれないだけですが。
また、今回の場合で言えばとしぁさんを中心としたておくれている人達を把握していると幸せになれたと思います。
3. 買ってきた漫画は消化しておく
完全に私事なんですが、セキュキャンの前日にハナヤマタを全巻まとめ買いしたのですが、全巻読み切らずにセキュキャンに来てしまいました。
そのせいで1日目2日目は続きが気になって夜も眠れない状態でした。
買ってきた漫画は消化しといた方がいいです、はい。
4. コミケと被るから欲しいものは友人に頼んでおく
これも私事ですが、今回のセキュキャンはコミケと日程が大被りしました。なので、セキュキャンに参加しようと思うと必然的にコミケの1、2日目は行くことができなくなります。
私はこのことを完全に見逃していて、おかげで1日目に好きなサークルが新刊を出していたのですが、買い逃してしまうという失態をおかしました。
このようなことがないように、予めセキュキャンの日程を確認して、緻密に計画を練っておくことが大切かと思われます。
最後に
こんなグダグダでダラダラな文章に最後まで目を通して頂きありがとうございます。
また、セキュキャンの講師の方々、運営の方々、参加者の皆様、自分が未熟なために迷惑をかけた部分もあったと思います。そういった際に優しくしてくださり、本当に助かりました。
それではっ!