C中的整数溢出

时间:2012-12-08 17:39:03

标签: c integer-overflow

我需要修改这段代码来演示整数溢出漏洞。我以前从未做过,需要一个良好的开端。

#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 :(得分:1)

确定。因此,至少在某些32位平台上,您的代码会打印hello world\n而不是用户的参数。我们通过操纵其他数组来改变了函数指针。现在我们想将它用于恶意目的。

首先 - 我们将myprintf2替换为危险的东西,在没有检查的情况下调用,例如:

void set_authorized(void) {
    authorized = 1;
}

现在,我们需要从用户那里获得一些输入。例如,当输入似乎有效时,我们将读取四个数字并将它们的和用作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位平台上运行,请将int buf[4];替换为long buf[4],将0xffffffff替换为0xffffffffffffffff。