【问题标题】:Running code from BSS section从 BSS 部分运行代码
【发布时间】:2015-04-19 15:01:20
【问题描述】:

在缓冲区溢出攻击中,可以从 BSS 部分运行代码(假设用户禁用了某些安全保护)。在那里运行的代码与在文本部分运行的代码有何不同?在运行 BSS 部分的代码时将内容压入堆栈是否有意义?如果没有,如何从那里调用函数?

我使用的是 linux x86。

【问题讨论】:

  • “可以从 BSS 部分运行代码”- 是吗?如果默认情况下它是一个可执行段,我会感到惊讶。在什么操作系统/环境中?
  • 如果你能让它运行起来,那么它与代码部分没有什么不同。你也可以使用堆栈。
  • 请更具体一点,您在哪个操作系统上提出问题。
  • 没有明确的操作系统执行限制,您可以从任何地方(堆栈、堆、bss、数据)运行代码。如果您想了解有关限制执行的信息,可以阅读有关 NX bit 的内容。
  • 好吧,当您处于保护模式时,描述符上设置的位也存在问题,@j123b567。但是,有时请参阅下面的答案以了解解决方法。

标签: c assembly


【解决方案1】:

据我所知,您对包含可执行指令的 BSS 段的前提是有缺陷的。 BSS 段用于仅保存未分配值的静态变量,例如:

静态字符 *test_var;

文本段是包含可执行指令的段,而不是BSS段。

为了更清楚,请参阅: http://en.wikipedia.org/wiki/.bss http://en.wikipedia.org/wiki/Code_segment

另外,您可能需要查看虚拟内存布局。链接http://duartes.org/gustavo/blog/post/anatomy-of-a-program-in-memory/ 用图表等很好地说明了这一点。

但是,如果您想查看可执行文件的哪些段被标记为executable,请在可执行文件上使用这个名为readelf的工具如下图:

readelf -l ./test

【讨论】:

    【解决方案2】:

    是的,你是对的。如果保存 BSS 的内存段或选择器未标记为不可执行,您可以轻松地从中执行代码:

    1. 你知道它在内存中的位置
    2. 你有办法控制 EIP 在这里重定向执行
    3. 您有一些输入(文件、实际输入、网络或环境)最终会出现在静态分配的变量中。

    只需将您的代码注入 #3 即可参加比赛。

    顺便说一句.. 我不希望 BSS 被标记为可执行,但不要绝望。这绝不表示某些其他选择器没有指向完全相同的内存并且被标记为可执行。这意味着您可以通过 BSS 接近它来注入代码,因为这将是读/写的,然后通过其他一些选择器来执行。

    例如,我发现了很多示例,其中 CS 指向与 DS 完全相同的内存,但 CS 是只读且可执行的,而 DS 是可读写且不可执行的。有意义吗?

    【讨论】:

    • 请注意,保护通常通过分页起作用,因此使用不同的选择器对您没有一点帮助。
    • @jester 我并不是建议他可以修改另一个进程的内存,而是他正在向其中注入代码的进程可能以不止一种方式引用相同的内存。
    • 这不会改变任何事情。至少在当前操作系统中,保护是按页面设置的,而不是按段设置的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-04
    • 2018-06-03
    • 1970-01-01
    相关资源
    最近更新 更多