2012-11-09 25 views
-7
  1. 代碼中的錯誤在buf = malloc(1)之後,爲什麼在buf [16]被覆蓋之前不會拋出guard頁面異常?

    int main() 
    { 
        void *ptr = 0;  
        int overrun = 1; 
        ptr = malloc(overrun); 
        while(overrun++) 
        { 
         if(!ptr) 
          while(1) Sleep(500); 
         *((char*)ptr + (overrun+1)) = 'a'; 
         printf("\n%d\n",overrun); 
        } 
        return 0; 
    } 
    
  2. 從Visual Studio 2010的項目菜單確信的版本是 「釋放」 和 「64」(機X64)

  3. 啓用整頁堆

    gflags /p /enable test.exe /full 
    
  4. 製作的WinDbg默認調試

    E:\installed\Debugging Tools for Windows (x64)>windbg -I 
    
  5. 運行代碼從cmd單獨的EXE而不調試器

    輸出:

    2 
    3 
    4 
    5 
    6 
    7 
    8 
    9 
    10 
    11 
    12 
    13 
    14 
    

    之後windbg中看出捕捉腐敗。我認爲整頁堆是假設立即發現腐敗。

    任何意見,爲什麼整頁堆很爛?

+2

有人嗎? 或者我應該問「heapoverrun.com」 得到它XD – user1813004

回答

30

由於需要堆分配給對準,不交叉的取向邊界不能在發生超限因爲存儲器保護是頁粒狀,不字節粒狀的時間被捕獲的膨脹率。這是一個硬件限制。釋放內存時會檢測到溢出並檢查尾部字節是否被篡改。

(順便說一句,說的東西很爛使得它不太可能你指責吸吮的人會費心幫助你解決問題。只是一個提示。)

+0

如果您使用'/ unaligned',那麼您告訴堆放棄其對齊要求。如果你這樣做了,那麼你最終可以以字節爲單位,但它也會打破堆合約。 (例如,使用SSE的代碼可能會由於錯位導致崩潰。)如果您可以忍受這種規則破壞,那就堅持下去。 –

+0

omg,你的意思是SSE指令調用者會盲目地使用內存指針而不檢查對齊要求嗎? – user1813004

+0

malloc從CRT堆(Windows)不授予任何對齊,SSE語句因此是假的 – user1813004

5

要在雷蒙德的響應擴大。如果你在調試器中查看通過malloc返回的原始指針,你會發現它在頁面末尾有16個字節。這是因爲x64上的HeapAlloc對齊要求是16字節。所以它把你要求的1個字節儘可能地放在頁面的末尾。一旦你離開你錯誤的頁面的末尾。

相關問題