从BSS部分运行代码

时间:2015-04-19 15:01:20

标签: c assembly

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

我正在使用linux x86。

2 个答案:

答案 0 :(得分:2)

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

static char * 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/很好地说明了图表等。

但是,如果您希望将可执行文件的哪些细分标记为可执行文件,请在可执行文件上使用名为 readelf 的工具作为如下所示:

readelf -l ./test

答案 1 :(得分:0)

是的,你是对的。如果保存BSS的内存段或选择器未标记为不可执行,则可以在以下情况下轻松执行代码:

  1. 你知道它在记忆中的位置
  2. 您可以通过此方式控制EIP以重定向执行
  3. 您有一些输入(文件,实际输入,网络或环境)将以静态分配的变量结束。
  4. 只需将您的代码注入#3即可开始参加比赛。

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

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

相关问题