serem constru´ıdos usando o sistema operacional
GNU Linux
, a teoria elabo-rada ´e aplic´avel a qualquer implementa¸c˜ao de ASLR encontrada nos sistemas
operacionais modernos.
2 Contextualiza¸c˜ao Te´orica
Nos sistemas operacionais modernos cada processo possui um espa¸co de en-dere¸camento privado, isolado e dividido em segmentos com fins espec´ıficos. Doponto de vista do processo ´e como se esse tivesse todos os recursos f´ısicos dis-pon´ıveis para uso exclusivo. A mem´oria b´asica ou vol´atil (RAM) ´e um desses
recursos. Quando o usu´ario solicita a execu¸c˜ao de um determinado aplicativo,
um espa¸co de endere¸camento virtual ´e reservado e o seu bin´ario ´e carregado
nesse espa¸co. O espa¸co de endere¸camento ´e segmentado de acordo com o tipo
dos dados armazenados em cada segmento. Os principais segmentos de umprocesso em mem´oria s˜ao:
•
Dados
: segmento onde est˜ao contidas as vari´aveis est´aticas e globais;
•
C´odigo
: possui o c´odigo de m´aquina do processo executado;
•
Pilha
: armazena vari´aveis locais e referˆencias para controle de fluxo;
•
Heap
: regi˜ao que armazena as vari´aveis alocadas dinˆamicamente;
•
Bibliotecas compartilhadas
: mapas de biliotecas ligadas dinˆamicamente.O C´odigo1mostra o espa¸co de endere¸camento e os principais segmentos do
processo “
cat
”. Nota-se que o “cat” ´e um bin´ario ligado dinˆamicamente a outrasbilbliotecas atrav´es do “
ld-2.11.1.so
” (linha 6). Atrav´es do
ld
bibliotecas podemser acopladas ao processo em tempo de execu¸c˜ao como a biblioteca mostradana linha 9. O segmento de c´odigo, onde o execut´avel ´e carregado, ´e encontradona linha 7. Note que esse segmento tem permiss˜ao de leitura e execu¸c˜ao mas
n˜ao de escrita. Esse mecˆanismo impede que ap´os o carregamento do bin´ario em
mem´oria seja poss´ıvel a inje¸c˜ao de conte´udo nesse segmento (l´ıcito ou n˜ao). Por
fim, observa-se a os segmentos de pilha e
heap
nas linhas 12 e 8 respectivamente.
1
mabj@Jarvis:~$ cat /proc/self/maps
2
00652000-00653000 r-xp 00000000 00:00 0 [vdso]
3
00695000-007e8000 r-xp 00000000 08:05 1077606 /lib/tls/i686/cmov/libc-2.11.1.so
4
007e8000-007e9000 ---p 00153000 08:05 1077606 /lib/tls/i686/cmov/libc-2.11.1.so
5
007ec000-007ef000 rw-p 00000000 00:00 0
6
00de3000-00dfe000 r-xp 00000000 08:05 918023 /lib/ld-2.11.1.so
7
08048000-08054000 r-xp 00000000 08:05 557808 /bin/cat
8
09f55000-09f76000 rw-p 00000000 00:00 0 [heap]
9
b75ff000-b763e000 r--p 00000000 08:05 269665 /usr/lib/locale/en_US.utf8/LC_CTYPE
10
...
11
b7772000-b7774000 rw-p 00000000 00:00 0
12
bfb54000-bfb69000 rw-p 00000000 00:00 0 [stack]
C´odigo 1:
Espa¸co de endera¸camento correspodente ao processo “cat”.
O componente do sistema operacional respons´avel por carregar o execut´avelem mem´oria ´e o
loader
. O
loader
recebe o arquivo bin´ario
COFF
(
Commom Object File Format
), cria os segmentos mostrados e configura suas respectivaspermiss˜oes. O tamanho e as permiss˜oes de um determinado segmento podemser alterados em tempo de execu¸c˜ao. Um exemplo de cria¸c˜ao de um segmento
em mem´oria usando o
mmap
pode ser observado no C´odigo2.2
Add a Comment