gpt4 book ai didi

linux - 现在可以进行 return-to-libc 攻击吗?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:16:46 26 4
gpt4 key购买 nike

我读到要成功返回到 lib-c 攻击,攻击者应该将命令的地址(例如“bin/sh”)存储在堆栈中,恰好在“系统”函数的返回地址之后(例如)。

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

最佳答案

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

以可能导致 return-to-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 将在第一个空字节后停止。

关于linux - 现在可以进行 return-to-libc 攻击吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29162279/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com