什麼是 0xdeadbeef ?

什麼是 0xdeadbeef ?

最近在做題的時候,遇到將返回地址覆寫爲 0xdeadbeef 。疑問着這是什麼,這裏就簡單記錄一下。

0xdeadbeef 是一個16進制魔術數字,是一種類似Leet的英文單詞轉寫形式。

起源

Hexspeak最早是程序員用來清晰獨特地標記內存數據的一些魔術數字,使用以0-9與A-F構成的16進制數表示一些簡單的英文單詞。Hexspeak的轉寫規則爲:數字“0”表示字母“O”,“1”表示“I”或“L”,“5”表示“S”,“7”表示“T”,“6”、“9”則各自表示“G”與“g”,其它的數字則可利用畫謎Leet的規則來借代字母,例如“defecate”就可用“DEFECA7E”或“DEFEC8”來表示。

更多的魔術數

16進制魔術數在許多處理器操作系統調試工具中都得到應用,且尤常作爲調試量使用。

  • 0x0000000FF1CE是微軟Office組件產品代碼的最後一部分,可於註冊表的HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall的鍵值中尋得。

  • 0x00BAB10C(oo-ba-block)在ZFS的uberblock裏使用。

  • 0x1BADB002(“I bad boot”)爲多重引導標頭。[1]

  • 0x8BADF00D(“ate bad food”)爲iOS應用程序崩潰報告中的超時標識符,一般在程序運行、終止與響應時停滯太久時出現。[2]

  • 0xBAADF00D(“bad food”)在微軟的LocalAlloc(LMEM_FIXED)函數中使用,用以在已啓用調試堆的情況下,標識未初始化的分配堆內存。[3]

  • 0xCAFEBABE(“cafe babe”)在Mach-O格式文件中用於標識通用二進制目標文件,同時也在Java中用於識別Java字節碼類文件。[4]

  • 0xCAFED00D(“Cafe Dude”)在Java中用於識別Pack200壓縮格式。[5]

  • 0xD15EA5E(“disease”)是任天堂GameCubeWii控制檯正常啓動的標識符。[6][7]

  • 0xDEADBABE(“Dead Babe”)在IBMJikes研究虛擬機上使用,用於確認主線程的棧是否正常。[8]

  • 0xDEADBEEF(“dead beef”)在嵌入式系統中常用於標示軟件崩潰或是死鎖,在IBM RS/6000系統、32位PowerPC處理器上的Mac OS系統以及Commodore InternationalAmiga電腦上都有使用;而在SunSolaris操作系統中,這一魔術數則用於標記已釋放的內核存儲空間。另外,在Alpha處理器上的OpenVMS操作系統中,按下CTRL+T就可以看到DEAD_BEEF。DEC Alpha的存儲資源管理控制檯亦有一個用於檢測內存錯誤的後臺進程,PS識別爲“BeefEater waiting on 0xdeadbeef”[9]

  • 0xDEADDEAD(“dead dead”)是藍屏時顯示的錯誤代碼[10] 。由於此代碼在基於Windows NT的系統上用於進行內存轉儲,因而常爲驅動開發者所見。0xDEADDEAD還有一個變種──0x000000E2[11],這兩者在微軟開發者網絡中都被稱爲MANUALLY_INITIATED_CRASH。

  • 0xDEADFA11(“dead fall”)爲iOS應用程序崩潰報告中的“強制終止應用程序”的標識符。[2]

  • 0xDEFEC8ED(“defecated”)在OpenSolaris核心文件中使用。[12]

  • 0xE011CFD0在微軟Office文件中使用,小端序下表示爲D0CF11E0,也即“docfile0”。[13]

  • 0xFACEFEED(“face feed”)在運行Windows NT的Alpha服務器上使用,也即當出現硬件錯誤時,Alpha的硬件抽象層就會產生這一錯誤信號。[14]

  • 0xFEE1DEAD(“feel dead”)是Linux重啓系統調用中使用的魔術數。[15]

  • C15C:0D06:F00D(cisco dog food)於世界IPv6日在www.cisco.com的IPv6地址中使用。“Dog food”指的就是就是Cisco在IPv6上“eating its own dog food”(也即用自家的設備)的做法。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章