整数安全漏洞
整数的异常情况:1. 溢出:只有有符号数才会发生溢出;2. 回绕:无符号数0-1变成最大数;3. 截断:较大宽度的数存入一个宽度较小的数。
溢出漏洞容易被植入shellcode。
漏洞多发的函数:memcpy strncpy strcpy
整数溢出示例:
1. 整数转换:如果len被赋予了一个负数,则可以绕过检测,执行到memcpy,由于memcpy的第三个参数类型是size_t,无符号整数类型,于是变成了一个非常大的正数,从而复制了大量数据到buf,引发缓冲区溢出:
char buf[80];
void vulnerable()
{
int len = read_int_from_network();
char *p = read_string_from_network();
if (len > 80)
{
error("no cookie");
return
}
memcpy(buf, p, len);
}
2. 回绕和溢出。 如果len过大,len + 5是可以发生回绕的。比如len = 0xffffffff,则len+5=0x00000004,这时只分配了4个字节,在里面写入了大量数据,就发生了缓冲区溢出:
void vulnerable()
{
size_t len;
char* buf;
len = read_int_from_network();
buf = malloc(len + 5);
read(fd, buf, len);
... ...
}
3. 截断:如果攻击者提供的两个字符串的总长度无法用total表示,就会发生截断从而导致后面的缓冲区溢出。
void main(int argc, char *argv[])
{
unsigned short int total;
total = strlen(argv[1]) + strlen(argv[2]) + 1;
char* buf = (char*)malloc(total);
strcpy(buf, argv[1]);
strcat(buf, argv[2]);
... ...
}