Stack

O que é a Stack

A pilha, ou Stack em Inglês, é uma região de memória contínua alocada no início da execução da aplicação, mais especificamente no início da thread. Essa região é usada para armazenar os dados necessários para a execução de blocos de código, é nela que são salvas as variáveis declaradas, endereços de retornos de funções e parâmetros, sendo que esse último é salvo somente em arquiteturas 32-bits.

Seu gerenciamento normalmente é feito por meio de um ponteiro que sempre irá apontar para o topo, normalmente salvo pelo registrador sp (stack pointer). Dessa forma, toda vez que se deseja salvar algo na pilha o sp é movimentado (criando um "espaço" nela), e quando algo deixa de ser usado, como o escopo de uma função após o seu término, o sp é movimentado na direção oposta. Todo esse gerenciamento da stack é feito pelo compilador, mas em linguagens como assembly é responsabilidade do programador gerenciar isso.

Nota: O conceito de pilha nos leva a acreditar que na memória essa região cresce, ou seja, vai de endereços menores até endereços maiores. Porém a realidade é o contrário, um programa carregado na memória tem toda um região reservada para ele, e essa região é dividida em regiões menores. Essas regiões menores são a heap, a stack, as tabelas globais e offsets, e a região reservada para a stack é a região que está no fim dessa área reservada, por isso ela "cresce" de cima para baixo, aí quando vai criar espaço nela o sp é decrementado.

Funcionamento

Seu funcionamento é baseado no princípio FIFO (First In First Out), pois como citado anteriormente o gerenciamento da Stack é feito por meio do incremento e decremento do registrador sp. Além disso não há muito o que comentar por agora, seu detalhamento será feito junto com as explicações dos exploits existentes para essa região.

Atualizado