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