teppay’s log

セキュリティ、CTF、機械学習などに興味があります。情報系学生です。興味のあることを思い立った時に書きます。曖昧なことの整理にも使います。月1が目標です。

カーネルエクスプロイト入門してみるー第2章ー

第1章の続きです。 teppay.hatenablog.com

1.3 GRUBの選択画面を表示させる

$ sudo vi /etc/default/grub
$ sudo update-grub

デバッギの/etc/default/grubGRUB_HIDDEN_TIMEOUTコメントアウトして、grub-updateして再起動。
grub-updateしないと設定が反映されないらしくて最初困った。 f:id:teppay:20170719134552p:plain この画面がGRUBの選択画面で、

Advanced opptions for Ubuntu -->
            Ubuntu, with Linux 3.12.0

を選択するとカーネルバージョン3.12で起動できます。

$ uname -r
3.12.0

カーネルコンパイルし直して起動したあとは、GuestAdditionが無効になってしまう?らしくて、共有フォルダなどを有効にするために

$ sudo apt-get -y install --reinstall virtualbox-guest-dkms

を実行。

1.4 2つのVMをシリアル接続する。

  • るくすさんのブログではやってませんが、ホストがmacだとkgdbが使えないらしく、LinuxVMをもう一つ使うと出来るらしい。
  • KGDB Tutorial - YouTubeMac上で2つのVMを接続してKGDBを使っている動画)←まさにおれ!
    これも参考にする。

  • デバッギを以下のように設定する f:id:teppay:20170719001743p:plain

  • デバッガを以下のように設定する f:id:teppay:20170719001811p:plain

    デバッギとデバッガの設定の違いは存在するパイプ/ソケットに接続にチェックがついているかいないかだけです。

    これは、片方のマシンが起動する際に/tmp/portというsocketファイル?をホスト上に作り、もう片方のマシンがそれを参照する形で2つのマシンが通信するから(っぽい)です。

    つまり、今回の場合デバッギが起動して、/tmp/portをホスト上に作り、それをデバッガが参照します。よって、デバッギ –> デバッガの順で起動しないといけません。

これで繋がったはずですが、シリアルポート接続っていうのがいまいちわかっていないのでほんとにつながっているのかわかりません。

とりあえず次に行ってみたいと思います。

1.5 netconsoleを動かす

  • ifconfigで調べると、
$ sudo modprobe netconsole netconsole=6665@192.168.1.8/eth0,6666/192.168.1.9/

これを実行して、デバッガで、

$ nc -l -u 192.168.1.9 6666

を実行すればいいらしいです。が、実行しても何も動きませんので、これまたうまく動いているのかわかりません。。。。

VMカーネルがクラッシュしたらここにダンプされます。と書いてあるので、クラッシュされないとなにもおこらないのかも。

vmlinuxというファイルをデバッガにコピー。

  • vmlinuxってなに。
  • 共有フォルダを介して、デバッギからデバッガにコピーし、参照できるようにする。
$ cp ~/linux-3.12/vmlinux /media/sf_vm_sync
  • デバッギとデバッガの共有フォルダをホスト上の同じフォルダにしてあげれば、デバッガからも見えるようになる。

1.6 カーネルデバッガを設定する。

  • やっとkgdbが出てきた。
  • デバッギのカーネルのブートオプションに以下を追加する
kernel ... kgdboc=ttyS0,115200 kgdbwait

例によって、また/etc/default/grubを編集するらしい。
“kgdboc=ttyS0,115200 kgdbwait"の部分を、GRUB_CMDLINE_LINUXに追加する。(らしい)

$ sudo vi /etc/default/grub
$ sudo update-grub

ここでも忘れずupdate-grub
これで再起動してみると、 f:id:teppay:20170719161504p:plain kgdbが起動して、リモートからのgdbを待ってますって状態で止まってくれています。

1.7 リモートのGDBから接続する

$ cd /media/sf_vm_sync
$ gdb -q
(gdb) file vmlinux
(gdb) target remote /dev/ttyS0
/dev/ttyS0 : 許可がありません。

はい。
またPermissionエラーがでました。おそらくまたグループに入れてもらうんだろうなと思いながらぐぐるとやはりそうでした。
今度はdialoutというグループに入らなければいけないので、

$ sudo gpasswd -a ユーザ名 dialout

からの再起動です。
気を取り直して、もう一度、

$ cd /media/sf_vm_sync
$ gdb -q
(gdb) file vmlinux
(gdb) target remote /dev/ttyS0
kgdb_breakpoint () at kernel/debug/debug_core.c:1014
1014   kernel/debug/debug_core.c: そのようなファイルやディレクトリはありません.

こんなエラー?はでましたが、ひとまず接続できました。

(gdb) c
Continuing.

てな感じでカーネルに制御を戻すと無事デバッギが起動しました!
めでたしめでたし(環境つくっただけ。。。)

teppay.hatenablog.com