[ Autor: Nicholas Ferreira ]
[0b0010] PHPattern - Gerador de padrões p/ buffer overflow
14/06/2021
Esta ferramenta é um simples criador de padrão e localizador de EIP para a exploração de buffer overflow.
Ele irá gerar uma grande string que será enviada para o software a ser explorado. Na melhor situação, o programa irá travar (com uma falha de segmentação ou algo parecido) e você poderá ver o valor do EIP com um debugger. Com esse valor em mãos, basta usar o recurso "find EIP" para encontrar o tamanho da string que você precisa enviar para chegar ao EIP. Sabendo esse tamanho, você pode manipular o EIP e alterar o fluxo do programa para ir para algum lugar, rodar alguma função interna, executar algum shellcode enviado, etc.
Criando uma string de 2000 bytes:
Uso
Gerar padrão
nich0las@0x7359:~$ ./PHPattern fuzz
Retorna uma string especial que será usada como um 'preenchedor de buffer' para sobrecrever o EIP.
size = Tamanho da string a ser gerada.
Tamanho máximo: 3.767.680. Use size = 0 para usar o tamanho máximo.
Ex:
nich0las@0x7359:~$ ./PHPattern fuzz 100
AA10AA11AA12AA13AA14AA15AA16AA17AA18AA19AA20AA21AA22AA23AA24AA25AA26AA27AA28AA29AA30AA31AA32AA33AA34
Encontrar o EIP
nich0las@0x7359:~$ ./PHPattern find
Retorna o tamanho do buffer que precisa ser enviado para chegar ao EIP.
offset = o valor do EIP após a aplicação crashar
size = O tamanho da string gerada anteriormente (mais rápido, mas opcional)
Exemplo:
Usando o Vulnserver, gerei um padrão com 3000 bytes:

Enviando o padrão para a aplicação, ela crasha e o EIP passa a ter o valor 0x46413136:

Usando esse valor no PHPattern em modo find, descobrimos que precisamos de exatamente 2006 bytes para manipular o EIP. Após os 2006 bytes, os próximos 4 sobrescreverão o EIP:

- Obtivemos o valor do EIP
- PHPattern foi usado para descobrir o tamanho do buffer para chegar ao EIP
- O tamanho obtido foi configurado no exploit
- O EIP foi setado para um valor conhecido (ABCD, 0x41424344)
- O programa crashou e nosso valor (0x41424344) foi setado para o EIP (em little endian)