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
SilentMoonwalk — Implementação de PoC de um spoofer de pilha de chamadas totalmente dinâmico | Kitploit
Ferramentas/GitHubGitHub/klezvirus/silentmoonwalk
ExploraçãoEngenharia ReversaAnálise de BináriosRed TeamingDesenvolvimento de Payloads
GitHubklezvirus/silentmoonwalk

SilentMoonwalk

Implementação de PoC de um spoofer de pilha de chamadas totalmente dinâmico

Ver Repositório
985113há 2 anosRevisado pelo Kitploit

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

SilentMoonwalk

Implementação de Prova de Conceito de um spoofing de pilha de chamadas totalmente dinâmico

TL;DR

SilentMoonwalk é uma implementação PoC de um spoofing de pilha de chamadas totalmente dinâmico, implementando uma técnica para remover o chamador original da pilha de chamadas, usando ROP para dessincronizar o desenrolamento do fluxo de controle.

Autores

Este PoC é o resultado de uma pesquisa conjunta sobre o tópico de spoofing de pilha. Os autores da pesquisa são:

  • KlezVirus
  • Waldo-IRC
  • Trickster0

Quero enfatizar que este trabalho teria sido impossível sem o trabalho de Waldo-IRC e Trickster0, que ambos contribuíram para os estágios iniciais do PoC, e para a pesquisa por trás do PoC.

Visão Geral

Este repositório demonstra uma implementação PoC para falsificar a pilha de chamadas ao chamar APIs arbitrárias do Windows.

Esta tentativa foi inspirada por este tópico do Twitter e este tópico do Twitter, onde o sensei namazso mostrou e sugeriu estender a abordagem de desenrolamento de pilha com uma cadeia ROP para dessincronizar o desenrolamento do fluxo de controle real e restaurar a pilha original posteriormente.

Este PoC tenta fazer algo semelhante ao acima, e usa uma pilha de dessincronização para ocultar completamente a pilha de chamadas original, além de remover a base da imagem EXE dela. Ao retornar, um gadget ROP é invocado para restaurar a pilha original. No código, esse processo é repetido 10 vezes em um loop, usando diferentes quadros a cada iteração, para provar estabilidade.

Modos Suportados

A ferramenta atualmente suporta 2 modos, onde um é na verdade um patch incorreto para um quadro pop RBP não funcional identificado, que opera deslocando o RSP atual e adicionando dois quadros falsos à pilha de chamadas. Como opera usando quadros sintéticos, refiro-me a este modo como "SYNTHETIC".

Ao selecionar o quadro que se desenrola ao retirar o registrador RBP da pilha, a ferramenta pode selecionar um quadro inadequado, resultando em uma pilha de chamadas abruptamente cortada, como observável abaixo.

Pilha de Chamadas do Windows 10 - Cortada

Modo de Pilha Sintética

Uma solução boba para o problema seria criar dois quadros falsos e vinculá-los de volta à pilha de chamadas cortada. Isso criaria uma espécie de pilha de chamadas aparentemente legítima, mesmo sem um quadro adequado que se desenrole chamando POP RBP, mas:

  • Você perderia a vantagem da técnica de dessincronização
  • A pilha ainda seria desenrolável
  • A pilha de chamadas resultante poderia parecer legítima à primeira vista, mas provavelmente não passaria em uma verificação rigorosa

O resultado do spoof sintético pode ser observado na imagem abaixo:

Pilha de Chamadas do Windows 10 - Aparentemente Legítima, não desenrolável - getchar

Figura 1: Windows 10 - Pilha de chamadas aparentemente legítima, não desenrolável, na qual o módulo EXE foi completamente removido (chamando a função getchar sem parâmetros)

Nota: Este modo de operação está desabilitado por padrão. Para habilitar este modo, altere CALLSTACK_TYPE para 1

Modo de Pilha Dessincronizada

Este modo é a solução correta para o problema acima, onde o quadro inadequado é simplesmente substituído por outro, adequado.

Pilha de Chamadas do Windows 10 - Legítima, desenrolável - MessageBoxExA

Figura 2: Windows 10 - Pilha de chamadas legítima, desenrolável, na qual o módulo EXE foi completamente removido (chamando a função MessageBoxA com 4 parâmetros)

Utilitário

No repositório, você também pode encontrar um pequeno utilitário para inspecionar funções de tempo de execução, que pode ser útil para analisar entradas de funções de tempo de execução.

