日B视频 亚洲,啪啪啪网站一区二区,91色情精品久久,日日噜狠狠色综合久,超碰人妻少妇97在线,999青青视频,亚洲一区二卡,让本一区二区视频,日韩网站推荐

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

緩沖區(qū)溢出-CTF-PWN

撒水 ? 來源:jf_82580774 ? 作者:jf_82580774 ? 2026-05-07 14:27 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

學(xué)習(xí)地址:pan.baidu.com/s/1EzedMxjmP8lyxlJ_KMMlig?pwd=gdwa

個人視角剖析PWN棧溢出核心難點:從“崩潰”到“控制”

在二進制安全領(lǐng)域,棧溢出(Stack Overflow)是最經(jīng)典、最基礎(chǔ),也最能考驗學(xué)習(xí)者底層功底的漏洞類型。很多人對它的認知停留在“輸入超長數(shù)據(jù)覆蓋返回地址”的淺層理解上。然而,當(dāng)我真正深入PWN的世界,嘗試編寫Exploit繞過層層防護機制時,才意識到棧溢出的核心難點遠不止于此。

本文從一個學(xué)習(xí)者的個人視角出發(fā),不貼大量匯編代碼,而是剖析棧溢出利用過程中真正令人頭疼的思維斷點技術(shù)卡點,希望能幫助那些在PWN入門路上感到困惑的朋友,看清迷霧背后的本質(zhì)。

一、難點的本質(zhì):看不見內(nèi)存布局與寄存器狀態(tài)

棧溢出的第一個核心難點,在于抽象思維到具體內(nèi)存的映射。

編程時,我們習(xí)慣于變量名、函數(shù)名、指針等抽象概念。但PWN要求我們必須在腦海中時刻構(gòu)建出具體的棧幀布局圖:局部變量在哪個地址?返回地址保存在哪里?EBP/RBP寄存器指向何處?當(dāng)輸入一個200字節(jié)的字符串時,它是如何從低地址向高地址填充棧空間的?

很多初學(xué)者在學(xué)習(xí)ret2text(直接跳轉(zhuǎn)到代碼段中的后門函數(shù))時,容易犯一個根本性錯誤:他們以為只要覆蓋返回地址即可,卻忽視了棧幀平衡。實際上,當(dāng)函數(shù)返回時,不僅會彈出返回地址到EIP/RIP,還會恢復(fù)舊的EBP/RBP。如果覆蓋的數(shù)據(jù)不慎將保存的EBP也破壞成非法值,即使EIP跳轉(zhuǎn)成功,程序后續(xù)的棧行走也可能崩潰。

這個難點通過大量畫圖可以逐漸克服——每次分析漏洞時,在紙上畫出被攻擊函數(shù)的棧布局,標(biāo)注每個輸入字節(jié)對應(yīng)覆蓋哪個位置。幾個月后,這種“腦內(nèi)調(diào)試”的能力會成為本能。

二、防護機制下的“矛與盾”:需要逐層突破的壁壘

現(xiàn)代操作系統(tǒng)開啟了層層防護,使得基礎(chǔ)的棧溢出利用幾乎失效。每個防護都對應(yīng)一個需要理解并設(shè)法繞過的技術(shù)難點。

1. ASLR(地址空間布局隨機化):庫函數(shù)、?;贰⒍训刂访看芜\行都隨機化。直接硬編碼shellcode地址或system函數(shù)地址是不行的。核心難點在于:如何在沒有泄漏的情況下獲取有效地址?解決思路通常是先利用信息泄漏漏洞(如格式化字符串、未初始化的變量)讀出某個地址,再基于固定偏移計算出所需地址。換句話說,單純的棧溢出往往不夠,還需要信息泄漏原語配合。

2. NX(數(shù)據(jù)執(zhí)行保護):棧內(nèi)存不可執(zhí)行。Shellcode放在棧上跳轉(zhuǎn)過去沒有意義。核心難點:如何讓程序執(zhí)行已有代碼(如libc中的system或execve)?這就引出了ret2libc技術(shù)——需要知道libc基址,且需要布置函數(shù)參數(shù)到正確寄存器或棧上。難點升級為:參數(shù)如何傳遞(32位棧傳參、64位寄存器優(yōu)先)?如果system函數(shù)地址含有x00字節(jié)怎么辦?這些都涉及到對調(diào)用約定的精細控制。

