off-by-one總結
阿新 • • 發佈:2021-10-02
常見的型別:
1.
int my_gets(char *ptr,int size) { int i; for(i=0;i<=size;i++) { ptr[i]=getchar(); } return i; } int main() { void *chunk1,*chunk2; chunk1=malloc(16); chunk2=malloc(16); puts("Get Input:"); my_gets(chunk1,16); return 0; }
我們自己編寫的 my_gets 函式導致了一個 off-by-one 漏洞,原因是 for 迴圈的邊界沒有控制好導致寫入多執行了一次
2.
int main(void) { char buffer[40]=""; void *chunk1; chunk1=malloc(24); puts("Get Input"); gets(buffer); if(strlen(buffer)==24) { strcpy(chunk1,buffer); } return 0; }
程式乍看上去沒有任何問題(不考慮棧溢位),可能很多人在實際的程式碼中也是這樣寫的。 但是 strlen 和 strcpy 的行為不一致卻導致了 off-by-one 的發生。 strlen 是我們很熟悉的計算 ascii 字串長度的函式,這個函式在計算字串長度時是不把結束符'\x00'
'\x00'
。這就導致了我們向 chunk1 中寫入了 25 個位元組