首页 文章

缓冲溢出利用“黑客攻击的艺术”中的例子

提问于
浏览
0

我在网站上发现了一些相关帖子,但没有人解释我的问题 . 代码在这里描述:Link

我的问题如下:

作者试图在notesearch.c程序中重写strcpy()函数的返回地址,缓冲区中有一个,以便shellcode(我理解的是在内存中植入机器代码)将被执行 .

为了工作,他创建了一个缓冲区,看起来像:nop nop nop ... | shell代码.. |退货地址

根据我在调用strcpy()函数后的理解,缓冲区被放在堆栈上并将返回值覆盖到notesearch.c的main . 他这样做,所以当strcpy()完成运行并想要返回main时,他将从缓冲区调用返回值 .

我不明白的是以下内容:

  • 在我看来,注入的返回地址始终与原始地址完全对齐 . 怎么可能?

  • 在书中说,注入的返回地址指向同一缓冲区中的shellcode . 为什么我们要将shellcode放在同一缓冲区而不是内存的另一部分?这不能导致无限循环吗?

  • 为什么我们不能将返回地址设置为缓冲区上的shellcode的地址?或者对于那个问题的变量shellcode?

  • 任何人都可以详细说明如何计算退货地址以及我们为什么需要抵消?

1 回答

  • 0

    Why would we want to put the shellcode in the same buffer and not in another part of the memory?

    好吧,只要您可以在该内存区域执行指令,您实际上可以随意将shellcode放在任何位置 . 话虽这么说,这个例子演示了一个基于堆栈的缓冲区溢出,在这样的漏洞中,很容易发现当前堆栈帧内局部变量的偏移量 .

    Couldn't that cause an infinite loop?

    假设shellcode不包含这样的无限循环 - 没有 . 然而,由于您正在修改执行流程,因此可能会产生错误 . 这实际上取决于shellcode . 例如,大多数shellcode用于生成shell - 假设使用了exec函数系列 - 所以一旦shell生成原始可执行映像,shell将覆盖它 .

    Why can't we set the return address to that of the shellcode on the buffer?

    你可以,这只需要更精确的计算 . 使用NOP底座,您可以使用多个可能的shell命令来执行shellcode .

    Can anyone elaborate on how the return address was calculated?

    作者获取了第一个声明的局部变量的地址,并计算了易受影响的缓冲区的位移 . 这里的第一个缺点是第一个声明的变量( i )可能不是编译后的第一个局部变量 . 如果要确保此类约束,则解决方法是使用结构(请参阅:Order of local variable allocation on the stack) .

    作者可能多次运行程序并调整偏移量直到shellcode被触发 . 请记住,计算缓冲区的确切地址实际上是依赖于平台和编译器的 . 您必须调试程序并检查编译器如何详细说明堆栈帧等 .

    Why we need the offset?

    由于堆栈帧布局,需要“有效”偏移量来查找将击中NOP底座的地址 .

相关问题