Skip to content
KitploitKITPLOIT
FerramentasBlog
Enviar
FerramentasBlog
Enviar

Ferramentas de Hacking, PenTest e Cibersegurança para o seu Arsenal de Segurança!

Kitploit é um diretório de ferramentas de hacking, cibersegurança e pentesting. Descubra as últimas atualizações de projetos para encontrar vulnerabilidades, analisar sistemas, automatizar testes e fortalecer sua segurança.

··Feeds·Contato·Privacidade·© 2026 Kitploit

Diretório de Ferramentas

Categorias

Ver todas as categorias
Loading categories
CVE-2019-25485 — Estouro de buffer baseado em pilha no R 3.4.4. Exploração completa em x86, mas apenas controle de RIP com análise de gadgets em x64 devido a restrições do programa. A mesma vulnerabilidade em duas arquiteturas, levando a diferentes caminhos de exploração. | Kitploit
Ferramentas/GitHubGitHub/themalwareguardian/cve-2019-25485
Análise de VulnerabilidadesExploraçãoEngenharia ReversaShellcodeDepuradoresAprendizado e EducaçãoDesenvolvimento de PayloadsExploração de Binários
GitHub
themalwareguardian/cve-2019-25485

CVE-2019-25485

Estouro de buffer baseado em pilha no R 3.4.4. Exploração completa em x86, mas apenas controle de RIP com análise de gadgets em x64 devido a restrições do programa. A mesma vulnerabilidade em duas arquiteturas, levando a diferentes caminhos de exploração.

Ver Repositório
3há 5 mesesAinda não revisado

Mais Populares

Ver todos →

Descubra as ferramentas mais usadas pela nossa comunidade.

Explore todas as ferramentas

Navegue pela nossa coleção de ferramentas

Ver todas as ferramentas →
Compartilhar

🐞 CVE-2019-25485: R 3.4.4 - Stack-Based Buffer Overflow (x86 e x64)

Stack-based buffer overflow no R 3.4.4. Exploração completa no x86, mas apenas controle de RIP com análise de gadgets no x64 devido a restrições do programa. A mesma vulnerabilidade em duas arquiteturas, levando a diferentes caminhos de exploração.




📑 Índice

  • Por que este repositório existe
  • Por que esta vulnerabilidade é interessante
  • Contexto e software afetado
  • Sobre a vulnerabilidade
  • Desencadeando o crash
  • Exploração



🎓 Por que este repositório existe

Este repositório faz parte do material que utilizo ao ensinar exploração de corrupção de memória (além do meu trabalho regular, também leciono em diferentes cursos de cibersegurança onde ajudo a treinar a próxima geração de engenheiros reversos).

CVE-2019-25485 é o caso que uso quando quero que os alunos trabalhem na mesma vulnerabilidade em duas arquiteturas diferentes e vejam em primeira mão o que muda entre elas. O R 3.4.4 é distribuído nas versões x86 e x64, e o mesmo overflow existe em ambas, o mesmo campo GUI, o mesmo manipulador de entrada, o mesmo crash. Ambos estão documentados e explorados aqui como exercícios separados:

  • A versão x86 segue a metodologia clássica de sobrescrita de EIP. O overflow atinge o EIP, um gadget JMP ESP é encontrado em um módulo sem ASLR, o shellcode é colocado após a sobrescrita do EIP, e um shell reverso funcional é alcançado. É um exploit limpo e direto que demonstra os fundamentos de overflows de buffer baseados em pilha.
  • A versão x64 atinge o controle de RIP e confirma o offset, mas o RCE completo não é alcançado. Isso é proposital e é o ponto do exercício. A tentativa de exploração no x64 documenta o processo de busca de gadgets na íntegra, analisa por que cada categoria de gadget falha neste contexto específico, explica a restrição de byte nulo imposta pelo manipulador de entrada, e descreve a estrutura da cadeia ROP que seria necessária para contornar o DEP e por que ela não pode ser construída dadas as restrições deste vetor de entrada. O único caminho teórico restante para exploração completa a partir desta única vulnerabilidade seria JOP, Jump-Oriented Programming, que encadeia gadgets terminados em JMP em vez de RET e não depende da pilha para o fluxo de controle. Construir uma cadeia JOP manualmente sem nenhuma região controlada gravável após a sobrescrita de RIP é um desafio avançado em aberto que está além do escopo deste exercício. O fracasso não é uma lacuna na metodologia. É a lição.



💡 Por que esta vulnerabilidade é interessante

