【发布时间】:2015-04-30 07:42:45
【问题描述】:
假设我的代码有如下缓冲区溢出漏洞
int func(const char *str){
char buffer[100];
unsigned short len = strlen(str);
if(len >= 100){
return -1;
}
strncpy(buffer,str,strlen(str));
return 0;
}
(取自question)
如果这个漏洞是从另一个函数(不是用户输入)获取输入并且str的长度总是小于100,有没有办法利用这个漏洞?
例如
int main() {
int user_input;
if (cin >> user_input) {
if(user_input == 1)
func("aaaa");
else
func("bbbb");
}
}
假设代码中没有其他漏洞。
只是一个假设的问题,有什么想法吗?
【问题讨论】:
-
如果str的长度始终小于100,则不存在漏洞。
-
如果你确定
len总是小于100,我看不出if(len >= 100)的原因 -
@smttsp 您是否阅读了您所链接问题的答案?如果
strlen(str) > 65535出现漏洞,str的来源无关紧要 -
您的
main内存严重损坏。您不能读入字符串文字的字节,顺便说一句,不推荐将其转换为非constchar *并且应该发出编译器警告。即使您被允许写入user_input的字节,该数组也会太短而无法容纳字符串"1"。此外,比较char缓冲区和==可能不会达到您的预期。 -
strlen(str) 作为 strncpy 的参数是一个严重的错误,总是创建一个非 nul 终止的字符串,因为 strncpy 认为目标缓冲区只能包含没有终止 nul 的字符串,这可能会被利用如果这段代码能以某种方式正常工作。参数应该是 sizeof(buffer)。