為什麼heap spary要用0x0C0C0C0C這個奇怪的數字?
01-08
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即可。推薦閱讀:
※中國黑客和美國黑客哪個更厲害?
※黑客是一種職業嗎?
※一些牛逼的編程高手每天的生活是怎樣?
※中國的頂級黑客在國際上是一個什麼樣的水平?
※黑客如何學起?