1

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

#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;
}
4

1 回答 1

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 位平台上运行,请将 0xffffffff 和 0xffffffffffffffff 替换int buf[4];long buf[4]0xffffffffffffff。

于 2012-12-08T18:32:46.260 回答