作者 主題: [轉貼]INTEL 晶片的BUG  (閱讀 2632 次)

0 會員 與 1 訪客 正在閱讀本文。

Demon

  • 可愛的小學生
  • *
  • 文章數: 9
    • 檢視個人資料
[轉貼]INTEL 晶片的BUG
« 於: 2003-08-25 04:03 »
轉帖至: 綠盟科技
作者: 袁仁廣(袁哥)
一些INTEL的PIII、PII晶片的call esp指令有BUG,導致call esp會出現不可預料的結果,害得寫溢出程式利用call esp的通用跳轉位址在有缺陷的晶片上不可用。大家去找INEL賠償吧。:)

      INTEL自己的文檔有相關介紹,可以搜索call esp,下面文檔的第39頁有相關說明。其實INTEL的BUG也挺多的。
http://www.intel.com/design/PentiumIII/specupdt/24445348.pdf
不是所有的,只是部分PIII,PII有BUG。其實INTEL晶片386還是什麼的就是跳轉到ESP而不是ESP-4了。其實就是EIP賦值順序的問題。

     老的8086和有BUG的PIII晶片
     CALL ESP 執行的微代碼是:

     esp-=4;
       [esp]=返回地址;
     eip=esp;
     
      沒有問題晶片執行CALL ESP 的微代碼是:

     eip=esp;
       esp-=4;
       [esp]=返回地址;

    有問題的晶片執行CALL ESP後EIP指向的就是返回位址了,這不同地方的call不同,返回位址也不應該當指令來執行,顯然那種邏輯是錯誤的,所以INTEL就列為了BUG。

底下為測試程式:
/*
   intel call esp bug test.c

*/
#include <windows.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv)
{

    printf("\r\nINTEL CALL ESP BUG TEST!\r\n");
    printf("\r\nyuange@nsfocus.com\r\n");

    __try
    {    
          _asm
          {
             sub esp,0x10
             mov byte ptr[esp],0xc3  //ret
             call esp
             add esp,0x10
          }
          printf("\r\nNO BUG!\r\n");

    }__except(1)
    {
          printf("\r\nFIND BUG!\r\n");
    }

   

}