3. Canary(棧 cookies):函數(shù)序言時在棧上放置一個隨機值,返回前檢查是否被修改。這是最令人頭疼的防護。直接覆蓋返回地址必然同時覆蓋canary,觸發(fā)__stack_chk_fail。核心難點:如何在不觸發(fā)檢測的情況下繞過canary?常見思路包括:泄漏canary值(通過同時存在的其他漏洞,或者按字節(jié)爆破)、攻擊線程存儲的canary副本、或者覆蓋異常處理句柄而非返回地址。但無論如何,canary的存在迫使攻擊者從“單步覆蓋”升級為“多階段信息搜集”。

三、64位與32位的差異:寄存器的陌生世界

從32位轉(zhuǎn)向64位,棧溢出利用的難度陡增。32位下函數(shù)參數(shù)全部壓棧,覆蓋返回地址后直接在棧上布置參數(shù)即可。而64位遵循System V調(diào)用約定:前六個整數(shù)或指針參數(shù)依次通過RDI、RSI、RDX、RCX、R8、R9傳遞,多出的參數(shù)才壓棧。

這意味著:僅僅覆蓋返回地址調(diào)用system還不夠,還需要控制RDI寄存器指向"/bin/sh"字符串。核心難點:如何控制寄存器?這就需要ROP(返回導(dǎo)向編程)——尋找程序中的pop rdi; ret等指令片段(gadget),將它們串聯(lián)起來。第一步是溢出后跳轉(zhuǎn)到pop rdi的地址,將棧上的下一個值("/bin/sh"地址)彈出到RDI,再執(zhí)行ret跳轉(zhuǎn)到system。這個過程必須精確計算棧指針的移動,稍有不慎就會導(dǎo)致段錯誤。

尋找gadget、計算偏移、構(gòu)造ROP鏈,是64位棧溢出利用的核心門檻。它要求學(xué)習(xí)者對指令編碼和棧的變化有精確的理解。

四、調(diào)試能力的瓶頸:紙上談兵終覺淺

所有理論在遇到實際二進制時,都會受到嚴(yán)峻考驗。真正的難點在于:如何確認exploit失敗的原因?

是覆蓋的偏移算錯了?是ROP鏈中某個gadget地址含有x0a導(dǎo)致輸入函數(shù)截斷?還是system成功執(zhí)行但shell一閃而過(因為標(biāo)準(zhǔn)輸入輸出被重定向)?新手往往面對Program received signal SIGSEGV束手無策。

我個人的經(jīng)驗證明,突破瓶頸的唯一方法是耐心地在調(diào)試器(GDB + pwndbg/peda)中單步跟蹤。觀察每個push、pop、ret指令后RSP和RIP的變化;查看info registers確認寄存器是否為預(yù)期值;用tele命令查看棧上數(shù)據(jù)布局。無數(shù)次踩過坑,再回頭查閱調(diào)用約定、字節(jié)序、內(nèi)存布局等基礎(chǔ)概念,才能真正理解漏洞利用的底層邏輯。

五、刻意練習(xí):從“跟著寫”到“獨立推導(dǎo)”

最后一個核心難點,也是學(xué)習(xí)者最容易忽視的:如何形成獨立分析漏洞的能力

觀看教學(xué)視頻時,師傅直接給出了偏移量、gadget地址和exploit代碼,一切行云流水。但輪到自己操作一個陌生的程序時,卻無從下手。這是因為在跟隨過程中沒有主動思考:為什么偏移是40字節(jié)而不是44?為什么選這個gadget而不選另一個?ROPgadget出來的地址如何驗證是否真的可用?

要跨過這道坎,必須進行刻意練習(xí)。拿到一個CrackMe或CTF題目后,盡量不要直接看Writeup,嘗試完成以下步驟:

自己計算偏移:用pattern create和pattern offset,或用手工輸入遞增字符串,通過崩潰時的RIP值反推偏移。

手動搜集gadget:用ROPgadget --binary 輸出所有結(jié)果,自己篩選需要的pop rdi; ret。然后結(jié)合二進制文件的基址(沒有PIE時直接使用)構(gòu)造ROP鏈。

構(gòu)建最小poc:先用最簡單的方式(如ret2text)驗證偏移是否正確;再升級到ret2libc或ROP鏈。每一步失敗了,就回到調(diào)試器找原因。

這個過程很煎熬,但只有走過幾次完整的獨立推導(dǎo),才能將零散的知識點串聯(lián)成動態(tài)的、可操作的漏洞利用方法論。

結(jié)語

棧溢出雖然經(jīng)典,但它的核心難點始終圍繞著內(nèi)存布局的可視化、防護機制的對抗策略、64位調(diào)用約定的控制、以及調(diào)試能力的耐心磨練。從“讓程序崩潰”到“精確控制它的執(zhí)行流”,這是一場對底層知識、逆向思維和調(diào)試功力的綜合考驗。

