菜鳥筆記之PWN入門(1.0.0)前言

XiDP發表於2024-09-17

什麼是 PWN?

PWN 是駭客術語中的俚語,是指攻破裝置或者系統。它的發音類似於“砰”,當然也有師傅把它叫作“胖”。PWN 的目標是獲取系統的控制權或執行未經授權的操作。

如何入門 PWN

前置知識

  1. C 語言

    • 學習內容
      • 程式結構和基礎語法
      • 資料型別、分支語句(如 ifswitch)和迴圈(如 forwhile
      • 指標和結構體
    • 學習資源
      • 浙江大學翁愷教你 C 語言程式設計
      • C 語言教程 | 菜鳥教程
  2. Python 語言

    • 學習內容
      • 程式結構和基礎語法
      • 迴圈(forwhile)和異常處理(如 try
    • 學習資源
      • Python3 教程 | 菜鳥教程
      • 超基礎 Python 課程

    建議:掌握 C 語言後,可以直接用文章進行 Python 的學習,進度會更快。

  3. 組合語言

    • 常見型別
      • x86 彙編:Intel 和 AMD 的處理器架構
      • ARM 彙編:用於移動裝置
      • MIPS 彙編:用於嵌入式系統
      • PowerPC 彙編:曾用於蘋果計算機
      • RISC-V 彙編:開源架構,逐漸獲得關注
    • 學習資源
      • 《組合語言》速成指南
      • 通俗易懂的組合語言(王爽老師的書)

    基礎要求:理解基本的彙編指令(如 poppushjmp)和程式流程即可。

  4. ELF 相關知識

    • 學習內容
      • ELF 檔案的組成部分
      • 各部分的作用
      • 常用的保護機制
    • 學習資源
      在後續文章中會有簡單介紹
  5. Linux 作業系統基礎

    • 學習內容
      • 基本的 Linux 命令(如 cdlscat
      • 系統呼叫函式(如 execve
      • glibc 庫
    • 學習資源
      在後續文章中會有簡單介紹

    基礎要求:能夠使用基本的 Linux 命令,瞭解系統呼叫函式和 glibc 庫的基本知識。

工具和資源

  1. 虛擬機器和作業系統

    • 建議:搭建一個 Ubuntu 虛擬機器環境,以便除錯和解決題目。
    • 儘管大部分題目都使用Ubuntu環境,但這並不意味著你必須要使用 Ubuntu 作為你的主力作業系統 。你仍舊可以選擇繼續使用你喜歡的其他 Linux 發行版(如,Arch、Debian、openSUSE、Fedora、NixOS 等)然後使用 Docker 來模擬 Ubuntu 環境
  2. 工具

    • 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)

相關文章