【问题标题】:If the stack is 'flipped' can you still execute shell code using a buffer overflow?如果堆栈被“翻转”,你还能使用缓冲区溢出执行 shell 代码吗?
【发布时间】:2013-12-31 15:18:59
【问题描述】:

在这种情况下,堆栈从地址 00000000 开始并向下增长。数组访问(char[6] 在 00002301 和 char[7] 在 00002302)。

ebp-> 00001904 …… esp-> 00002100(栈顶在这里)

如果输入错误,仍然可以执行缓冲区溢出,我的问题是:
- 你能利用溢出来执行一些shell代码吗(来自输入)。

在常规堆栈中,您可以覆盖 ebp 以指向您的 shell 代码,如果堆栈被“翻转”,您仍然可以这样做。

【问题讨论】:

  • 关闭投票是不合适的,因为问题是非常清楚的:如果堆栈推/增长到更大的地址而不是更小的地址,缓冲漏洞的敏感性会降低吗?
  • 答案已解决,所以无论如何这都不是问题。
  • StackOverflow 的目标是成为问题和答案的存储库,而不仅仅是为个人回答问题。
  • 我理解这个概念。我的问题已得到解答,因此问题已结束并不重要。

标签: c security buffer-overflow


【解决方案1】:

简短回答:是的。

  1. 函数 A 在堆栈上为变量 Q 分配缓冲区。
  2. A 调用 B 传递 Q 的地址作为参数。
  3. B 溢出缓冲区,将返回地址返回给 A。

您还必须注意缓冲区下溢或其他可能修改任意内存的攻击(例如从双链表中释放元素)。

【讨论】:

    【解决方案2】:

    你可以在 O'Hallaron 的书 CSAPP 中找到完美解决的这个问题。

    下面是简要介绍:

    • 首先,您知道我们可以通过使用缓冲区溢出来覆盖 ebp。这是可行的,因为 call 和 ret 指令会使用地址来放入返回点并将其拉回。
    • 然后,Linux 有一种保护机制,称为堆栈随机化。这意味着您无法找到 ebp 的确切地址。但是我们可以使用指令名称nop,这被称为 slop(也许我猜)。
    • Linux 终于有了最后一道保护墙:设置金丝雀。这是在调用函数之前设置的 (ebp+4) 地址中的值。返回后可以查看这个,看看栈是否被溢出攻击了。

    如果你想试试这个,你可以查看 ICS 的 Lab3,你可以很好地练习这个技术。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-25
      • 2017-02-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-11-11
      相关资源
      最近更新 更多