為什麼heap spary要用0x0C0C0C0C這個奇怪的數字?


0x0C0C0C0C 作為地址,指向了 Heap Spary 分配到的內存;作為指令,是 or al,0x0C,在任何環境下都不會直接引發異常,和 NOP 一樣可作為 sled 填充——這點在 DEP 環境下並不重要,但在當年無 DEP 的環境下,幾乎完全不懂漏洞原理的人,知道去 Heap Spary 0x0C0C0C0C 就能搭積木一樣寫出 Exploit,而且還很通用。

當然,並不一定非得用 0x0C0C0C0C。


原因很簡單,因為在DEP出現之前堆噴是一種不精準的技術。就是說它需要一段滑板指令來增大靶子的面積。在這種情況下就需要一個值,當它是地址時是我們的堆噴可以抵達的,當它是指令時是可以當成滑板指令不影響執行的。所以0x0C0C0C0C就成為了通用地址。

那麼為什麼nop這種在棧中常用的滑板指令不行?你可以想一下c++虛表訪問的情形(比如堆噴最常見的ie中的利用),比如

mov eax,[ecx]

call [eax+4]

如果你用nop填充就會跳到90909090。

所以很多時候也並沒有必要用0x0C0C0C0C,如果只是為了給shellcode找一個穩定的地址那麼找一個堆噴可到達地址。使用nop滑板指令+shellcode即可。


推薦閱讀:

中國黑客和美國黑客哪個更厲害?
黑客是一種職業嗎?
一些牛逼的編程高手每天的生活是怎樣?
中國的頂級黑客在國際上是一個什麼樣的水平?
黑客如何學起?

TAG:破解 | 黑客Hacker | 二進位 | 緩衝區溢出 | 安全漏洞 |