it-swarm-pt.tech

EIP de quê?

Há uma tonelada de perguntas aqui que fazem referência ao eip:

O que é o EIP? Como é usado, tanto como alvo de exploração quanto em código benigno?

17
Ares

O EIP é um registro nas arquiteturas x86 (32 bits). Ele contém o "Ponteiro de Instrução Estendida" para a pilha. Em outras palavras, indica ao computador para onde ir para executar o próximo comando e controla o fluxo de um programa.

Pesquise a linguagem Assembly para entender melhor como os registros funcionam. Skull Security tem uma boa cartilha.

18
HashHazard

Uma das coisas básicas que um computador precisa acompanhar é onde estão localizadas as instruções que estão sendo executadas na memória.

Isso normalmente é feito pela CPU usando o que é conhecido como o ponteiro de instruções ou contador de programaregistrador . O nome exato depende da arquitetura, mas o conceito generaliza em todas as arquiteturas. Ele é chamado de ponteiro de instrução nas CPUs Intel, e esse é o termo que usarei nesta resposta. O ponteiro de instruções é incrementado continuamente enquanto as instruções são executadas a partir da memória e também atualizado sempre que uma instrução de salto de algum tipo é executada. Arquiteturas de CPU modernas com vários pipelines de execução paralela e múltiplos núcleos tornam o que realmente está acontecendo dentro da CPU mais complexo, mas para um observador externo, a explicação simples é suficiente para entender o que está acontecendo e o objetivo dos registros relevantes.

Em virtude dos antigos processadores Intel 8086/8088, 80186 e 80286 serem processadores de 16 bits, o ponteiro de instruções era normalmente expresso como um par de valores de 16 bits conhecido como segmento de código (código seletor no 80286, mas, exceto no modo protegido, os seletores funcionam de maneira muito semelhante aos segmentos) e ao ponteiro de instruções. No parla do assembler, CS:IP onde os dois pontos indicam o emparelhamento de um segmento e um deslocamento como um par para formar um endereço de memória. CS e IP aqui são CPU registradores, pequenas localizações de memória no próprio chip da CPU, neste caso em particular, com 16 bits de tamanho. (Você também teve coisas como DS:DX que era convencionalmente o local para onde ler ou gravar dados na memória; DS foi segmento de dados e DX é um registro de uso geral que, nesse caso, retinha o deslocamento do segmento de dados. Originalmente, havia quatro registros destinados ao uso geral, chamados AX, BX, CX e DX, respectivamente, cada um dos quais poderia ser tratado em termos da metade alta - AH, por exemplo - ou da metade baixa - AL, além de um pequeno número de registros de uso geral que tinham usos específicos específicos. As CPUs modernas têm muitos, muitos mais registros, com dezenas de registros comuns e mais de cem inéditos.)

Ao fabricar a CPU 80386 no final dos anos 80, a Intel fez muitas alterações, incluindo a extensão do espaço de endereço para 32 bits enquanto mantém os seletores como um conceito. Por esse motivo, os antigos valores de 16 bits não eram mais suficientes e o ponteiro da instrução foi estendido para 32 bits. Para manter a compatibilidade com versões anteriores (neste momento, a Intel provavelmente havia aprendido a lição do 80286, que era mais compatível unidirecionalmente; era fácil passar dos anos 8086/8088 modo real nos anos 80286 modo protegido, mas voltar era muito mais difícil, e isso acabou sendo um problema na prática), isso exigiu um novo registro para a CPU para manter o ponteiro de instruções quando operando no modo de 32 bits.

No 80386, os registradores estendidos (32 bits) foram nomeados Exx, enquanto os registradores correspondentes de 16 bits foram chamados anteriormente como xx. Portanto, você obteria, por exemplo, o antigo registro acumulador de 16 bits AX mais o registro estendido EAX de 32 bits (com metades de 16 bits EAH e EAL). De acordo com esta convenção de nomenclatura, o registro Extended Instruction Pointer foi referido como EIP.

Como um aparte, na maioria das vezes, o valor correto não é apenas EIP, mas CS: EIP, porque o valor de EIP permanece um offset a partir de algum local inicial definido pelo seletor de código.

13
a CVn

EIP é um registro de execução básica de programa.

-Como alvo de exploração, acho que pág. 81 do manual da Intel diz tudo

O registro EIP não pode ser acessado diretamente pelo software; é controlado implicitamente por instruções de transferência de controle (como JMP, Jcc, CALL e RET), interrupções e exceções. A única maneira de ler o registro EIP é executar uma instrução CALL e, em seguida, ler o valor do ponteiro da instrução de retorno na pilha de procedimentos. O registro EIP pode ser carregado indiretamente, modificando o valor de um ponteiro de instrução de retorno na pilha de procedimentos e executando uma instrução de retorno

Entender o papel que o EIP desempenha na execução do programa parece simples, porém complexo, quando você considera que a combinação do registro do Segmento de Código (CS) com o EIP cria esse "endereço lógico" e, como todas as CPUs x86 usam pré-busca, uma instrução lida no barramento não será seja o que está no registro EIP. A parte simples é que o valor no EIP é usado para determinar o local da próxima instrução, se isso o envia de volta a uma instrução anterior ou é encaminhado em código linear. Os resultados das instruções anteriores são armazenados no EAX.

-e em código benigno?

Bem, sempre que seu código executar um algoritmo ou chamar uma função, você definitivamente usará esse registro.

1
Robert Houghton