Bununla kafamı duvara vuruyorum.
Projemde mmap
, mapping ( /proc/self/maps
) ile bellek ayırdığımda , yalnızca okunabilir bellek istememe rağmen okunabilir ve yürütülebilir bir bölge olduğunu gösteriyor .
Strace (iyi görünüyor) ve diğer hata ayıklama içine baktıktan sonra, bu garip sorunu önlemek gibi görünüyor tek şey tespit edebildi: derleme dosyaları projeden kaldırma ve sadece saf C. bırakarak (ne ?!)
İşte benim garip örneğim, Ubunbtu 19.04 ve varsayılan gcc üzerinde çalışıyorum.
Hedef yürütülebilir dosyayı ASM dosyasıyla (boş) mmap
derlerseniz, okunamayan ve yürütülebilir bir bölge döndürür, onsuz oluşturursanız doğru davranır. /proc/self/maps
Benim örneğime gömülü çıktı bakın .
example.c
#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
int main()
{
void* p;
p = mmap(NULL, 8192,PROT_READ,MAP_ANONYMOUS|MAP_PRIVATE,-1,0);
{
FILE *f;
char line[512], s_search[17];
snprintf(s_search,16,"%lx",(long)p);
f = fopen("/proc/self/maps","r");
while (fgets(line,512,f))
{
if (strstr(line,s_search)) fputs(line,stderr);
}
fclose(f);
}
return 0;
}
example.s : Boş bir dosya!
çıktılar
ASM dahil sürüm ile
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
ASM dahil sürüm olmadan
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
.