pwntools の使い方 (基礎編)
pwntools を使った基本的な解析についての覚え書き
検証環境
- wsl2
- Ubuntu 24.02
インストール
- pip でインストール可能
pip install pwntools
セキュリティチェック
- checksec を用いる
pwn checksec $FILE
確認事項としては
- canary があるか?
- PIE が有効かどうか?
が一番基本的な部分
canary はスタック上におかれる Buffer Overflow 検知用のダミー変数であり, 改変されているとプログラムが強制終了する
PIE はアドレスの相対化のことであり, 有効であるとすべてのアドレスが相対アドレスで表記される
相対アドレス表記の場合はリターンアドレスの書き換えなどで遷移させたい先の関数のアドレスについて事前に何かしらの手段でリークさせる必要がある
プログラムの開始
- ローカルにある実行ファイルは以下の方法で起動する
from pwn import * sh = process($FILE)
- リモートホストの場合は
remote
関数を使用
host = $HOST port = $PORT # int sh = remote(host, port)
データの受信
- 入力を行うプログラムの場合入力前の文字列をベースに
recvuntil
を用いることでプロンプトまでのデータを一気に読み取ることが可能
prompt = sh.recvuntil("input:") print(prompt.decode())
上記コードでは
"input:"
が出てくるまでデータを受信する一行のみ受け取りたい場合は
recvline()
が使える
データの送信いろいろ
- 特定の文字列を送る際は
sendline
を用いる
payload = "test".encode() sh.sendline(payload)
- 送るデータは byte の形式にするように気を付ける
- 32 bit や 64 bit の数字を送る際は以下が便利
print(p32(0xdeadbeef)) # b'\xef\xbe\xad\xde' print(p64(0xdeadbeef)) # b'\xef\xbe\xad\xde\x00\x00\x00\x00'
gdb を用いてスタックを調べる
- gdb が既にインストールされている状態であれば, プログラムの特定の場所にブレークポイントを仕掛けた上で実行が可能
gdb.attach(sh, gdbscript=""" break *main+111 c """)
- 上記コードをプログラムのデバック開始後すぐの地点においておくと, gdb がプロセスにアタッチされブレークポイントの設定などが可能
- 当然だがリモートホストに対してはできない