我正在阅读this question,其中一条评论提到基于C签名整数的攻击。
我知道int
溢出是什么,但我不明白如何将其用于攻击
一个程序
攻击程序究竟是什么意思?如果您知道该程序有此错误,您如何使用它?
这仅限于signed int
如果是,那为什么呢?
在C ++中是什么情况?
如果问题很简单,我道歉
答案 0 :(得分:6)
例如,FreeBSD的getpeername函数中存在一个错误。
为了说明这一点,让我们从一个受限制的内存区域void copyFromKernel(char* dest, int size)
字节中复制一个函数size
。
正如您可能已经知道的那样,memcpy函数声明如下:
void * memcpy ( void * destination, const void * source, size_t num );
其中size_t是无符号类型。如果在我们的函数中,我们执行类似的操作:
void copy_from_kernel(void *user_dest, int maxlen) {
int len = KSIZE < maxlen ? KSIZE : maxlen;
memcpy(user_dest, kbuf, len);
}
,其中KSIZE是我们希望允许用户复制的最大字节数。如果调用者为maxlen发送正值,则该函数按预期工作。但是如果调用者为maxlen发送一个负值,那么比较将通过,memcpy的第三个参数将是负值。当它被转换为无符号时,复制的字节数会很大,因此调用者可能会获得受限制的数据。
答案 1 :(得分:3)
在以下示例中,一个非常简单的情况可能是id
上的溢出。想象一下id
是用户的id。你创建了大量的假用户,或者我不知道创建溢出。 0是管理员的ID。
if (id > 0) {
// you don't have many privileges
} else {
// you are basically root and can do evil stuff.
}
答案 2 :(得分:1)
大多数“反溢出”代码是范围检查的组合,然后使用索引访问内存。因此,如果你可以使用int wrap-around传递范围检查(例如“if(index&lt; max)”,索引为负)那么你可以访问预期目标之外的内存(例如“array [index] = value”) 。这种编码错误不太可能使用无符号。
答案 3 :(得分:0)
阅读有符号和无符号整数的位表示。
基本上如果int被签名...并且用户可以访问它(例如,它是从用户输入加载的)...如果用户输入一个更大的数字然后整数可以包含,则int将结果是否定的......
如果这个int是程序中某个东西的大小,那么它将变为负数。
无符号整数没有这样的问题
答案 4 :(得分:0)
您可以将它与sql注入进行比较
您为输入提供了一个非常大的整数,整数无法存储,程序可能会显示未定义的行为
每当我们存储一个更大的no时,int
的容量就会被包裹,并且可能会变成负数,这可以被攻击者使用。例如: -
int j ;
cin>>j ;
for(i=0;i<j;++i)
{
// Do some stuff
}
现在,如果攻击者输入更大的no,则j变为wrapping around的负面消息,并且程序会跳过for循环代码。