root@kitploit:~
UnwindInspector.exe -h

 Unwind Inspector v0.100000

 Mandatory args:
   -m <module>: Target DLL
   -f <function>: Target Function
   -a <function-address>: Target Function Address

Saída de Exemplo:

root@kitploit:~
UnwindInspector.exe -m kernelbase -a 0x7FFAAE12182C
[*] Using function address 0x7ffaae12182c

  Runtime Function (0x000000000000182C, 0x00000000000019ED)
  Unwind Info Address: 0x000000000026AA88
    Version: 0
    Ver + Flags: 00000000
    SizeOfProlog: 0x1f
    CountOfCodes: 0xc
    FrameRegister: 0x0
    FrameOffset: 0x0
    UnwindCodes:
    [00h] Frame: 0x741f - 0x04  - UWOP_SAVE_NONVOL     (RDI, 0x001f)
    [01h] Frame: 0x0015 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0015)
    [02h] Frame: 0x641f - 0x04  - UWOP_SAVE_NONVOL     (RSI, 0x001f)
    [03h] Frame: 0x0014 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0014)
    [04h] Frame: 0x341f - 0x04  - UWOP_SAVE_NONVOL     (RBX, 0x001f)
    [05h] Frame: 0x0012 - 0x00  - UWOP_PUSH_NONVOL     (RAX, 0x0012)
    [06h] Frame: 0xb21f - 0x02  - UWOP_ALLOC_SMALL     (R11, 0x001f)
    [07h] Frame: 0xf018 - 0x00  - UWOP_PUSH_NONVOL     (R15, 0x0018)
    [08h] Frame: 0xe016 - 0x00  - UWOP_PUSH_NONVOL     (R14, 0x0016)
    [09h] Frame: 0xd014 - 0x00  - UWOP_PUSH_NONVOL     (R13, 0x0014)
    [0ah] Frame: 0xc012 - 0x00  - UWOP_PUSH_NONVOL     (R12, 0x0012)
    [0bh] Frame: 0x5010 - 0x00  - UWOP_PUSH_NONVOL     (RBP, 0x0010)

Compilação

Para compilar o PoC e observar um comportamento semelhante ao da imagem, certifique-se de:

  • Desabilitar GS (/GS-)
  • Desabilitar Otimização de Código (/Od)
  • Desabilitar Otimização do Programa Inteiro (Remover /GL)
  • Desabilitar preferência de tamanho e velocidade (Remover /Os, /Ot)
  • Habilitar intrínseco se não estiver habilitado (/Oi)

Trabalhos Anteriores

Vale mencionar trabalhos anteriores neste tópico, que construíram a base deste trabalho.

  • Return Address Spoofing: Técnica e ideia originais, por Namaszo. Todos os outros PoCs que conheço foram construídos sobre isso.
  • YouMayPasser: Este trabalho incrível de Arash é a primeira extensão propriamente feita do PoC Return Address Spoofing de Namaszo.
  • VulcanRaven: Um spoofing de pilha de chamadas que opera o spoofing criando sinteticamente uma Pilha de Threads espelhando outra pilha de chamadas real.
  • Unwinder: Uma implementação PoC em Rust muito boa de um spoofing de pilha de chamadas que opera analisando informações de código de desenrolamento para substituir quadros na pilha de chamadas.

Créditos

  • Um grande agradecimento ao waldo-irc e trickster0, que colaboraram comigo nesta pesquisa. Devo tudo a eles.
  • Todo o crédito pela ideia por trás disso vai para namaszo, que pessoalmente considero um gênio. Ele também revisou este PoC antes do lançamento, então muito obrigado a ele.

Notas

  • [SYNTHETIC STACK ONLY]: Devido a uma limitação na forma como estou localizando os gadgets, o número máximo de argumentos é 8 por enquanto (é TRIVIAL modificar e adicionar mais parâmetros, mas não me preocupei).
  • [DSESYNC STACK ONLY]: Devido a uma limitação na forma como configuro o spoofing, o número máximo de argumentos suportados é 4 por enquanto.
  • Os testes neste foram bastante limitados. Pode haver exceções das quais não tenho conhecimento no momento.
  • O desenrolamento envolvendo registradores de 128 bits não foi testado.
  • Chamar funções que usam registradores de 128 bits não é oficialmente suportado.
Baixar ferramenta