c - 如何利用对 updateConfigParams() 函数的缓冲区溢出攻击来禁用该程序?

标签 c buffer buffer-overflow

考虑以下功能

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 | ...

假设value5120xff所以我们不改变任何东西。

在第 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所以你可能会尝试写入你的进程没有写入权限的内存区域。

关于c - 如何利用对 updateConfigParams() 函数的缓冲区溢出攻击来禁用该程序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40525775/

相关文章:

c - 编写一个接受可变参数并返回一个值的 C 宏

c - RabbitMQ c 客户端库 - amqp_basic_get() 与 amqp_basic_consume() - 数据容器

ios - 如何在 iOS 中将缓冲区中的大整数读入整数?

java - 滚动 BufferedImage Java

c - 离开函数时重写ret地址

c - 我应该在括号之间写什么来定义我想要变量更改为的数据类型?

c - Windows 服务器上的 KMDF

java - Java : How do you get a Message. Builder 中的 Google Protobufs 来自 FieldDescriptor?

c - 阿姆斯壮数字缓冲区溢出

ffmpeg - 如何更改输入视频的 ffmpeg 缓冲区