什麼是 PWN?
PWN
是駭客術語中的俚語,是指攻破裝置或者系統。它的發音類似於“砰”
,當然也有師傅把它叫作“胖”
。PWN 的目標是獲取系統的控制權或執行未經授權的操作。
如何入門 PWN
前置知識
-
C 語言
- 學習內容:
- 程式結構和基礎語法
- 資料型別、分支語句(如
if
、switch
)和迴圈(如for
、while
) - 指標和結構體
- 學習資源:
- 浙江大學翁愷教你 C 語言程式設計
- C 語言教程 | 菜鳥教程
- 學習內容:
-
Python 語言
- 學習內容:
- 程式結構和基礎語法
- 迴圈(
for
、while
)和異常處理(如try
)
- 學習資源:
- Python3 教程 | 菜鳥教程
- 超基礎 Python 課程
建議:掌握 C 語言後,可以直接用文章進行 Python 的學習,進度會更快。
- 學習內容:
-
組合語言
- 常見型別:
- x86 彙編:Intel 和 AMD 的處理器架構
- ARM 彙編:用於移動裝置
- MIPS 彙編:用於嵌入式系統
- PowerPC 彙編:曾用於蘋果計算機
- RISC-V 彙編:開源架構,逐漸獲得關注
- 學習資源:
- 《組合語言》速成指南
- 通俗易懂的組合語言(王爽老師的書)
基礎要求:理解基本的彙編指令(如
pop
、push
、jmp
)和程式流程即可。 - 常見型別:
-
ELF 相關知識
- 學習內容:
- ELF 檔案的組成部分
- 各部分的作用
- 常用的保護機制
- 學習資源:
在後續文章中會有簡單介紹
- 學習內容:
-
Linux 作業系統基礎
- 學習內容:
- 基本的 Linux 命令(如
cd
、ls
、cat
) - 系統呼叫函式(如
execve
) - glibc 庫
- 基本的 Linux 命令(如
- 學習資源:
在後續文章中會有簡單介紹
基礎要求:能夠使用基本的 Linux 命令,瞭解系統呼叫函式和 glibc 庫的基本知識。
- 學習內容:
工具和資源
-
虛擬機器和作業系統:
- 建議:搭建一個
Ubuntu
虛擬機器環境,以便除錯和解決題目。 - 儘管大部分題目都使用Ubuntu環境,但這並不意味著你必須要使用 Ubuntu 作為你的主力作業系統 。你仍舊可以選擇繼續使用你喜歡的其他 Linux 發行版(如,Arch、Debian、openSUSE、Fedora、NixOS 等)然後使用
Docker
來模擬Ubuntu
環境
- 建議:搭建一個
-
工具:
- IDA:逆向分析工具
- Python + pwntools:用於編寫漏洞利用指令碼
- gdb + pwndbg/peda:用於除錯二進位制檔案
- QEMU:有些題目需要它來模擬環境(對於基礎入門並不是必須的工具)
注意:入門階段不需要配置複雜的環境,基礎的除錯和利用工具足夠。
PWN 大致內容
- 棧溢位與 ROP 鏈:理解棧溢位漏洞和如何利用返回-oriented programming(ROP)來繞過安全保護機制。
- 格式化字串:學習如何利用格式化字串漏洞來進行攻擊。
- 整數安全:瞭解整數溢位等安全問題。
- 堆漏洞利用:探索如何利用堆上的漏洞進行攻擊。
- 異架構:理解不同架構(如 x86、ARM)的特點和攻擊方法。
- 核心漏洞:深入研究核心漏洞 (可能這並不基礎...)
做PWN題的大致流程
這裡使用buuctf中PWN板塊的第二題rip
為例子:BUUCTF線上評測 (buuoj.cn)
1. 下載和啟動靶機
點開題目,裡面會有一個可以下載的檔案,以及啟動靶機
四個大字。如下圖:
2. 將檔案傳入Linux虛擬機器
開啟Linux虛擬機器,下載這個附件並將這個附件傳入到Linux虛擬機器中。此時我們可以看到這個附件叫pwn1
3. 檢查二進位制檔案的安全性和架構
使用checksec
工具(安裝pwntools
後就有了)去檢視它的架構和位數以及保護開啟的情況,這裡因為是基礎題所以什麼保護都沒有
4. 反編譯和分析二進位制檔案
將檔案拖動到IDA這類反編譯工具中,對二進位制檔案進行反編譯
下圖中這個非常有魅力的女人頭像的工具就是我們的IDA
剛剛我們透過checksec
已經知道了pwn1
他是64位的,那麼就拖入64位的IDA中(其實如果你拖錯了,IDA會提示你搞錯了,所以checksec
的主要功能是檢視開啟了什麼保護)
拖入後會看到這個畫面,直接OK
就完事了
然後進入後,我們在左側的Functions欄裡面找到main函式並點選他
選中main函式後,按TAB鍵(一般在Q的左邊)或者按F5鍵,此時就會顯示偽C語言程式碼
5. 理解程式碼和找出漏洞
看懂程式碼(需要學習C語言),找出漏洞(需要學習相關的PWN知識),編寫python指令碼(需要學習python語言和使用pwntools等庫)
pwntools的使用後續會進行介紹
#PWN1 exp
from pwn import *
context.log_level = 'debug'
#io = process('./pwn1') # 本地
io = remote('node5.buuoj.cn',28735)
payload = b"A"*15
payload +=p64(0x401186)
io.sendline(payload)
io.interactive()
這裡我編寫了python指令碼,並將其命名為exp.py
6. 建立靶機並執行指令碼嘗試攻擊
- 使用
nc
:用nc
命令連線靶機(如nc node5.buuoj.cn 28735
)進行測試。- 測試指令碼:將指令碼中的地址和埠替換為靶機提供的實際地址和埠。
- 檢查結果:確認指令碼是否能正確獲取flag,解決
EOF
錯誤的問題。
點選啟動靶機
會得到一串nc地址,這個可以在Linux中使用nc
工具進行連線
這裡我們使用python指令碼去攻擊它的時候,需要將其放入python指令碼中
比如:io = remote('node5.buuoj.cn',28735)
我們嘗試執行這個指令碼
然後輸入指令cat flag就可以拿到我們想要的東西了,複製flag去平臺提交即可
如果沒有打通的話會輸出提示
[*] Got EOF while reading in interactive
表示連線斷開了,此時你輸入cat flag是沒有用的
刷題平臺推薦
BUUCTF線上評測 (buuoj.cn)
題庫 | NSSCTF
pwn.college
ctf.show
其中ctfshow
大部分題目是收費的,但是裡面的題目較為系統化,從簡單到困難,因此我個人比較推薦
學習PWN是非常漫長的過程,需要學習大量知識,以及進行大量的練習。許多難以理解的問題可能很長一段時間都無法得到解決,複雜的漏洞利用也常常想讓人放棄。所以在文章的最後我想分享翁愷老師的一段話:“計算機裡的所有東西都是人做出來的,別人能想的出來的,我也一定能想的出來。在計算機裡頭沒有任何黑魔法。所有的東西只是我現在還不知道而已,總有一天我會把所有細節所有內部的東西全都搞明白。”
參考文獻
- Pwn | 快速入門 - NewStar CTF
- Environment - CTF Wiki (ctf-wiki.org)