.d8888b. 8888888888 .d8888b. 888888888 .d8888b. d88P Y88b d88P d88P Y88b 888 d88P Y88b 888 888 d88P .d88P 888 888 888 888 888 888 888 d88P 8888" 8888888b. Y88b. d888 888 888 `Y8bd8P' 88888888 "Y8b. "Y88b "Y888P888 888 888 X88K d88P 888 888 888 888 Y88b d88P .d8""8b. d88P Y88b d88P Y88b d88P Y88b d88P "Y8888P" 8888 8888 d88P "Y8888P" "Y8888P" "Y8888P"

[ Autor: Nicholas Ferreira ]


[0b0010] PHPattern - Gerador de padrões p/ buffer overflow

14/06/2021

PHPattern

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 [size]

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:

Padrão

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

Crash

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:

EIP


  1. Obtivemos o valor do EIP

  2. PHPattern foi usado para descobrir o tamanho do buffer para chegar ao EIP

  3. O tamanho obtido foi configurado no exploit

  4. O EIP foi setado para um valor conhecido (ABCD, 0x41424344)

  5. O programa crashou e nosso valor (0x41424344) foi setado para o EIP (em little endian)


Download - Github