我读到为了成功返回lib-c攻击,攻击者应该在返回地址到'system'函数之后将命令的地址(例如“bin / sh”)存储在堆栈上(例如)。
因此'system()'函数将该地址作为其'参数'读取并执行该命令。但现在在反汇编调用system()的程序后,我注意到它没有使用堆栈来获取该字符串的地址(“bin / sh”)。相反,地址存储在EDI或RDI寄存器中。只要攻击者无法访问寄存器,如何才能执行此类攻击?
答案 0 :(得分:2)
攻击者实际上可能很容易在RDI
中存储正确的值,而无法直接访问寄存器。
采取可能导致返回libc攻击的典型易受攻击的C函数:
void f(const char* 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
call strcpy
如您所见,strcpy
的目标缓冲区(易受攻击的缓冲区)存储在RDI
中。这意味着如果我们设法用system
的地址覆盖返回地址,它将使用指向易受攻击的缓冲区的指针作为其参数进行调用。
一个小小的免责声明:这个特殊的例子只是为了说明在寄存器中具有正确的值可以通过除直接访问寄存器之外的其他方式来完成。实例本身实际上很难利用,因为strcpy
将在第一个空字节后停止。