lea edi, dword ptr ss:[ebp-40]取地址編號賦給edi即edi = esp + 3*0x4 , 下面三條之路是一組 , stos用于將eax的值存儲到edi的地址編號中 , ecx記錄執(zhí)行次數(shù) 。每執(zhí)行一次 , ecx - 1, edi + 4(df位為0)或者edi - 4(df位為1) 。cccccccc是int 3的硬編碼int 3是端點(diǎn) , 這樣做為了防止緩沖區(qū)溢出 , 未到的棧空間都被設(shè)置為cccccccc , CPU執(zhí)行遇到這里就會將程序停下來了 。下一步mov eax, dword ptr ss:[ebp+8]是函數(shù)的第二個參數(shù) , ebp+c是函數(shù)的第一個參數(shù) , 這兩步執(zhí)行了關(guān)鍵操作 2 + 1 = 3此時函數(shù)功能就完成了 , 下面就是恢復(fù)現(xiàn)場了 , pop edi , 可分為兩步 , mov edi, espadd esp,4 , 先push的后pop然后執(zhí)行mov, esp, ebp , 即將棧指針esp下降到之前sub執(zhí)行前的位置 , 棧中的數(shù)據(jù)并沒有清除
然后pop ebp , 即將0x12ff30賦給ebp然后esp + 4 , 最后執(zhí)行retn , 相當(dāng)于pop eip即mov eip, 401171然后esp + 4 , 這個地址就很關(guān)鍵了 , 這就是我們在pwn中經(jīng)常覆蓋的返回地址 。然后返回到調(diào)用者中執(zhí)行 , 但是需要注意此時esp與剛開始不一樣 , 還沒有平衡堆棧 , 由上圖下面的add esp, 8用于平衡堆棧 , 這種方式就叫外平棧 。

文章插圖

文章插圖
要覆蓋返回地址 , 即
ebp + 4 , 覆蓋了ebp之后還需要再覆蓋ebp + 4的位置 , 64位下為ebp + 8 , 如上圖所示401171即為返回地址裸函數(shù)示例leave指令相當(dāng)于這兩條指令:movl %ebp, %esp即令esp=ebppopl %ebp 即 ebp = M[esp] , esp = esp + 4
int __declspec(naked) plus(){__asm{//在函數(shù)調(diào)用之前會先push 1 push 2(傳參數(shù))call后會執(zhí)行push 返回地址//保留調(diào)用前的棧底push ebp//提升堆棧mov ebp,espsub esp,0x40//保留現(xiàn)場push ebxpush esipush edi//填充緩沖區(qū)主要用于存儲函數(shù)的局部變量mov eax,0xccccccccmov ecx,0x10// 之所以是10 是因?yàn)橹疤嵘褩?x40 / 4 = 10棧一個格四個字節(jié)lea edi,dword ptr ds:[ebp-0x40]rep stosd //每次填充四個字節(jié) , 重復(fù)16次//函數(shù)的核心功能ebp + 0x4為返回地址mov eax,dword ptr ds:[ebp+0x8]//把第一個參數(shù)給eaxebp+0x4為函數(shù)返回地址add eax,dword ptr ds:[ebp+0xc]//第二個參數(shù) + eax -> eax//恢復(fù)現(xiàn)場pop edi// 取出棧頂給edi , 然后esp+4pop esi// 取出棧頂給esi , 然后esp+4pop ebx// 取出棧頂給ebx , 然后esp+4//降低堆棧mov esp,ebppop ebp//恢復(fù)棧底 , 剛開始ebp保留過ret//相當(dāng)于pop eip 把函數(shù)返回地址401171給eip然后 rsp + 4}}//裸函數(shù) , 系統(tǒng)不會生成任何指令 , 調(diào)用時會出錯 , 會導(dǎo)致指令跳轉(zhuǎn)后回不來 , 往往需要自己寫入?yún)R編指令Pwntools用法參考手冊- 連接:本地process()、遠(yuǎn)程remote( , );對于remote函數(shù)可以接url并且指定端口
- 數(shù)據(jù)處理:主要是對整數(shù)進(jìn)行打包:p32、p64是打包為二進(jìn)制 , u32、u64是解包為二進(jìn)制
- 設(shè)置目標(biāo)系統(tǒng)架構(gòu)及操作系統(tǒng)
經(jīng)驗(yàn)總結(jié)擴(kuò)展閱讀
- 四十一 增刪查改分頁 Java開發(fā)學(xué)習(xí)----MyBatisPlus標(biāo)準(zhǔn)數(shù)據(jù)層開發(fā)
- 中 學(xué)習(xí)ASP.NET Core Blazor編程系列十——路由
- CC1,3,6回顧
- 圖學(xué)習(xí)【參考資料2】-知識補(bǔ)充與node2vec代碼注解
- 二十四 設(shè)計(jì)模式學(xué)習(xí):Spring 中使用到的設(shè)計(jì)模式
- Java安全之CC3
- TensorFlow深度學(xué)習(xí)!構(gòu)建神經(jīng)網(wǎng)絡(luò)預(yù)測股票價(jià)格!?
- JUC學(xué)習(xí)筆記——共享模型之管程
- Seata Server 1.5.2 源碼學(xué)習(xí)
- 2022極端高溫!機(jī)器學(xué)習(xí)如何預(yù)測森林火災(zāi)?? 萬物AI
