이 execstack
프로그램은 실행 가능한 스택이 필요한 ELF 바이너리를 표시하는 데 사용할 수 있습니다.
힙을 실행 가능으로 표시하는 비슷한 방법이 있습니까? 단일 바이너리가 선호되지만 이것이 가능하지 않은 경우 시스템 전체 솔루션도 유용합니다.
답변1
실행 가능 스택 설정(또는 실행 불가능 스택 설정)은 내가 시도한 Linux 버전(x86_64의 2.6.9, x86_64의 2.4.21, 2.6.20.9 x86, 3.1.4 x86)에 아무런 영향을 미치지 않습니다. 현재 Solaris 또는 *BSD 시스템에 액세스할 수 없습니다. 내 생각엔 문제의 커널이 "스택에서" 코드 실행을 비활성화하도록 컴파일되지 않은 것 같습니다. 이것 좀 봐위키피디아 기사, 이는 패치 또는 컴파일 옵션이 필요함을 나타냅니다.
나는 이미 썼다malloc 메모리에서 실행되는 C 프로그램. 위에서 언급한 것과 동일한 모든 코어 및 아키텍처에서 작동합니다. 실행 파일을 "힙 실행 파일"로 표시하는 execstack과 같은 특정 도구를 찾을 수 있을지 의문입니다. 제가 말씀드릴 수 있는 가장 좋은 소식은 mprotect()
시스템 호출을 사용해야 한다는 것입니다 . 설령 사용하더라도 mprotect()
좀 더 특이한 아키텍처(이전 DEC Alpha 또는 HP의 "정확한 아키텍처") 중 일부는 힙 외부 실행을 절대 허용하지 않는다는 점을 알게 될 것입니다.
답변2
예, Ediger가 지적했듯이 mprotect()
시스템 호출을 사용해야 합니다.
하지만 시스템콜을 사용하기 위해서는 mprotect()
자신의 메모리 주소가 어느 페이지에 있는지 알아내야 한다. 마스크 번호가 도움이 될 수도 있습니다.
다음은 매우 간단한 예입니다.
int *ptr = malloc(0x1000);
mprotect((long long)ptr & 0xfffffffffffff000, 0x1000, PROT_EXEC | PROT_READ | PROT_WRITE);
ptr[0] = 0xd503201f; // nop
ptr[1] = 0xd503201f; // nop
ptr[2] = 0xd503201f; // nop
ptr[3] = 0xd65f03c0; // ret
void (*foo)(void) = (void (*)())ptr;
foo();