2012-12-08 123 views
1

我有這段代碼,我需要修改來演示整數溢出漏洞。我從來沒有做過,需要一個開始。整數溢出C

#include <stdio.h> 

int myprintf(char* argv){ 
    printf("%s\n", argv); 
    return 0; 
} 

int myprintf2(char* argv){ 
    printf("hello world\n"); 
    return 0; 
} 

int main(int argc, char** argv){ 
    struct foodata{ 
     int (*fptr)(char*); 
     int buf[4]; 
    } foo; 
    foo.buf[0] = 0xdeadbeef; 
    foo.fptr = myprintf; 
    foo.buf[0xffffffff] = myprintf2; 
    foo.fptr(argv[1]); 
    return 0; 
} 
+1

你的意思是緩衝區溢出?整數溢出不是很危險。 –

+0

請參閱此處以供參考:[緩衝區溢出攻擊](http://stackoverflow.com/questions/7344226/buffer-overflow-attack) – Mysticial

+4

@Jan Dvorak:我不同意:)請參閱:http://www.ima .umn.edu /〜arnold /災難/ ariane.html – dst2

回答

1

好的。因此,至少在某些32位平臺上,您的代碼不打印hello world\n,而不是來自用戶的參數。我們通過操作其他數組來改變函數指針。現在我們想要將其用於惡意目的。

void set_authorized(void) { 
    authorized = 1; 
} 

現在,我們需要得到來自用戶的輸入信息: -

的第一件事情,我們有什麼危險的,當被稱爲沒有一些檢查,如更換myprintf2。例如,當輸入看起來有效時,我們將讀取四個數字並將它們的總和用作buf的索引。

int a, b, c, d; 
do { 
    scanf("%d%d%d%d", &a, &b, &c, &d); 
} while (a < 0 || b < 0 || c < 0 || a + b + c > 4); 
buf[a+b+c] = d; 

看起來我們永遠無法在陣列外寫字,對吧? 否,攻擊者可以使用數據

a = INT_MAX; 
b = 1; 
c = INT_MAX; 
d = (int)set_authorized 

INT_MAX + 1 + INT_MAX = INT_MIN + INT_MAX = -1(0xffffffff)。所以我們基本上有類似於你的例子的行爲,但是這次它授予非特權用戶一些權利。

注: 要讓這個例子在64位平臺上工作與long buf[4]併爲0xffffffff與0xffffffffffffffff取代int buf[4];

+0

感謝您的幫助。對此,我真的非常感激。 :) –