考虑以下功能
void updateConfigParams( void ) {
char buffer [512];
int i = 0;
while (( c = readFromWireless ()) != NULL)
{
buffer [ i ] = c;
i += 1;
}
writeConfigParams ( buffer );
}
如何利用对 updateConfigParams() 函数的缓冲区溢出攻击来禁用程序?
在例子中i
是一个整数,假设它占用 4 个字节。
假设你的内存是这样的:
0 1 511 512 513 514 515 ...
buffer[0] | buffer[1] | ... | buffer[511] | i[0] | i[1] | i[2] | i[3] | ...
在 while 循环中,您在位置 buffer[i]
处向内存写入内容。 .
while (( c = readFromWireless ()) != 0)
{
buffer [ i ] = c;
i += 1;
}
当您向 buffer[511]
写入内容时(第 512 次迭代)您的内存如下所示:
0 1 511 512 513 514 515
value0 | value1 | ... | value511 | 0xff | 0x01 | 0x00 | 0x00 | ...
请注意,索引 512 和 513 表示变量 i
的值: i = 511
如果您收到超过 512 个字节,您将覆盖变量 i
,因此在第 513 次迭代中,您将写入 i[0]
的内存(索引 512)。
0 1 511 512 513 514 515
value0 | value1 | ... | value511 | value512 | 0x01 | 0x00 | 0x00 | ...
假设value512
是0xff
所以我们不改变任何东西。
在第 514 次迭代中,您将覆盖 i[1]
位置的内存(索引 513)。
0 1 511 512 513 514 515
value0 | value1 | ... | value511 | value512 | value513 | 0x00 | 0x00 | ...
在第 515 次迭代中,您将编写 value514
为了纪念buffer[i]
.但是现在i = (value513 << 8) | value512
所以你可能会尝试写入你的进程没有写入权限的内存区域。
我是一名优秀的程序员,十分优秀!