我有這段代碼,我必須在其中找到安全漏洞。
win() {
printf("Congratulations!");
}
setter(unsigned int i, int v, int * a) {
a[i] = v;
}
main() {
int i, v;
int a[50];
puts("i");
scanf("%d", i);
puts("v");
scanf("%d", v);
setter(i, v, a)
}
在網上閱讀,我發現在從anint到an的轉換時unsigned int,如果int是負數,會被轉換成非常高的unsigned int。因此,這段代碼中的漏洞可能是由于在函式setter中呼叫時發生的這種轉換。main因此,攻擊者可以提供以下輸入:i=-1,v=40他將訪問未保留給緩沖區的記憶體部分,a因此,在setter函式中,攻擊者將能夠覆寫重要值。例如,攻擊者可以用win函式的地址覆寫回傳地址,以便win在setter回傳時執行。我對嗎?
uj5u.com熱心網友回復:
一些評論的總結和一些補充
首先,代碼錯誤。的引數scanf需要是指標:
scanf("%d", &i); // Note the &
如果 int 是負數,它將被轉換為非常高的 unsigned int。
是的,這在技術上是正確的,而且這可能導致訪問陣列越界也是正確的。但是,即使您更改為無符號,也沒有什么可以阻止攻擊者簡單地輸入任何數字,包括(unsigned) -1特定系統上的任何數字。
解決此安全問題的正確方法是檢查輸入的數字是否在 [0,49] 范圍內。如果您使用無符號數,您可能會因為明顯的原因跳過檢查它是否低于零。但是您仍然需要進行范圍檢查。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/489128.html
上一篇:Zoom和Chrome如何允許沒有com.apple.security.cs.disable-library-validation的虛擬網路攝像頭?
