引言
今天就來討論 Pwn 吧,
所謂 Binary Exploitation 直翻是二進制程式檔滲透,
其實就是找尋程式中的漏洞,或是取得伺服器權限,使用伺服器 shell 偷取檔案、修改資料等等。
事實上這就是大家刻板印象中駭客所做的事情啦~
那為什麼叫做 Pwn 呢?
Pwn 唸作「碰!」,就是一個擬聲詞,
有那種攻破對方領地後,你對對方發出碰一聲的聲音調侃的感覺。
[參考維基百科: Pwn]
這主題的題目多半都是找程式漏洞、給你伺服器你必許取得其 shell 控制權拿到某資料之類的。
pwntools
pwntools 之前曾經提到過,現在我們正式要來使用它了。
這個工具絕對是 CTF 必備,後面很多複雜的題目都離不開它,而且它很好用!
首先我們先安裝它:
pwntools
請照著教學中的步驟安裝,如果你是 Python3 ,可以照著下面的步驟安裝即可:
$ apt-get update
$ apt-get install python3 python3-pip python3-dev git libssl-dev libffi-dev build-essential
$ python3 -m pip install --upgrade pip
$ python3 -m pip install --upgrade pwntools
這裡主要簡介基本使用方式與常見函式,實際上還有非常多函數可以使用:
from pwn import *
r = remote('xxx.com', 12345)
print(r.recvuntil(b'Ironman!\n').decode())
r.sendline(b'go')
print(r.recvline().decode())
r.close()
以這段程式碼為例,我們假設一個情境:
搭配這個情境,我們看看上面那段使用 pwntools 的程式:
decode()
與 encode()
,只要是要傳送或接收,一律都是 bytes 型態,給你看的時候要轉成 str 型態。而 decode()
做的事是 bytes 變 str , encode()
做的事是 str 變 bytes ; 'xxx'
是 str 型態, b'yyy'
是 bytes 型態。這樣就不會再搞混了!from pwn import *
代表使用 pwntools ,也可以寫 import pwn
但是等等所有 pwntools 的函式前面都要加上 pwn.
變成 pwn.函式()
的形式。remote()
函式用來連接伺服器,一樣輸入 host 與 port 就可以,連接成功將回傳結果給 r
, r
可以在稍後跟伺服器接收、傳送資料等等,關閉伺服器連接也要由 r
來做。r
可以做的事簡單說幾個:
print(r.recvuntil(b'Ironman!\n').decode())
recvuntil()
是從伺服器接收輸出,一直到括號裡限定的內容為止,例如上面這句就是接收內容直到 Ironman! 然後換行為止,必須注意要是 bytes 型態,因此有個 b
。 接收到的結果使用 decode()
轉回 str ,最後印出,因此這行會印出「I'm Ironman!」然後換行。r.sendline(b'go')
sendline()
就是送出資料給伺服器,資料也必須是 bytes 型態,然後它會自動幫你加換行,因為是 sendline 。print(r.recvline().decode())
recvline()
則是從伺服器接收一行輸出,收到的一樣是 bytes 型態,再自行轉 str 印出。因為剛剛送出「go」給伺服器,這裡預期會收到「success!」。r.close()
大概最簡單的使用方式就是這樣,有遇到新的使用方法再陸續補充。