2012-12-08 79 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

感谢您的帮助。对此,我真的非常感激。 :) –