ฉันกระแทกหัวของฉันกับกำแพงด้วยสิ่งนี้
ในโครงการของฉันเมื่อฉันจัดสรรหน่วยความจำด้วยmmap
การจับคู่ ( /proc/self/maps
) แสดงให้เห็นว่ามันเป็นพื้นที่ที่สามารถอ่านได้และปฏิบัติการได้แม้ว่าฉันจะขอหน่วยความจำที่สามารถอ่านได้เท่านั้น
หลังจากตรวจสอบ strace (ซึ่งดูดี) และการดีบักอื่น ๆ ฉันสามารถระบุสิ่งเดียวที่ดูเหมือนว่าจะหลีกเลี่ยงปัญหาแปลก ๆ นี้ได้: การลบไฟล์ชุดประกอบออกจากโครงการและปล่อยให้เฉพาะ C. บริสุทธิ์ (อะไร?!)
ดังนั้นนี่คือตัวอย่างที่แปลกประหลาดของฉันฉันกำลังทำงานบน Ubunbtu 19.04 และ gcc เริ่มต้น
หากคุณรวบรวมเป้าหมายไฟล์ที่เรียกใช้งานได้ด้วยไฟล์ ASM (ซึ่งว่างเปล่า) mmap
จะส่งคืนพื้นที่ที่สามารถอ่านได้และสามารถเรียกใช้งานได้หากคุณสร้างโดยไม่ต้องดำเนินการอย่างถูกต้อง ดูผลลัพธ์/proc/self/maps
ที่ฉันได้ฝังในตัวอย่างของฉัน
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 : เป็นไฟล์ว่าง!
เอาท์พุท
ด้วยรุ่น ASM รวม
VirtualBox:~/mechanics/build$ gcc example.c example.s -o example && ./example
7f78d6e08000-7f78d6e0a000 r-xp 00000000 00:00 0
ไม่มี ASM เวอร์ชันรวม
VirtualBox:~/mechanics/build$ gcc example.c -o example && ./example
7f1569296000-7f1569298000 r--p 00000000 00:00 0
-Wa,--noexecstack
ประกอบไฟล์ที่มาของคุณด้วย