PWN的學(xué)習(xí)沒有捷徑。那些令人頭疼的SIGSEGV、錯位的棧幀、難以尋覓的gadget,都是走向深層理解的必經(jīng)路標(biāo)。每當(dāng)在黑暗中摸索并最終成功彈出Shell的那一刻,你會感到之前所有的掙扎都是有價值的。而你也在這一過程中,真正掌握了棧溢出利用的精髓。

審核編輯 黃宇

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • PWN
    PWN
    +關(guān)注

    關(guān)注

    0

    文章

    14

    瀏覽量

    17060
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評論

    相關(guān)推薦
    熱點推薦

    DMA傳輸完成通知未在S32K324上的半滿緩沖區(qū)時觸發(fā),為什么?

    S32K344發(fā)生第一次中斷時(半緩沖區(qū)已滿并發(fā)生中斷): 第一次中斷發(fā)生時S32K324: 我使用以下代碼片段來配置 DMA 傳輸: K344 上的 TCD: TCD 對S32K324:
    發(fā)表于 04-02 08:10

    C語言的緩沖區(qū)(緩存)詳解

    緩沖區(qū)又稱為緩存,它是內(nèi)存空間的一部分。也就是說,在內(nèi)存空間中預(yù)留了一定的存儲空間,這些存儲空間用來緩沖輸入或輸出的數(shù)據(jù),這部分預(yù)留的空間就叫做緩沖區(qū)。   緩沖區(qū)根據(jù)其對應(yīng)的是輸入設(shè)
    發(fā)表于 01-14 07:30

    CW32L052串口的緩沖區(qū)機制

    默認緩沖區(qū)配置 CW32L052的UART模塊支持硬件FIFO(通常為16字節(jié)),但HAL庫或用戶代碼需手動管理接收緩沖區(qū)。若未顯式分配足夠大的軟件緩沖區(qū),可能導(dǎo)致數(shù)據(jù)溢出。 HAL庫
    發(fā)表于 11-24 06:40

    飛凌嵌入式ElfBoard-標(biāo)準(zhǔn)IO接口之設(shè)置緩沖區(qū)

    1.setvbuf 用于以對文件的 stdio 緩沖區(qū)進行設(shè)置,譬如緩沖區(qū)緩沖模式、緩沖區(qū)的大小、起 始地址等。 1)頭文件 #include 2)函數(shù)原型 int setvbuf
    發(fā)表于 11-14 09:02

    【道生物聯(lián)TKB-623評估板試用】+3、模塊深度測評:高頻率數(shù)據(jù)傳輸?shù)?b class='flag-5'>緩沖區(qū)陷阱與優(yōu)化方案

    建議 不要假設(shè)AT_OK代表發(fā)送完成 必須處理 +SEND_FINISH事件 合理設(shè)計發(fā)送頻率,避免緩沖區(qū)溢出 2. 性能優(yōu)化要點 異步模式最大連續(xù)發(fā)送頻率:約6-7包/秒 同步模式取決于時隙配置 實際
    發(fā)表于 10-15 19:29

    移植的lvgl,在運行的時候,緩沖區(qū)無法釋放怎么解決?

    代碼在運行的時候,只有l(wèi)vgl線程用于刷新,另一個線程只有一個串口打印。 當(dāng)運行一段時間后,發(fā)現(xiàn),程序會在LVGl中,lv_refr.c這個庫下面第625行代碼, 在這一直判斷,看介紹說是在等待釋放緩沖區(qū),求大神給個思路
    發(fā)表于 09-09 07:28

    如何清除CYUSB3014的緩沖區(qū)數(shù)據(jù)?USB接口數(shù)據(jù)什么時候發(fā)送到電腦?

    、如何清除GPIF II接口處對應(yīng)的DMA BUFFER數(shù)據(jù)?當(dāng)標(biāo)志設(shè)置為滿/非滿狀態(tài)時,一旦 DMA 緩沖區(qū)已滿,標(biāo)志信號就會指示它已滿。清除DMA緩沖區(qū)數(shù)據(jù)后,相應(yīng)的標(biāo)志信號會改變嗎?會不會變成非滿狀態(tài)
    發(fā)表于 07-18 07:58

    USB緩沖區(qū)中的內(nèi)容滿了之后,是否有標(biāo)志位進行反饋?

    USB緩沖區(qū)中的內(nèi)容滿了之后,是否有標(biāo)志位進行反饋。
    發(fā)表于 07-17 07:13

    請問USB緩沖區(qū)取數(shù)據(jù)可以多次取嗎?

    在使用USB軟件獲取數(shù)據(jù)是,下位機給我發(fā)送了13個32位數(shù)據(jù)到USB IN緩沖區(qū),為什么我調(diào)用API函數(shù)想要第一次取1個32位數(shù)據(jù),取完之后再取12位數(shù)據(jù),程序會卡死。
    發(fā)表于 07-16 08:12

    socket緩沖區(qū)溢出的原因?怎么解決?

    我在測試視頻通話時 發(fā)現(xiàn)丟幀特別嚴(yán)重 進行了一些列的排查 發(fā)現(xiàn)socket本身似乎有問題 通過測試代碼發(fā)現(xiàn)了大量的緩沖區(qū)溢出我嘗試換了不同的服務(wù)器 我還分別測試了wifi網(wǎng)卡和4G網(wǎng)卡 全都這樣
    發(fā)表于 06-19 06:34

    解析RZ/N2L CANFD模塊的緩沖區(qū)機制(2)

    在工業(yè)自動化、智能交通、機器人等領(lǐng)域,CANFD(CAN with Flexible Data-Rate)技術(shù)正逐步取代傳統(tǒng)CAN,以適應(yīng)更高的數(shù)據(jù)速率和更復(fù)雜的通信需求。本文將深入解析RZ/N2L CANFD模塊的緩沖區(qū)機制,幫助工程師更高效地管理CAN消息,提高系統(tǒng)性能。
    的頭像 發(fā)表于 05-19 14:13 ?1655次閱讀
    解析RZ/N2L CANFD模塊的<b class='flag-5'>緩沖區(qū)</b>機制(2)

    解析RZ/N2L CANFD模塊的緩沖區(qū)機制(1)

    在工業(yè)自動化、智能交通、機器人等領(lǐng)域,CANFD(CAN with Flexible Data-Rate)技術(shù)正逐步取代傳統(tǒng)CAN,以適應(yīng)更高的數(shù)據(jù)速率和更復(fù)雜的通信需求。本文將深入解析RZ/N2L CANFD模塊的緩沖區(qū)機制,幫助工程師更高效地管理CAN消息,提高系統(tǒng)性能。
    的頭像 發(fā)表于 05-19 14:10 ?1484次閱讀
    解析RZ/N2L CANFD模塊的<b class='flag-5'>緩沖區(qū)</b>機制(1)

    FX3 Socket緩沖區(qū)切換的最大時間是多少?

    FX3_Programmers_Manual 文檔的第 10 章提到“每個緩沖區(qū)緩沖區(qū)切換開銷為 550 - 900 ns”。 Getting_Started_with_EZ-USB_FX3 文檔
    發(fā)表于 05-16 07:51

    在傳輸DMA通道中的所有緩沖區(qū)后,DMA標(biāo)志(就緒和部分)被卡住了是怎么回事?

    是,旗幟最初的表現(xiàn)是正確的。 它們被配置為 ACTIVE HIGH 標(biāo)志,初始值設(shè)為 LOW。 整個 DMA 通道默認使用兩個 DMA 緩沖區(qū)。 傳輸開始時,第一個緩沖區(qū)被正確填滿:部分標(biāo)志(標(biāo)志 b
    發(fā)表于 05-16 07:18

    DMA緩沖區(qū)設(shè)置為48K,如果沒有寫滿48K,數(shù)據(jù)會自動被發(fā)送出去嗎?

    請問我的DMA緩沖區(qū)設(shè)置為48K,如果沒有寫滿48K,數(shù)據(jù)會自動被發(fā)送出去嗎。2.有沒有清空DMA緩沖區(qū)的函數(shù),我直接調(diào)用CyU3PUsbFlushEp()不起作用。
    發(fā)表于 05-09 06:21
    屏东县| 英山县| 襄汾县| 余庆县| 洛南县| 都兰县| 南宫市| 灵武市| 新野县| 克什克腾旗| 景洪市| 扎鲁特旗| 小金县| 武乡县| 长岛县| 潜江市| 黔西县| 徐州市| 延津县| 本溪| 海淀区| 安新县| 兰溪市| 拜泉县| 库伦旗| 同仁县| 北海市| 鄄城县| 原阳县| 南皮县| 惠州市| 钦州市| 车险| 晋江市| 合作市| 松原市| 当涂县| 宝应县| 樟树市| 辰溪县| 奉节县|