나는 이것으로 벽에 머리를 두드리고 있습니다.
내 프로젝트 mmap
에서 매핑 ( /proc/self/maps
)으로 메모리를 할당 할 때 읽기 가능한 메모리 만 요청 했지만 읽기 가능하고 실행 가능한 영역임을 보여줍니다 .
strace (좋아 보이는) 및 기타 디버깅을 살펴본 후에 프로젝트에서 어셈블리 파일을 제거하고 순수한 C 만 남겨 두는이 이상한 문제를 피하는 것으로 보이는 유일한 것을 확인할 수있었습니다 (무엇?!).
그래서 여기 이상한 예가 있습니다. 우분투 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
.