基于C签名整数的攻击

我正在阅读这个问题 ,其中一条评论提到了基于C签名整数的攻击

我知道什么是int溢出,但我不明白如何使用它来攻击程序。
攻击程序究竟是什么意思? 如果您知道该程序有此错误,您如何使用它?
这仅限于signed int
如果是,那为什么呢? 在C ++中是什么情况?
如果这个问题很简单,我道歉

例如,FreeBSD的getpeername函数中存在一个错误。

为了说明它,让我们从一个受限制的内存区域size字节复制一个函数void copyFromKernel(char* dest, int 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的第三个参数将是负值。 当它被转换为无符号时,复制的字节数将是巨大的,因此调用者可能获得受限制的数据。

在下面的示例中,一个非常简单的情况可能是id溢出。 想象一下, id是用户的id。 而你创造了大量的假用户,或者我不知道创建溢出。 0是管理员的ID。

 if (id > 0) { // you don't have many privileges } else { // you are basically root and can do evil stuff. } 

大多数“反溢出”代码是范围检查的组合,然后使用索引来访问内存。 因此,如果您可以使用int wrap-around传递范围检查(例如,“if(index

阅读有符号和无符号整数的位表示。

基本上,如果int是有符号的…并且如果用户可以访问它(例如,它是从用户输入加载的)…如果用户输入一个更大的数字然后整数可以包含,则int将在结果中负…

如果这个int是程序中某个东西的大小,它将变为负数。

无符号整数没有这样的问题

你可以将它与sql注入进行比较。
您为输入提供了一个非常大的整数,整数无法存储,程序可能会显示未定义的行为。
每当我们存储一个更大的no时,它包含的int的容量就会变成负数no,这可以被攻击者使用。 例如: –

  int j ; cin>>j ; for(i=0;i 

现在,如果攻击者进入更大的没有j变成负面包裹 ,并且程序跳过for循环代码。