remote()
関数とは?
pwntools
のremote()
関数は、リモートのサービスに接続し、そのサービスとの間でデータの送受信を行うための関数です。CTF問題を解く際、リモートサービスと通信し、入力や出力をやり取りすることで問題を解いていくことが多く、このremote()
関数が非常に重要な役割を果たします。
remote()
関数の基本的な使い方
from pwn import *
# リモートサービスに接続
p = remote('localhost', 1337')
# データを送信
p.sendline('Hello, world!')
# データを受信
data = p.recvline()
print(data)
remote()
関数:- 第1引数: 接続先のホスト名またはIPアドレス
- 第2引数: 接続先のポート番号
sendline()
関数:- 指定した文字列をリモートサービスに送信し、最後に改行コードを追加します。
recvline()
関数:- リモートサービスから1行のデータを受信します。
remote()
関数のオプション
remote()
関数には、他にも様々なオプションがあります。
timeout
: タイムアウト時間を設定します。ssl
: SSL/TLS接続を使用する場合にTrueを設定します。level
: ログレベルを設定します。- **args:
socket.create_connection()
関数に渡す追加の引数を指定できます。
# タイムアウトを5秒に設定
p = remote('localhost', 1337', timeout=5)
# SSL/TLS接続で接続
p = remote('example.com', 443', ssl=True)
remote()
関数を使った具体的な例
ファイルのアップロード
# ファイルを読み込む
with open('payload.bin', 'rb') as f:
payload = f.read()
# リモートサービスにファイルを送信
p.send(payload)
特定の文字列を探す
# 特定の文字列を含むデータを受信するまで待つ
p.recvuntil(b'password:')
インタラクティブモード
# インタラクティブモードに入る
p.interactive()
インタラクティブモードに入ると、Pythonの対話型シェルのように、リモートサービスと直接やり取りできます。
その他の便利な関数
send()
: 指定したデータをリモートサービスに送信します。recv()
: 指定したバイト数分のデータを受信します。recvall()
: すべての受信可能なデータを一度に受信します。interactive()
: インタラクティブモードに入ります。close()
: 接続を閉じます。
See Also
pwntools
エクスプロイト開発のためのツール
bytes
バイナリデータを表す不変なシーケンス
算術関数
数値計算に用いる関数
リスト
データの入れ物
辞書 / ディクショナリ
キーと値からなるリスト
Jupyter Notebook
OSの機能を使用する
統合開発環境
開発から実行までをお手軽に