【发布时间】:2017-04-01 03:07:16
【问题描述】:
我正在尝试保护我的应用程序免受缓冲区溢出攻击。除其他外,我正在使用非可执行堆栈并将我的二进制文件与noexecstack 标志链接(通过将-Wl,-z,noexecstack 传递给gcc)。
一切似乎都很好 - readelf 确认 PT_GNU_STACK 指定了正确的权限:
$ readelf -l target | grep -A1 GNU_STACK
GNU_STACK 0x0000000000000000 0x0000000000000000 0x0000000000000000
0x0000000000000000 0x0000000000000000 RW 10
execstack也是如此:
$ execstack -q target
- target
只有一个问题。我所有的堆栈实际上都是可执行的:
root@170ubuntu16p04-64smp-1:~# cat /proc/12878/task/*/maps | grep stack
7ffcac654000-7ffcac675000 rwxp 00000000 00:00 0 [stack]
7fe540e66000-7fe541666000 rwxp 00000000 00:00 0 [stack]
7fe540665000-7fe540e65000 rwxp 00000000 00:00 0 [stack]
7fe53b800000-7fe53c000000 rwxp 00000000 00:00 0 [stack]
我捕获了allocate_stack 调用并检查了保护标志。 In theory,它们应该根据PT_GNU_STACK进行初始化。但在我的例子中,PT_GNU_STACK 似乎被忽略了,_dl_stack_flags 被初始化为默认权限。
有谁知道是什么原因造成的?一切似乎都正确,但堆栈仍然是可执行的。
我正在使用 gcc 4.8.3 / glibc 2.11。
【问题讨论】:
-
这是一个多线程应用程序吗?
-
该选项只是标记可执行文件,但不能保证您的操作系统会注意它。这可能不是编程问题,而是系统管理/配置问题。
-
@BasileStarynkevitch 是的,它是一个多线程应用程序。堆栈由
pthread_create分配。 -
@Olaf 操作系统注意了。我已经使用相同的工具链构建了几个应用程序,它们没有可执行堆栈 - 堆栈是
mmaped 和rw-p。这就是为什么我认为我忽略了一些东西。 -
好吧,您可能会使用未设置该标志的库/目标文件。这样一来,整个应用程序就不能了。