我需要修改这段代码来演示整数溢出漏洞。我以前从未做过,需要一个良好的开端。
#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;
}
答案 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。