1、Intel現在稱其指令集為IA32,即Intel 32位體繫結構(Intel Architecture 32-bit),這個處理器也俗稱為“x86”。
2、Linux使用了平面定址方式(flat addressing),在這種定址方式中,程式員將整個儲存空間看做一個大的位元組數組。
3、在平面定址中,對特殊寄存器的需求已經大為降低了。在大多數情況下,前六個寄存器都可以看作是通用寄存器,對它們使用的沒有限制。
4、對於C語言中比如if表示式,switch,while,for迴圈等對應的彙編表示,在本書都有詳細描述,對於研究彙編寫程式有極大協助。此略。
5、一個程序呼叫包括將資料(以過程參數和傳回值的形式)和控制從代碼的一部分傳遞到另一部分。資料傳遞、局部變數的分配和釋放是通過操縱程式棧來實現的。
6、IA32程式用程式棧來支援程序呼叫。棧用來傳遞過程參數、儲存返回資訊、儲存寄存器以供以後恢複之用,以及用於本機存放區。為單個過程分配的那部分棧稱為棧幀(stack frame)。棧幀的最頂端是以兩個指標定界的,寄存器%ebp作為幀指標,而寄存器%esp作為棧指標。
7、程式寄存器組是惟一一個被所有過程共用的資源。我們必須保證當一個過程(調用者)調用另一個(被調用者)時,被調用者不會覆蓋某個調用者稍後會使用的寄存器的值。為些,IA32採用於一組統一的寄存器使用慣例:寄存器eax,edx,ecx被分為調用者儲存寄存器,當過程P調用Q時,Q可以覆蓋這些寄存器,而不會破壞任何P所需要的資料。另外,ebx,esi,edi分為被調用者儲存寄存器,意味著覆蓋他們之前,將這些寄存器的值儲存在棧中,並在返回前恢複他們。
8、在大多數現代處理器模型中,乘法指令只需要3個刻度。
9、結構的實作類別似於數組的實現,因為結構的所有組成部分都存放在儲存空間中連續的地區內,而指向結構的指標就是結構第一個位元組的地址。
10、對齊
許多電腦系統對基礎資料型別 (Elementary Data Type)的可允許地址做出了一些限制,要求某種類型的對象的地址必須是某個值k(通常是2,4,或8)的倍數。
Linux沿用的對齊策略是:2位元組資料類型(e.g short)的地址必須是2的倍數,而較大的資料類型(e.g int,int*,float,double)的地址必須是4的倍數。這意味著一個short類型對象的地址的最低位必須等於0。類似地,任何int類型的對象或指標的地址最低兩位必須都是0。
Microsoft windows的對齊策略為:任何k位元組對象的地址都必須是k的倍數;特別地,要求一個double的地址應該是8的倍數。
分配儲存空間的常式(如malloc)的設計必須使得它們返回的指標能滿足最糟糕的對齊限制,通常是4或者是8。
結構體的對齊策略,考慮到分配結構體數組,要求其大小是結構體中最大位元組類型的整數倍。
11、儲存空間越界問題
範例程式碼
/* Implementation of library function gets() */char* gets(char *s){ int c; char *dest = s; while ((c = getchar()) != '\n' && c != EOF) *dest++ = c; *dest++ = '\0'; /* Terminate String */ if (c == EOF) return NULL; return s;} /* Read input line and write it back */ void echo() { char buf[4]; /* Way too small! */ gets(buf); puts(buf); }
緩衝區溢位的一個更加致命的使用就是讓程式執行它本身不願意執行的函數。通常,輸入給程式一個字串,這個字串包含一些可執行代碼的位元組編碼,稱為expliot code,另外,還有一些位元組會用一個指向緩衝區中那些可執行代碼的指標覆蓋掉返回指標,所以執行ret指令的效果就是跳轉到expliot code(plus some extra bytes that overwrite the return pointer with a pointer to the code in the buffer. The effect of executing the ret instruction is then to jump to the exploit code)。
在一種攻擊形式中,expliot code會使用系統調用啟動一個shell程式,提供給攻擊者一組作業系統的函數(providing the attacker with a range of operating system functions.)。另一種攻擊形式中,expliot code會執行一些未授權的任務,修複對棧的破壞,然後第二次執行ret指令(看上去好像)正常返回給調用者。(the exploit code performs some otherwise unauthorized task, repairs the damage to the stack, and then executes ret a second time, causing an (apparently) normal return to the caller.)。
12、蠕蟲(worm)是這樣一個程式,它可以自己運行,並且能夠將一個完全有效自己傳播到其他機器。病毒(virus)是這樣一段代碼,它能將自己添加到包括作業系統在內的其他程式中,但它不能獨立運行。
13、浮點運算單元(FPU),IA32浮點寄存器的寬都是80位。浮點運算器的行為可能依賴於值是儲存在寄存器中,還是儲存空間中。
<Computer Systems:A Programmer's Perspective>