今まであんまり授業の感想を書いてこなかったんですが、アウトプットが大事だと学んだばっかりなので、こうして記事にしてみました。
CS6035について
課題について感想を書く前に、そもそも今わたしがどんな授業を取っているのかという説明も軽く書いてみます。
今OMSCSで取っているのは、CS6035 Intro to Information Security という授業です。
基本的にProjectと呼ばれる課題を提出していくスタイルの構成で、成績はこのProjectが100%でつくようになってます。中間や期末テストはないですし、ディスカッションは開放されてますが、基本的にTAや生徒同士が課題についてアドバイスしあうような空間になってます。
Projectは全部で7つあり、それぞれにつきだいたい10日~2週間弱程度の日数が与えられます。
Project6の概要
今回はBinary ExploitationというタイトルのProjectでした。
内容としては
- バイナリ解析の脆弱性をついた複数の攻撃手法について学ぶ
- gbcコマンドや、Pythonのライブラリであるpwntoolsについて学ぶ
といった感じで、バッファオーバーフローやアセンブリコード、スタック、ROP、レジストリといった単語がキーワードになるのかなと思います。
学んだことを3つ
学びはけっこういろいろあるのですが、あんまり理解せずに進んでしまっている部分も多いです。今わたしが説明できる範囲で学びを挙げるとすると、
- pwntoolsやgdbコマンドの使い方
- バッファオーバーフローの怖さ
- データのやり取りについて
あたりになるでしょうか。
pwntoolsやgdbコマンドの使い方
今回初めて使いました。
とはいえ使った機能自体は序の序レベルかと思います。
この課題でのpwntoolsの基本的な使い方としては
C言語で書かれたプログラムを実行し、入力データを作成し送信する
という使い方でした。
あとはgdbコマンドのような使い方ができるんだ、そうか~という具合です(ちなみにgdbコマンドも初めて)。
使って覚えたgdbコマンドも列挙してみます。
> gdb ファイル名 --- gdb開始
> main --- main関数を実行
> c --- つきあたりまで実行
> n --- ステップ実行(callした関数には入らない)
> s --- ステップ実行(callした関数に入る)
> p 変数名 --- 変数の値を表示(*変数名ならポインタを表示)
> p/x 変数名 --- 変数の値を16進数で表示
バッファオーバーフローの怖さ
これも初めて知った概念なんですが、怖いですね。。。
今回学んだ攻撃手法は、大半がバッファオーバーフローを使うものでした。
バッファオーバーフローを使って、本来callするべき関数ではなく悪意ある関数をcallするようにアドレスを書き換えるとか、チェックをすり抜けるために値を書き換えるとか、、、
超初心者向けに作られた課題とはいえ経験がない人が簡単に攻撃できるくらいだから、悪意ある頭いい人たちにとっては造作もないことなんだろうなと怖くなりました。
ただバッファオーバーフローってC言語の界隈ではたぶん当たり前の知識なんですかね。調べれば山ほど記事がヒットするし、言語側での対策も入っていたりするみたいですし。
ところでわたしはruby使いでしたが、そういうメモリをいじれない言語だとどんなふうに対策されているんでしょうか。少し興味が出てきたので、気が向いたら調べてみます。
データのやり取りについて
だいぶ漠然としてるんですが、こういう文字データって、文字のままでやり取りされているわけじゃないんだよなというのが腑に落ちた気がします。
もちろん、コンピュータが扱うのはOn・Offの信号で、それをまとめるために16進数が使われていて、、、みたいなのは知識としてあります。
ですが今回gdbコマンドでスタックやらレジストリやらのデータをのぞいてみたことで、「本当に16進数なのか~」と謎に感動しました。あと、On・Offの信号をまとめるとこんなにコンパクトになるのか、とか。
仕事でrubyを書いていてもこういうことが感覚としては身につかないので、PCが動く仕組みに少し近づけたような感動がありました。
全体の感想
難しかったです。
最初の概念というか、概要をつかむ部分でだいぶ時間を取られました。
こういう課題だけで進む授業だとあるあるかもしれませんが、「まあとりあえず攻撃してみようぜ!」という感じでポンとお題を渡されます。でもこちらはC言語をまともに触ったことがなく、pwntoolsとか初見だし、そもそもbinary exploitationとは何ぞや状態。
もちろんそんな人はたくさんいるので、お題とともに課題図書(記事・動画)的なものも渡されます。それを読むのにだいぶ時間を取られました。
でも、徐々に理解が進むと課題って楽しくなるんですよね。土日をフルで取られたりしましたが、試行錯誤しつつ進めて攻撃が成功した時の喜びはやっぱりすごかったです。
というわけで今回の課題は、時間にして20時間、日数としては10/24~10/31の約1週間かかりました。
たぶん、C言語を実用レベルで使っている人はそれほど苦労せずに終わるんじゃないかと思います。
必要な技術等
- Python(簡単なスクリプトを組める程度)
- C言語(読解できる程度)
- Oracle VM VirtualBox
- アセンブリコード(簡単なコードを読める程度)
にほんブログ村