alocar endereço zero no Linux com mmap falha

Sep 08 2020

Estou escrevendo um carregador de programa estático para Linux, lendo cabeçalhos de programa ELF e mapeando os segmentos para a memória.

Encontrei um executável que assume que o endereço virtual de seu primeiro segmento está em 0. Meu mapeamento de memória falha, recebo um erro ao alocar página virtual no endereço 0.

Eu me pergunto se é possível alocar toda a memória no endereço 0para o espaço do usuário.

Veja este exemplo de código:

/*mmaptests.c*/
#include <sys/mman.h>
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <errno.h>

int main()
{
    void* p = mmap(0, sysconf(_SC_PAGE_SIZE), PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_FIXED | MAP_ANONYMOUS, -1, 0);
    printf("mmap result %p (errno %s)\n",p,strerror(errno));
    return 0;
}

Eu compilo com:

gcc mmaptests.c

Isso é o que ele retorna:

$./a.out
mmap result 0xffffffffffffffff (errno Operation not permitted)

Ficarei feliz por quaisquer insights.

Obrigado B

Respostas

1 PSkocik Sep 08 2020 at 16:18

O Linux só permitirá mmapa 0ª página se tiver privilégios.

gcc mmaptests.c && sudo ./a.out

deve pegar você:

mmap result (nil) (errno Success)