iT邦幫忙

2021 iThome 鐵人賽

DAY 28
0
Security

一起資安入門 -- picoCTF 探索與解題系列 第 28

[2021鐵人賽 Day28] Binary Exploitation (Pwn) 介紹工具

  • 分享至 

  • xImage
  •  
  • 引言
    今天就來討論 Pwn 吧,
    所謂 Binary Exploitation 直翻是二進制程式檔滲透
    其實就是找尋程式中的漏洞,或是取得伺服器權限,使用伺服器 shell 偷取檔案、修改資料等等。
    事實上這就是大家刻板印象中駭客所做的事情啦~

    那為什麼叫做 Pwn 呢?
    Pwn 唸作「碰!」,就是一個擬聲詞,
    有那種攻破對方領地後,你對對方發出碰一聲的聲音調侃的感覺。/images/emoticon/emoticon50.gif
    [參考維基百科: 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()
    

    以這段程式碼為例,我們假設一個情境:

    1. xxx.com 這個伺服器的 port 12345 上,有個程式在執行
    2. 該程式會先 print 出:「I'm Ironman!」,然後換行
    3. 之後它會等待你 input
    4. 如果它收到 input 是 「go」
    5. 則它會 print 出 「success!」 然後換行
    6. 之後永遠等待輸入

    搭配這個情境,我們看看上面那段使用 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 就可以,連接成功將回傳結果給 rr 可以在稍後跟伺服器接收、傳送資料等等,關閉伺服器連接也要由 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()
        關閉與伺服器連結。

    大概最簡單的使用方式就是這樣,有遇到新的使用方法再陸續補充。


上一篇
[2021鐵人賽 Day27] Reverse Engineering 逆向工程 01
下一篇
[2021鐵人賽 Day29] Binary Exploitation (Pwn) Pwn題目 01
系列文
一起資安入門 -- picoCTF 探索與解題30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言