PIE

Apoie o HackTricks

Informações Básicas

Um binário compilado como PIE, ou Executable de Posição Independente, significa que o programa pode carregar em diferentes locais de memória cada vez que é executado, impedindo endereços codificados.

O truque para explorar esses binários está em explorar os endereços relativos — os deslocamentos entre partes do programa permanecem os mesmos mesmo se as localizações absolutas mudarem. Para burlar o PIE, você só precisa vazar um endereço, normalmente da pilha usando vulnerabilidades como ataques de string de formato. Uma vez que você tem um endereço, você pode calcular outros pelos seus deslocamentos fixos.

Uma dica útil na exploração de binários PIE é que o endereço base geralmente termina em 000 devido às páginas de memória serem as unidades de randomização, com tamanho de 0x1000 bytes. Este alinhamento pode ser um verificador crítico se um exploit não estiver funcionando como esperado, indicando se o endereço base correto foi identificado. Ou você pode usar isso para o seu exploit, se você vazar que um endereço está localizado em 0x649e1024 você sabe que o endereço base é 0x649e1000 e a partir daí você pode apenas calcular deslocamentos de funções e localizações.

Bypasses

Para burlar o PIE é necessário vazar algum endereço do binário carregado, existem algumas opções para isso:

  • ASLR desativado: Se o ASLR estiver desativado, um binário compilado com PIE sempre será carregado no mesmo endereço, portanto o PIE será inútil já que os endereços dos objetos sempre estarão no mesmo lugar.

  • Ser dado o vazamento (comum em desafios CTF fáceis, verifique este exemplo)

  • Forçar os valores de EBP e EIP na pilha até vazar os corretos:

BF Addresses in the Stack
  • Use uma vulnerabilidade de leitura arbitrária como string de formato para vazar um endereço do binário (por exemplo, da pilha, como na técnica anterior) para obter a base do binário e usar deslocamentos a partir daí. Encontre um exemplo aqui.

Referências

Apoie o HackTricks

Last updated