R 3.4.4 é uma aplicação de computação estatística, não um serviço de rede ou navegador. O overflow é acionado através de um campo GUI de desktop, o que significa que a superfície de ataque é completamente diferente de todos os outros casos que ensino. O que torna este caso útil para o ensino:

  • Nenhum componente de rede. O payload é colado em um campo GUI, o que introduz uma classe diferente de restrições, em particular como o manipulador de entrada do GUI processa bytes antes que eles alcancem a operação de cópia vulnerável.
  • Controle de RIP confirmado. O overflow atinge o RIP e o offset é encontrado. Este não é um caso onde a vulnerabilidade não pode ser alcançada. O controle do ponteiro de instrução é totalmente demonstrado.
  • A imposição de endereço canônico quebra a abordagem clássica. No x86 você sobrescreve o EIP e anexa shellcode. No x64 os bytes superiores do RIP devem ser \x00\x00 para que o endereço seja canônico, e esses bytes nulos terminam a entrada imediatamente após o endereço do gadget. Não há espaço para shellcode ou valores de cadeia ROP após a sobrescrita.
  • A conversão de byte nulo bloqueia ROP. O campo GUI converte bytes nulos em espaços antes de copiar para o buffer. Todo endereço x64 contém bytes nulos na metade superior. Nenhum endereço de gadget pode ser colocado na pilha como um valor de cadeia ROP, todos chegam corrompidos.
  • DEP bloqueia a execução direta. Mesmo que uma maneira de alcançar o buffer de shellcode fosse encontrada, o DEP está ativado e bloqueia a execução na pilha.
  • A busca de gadgets é documentada na íntegra. O processo de despejar gadgets de todos os módulos carregados, filtrar por tipo e raciocinar sobre por que cada gadget falha é documentado passo a passo. Esta é a habilidade central que todo desenvolvedor de exploits precisa.
  • O esqueleto da cadeia ROP para VirtualProtect é explicado. Os alunos veem exatamente o que seria necessário para contornar o DEP, por que a convenção de chamada é importante e por que esta cadeia específica não pode ser construída dadas as restrições de entrada.



🔍 Contexto e software afetado

R é um ambiente de computação estatística e gráficos disponível para Windows, macOS e Linux. A vulnerabilidade está na caixa de diálogo Preferências do GUI, especificamente no campo Idioma para menus e mensagens, que copia a entrada do usuário para um buffer de pilha de tamanho fixo sem validar seu comprimento.

Principais detalhes técnicos:

  • Tipo de vulnerabilidade: Stack-based buffer overflow
  • Versão afetada: R 3.4.4 x86_x64
  • Endpoint afetado: Editar -> Preferências do GUI -> Idioma para menus e mensagens
  • Componente vulnerável: Manipulador de entrada de preferências do GUI
  • Autenticação necessária: Não (aplicativo local)
  • Impacto: x86 - Execução remota de código | x64 - Fluxo de controle confirmado



⚠️ Sobre a vulnerabilidade

O R 3.4.4 processa o campo Idioma para menus e mensagens copiando a string fornecida para um buffer de pilha de tamanho fixo sem verificar seu comprimento. Uma versão simplificada da lógica vulnerável se parece com isso:

root@kitploit:~
char language_buffer[256];

strcpy(language_buffer, user_input);

Enviar uma string suficientemente longa faz com que a cópia escreva além do final do buffer, corrompendo a pilha até que o endereço de retorno salvo seja sobrescrito. Quando a função retorna, a CPU carrega o valor controlado pelo atacante da pilha para o RIP e tenta pular para ele.

No x64, o Windows impõe validação de endereço canônico antes que qualquer salto ocorra. Um valor não canônico como 0x4141414141414141 desencadeia uma violação de acesso imediata antes que o RIP seja carregado, o que significa que o crash parece diferente do x86, sem um RIP = 4141414141414141 limpo. O offset deve ser encontrado lendo o padrão cíclico da pilha após o crash, em vez de diretamente do RIP.




💥 Desencadeando o crash

O crash pode ser reproduzido colando uma string longa no campo de idioma. Nenhuma autenticação é necessária. Exemplo usando Python para gerar o payload:

root@kitploit:~
import struct

payload = b'A' * 400

with open('payload.txt', 'wb') as f:
	f.write(payload)
root@kitploit:~
Open R 3.4.4 x64
Edit -> GUI Preferences
Paste contents of payload.txt into Language for menus and messages
Click OK
Baixar ferramenta



💣 Exploração

O objetivo deste repositório não é apenas demonstrar o crash, mas percorrer o processo completo de exploração em ambas as arquiteturas, documentando o que funciona no x86, o que quebra no x64 e, mais importante, por quê.

Para manter o README principal limpo, as notas detalhadas de exploração, scripts e etapas do depurador estão colocadas dentro da pasta Vulnerability 📂 deste repositório, organizadas em subpastas separadas x86 e x64.

Lá você encontrará o fluxo de trabalho completo para ambas as arquiteturas:

x86 - Exploração completa:

  • Fuzzing do campo de idioma para identificar o crash.
  • Descoberta do offset para localizar a posição exata do EIP na pilha.
  • Análise de caracteres ruins para identificar bytes que corrompem o payload.
  • Localização de um gadget JMP ESP em stats.dll, um módulo compilado sem ASLR ou SafeSEH.
  • Colocação e execução de shellcode, shell reverso completo alcançado.

x64 - Controle de RIP e análise de exploração:

  • Configuração do x64dbg para evitar interrupções constantes de eventos de carregamento de DLL.
  • Fuzzing do campo de idioma em três fases para encontrar o tamanho exato do crash.
  • Encontrar o offset do RIP lendo o padrão cíclico da pilha em vez do RIP.
  • Confirmar o controle de RIP usando uma sobrescrita de 6 bytes com preenchimento automático de byte nulo.
  • Identificar a conversão de byte nulo para espaço como a restrição fundamental de entrada.
  • Despejar gadgets de todos os módulos R carregados usando rp++ e filtrando com PowerShell.
  • Analisar cada categoria de gadget, CALL RBX, CALL RSP, POP RSP, SUB RSP, PUSH RSP, e documentar por que cada uma falha neste contexto específico.
  • Explicar a estrutura da cadeia ROP necessária para chamar VirtualProtect e contornar o DEP, e por que ela não pode ser construída dada a restrição de byte nulo.
  • Documentar o JOP como o único caminho teórico restante e por que permanece um desafio em aberto.