【问题标题】:Arbitrary write vulnerability without buffer overflow无缓冲区溢出的任意写入漏洞
【发布时间】:2022-01-05 15:50:40
【问题描述】:

我正在深入研究内存漏洞 (C/C++),我想知道什么样的漏洞允许任意内存写入(或读取)而不利用缓冲区溢出(或过度读取)。最终目标是利用内存漏洞(源)到达任意位置(目标),而无需访问目标和源之间的内存。位置能不能选择没关系,我只对能到达远方的能力感兴趣。

我知道一个可能的例子是在 printf 函数和类似函数中使用 %n 占位符(格式字符串漏洞)。还有其他的吗?

我也知道以某种方式破坏索引(可能是整数溢出)可能会导致这样的任意写入,如下例所示:

#include <stdlib.h>

void main(int argc, char ** argv){
    int c = atoi(*(argv+1)); //get value from input
    char buf[40000];    
    if(c>39999) return 1; //check boundary for buffer
    short ind = c; //wrong conversion --> integer overflow
    buf[ind] = 'c'; //Write to arbitrary location (negative index)
}

但是,我想知道是否还有更多此类漏洞的经典示例。感谢您的帮助!

【问题讨论】:

  • 代码return buffer[index]可能被利用来读取内存中的任意位置,它不一定会读取“目标和源之间的内存”。
  • 期待一路障碍,操作系统的任务是不允许你读/写不属于你的进程的内存(这是一件好事,让你自己的程序崩溃是件坏事足够)。有点好奇你想用这个做什么?
  • 除非它们在内核中,否则缓冲区溢出漏洞不会涉及访问不属于您的进程的内存。但它们仍然可能具有破坏性,例如作为病毒载体,或利用影响多个用户的守护程序代码中的错误等。
  • 其实short ind = c 不是溢出。行为是实现定义的。
  • 对于那些想知道它是出于研究目的的人。澄清一下,我对访问进程之外的内存不感兴趣,而是访问不与缓冲区相邻的内存

标签: c++ c security buffer-overflow memory-safety


【解决方案1】:

只需设置一个指向任意地址的指针并间接通过它。

#include <stdlib.h>

void main(int argc, char ** argv){
    char *c = (char *)strtoul(*(argv+1), NULL, 0); //get value from input
    *c = 'c';
}

【讨论】:

  • 感谢您的回答。这个结构确实给出了任意写入,但我认为这是程序的目标。我正在寻找的是允许这种行为作为程序副作用的漏洞。
  • 现实世界中的漏洞最常见的原因是读取数据时缓冲区溢出。
  • 因为从不受信任的来源接收数组索引或指针是不寻常的。
猜你喜欢
  • 2016-06-04
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-01
  • 1970-01-01
相关资源
最近更新 更多