Linux 现在可以返回libc攻击吗?

Linux 现在可以返回libc攻击吗?,linux,security,buffer-overflow,Linux,Security,Buffer Overflow,我了解到,要成功返回lib-c攻击,攻击者应将命令地址(例如“bin/sh”)存储在堆栈上,正好位于“system”函数的返回地址(例如)之后 因此,当'system()'函数读取该地址作为其'parameter'并执行该命令时。但是现在在分解一个调用system()的程序之后,我注意到它没有使用堆栈来获取该字符串的地址(“bin/sh”)。相反,地址存储在EDI或RDI寄存器中。只要攻击者不能访问寄存器,怎么可能执行这样的攻击?实际上,攻击者可能很容易将正确的值存储在RDI中,而无需直接访问寄

我了解到,要成功返回lib-c攻击,攻击者应将命令地址(例如“bin/sh”)存储在堆栈上,正好位于“system”函数的返回地址(例如)之后


因此,当'system()'函数读取该地址作为其'parameter'并执行该命令时。但是现在在分解一个调用system()的程序之后,我注意到它没有使用堆栈来获取该字符串的地址(“bin/sh”)。相反,地址存储在EDI或RDI寄存器中。只要攻击者不能访问寄存器,怎么可能执行这样的攻击?

实际上,攻击者可能很容易将正确的值存储在
RDI
中,而无需直接访问寄存器

以可能导致返回libc攻击的典型易受攻击的C函数为例:

void f(常量字符*str)
{
char buf[buf_LEN];
strcpy(buf,str);
}
在我的机器上,为调用strcpy生成以下程序集:

movq%rdi,-24(%rbp)
movq-24(%rbp),%rdx
leaq-16(%rbp),%rax
movq%rdx,%rsi
movq%rax,%rdi
调用strcpy
如您所见,
strcpy
的目标缓冲区是易受攻击的缓冲区,它存储在
RDI
中。这意味着,如果我们设法用
系统
的地址覆盖返回地址,将使用指向易受攻击缓冲区的指针作为其参数来调用它


一个小的免责声明:这个特殊的例子只是为了说明在寄存器中拥有正确的值可以通过其他方式实现,而不是直接访问寄存器。这个例子本身实际上很难利用,因为strcpy将在第一个空字节后停止。

谢谢,但我想我应该澄清一下情况。问题不在于RDI本身的价值。它是攻击者必须存储缓冲区的内存位置。例如,假设我作为攻击者知道RDI中存储的值是“0x400430”,它不指向缓冲区,而是指向一般变量。如果我想要system()执行我想要的,我必须写入地址“0x400430”,这在某种程度上是不可能的,因为它离堆栈帧的当前位置太远,并且我无法提供1Gb字符来输入。@user2808671:我试图说明的是,在一个典型的易受攻击函数中,
strcpy
用于注入有效负载,
RDI
在调用
strcpy
之后具有正确的值。这意味着,如果你能找到一个对strcpy的易受攻击的调用,紧接着返回,你就可以利用它。是的,你是对的。strcpy/memcpy/使用EDI/RDI。但除了使用RDI,他们还可以在复制数据时更改RDI的值。复制每个字节后,RDI将递增一。因此,从gets()/memspy()/strcpy()返回后的RDI指向缓冲区的“结束”。攻击者需要它指向字符串命令“bin/sh”之前的开始或至少一个位置。是吗?@user2808671:是的,你完全正确。同样,我只是想说明如何在寄存器中获得正确的值。必须为每个具体案例制定具体细节。提供一个具体的例子,说明您正在谈论的内容,也许还可以用于现场演示,这会很有帮助。