【发布时间】: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