相关文章推荐
深情的钱包  ·  map.find与string.find的返 ...·  1 年前    · 
乖乖的手术刀  ·  使用 Python ...·  1 年前    · 

返回到libc的攻击现在可能吗?

2 人关注

我读到过,要想成功地返回lib-c攻击,攻击者应该把命令的地址(例如 "bin/sh")准确地存储在堆栈上,然后再返回到'system'函数(例如)的地址。

所以'system()'函数读取该地址作为其'参数'并执行该命令。但是现在在反汇编了一个调用system()的程序后,我注意到它并没有使用堆栈来获取那个字符串的地址("bin/sh")。相反,该地址被存储在EDI或RDI寄存器中。只要攻击者不能访问这些寄存器,就有可能进行这样的攻击?

1 个评论
提供一个具体的例子来说明你所谈论的内容,也许使用 godbolt 如果能在现场演示一下,那就更有帮助了。
linux
security
buffer-overflow
user2808671
user2808671
发布于 2015-03-20
1 个回答
mtvec
mtvec
发布于 2015-03-20
已采纳
0 人赞同

实际上,攻击者可能很容易在没有直接访问寄存器的情况下将正确的值存储在 RDI 中。

以一个典型的易受攻击的C函数为例,它可能导致返回到libc的攻击。

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