iT邦幫忙

2023 iThome 鐵人賽

DAY 26
0

前言

今天本來要解 Hackme CTFhomework,但還沒能解出來,已經快來不及了 QQ。
所以最後決定先寫 Pwntools 的簡單使用方式,明天繼續挑戰~

Pwntools 介紹

https://github.com/Gallopsled/pwntools

Pwntools 是一個 CTF 框架及 library,在許多公開 PoC 中也可以看到它,可見是被廣泛使用的工具。它除了可以用在 local,也有 remote 的功能,產生 shell code、串 ROP chain 等等都有支援,功能相當豐富。

Install

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)

上一篇
Day 25. Pwn - Buffer Overflow
下一篇
Day 27. Pwn - Out-of-bound 實戰
系列文
進了資安公司當後端 RD 才入門資安會不會太晚了30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言