缓冲区溢出链接

Posted

技术标签:

【中文标题】缓冲区溢出链接【英文标题】:Buffer Overflow chaining 【发布时间】:2021-06-11 04:32:35 【问题描述】:

是否可以通过将堆栈链接在一起来进行缓冲区溢出(假设没有现代堆栈防御,如金丝雀、aslr、不可执行堆栈等)?我试着在下面画一张图来说明我的意思:

(已编辑;低地址)


缓冲区 A + ebp(8 字节)


返回地址A


随机内存(假设 40 字节)


缓冲区 B + ebp(40 字节)


返回地址B


(高地址)

我可以制作如下所示的有效载荷吗? 'A' * 8 + 缓冲区 B 开头的十六进制值 + '\x90' * 50 + shellcode(假设 20 个字节) 这个想法是我返回到包含 nop sled 和 shellcode 的堆栈的一部分。

如果我可以执行上面的有效负载,那么作为后续,如果我放入随机内存而不是缓冲区 B 会怎样? nop 雪橇会带我到我的 shellcode 吗?谢谢!!!

【问题讨论】:

返回地址不能在开头,那不是保存的返回地址在栈中的位置。我不明白您在这里所说的“链接”是什么;这听起来就像通常覆盖返回地址以返回到您的漏洞利用有效负载附近的某个地方,而 nop 雪橇覆盖了该区域。如果你知道缓冲区的近似绝对地址,你就知道返回地址指向哪里,希望能在非雪橇内命中。 或者你的图表是颠倒的,顶部的地址较低? 我应该说清楚的;低地址在栈顶,高地址在栈底。 【参考方案1】:

这绝对是可能的,对于我去年学习的操作系统课程,我们甚至不得不将其作为一项作业来完成。这就是您提到的堆栈防御存在的全部原因,因此您通常不能这样做。当你进入随机内存时,如果这部分是可执行的、可写的等等,那么你确实可以在这个过程中滑动和运行任意的 shellcode。然而,即使二进制文件不使用金丝雀等这些保护措施,内核也有另一个窍门:地址空间随机化。通常很难从您尝试利用的过程中找出重要函数的加载位置以及重要数据的位置。

对于课程,这是我们的设置:


int main(int argc, char ** argv) 
    char buf[256];
    strcpy(buf, argv[1]);
    return 0;


void unused_function() 
    printf("exploit!");

目标当然是打电话给unused_function。地址空间随机化已关闭,堆栈保护也已关闭。

【讨论】:

好的,谢谢!!!我实际上是在尝试使用这种方法但没有任何防御措施的情况下进行二进制漏洞利用挑战,但它不起作用,所以我只是想验证这个想法是否可行。 用一个小例子更新了我的答案,希望它可以帮助你:) 嗯嗯?我更多地考虑类似 int main(int argc, char ** argv) char buf[4]; strcpy(buf, argv[1]);返回0; int used_function() char buf[64];返回0; @MathStudent:这个答案中显示的这种 call-unused-func 类型的利用更通常是通过 ROP 攻击来完成的,在这种攻击中,不是返回到您自己的 shellcode 有效负载,而是用unused_function 的地址(在非 PIE 可执行文件中,即使堆栈是 ASLRed,它也可能是恒定的......击败 ROP 攻击是现代 Linux 发行版使用 PIE 可执行文件并将 .rodata 映射为不可执行文件的原因,以减少数量您可以有用地返回到可能的 ROP 小工具。扩展它,您可以返回到以 ret 结尾的几个 insn 序列...)

以上是关于缓冲区溢出链接的主要内容,如果未能解决你的问题,请参考以下文章

关于电脑!啥是“缓冲区溢出”?

缓冲区溢出 是啥意思?原理性讲解下

缓冲区溢出攻击的6.防范方法

缓冲区溢出的问题?

什么是C语言缓冲区溢出漏洞?怎么利用?谁可以提供详细的资料

McAfee提示“缓冲区溢出”,该怎么处理?