我有这段代码从用户那里读取输入:
unsigned int readInput(char * buffer, unsigned int len){
size_t stringlen = 0;
char c;
while((c = getchar()) != '\n' && c != EOF){
if(stringlen < (len-1)){
buffer[stringlen] = c;
stringlen++;
}
}
buffer[stringlen+1] = '\x00';
return stringlen;
}
char * buff的大小已设置为len,并且memset包含“0”。此代码是否容易受到任何漏洞攻击?
答案 0 :(得分:1)
根据平台的不同,unsigned int
可能太小而无法容纳数字13194139533312
。你应该总是使用size_t
来表示C中的缓冲区大小,不这样做可能是一个漏洞,是的。
此外,当然getchar()
不会返回char
,因此也会被破坏。
我说&#34;是&#34;,该代码容易受到攻击。
答案 1 :(得分:1)
您的代码可能会写出超出边界并使数组元素未初始化:
char buf[10]; // uninitialized!
readInput(buf, 10); // feed 12 TB of data
这有未定义的行为,因为您写入buf[10]
。
readInput(buf, 10); // feed 8 bytes of data
strlen(buf);
这有未定义的行为,因为您读取了未初始化的值buf[8]
。
错误在于您分配使用错误索引的空终止符的方式。它应该说:
buffer[stringlen] = '\0';
// ^^^^^^^^^
由于您计算len - 1
,因此您的代码还应具有len
必须严格为正的前提条件。这是明智的,因为您承诺生成以null结尾的字符串。
答案 2 :(得分:1)
假设缓冲区分配了=IF(B3="","",IF(ABS(B3)=0,0,LEN((ABS(B3)/10^LEN(ABS(B3)))*10^(LEN(ABS(B3)/10^LEN(ABS(B3)))-LEN(INT(ABS(B3)/10^LEN(ABS(B3))))-1)))+LEN(B3)-LEN(ABS(B3))-IF(LEFT(B3,1)="-",1,0)+IF(OR(LEFT(B3,1)=".",LEFT(B3,2)="-."),1,0))+IF(AND(NOT(ISERROR(FIND(".",B3))),ISERROR(FIND(".",ABS(B3)))),-1,0)
个字节,最明显的问题是:
len
这是因为循环可以在buffer[stringlen+1] = '\x00';
等于stringlen
的情况下退出,因此您正在写入len-1
。但是,您应该只写入最多buffer[len]
的索引。
所以让我们解决这个问题如下:
len-1
这是你真正想要的,因为你尚未写入buffer[stringlen] = '\x00';
。
一个微妙的错误是如果len为0(你可能会说永远不会发生),那么buffer[stringlen]
是MAXINT,因此len-1
总是为真。因此,代码将始终缓冲0长度缓冲区上的溢出。
答案 3 :(得分:-1)
您的问题是代码是否容易受到攻击。答案是否定的,它不易受攻击,当然也不是漏洞的常见定义。
这是一些未知输入(可能是对手)和缓冲区之间的接口。您已正确包含防止缓冲区溢出的机制,因此您的代码是安全的。 [我们假设getchar()中的所有内容都不是您的问题的主题]。
代码是否按预期工作是一个不同的故事,(其他人已经在终止NULL之前指出了漏洞),但这不是你的问题。