我試圖保護我的應用程序免受緩衝區溢出攻擊。除此之外,我使用非可執行堆棧並將我的二進制文件與noexecstack
標誌(將-Wl,-z,noexecstack
傳遞給gcc)相鏈接。即使使用`noexecstack`,堆棧也可以執行
似乎一切都很好 - 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
這裏只有一個問題。我所有的堆棧實際上是可執行文件:
[email protected]:~# 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。
這是一個多線程應用程序嗎? –
該選項只是標記可執行文件,但不能保證您的操作系統注意到它。這可能不是編程問題,而是系統管理/配置。 – Olaf
@BasileStarynkevitch是的,這是一個多線程應用程序。堆棧由'pthread_create'分配。 –