【发布时间】:2015-12-16 07:58:05
【问题描述】:
我已经在网上搜索了几天,但仍然无法弄清楚以下代码的漏洞是什么。 我的第一个想法是我们可以对 int 'length' 进行溢出,然后进行缓冲区溢出利用来复制 shell 代码并将地址返回到缓冲区。然而,代码中的“长度”大小正在防止缓冲区溢出。任何人都可以阐明如何利用这个程序吗?非常感谢!
void copy_str(char *buffer2, int buffer2_l, char *input)
{
int i, length;
length = strlen(input);
if (length > buffer2_l)
length = buffer2_l;
for (i = 0; i <= **length**; i++)
buffer2[i] = input[i];
}
void vul2(char *arg)
{
char buffer[109];
copy_str(buffer, sizeof buffer, arg);
}
void vul1(char *argv[])
{
vul2(argv[1]);
}
int main(int argc, char *argv[])
{
if (argc != 2)
{
fprintf(stderr, "program2: argc != 2\n");
exit(EXIT_FAILURE);
}
vul1(argv);
return 0;
}
【问题讨论】:
-
提示:如果
argv[1]的长度为200 个字符,那么将多少字节复制到buffer中?for循环执行了多少次迭代? (如果没有看到,请尝试将buffer更改为char buffer[1]。) -
您好,感谢您的回复。我的理解是,如果 argv[1] 长度为 200 个字符,则只会将 109 个字节复制到缓冲区,for 循环将执行 109 次。在这种情况下没有缓冲区溢出。所以这里的问题是如何通过这样的长度检查编写预期的 shell 代码并将地址返回到缓冲区?
-
查看此视频为 Georgia Weidman vimeo.com/33106013
标签: c buffer-overflow integer-overflow strlen