今天本來要解 Hackme CTF 的 homework
,但還沒能解出來,已經快來不及了 QQ。
所以最後決定先寫 Pwntools 的簡單使用方式,明天繼續挑戰~
Pwntools 是一個 CTF 框架及 library,在許多公開 PoC 中也可以看到它,可見是被廣泛使用的工具。它除了可以用在 local,也有 remote 的功能,產生 shell code、串 ROP chain 等等都有支援,功能相當豐富。
pip install pwntools
我安裝的時候有遇到缺 cmake 的情形,需要順便安裝
brew install cmake
建立連線:
from pwn import *
# local process
p = process('./your_binary')
# 連接 remote
p = remote('example.com', 12345)
設定 log level 為 debug
:
context.log_level = "debug"
傳送資料:
p.sendline('Hello, server!')
# 也可以等收到某字串再傳送
p.sendlineafter("Hi?", "Hello!")
接收資料:
response = p.recvline()
print(response)
拿到 shell 之後,跟 shell 互動:
p.interactive()
打包資料(Little Endian):
# 32 位元
payload = p32(0xdeadbeef)
# 64 位元
payload = p64(0xdeadbeefdeadbeef)
解包資料:
# 32 位元
binary_data = b'\xef\xbe\xad\xde'
unpacked_value = u32(binary_data)
print(hex(unpacked_value)) # 0xdeadbeef
# 64 位元
binary_data = b'\xef\xbe\xad\xde\xef\xbe\xad\xde'
unpacked_value = u64(binary_data)
print(hex(unpacked_value)) # 0xdeadbeefdeadbeef
試著寫一個完整一點的範例:
from pwn import *
# 連接到 remote 伺服器
remote_host = 'example.com'
remote_port = 12345
p = remote(remote_host, remote_port)
# 組 payload
payload = "A" * 32 + p32(0xdeadbeef)
# 發送 payload 到伺服器
p.sendline(payload)
# 接收伺服器的回應
response = p.recvline()
# 輸出伺服器的回應
print("伺服器回應:", response)
組譯:
from pwn import *
# 將組合語言指令轉換為二進制數據
assembly_code = """
mov eax, 1
xor ebx, ebx
int 0x80
"""
binary_data = asm(assembly_code)
反組譯:
from pwn import *
# 二進制數據
binary_data = b'\xb8\x01\x00\x00\x00\x31\xdb\xcd\x80'
# 將二進制數據轉換為組合語言指令
disassembled_code = disasm(binary_data)