戰(zhàn):從CTF到真實(shí)攻防的破解之道)
1. 項(xiàng)目概述從賽場(chǎng)到實(shí)戰(zhàn)的逆向與加密攻防最近幾年數(shù)據(jù)安全相關(guān)的競(jìng)賽越來越火題目也愈發(fā)貼近真實(shí)世界的攻防場(chǎng)景。我參加過不少這類比賽也帶過一些新人隊(duì)伍發(fā)現(xiàn)很多朋友在面對(duì)涉及逆向工程和加密算法破解的題目時(shí)常常感到無從下手。要么是卡在復(fù)雜的代碼混淆里要么是對(duì)著一堆加密數(shù)據(jù)干瞪眼不知道從哪里開始分析。這個(gè)項(xiàng)目就是想結(jié)合我自己的實(shí)戰(zhàn)經(jīng)驗(yàn)把那些在賽場(chǎng)上和實(shí)際工作中真正管用的技巧掰開揉碎了講清楚。它不是一本教科書更像是一份“戰(zhàn)地筆記”記錄了我們?nèi)绾螐囊粋€(gè)加密的二進(jìn)制程序或者一段網(wǎng)絡(luò)流量中一步步抽絲剝繭最終拿到明文數(shù)據(jù)或者關(guān)鍵邏輯的過程。逆向工程和加密算法破解聽起來很高深其實(shí)核心思路就是“理解與對(duì)抗”。你需要理解程序或協(xié)議原本的設(shè)計(jì)邏輯它是怎么保護(hù)數(shù)據(jù)的然后找到其設(shè)計(jì)或?qū)崿F(xiàn)上的薄弱點(diǎn)進(jìn)行對(duì)抗。無論是CTFCapture The Flag比賽中的一道Reverse逆向或Crypto密碼學(xué)題目還是安全評(píng)估中對(duì)一個(gè)客戶端軟件的分析其方法論都是相通的。我們會(huì)從最基礎(chǔ)的靜態(tài)分析、動(dòng)態(tài)調(diào)試講起深入到常見的加密算法識(shí)別與手工推導(dǎo)最后再聊聊如何應(yīng)對(duì)一些高級(jí)的混淆和對(duì)抗技術(shù)。目標(biāo)很明確讓你看完之后再遇到一個(gè)加了密的“黑盒子”能有一套清晰的思路和工具鏈去搞定它。2. 逆向工程基礎(chǔ)靜態(tài)分析與動(dòng)態(tài)調(diào)試的黃金組合逆向工程的第一步永遠(yuǎn)是“觀察”。在你動(dòng)手運(yùn)行或修改任何代碼之前盡可能多地收集信息這能節(jié)省你大量的時(shí)間。2.1 靜態(tài)分析像法醫(yī)一樣檢查“尸體”靜態(tài)分析就是在程序不運(yùn)行的情況下對(duì)其二進(jìn)制文件或代碼進(jìn)行剖析。這是你的第一把手術(shù)刀。工具選擇與初步探查對(duì)于Windows的PE文件.exe, .dllPEiD或Exeinfo PE是快速檢查文件是否被加殼保護(hù)的好工具。如果顯示是UPX、ASPack等常見殼通??梢韵葒L試脫殼。對(duì)于Linux的ELF文件file和strings命令是第一步。file命令告訴你文件的基本信息strings則可以提取文件中所有可打印的字符串奇跡往往就藏在這里——比如硬編碼的密碼、調(diào)試信息、特殊的URL或提示語。注意很多CTF題目會(huì)故意留一些“提示字符串”但真正的惡意軟件或商業(yè)軟件會(huì)刻意清除這些信息。strings的輸出可能很長要學(xué)會(huì)用grep進(jìn)行過濾例如strings target.exe | grep -i “key”或strings target.exe | grep -i “flag”。接下來你需要一個(gè)反匯編器/反編譯器。IDA Pro是行業(yè)標(biāo)桿但其免費(fèi)版IDA Freeware功能也足夠強(qiáng)大。GhidraNSA開源和Binary Ninja是強(qiáng)有力的替代品尤其是Ghidra完全免費(fèi)且反編譯效果出色。我的習(xí)慣是用IDA進(jìn)行主流程的圖形化分析它的流程圖視圖無可替代用Ghidra輔助閱讀反編譯的C代碼。分析入口與核心邏輯定位對(duì)于控制臺(tái)程序重點(diǎn)通常是main函數(shù)。對(duì)于圖形界面程序可能是WinMain或特定的消息處理函數(shù)。在逆向分析時(shí)要快速定位到處理用戶輸入和產(chǎn)生輸出的關(guān)鍵代碼區(qū)域。一個(gè)常見的技巧是在strings輸出中找到程序運(yùn)行時(shí)打印的提示語如“Please input your password:”然后在反匯編器中查找引用cross-reference, xref這個(gè)字符串的代碼位置這里往往就是核心邏輯的開始。2.2 動(dòng)態(tài)調(diào)試讓程序“活”著接受審訊靜態(tài)分析能給你藍(lán)圖但動(dòng)態(tài)調(diào)試能讓你看到程序運(yùn)行時(shí)每一刻的狀態(tài)——寄存器、內(nèi)存、棧的變化。這是理解復(fù)雜邏輯和驗(yàn)證猜測(cè)的必經(jīng)之路。調(diào)試器配置與技巧x64dbg/OllyDbgWindows和GDBLinux是動(dòng)態(tài)調(diào)試的利器。在調(diào)試前有幾個(gè)關(guān)鍵設(shè)置設(shè)置符號(hào)路徑如果有可能這能讓調(diào)試器顯示函數(shù)名而非晦澀的地址。下斷點(diǎn)策略不要盲目下斷點(diǎn)。通常先在GetDlgItemText、scanf、fgets等輸入函數(shù)或strcmp、memcmp等比較函數(shù)上下斷點(diǎn)。在CTF中比較輸入與內(nèi)置密碼或flag的代碼段是突破口。內(nèi)存與寄存器監(jiān)控重點(diǎn)關(guān)注棧ESP/EBP, RSP/RBP和通用寄存器EAX, EBX等。在比較函數(shù)執(zhí)行前后觀察哪個(gè)寄存器或內(nèi)存地址存放著你的輸入哪個(gè)存放著正確的值。一個(gè)實(shí)戰(zhàn)心法我經(jīng)常使用“差分調(diào)試”法。準(zhǔn)備兩個(gè)不同的輸入比如“AAAA”和“BBBB”在相同的代碼路徑上單步執(zhí)行觀察內(nèi)存和寄存器的變化差異。這能幫你快速定位出處理輸入數(shù)據(jù)的關(guān)鍵變換函數(shù)。例如你發(fā)現(xiàn)輸入“AAAA”后某個(gè)內(nèi)存區(qū)域變成了[0x01, 0x02, 0x03, 0x04]而輸入“BBBB”后變成了[0x02, 0x03, 0x04, 0x05]這可能就是一個(gè)簡單的加1操作。動(dòng)態(tài)調(diào)試的魅力就在于你能親眼看到數(shù)據(jù)是如何被“加密”或“變形”的。3. 常見加密算法識(shí)別與手工分析套路在逆向題目中算法很少會(huì)直接告訴你“我用了AES”。你需要通過代碼特征和常數(shù)來識(shí)別它們。3.1 對(duì)稱加密算法AES、DES與流密碼AESAdvanced Encryption Standard識(shí)別AES最明顯的特征是它的S盒Substitution Box。在反編譯代碼中如果你看到一個(gè)巨大的、固定的256字節(jié)數(shù)組內(nèi)容以0x63, 0x7c, 0x77, 0x7b...開頭那么你幾乎可以肯定遇到了AES加密。AES的密鑰擴(kuò)展也會(huì)用到一系列固定的輪常數(shù)Rcon。在內(nèi)存中如果看到數(shù)據(jù)塊被分成16字節(jié)一組進(jìn)行處理并且流程中有明顯的SubBytes、ShiftRows、MixColumns、AddRoundKey等操作可能函數(shù)名被混淆但結(jié)構(gòu)可辨那基本就是AES。實(shí)戰(zhàn)案例我曾遇到一個(gè)程序它對(duì)用戶輸入進(jìn)行加密后與內(nèi)置密文比較。靜態(tài)分析發(fā)現(xiàn)一個(gè)巨大的常數(shù)數(shù)組通過搜索確認(rèn)是AES的S盒。動(dòng)態(tài)調(diào)試時(shí)我在CreateDecryptionObject之類的函數(shù)調(diào)用后下斷點(diǎn)成功在內(nèi)存中dump出了解密后的密鑰。對(duì)于簡單的CTF題有時(shí)密鑰甚至就硬編碼在代碼里。如果算法是標(biāo)準(zhǔn)的但密鑰未知可以嘗試將密文塊和可能的明文塊比如已知的固定文件頭PK\x03\x04或文本”flag{“輸入到在線AES工具進(jìn)行暴力破解或模式分析ECB、CBC等。DES與3DESDES算法會(huì)使用到初始置換表IP、擴(kuò)展置換表E、S盒8個(gè)每個(gè)是4x16的矩陣等大量固定的置換表。在二進(jìn)制中看到一連串的、看起來雜亂無章但結(jié)構(gòu)規(guī)整的查表操作很可能是DES。3DES特征類似只是加密過程重復(fù)三次。流密碼RC4、Salsa20等流密碼的特征是生成一個(gè)偽隨機(jī)的密鑰流然后與明文逐字節(jié)異或XOR。代碼中通常有一個(gè)初始化函數(shù)用密鑰初始化內(nèi)部狀態(tài)數(shù)組S如RC4的KSA然后是一個(gè)生成密鑰流的函數(shù)如RC4的PRGA。如果你在代碼中看到大量的異或操作且異或的“密鑰”是動(dòng)態(tài)生成的而非固定值那很可能就是流密碼。Salsa20/ChaCha20等現(xiàn)代流密碼會(huì)涉及較多的32位整數(shù)加、異或、循環(huán)移位操作。3.2 非對(duì)稱加密與編碼RSA與Base家族RSA算法識(shí)別RSA在題目中非常常見。它的核心數(shù)學(xué)運(yùn)算是大整數(shù)的模冪運(yùn)算。在代碼中你可能會(huì)看到直接調(diào)用BigInteger.ModPow.NET、mpz_powmGMP庫或類似的函數(shù)。更底層一點(diǎn)你會(huì)看到程序初始化了兩個(gè)非常大的素?cái)?shù)p和q計(jì)算模數(shù)N p * q歐拉函數(shù)φ(N) (p-1)*(q-1)公鑰e通常是65537和私鑰d滿足e*d ≡ 1 mod φ(N)。 識(shí)別RSA的關(guān)鍵線索代碼或數(shù)據(jù)段中存在非常大的整數(shù)幾十到幾百位十進(jìn)制數(shù)。存在“模逆元”計(jì)算。題目描述或字符串中提及“公鑰”、“私鑰”、“.pem文件”。在內(nèi)存或文件中發(fā)現(xiàn)-----BEGIN PUBLIC KEY-----或-----BEGIN RSA PRIVATE KEY-----這樣的PEM格式頭。RSA的常見攻擊場(chǎng)景CTF中RSA的考點(diǎn)很多不一定是直接破解算法那在現(xiàn)實(shí)中沒有足夠大的密鑰是不可能的而是利用其實(shí)現(xiàn)或使用上的漏洞。模數(shù)N過小可以直接用工具如yafu、factordb.com分解N得到p和q從而計(jì)算私鑰d。共模攻擊同一段明文用相同的N但不同的e加密??梢酝ㄟ^擴(kuò)展歐幾里得算法恢復(fù)明文。低加密指數(shù)攻擊如果e很小比如3且明文m也很小使得m^e N那么直接對(duì)密文c開e次方根就能得到m。維納攻擊私鑰d過小可以通過連分?jǐn)?shù)逼近來破解。 在逆向中你的任務(wù)往往是提取出這些關(guān)鍵參數(shù)N, e, c有時(shí)還有p, q然后根據(jù)場(chǎng)景選擇相應(yīng)的數(shù)學(xué)攻擊腳本Python的gmpy2庫是神器進(jìn)行解密。Base64/32/16編碼這嚴(yán)格來說是編碼而非加密但常用來混淆數(shù)據(jù)。Base64的特征是字母表A-Za-z0-9/以及填充符。在代碼中你會(huì)看到一個(gè)包含64個(gè)字符的常量字符串以及一個(gè)將每3字節(jié)映射到4字節(jié)的循環(huán)處理邏輯。識(shí)別后直接使用在線工具或編程語言標(biāo)準(zhǔn)庫解碼即可。Base32字母表A-Z2-7和Base16純十六進(jìn)制0-9A-F也類似。4. 實(shí)戰(zhàn)破解流程深度解析從黑盒到白盒讓我們通過一個(gè)虛構(gòu)但綜合的案例把上面的技巧串起來。假設(shè)我們有一個(gè)Windows控制臺(tái)程序crackme.exe運(yùn)行后提示輸入密碼錯(cuò)誤則退出。4.1 第一步信息收集與初步靜態(tài)分析首先用Exeinfo PE檢查發(fā)現(xiàn)是UPX 3.96殼。使用upx -d crackme.exe輕松脫殼。然后用strings查看... Please enter the secret key: Congratulations! The flag is: %s Wrong key! ... sUPer_S3creT_K3y_123 ... 一些亂碼字符 ...發(fā)現(xiàn)可疑字符串sUPer_S3creT_K3y_123可能是密碼或密鑰。用IDA Pro加載脫殼后的程序查找字符串引用。發(fā)現(xiàn)”Wrong key!”字符串被一個(gè)函數(shù)引用我們將其命名為check_password。4.2 第二步核心函數(shù)分析與算法識(shí)別進(jìn)入check_password函數(shù)查看反編譯代碼以Ghidra輸出為例void check_password(char *input) { char local_28[32]; int i; if (strlen(input) 16) { for (i 0; i 16; i i 1) { local_28[i] (input[i] ^ 0x55) 0x10; } if (memcmp(local_28, encrypted_flag, 0x10) 0) { printf(Congratulations! The flag is: flag{%s}\n, input); return; } } puts(Wrong key!); }分析這段代碼輸入長度必須為16。對(duì)每個(gè)輸入字符先與0x55異或然后加0x10。將變換后的結(jié)果與一個(gè)全局?jǐn)?shù)組encrypted_flag在數(shù)據(jù)段中比較。 這顯然是一個(gè)自定義的對(duì)稱加密或者說混淆算法結(jié)合了異或和加法。我們需要找到encrypted_flag的內(nèi)容。4.3 第三步動(dòng)態(tài)調(diào)試驗(yàn)證與數(shù)據(jù)提取用x64dbg加載程序在memcmp處下斷點(diǎn)。運(yùn)行程序輸入一個(gè)16字節(jié)的測(cè)試數(shù)據(jù)如AAAAAAAAAAAAAAAA。程序斷下后查看memcmp的兩個(gè)參數(shù)在x64調(diào)用約定中通常是RCX和RDX寄存器指向的內(nèi)存。RCX指向的是我們輸入經(jīng)過變換后的結(jié)果緩沖區(qū)local_28。RDX指向的就是encrypted_flag的地址。 我們?cè)趦?nèi)存窗口中查看RDX指向的16個(gè)字節(jié)假設(shè)是[0x92, 0x8f, 0x8e, 0x9d, 0x9b, 0x8a, 0x9d, 0x8e, 0x8d, 0x9c, 0x9b, 0x8a, 0x9d, 0x8e, 0x8d, 0x9c]。 同時(shí)我們可以單步執(zhí)行觀察local_28的生成過程驗(yàn)證我們的靜態(tài)分析‘A’(0x41) ^ 0x55 0x14, 0x10 0x24與內(nèi)存中看到的第一個(gè)字節(jié)0x24對(duì)應(yīng)我們輸入‘A’后的結(jié)果一致。4.4 第四步逆向算法與編寫解密腳本加密過程是C[i] (P[i] ^ 0x55) 0x10那么解密過程就是其逆運(yùn)算先減0x10再異或0x55。P[i] (C[i] - 0x10) ^ 0x55注意減法可能涉及負(fù)數(shù)在C語言中直接減可能導(dǎo)致下溢但在Python中我們可以直接使用整數(shù)運(yùn)算。另外異或操作是可逆的A ^ B ^ B A。編寫Python解密腳本encrypted_data [0x92, 0x8f, 0x8e, 0x9d, 0x9b, 0x8a, 0x9d, 0x8e, 0x8d, 0x9c, 0x9b, 0x8a, 0x9d, 0x8e, 0x8d, 0x9c] flag_chars [] for c in encrypted_data: p (c - 0x10) 0xff # 減0x10并確保在0-255范圍內(nèi) p p ^ 0x55 flag_chars.append(chr(p)) plaintext .join(flag_chars) print(fDecrypted key: {plaintext})運(yùn)行腳本得到明文密鑰輸入程序驗(yàn)證成功獲得flag。實(shí)操心得這個(gè)例子比較簡單但流程是通用的。關(guān)鍵在于識(shí)別出加密/變換的閉環(huán)。很多題目算法更復(fù)雜可能包含多輪循環(huán)、置換、查表等。動(dòng)態(tài)調(diào)試時(shí)在算法輸入原始輸入和輸出最終比較的數(shù)據(jù)處下斷點(diǎn)然后逆向單步記錄下每一個(gè)操作。把這些操作反過來就是解密算法。對(duì)于復(fù)雜的算法可以嘗試用angr這類符號(hào)執(zhí)行框架但掌握手動(dòng)分析是基礎(chǔ)。5. 高級(jí)對(duì)抗技巧與自動(dòng)化工具鏈隨著題目難度提升你會(huì)遇到代碼混淆、反調(diào)試、多線程、虛擬機(jī)保護(hù)等高級(jí)技術(shù)。5.1 應(yīng)對(duì)代碼混淆與反調(diào)試代碼混淆包括控制流扁平化、虛假指令插入、指令替換等。這會(huì)讓IDA生成的流程圖變得極其復(fù)雜像一團(tuán)亂麻。應(yīng)對(duì)策略不要試圖完全理解每一句指令。關(guān)注數(shù)據(jù)流而非控制流。找到輸入數(shù)據(jù)在哪里被讀取最終結(jié)果在哪里被比較。動(dòng)態(tài)調(diào)試可以幫你理清真實(shí)的執(zhí)行路徑。對(duì)于控制流扁平化可以嘗試使用deflat等Ghidra插件進(jìn)行還原。反調(diào)試技術(shù)程序會(huì)檢測(cè)自己是否被調(diào)試如果發(fā)現(xiàn)則改變行為或直接退出。常見手段有IsDebuggerPresent()、CheckRemoteDebuggerPresent()API調(diào)用。檢測(cè)PEB進(jìn)程環(huán)境塊中的BeingDebugged標(biāo)志。檢測(cè)硬件斷點(diǎn)、執(zhí)行時(shí)間差異等。應(yīng)對(duì)策略修改程序用IDA或x64dbg的補(bǔ)丁功能將檢測(cè)函數(shù)的調(diào)用或跳轉(zhuǎn)指令NOP掉填充為0x90。修改調(diào)試器環(huán)境使用插件如x64dbg的ScyllaHide或TitanHide可以隱藏調(diào)試器。修改內(nèi)存標(biāo)志在調(diào)試器中手動(dòng)將PEB.BeingDebugged置0。時(shí)間跳過對(duì)于通過rdtsc指令檢測(cè)時(shí)間差的可以在調(diào)試器中設(shè)置條件斷點(diǎn)在兩次rdtsc之間手動(dòng)增加計(jì)數(shù)器值。5.2 利用符號(hào)執(zhí)行與污點(diǎn)分析對(duì)于路徑爆炸海量分支的題目手動(dòng)分析不現(xiàn)實(shí)。這時(shí)可以借助自動(dòng)化工具。angr一個(gè)強(qiáng)大的二進(jìn)制分析框架支持符號(hào)執(zhí)行。你可以告訴它“從地址A開始執(zhí)行找到能使地址B的寄存器RAX值為0x12345678的輸入”。它會(huì)自動(dòng)探索路徑并求解。對(duì)于簡單的CrackMe幾行腳本就能搞定。import angr proj angr.Project(./crackme, auto_load_libsFalse) state proj.factory.entry_state() simgr proj.factory.simulation_manager(state) simgr.explore(find0x4000000x1234) # 找到成功地址 if simgr.found: print(simgr.found[0].posix.dumps(0)) # 打印成功輸入Triton另一個(gè)框架更側(cè)重于動(dòng)態(tài)符號(hào)執(zhí)行和污點(diǎn)分析。適合分析一段代碼如何處理特定的輸入數(shù)據(jù)。注意事項(xiàng)符號(hào)執(zhí)行雖然強(qiáng)大但存在路徑爆炸和環(huán)境建模兩大難題。程序如果調(diào)用未建模的系統(tǒng)函數(shù)如復(fù)雜的庫函數(shù)分析可能失敗。它通常作為輔助手段用于解決那些邏輯清晰但分支復(fù)雜的題目。5.3 構(gòu)建個(gè)人逆向工具箱效率來自于好的工具鏈。除了上述工具我的工具箱里還有這些Process Monitor/Process Hacker監(jiān)控程序的文件、注冊(cè)表、網(wǎng)絡(luò)訪問行為。有時(shí)密碼或密鑰就寫在配置文件或注冊(cè)表里。Wireshark/Fiddler如果程序有網(wǎng)絡(luò)通信抓包分析協(xié)議??赡芗用苓^程在服務(wù)器端客戶端只是發(fā)送和接收。CyberChef一個(gè)網(wǎng)頁端的“數(shù)字瑞士軍刀”支持各種編碼、解碼、加密、解密、哈希操作??焖衮?yàn)證猜測(cè)的神器。Python pwntools不僅是CTF攻防利器本地逆向時(shí)也可以寫腳本快速爆破簡單密鑰、與調(diào)試器交互等。010 Editor強(qiáng)大的二進(jìn)制文件編輯器帶有模板解析功能。對(duì)于分析自定義文件格式至關(guān)重要。6. 典型問題排查與心法總結(jié)在實(shí)際操作中你肯定會(huì)遇到各種奇怪的問題。這里記錄一些常見的“坑”和解決思路。問題1程序一運(yùn)行就崩潰無法調(diào)試??赡茉蛎摎げ徽_程序有自校驗(yàn)依賴環(huán)境缺失。排查檢查脫殼后的程序能否正常運(yùn)行。用Dependency Walker或ldd檢查依賴項(xiàng)。在調(diào)試器中在程序入口點(diǎn)Entry Point直接暫停然后單步看崩潰在哪條指令。問題2算法識(shí)別出來了比如AES但不知道密鑰和模式。策略靜態(tài)搜索在字符串、常量池中搜索可能的密鑰。密鑰可能是硬編碼的字符串也可能是通過某種計(jì)算生成的。動(dòng)態(tài)提取在標(biāo)準(zhǔn)加密函數(shù)如Windows的CryptDecrypt或OpenSSL的AES_decrypt調(diào)用前后下斷點(diǎn)。密鑰往往以某種形式存在于內(nèi)存中。已知明文攻擊如果你知道部分明文和對(duì)應(yīng)的密文比如文件頭、固定協(xié)議頭可以嘗試推導(dǎo)密鑰或驗(yàn)證加密模式ECB、CBC等。對(duì)于流密碼已知明文可以直接得到密鑰流。問題3反編譯的代碼完全看不懂函數(shù)調(diào)用關(guān)系混亂。策略重命名與注釋這是逆向中最重要的工作之一。給函數(shù)、變量起上有意義的名字如decode_buffer,validate_checksum。理清主干先忽略錯(cuò)誤處理、日志打印等分支代碼專注于主成功路徑。畫圖在紙上或白板上畫出關(guān)鍵的數(shù)據(jù)流和控制流幫助理解。動(dòng)態(tài)跟在你覺得可能是核心邏輯的地方下斷點(diǎn)看數(shù)據(jù)是怎么流動(dòng)的。逆向心法總結(jié)大膽假設(shè)小心求證先根據(jù)字符串、導(dǎo)入函數(shù)等做出初步猜測(cè)比如“這可能是個(gè)比較函數(shù)”然后用動(dòng)態(tài)調(diào)試去驗(yàn)證。由外而內(nèi)由果溯因先確定程序的最終目標(biāo)輸出什么比較什么然后一步步往回推看這個(gè)結(jié)果是怎么產(chǎn)生的。善用對(duì)比正確的輸入 vs 錯(cuò)誤的輸入加密前 vs 加密后。差異就是突破口。工具是輔助思路是關(guān)鍵不要沉迷于使用各種炫酷的工具。最重要的是培養(yǎng)分析問題和邏輯推理的能力。工具只是幫你更高效地看到數(shù)據(jù)。保持耐心和記錄逆向是個(gè)細(xì)活可能會(huì)在一條錯(cuò)誤的思路上浪費(fèi)幾個(gè)小時(shí)。隨時(shí)記錄你的發(fā)現(xiàn)和嘗試過的路徑避免重復(fù)勞動(dòng)。最后安全技術(shù)是一把雙刃劍。我們學(xué)習(xí)逆向與破解技巧是為了理解系統(tǒng)如何工作從而更好地防御和構(gòu)建安全的系統(tǒng)。請(qǐng)務(wù)必在合法授權(quán)的范圍內(nèi)進(jìn)行所有實(shí)踐例如CTF比賽、授權(quán)下的安全評(píng)估或?qū)ψ杂熊浖姆治觥⑦@些技術(shù)用于未經(jīng)授權(quán)的系統(tǒng)訪問或軟件破解不僅是非法的也違背了安全從業(yè)者的職業(yè)道德。真正的能力體現(xiàn)在用你的知識(shí)去保護(hù)而非破壞。