1. 程式人生 > 其它 >off-by-one總結

off-by-one總結

常見的型別:

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'

計算在內的,但是 strcpy 在複製字串時會拷貝結束符'\x00'。這就導致了我們向 chunk1 中寫入了 25 個位元組