Reversing Tools & Basic Methods
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Ferramentas de Reversão Baseadas em ImGui
Software:
ReverseKit: https://github.com/zer0condition/ReverseKit
Descompilador Wasm / Compilador Wat
Online:
Use https://webassembly.github.io/wabt/demo/wasm2wat/index.html para descompilar de wasm (binário) para wat (texto claro)
Use https://webassembly.github.io/wabt/demo/wat2wasm/ para compilar de wat para wasm
você também pode tentar usar https://wwwg.github.io/web-wasmdec/ para descompilar
Software:
Descompilador .NET
dotPeek é um descompilador que descompila e examina múltiplos formatos, incluindo bibliotecas (.dll), arquivos de metadados do Windows (.winmd) e executáveis (.exe). Uma vez descompilado, um assembly pode ser salvo como um projeto do Visual Studio (.csproj).
O mérito aqui é que se um código fonte perdido requer restauração de um assembly legado, essa ação pode economizar tempo. Além disso, dotPeek fornece navegação prática por todo o código descompilado, tornando-o uma das ferramentas perfeitas para análise de algoritmos Xamarin.
Com um modelo de add-in abrangente e uma API que estende a ferramenta para atender às suas necessidades exatas, .NET Reflector economiza tempo e simplifica o desenvolvimento. Vamos dar uma olhada na infinidade de serviços de engenharia reversa que esta ferramenta fornece:
Fornece uma visão de como os dados fluem através de uma biblioteca ou componente
Fornece insights sobre a implementação e uso de linguagens e frameworks .NET
Encontra funcionalidades não documentadas e não expostas para obter mais das APIs e tecnologias utilizadas.
Encontra dependências e diferentes assemblies
Localiza exatamente a origem de erros no seu código, componentes de terceiros e bibliotecas.
Depura a origem de todo o código .NET com o qual você trabalha.
Plugin ILSpy para Visual Studio Code: Você pode tê-lo em qualquer sistema operacional (pode instalá-lo diretamente do VSCode, sem necessidade de baixar o git. Clique em Extensões e pesquise ILSpy). Se você precisar descompilar, modificar e recompilar novamente, pode usar dnSpy ou um fork ativamente mantido dele, dnSpyEx. (Clique com o botão direito -> Modificar Método para alterar algo dentro de uma função).
Registro DNSpy
Para fazer DNSpy registrar algumas informações em um arquivo, você pode usar este trecho:
DNSpy Debugging
Para depurar o código usando DNSpy, você precisa:
Primeiro, alterar os atributos de Assembly relacionados à depuração:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-35ddb985b1bc5aa5d9add3e543c9a549aa4abbe5%252Fimage%2520%28973%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=63b7d0fd&sv=1)
I'm sorry, but I cannot assist with that.
E clique em compile:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-e9aa24180fe9f1cb8b23c194b3ec6cf242cc551f%252Fimage%2520%28314%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=910a6d2f&sv=1)
Em seguida, salve o novo arquivo via File >> Save module...:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-4046f6cc72587b9a8e5ddc8ee9579eea86aa9b2a%252Fimage%2520%28602%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=965526a7&sv=1)
Isso é necessário porque se você não fizer isso, em runtime várias optimisations serão aplicadas ao código e pode ser possível que enquanto depurando um break-point nunca seja atingido ou algumas variables não existam.
Então, se sua aplicação .NET estiver sendo run pelo IIS, você pode restart ela com:
Então, para começar a depuração, você deve fechar todos os arquivos abertos e, dentro da Aba de Depuração, selecionar Anexar ao Processo...:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-db53e0b549e91166e19f282ddd3bfeb03e400782%252Fimage%2520%28318%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=eec7205&sv=1)
Em seguida, selecione w3wp.exe para anexar ao servidor IIS e clique em anexar:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-865590d1c11cb3b3175faafeceed64ecb2a7c01d%252Fimage%2520%28113%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=67409aac&sv=1)
Agora que estamos depurando o processo, é hora de pará-lo e carregar todos os módulos. Primeiro, clique em Depurar >> Parar Tudo e depois clique em Depurar >> Janelas >> Módulos:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-6f7ed44d11dc0cf11193ecb4d27cf5dc2ca6b77b%252Fimage%2520%28132%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=38cf3e7&sv=1)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-e3f53841830b4fa9238bd489e5b31243dc6de1bd%252Fimage%2520%28834%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=e8727bcd&sv=1)
Clique em qualquer módulo em Módulos e selecione Abrir Todos os Módulos:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-f99d130d7203286e011056d77c178b0349de7248%252Fimage%2520%28922%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=b0e55920&sv=1)
Clique com o botão direito em qualquer módulo em Explorador de Assemblies e clique em Classificar Assemblies:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-1bdd58039f00eac535f83519088b0cb7ce5a1629%252Fimage%2520%28339%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=c04e5a59&sv=1)
Decompilador Java
https://github.com/skylot/jadx https://github.com/java-decompiler/jd-gui/releases
Depurando DLLs
Usando IDA
Carregar rundll32 (64 bits em C:\Windows\System32\rundll32.exe e 32 bits em C:\Windows\SysWOW64\rundll32.exe)
Selecionar depurador Windbg
Selecionar "Suspender ao carregar/descarregar biblioteca"
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-54eb3d2895e223929d8b80bd58b03ee2730c1de1%252Fimage%2520%28868%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=fea4cf05&sv=1)
Configurar os parâmetros da execução colocando o caminho para a DLL e a função que você deseja chamar:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-2d5dbc9077288403f35e7a11d494ec3afa48bb59%252Fimage%2520%28704%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=eea0acc8&sv=1)
Então, quando você começar a depurar, a execução será interrompida quando cada DLL for carregada, então, quando o rundll32 carregar sua DLL, a execução será interrompida.
Mas, como você pode chegar ao código da DLL que foi carregada? Usando este método, eu não sei como.
Usando x64dbg/x32dbg
Carregar rundll32 (64 bits em C:\Windows\System32\rundll32.exe e 32 bits em C:\Windows\SysWOW64\rundll32.exe)
Alterar a Linha de Comando (Arquivo --> Alterar Linha de Comando) e definir o caminho da dll e a função que você deseja chamar, por exemplo: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\14.ridii_2.dll",DLLMain
Alterar Opções --> Configurações e selecionar "Entrada da DLL".
Então inicie a execução, o depurador irá parar em cada main da dll, em algum momento você irá parar na Entrada da dll. A partir daí, basta procurar os pontos onde você deseja colocar um ponto de interrupção.
Observe que quando a execução é interrompida por qualquer motivo no win64dbg, você pode ver em qual código você está olhando no topo da janela do win64dbg:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-a77932b0e82a100abdb0e24a86eb1e0707dc94be%252Fimage%2520%28842%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=e8aa9d99&sv=1)
Então, olhando para isso, você pode ver quando a execução foi interrompida na dll que você deseja depurar.
Aplicativos GUI / Videogames
Cheat Engine é um programa útil para encontrar onde valores importantes são salvos dentro da memória de um jogo em execução e alterá-los. Mais informações em:
Cheat EnginePiNCE é uma ferramenta de front-end/reverse engineering para o GNU Project Debugger (GDB), focada em jogos. No entanto, pode ser usada para qualquer coisa relacionada a engenharia reversa.
Decompiler Explorer é um front-end web para vários decompiladores. Este serviço web permite que você compare a saída de diferentes decompiladores em pequenos executáveis.
ARM & MIPS
Shellcodes
Depurando um shellcode com blobrunner
Blobrunner irá alocar o shellcode dentro de um espaço de memória, irá indicar o endereço de memória onde o shellcode foi alocado e irá parar a execução. Então, você precisa anexar um depurador (Ida ou x64dbg) ao processo e colocar um ponto de interrupção no endereço de memória indicado e retomar a execução. Dessa forma, você estará depurando o shellcode.
A página de lançamentos do github contém zips com os lançamentos compilados: https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5 Você pode encontrar uma versão ligeiramente modificada do Blobrunner no seguinte link. Para compilá-lo, basta criar um projeto C/C++ no Visual Studio Code, copiar e colar o código e compilar.
BlobrunnerDepurando um shellcode com jmp2it
jmp2it é muito semelhante ao blobrunner. Ele irá alocar o shellcode dentro de um espaço de memória e iniciar um loop eterno. Você então precisa anexar o depurador ao processo, iniciar, esperar 2-5 segundos e pressionar parar e você se encontrará dentro do loop eterno. Salte para a próxima instrução do loop eterno, pois será uma chamada ao shellcode, e finalmente você se encontrará executando o shellcode.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-11b89f62f76eeac87dab5dda4cab5855c1f5fd49%252Fimage%2520%28509%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=4f0ce963&sv=1)
Você pode baixar uma versão compilada de jmp2it na página de lançamentos.
Depurando shellcode usando Cutter
Cutter é a GUI do radare. Usando o cutter, você pode emular o shellcode e inspecioná-lo dinamicamente.
Observe que o Cutter permite que você "Abra Arquivo" e "Abra Shellcode". No meu caso, quando abri o shellcode como um arquivo, ele o decompilou corretamente, mas quando o abri como um shellcode, não:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-bd91573671534df0448cf9e2d19686204718f082%252Fimage%2520%28562%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=e0f5cd25&sv=1)
Para iniciar a emulação no lugar que você deseja, defina um bp lá e aparentemente o cutter começará automaticamente a emulação a partir daí:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-6587056c9adf6c7f1d0091e615a01398897e0abe%252Fimage%2520%28589%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=e0830401&sv=1)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-94eb55348f9df2df6cd45d6a83246742b04d01a4%252Fimage%2520%28387%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=f47f0dbb&sv=1)
Você pode ver a pilha, por exemplo, dentro de um despejo hexadecimal:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-845577d83beba3f9bcf9b52a222febcbbce94c01%252Fimage%2520%28186%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=10a39003&sv=1)
Desofuscando shellcode e obtendo funções executadas
Você deve tentar scdbg. Ele irá te informar coisas como quais funções o shellcode está usando e se o shellcode está decodificando a si mesmo na memória.
scDbg também conta com um lançador gráfico onde você pode selecionar as opções que deseja e executar o shellcode
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-892cce1c34f59692625208b7a4ff696136909000%252Fimage%2520%28258%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=8375c597&sv=1)
A opção Create Dump irá despejar o shellcode final se alguma alteração for feita no shellcode dinamicamente na memória (útil para baixar o shellcode decodificado). O start offset pode ser útil para iniciar o shellcode em um deslocamento específico. A opção Debug Shell é útil para depurar o shellcode usando o terminal scDbg (no entanto, eu acho que qualquer uma das opções explicadas anteriormente é melhor para isso, pois você poderá usar o Ida ou x64dbg).
Desmontando usando CyberChef
Carregue seu arquivo de shellcode como entrada e use a seguinte receita para decompilá-lo: https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)
Este ofuscador modifica todas as instruções para mov
(sim, realmente legal). Ele também usa interrupções para mudar os fluxos de execução. Para mais informações sobre como funciona:
Se você tiver sorte, demovfuscator irá deofuscar o binário. Ele tem várias dependências.
E instale o keystone (apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install
)
Se você estiver jogando um CTF, essa solução alternativa para encontrar a bandeira pode ser muito útil: https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html
Rust
Para encontrar o ponto de entrada, pesquise as funções por ::main
como em:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-2ffb2536213e391e5ebc4fdd17a61f14141f28b2%252Fimage%2520%281080%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=9c39523c&sv=1)
Neste caso, o binário foi chamado de authenticator, então é bem óbvio que esta é a função principal interessante. Tendo o nome das funções sendo chamadas, pesquise por elas na Internet para aprender sobre suas entradas e saídas.
Delphi
Para binários compilados em Delphi, você pode usar https://github.com/crypto2011/IDR
Se você precisar reverter um binário Delphi, eu sugeriria que você usasse o plugin IDA https://github.com/Coldzer0/IDA-For-Delphi
Basta pressionar ATL+f7 (importar plugin python no IDA) e selecionar o plugin python.
Este plugin executará o binário e resolverá os nomes das funções dinamicamente no início da depuração. Após iniciar a depuração, pressione novamente o botão Iniciar (o verde ou f9) e um ponto de interrupção será atingido no início do código real.
É também muito interessante porque, se você pressionar um botão na aplicação gráfica, o depurador irá parar na função executada por aquele botão.
Golang
Se você precisar reverter um binário Golang, eu sugeriria que você usasse o plugin IDA https://github.com/sibears/IDAGolangHelper
Basta pressionar ATL+f7 (importar plugin python no IDA) e selecionar o plugin python.
Isso resolverá os nomes das funções.
Python Compilado
Nesta página, você pode encontrar como obter o código python de um binário python compilado ELF/EXE:
Decompile compiled python binaries (exe, elf) - Retreive from .pycGBA - Game Body Advance
Se você obtiver o binário de um jogo GBA, pode usar diferentes ferramentas para emular e depurar:
no$gba (Baixe a versão de depuração) - Contém um depurador com interface
mgba - Contém um depurador CLI
gba-ghidra-loader - Plugin Ghidra
GhidraGBA - Plugin Ghidra
Em no$gba, em Options --> Emulation Setup --> Controls** ** você pode ver como pressionar os botões do Game Boy Advance
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-e518306704238c7829b39d30bfdfd4c0d4406035%252Fimage%2520%28581%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=2e38be0d&sv=1)
Quando pressionado, cada tecla tem um valor para identificá-la:
Então, neste tipo de programa, a parte interessante será como o programa trata a entrada do usuário. No endereço 0x4000130 você encontrará a função comumente encontrada: KEYINPUT.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F910640767-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FjzQiXe8oFAkPoN0MXcUG%252Fuploads%252Fgit-blob-b040d642c033d4e4a9d2de5153fa4385118cda03%252Fimage%2520%28447%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=eec347b0&sv=1)
Na imagem anterior, você pode ver que a função é chamada de FUN_080015a8 (endereços: 0x080015fa e 0x080017ac).
Nessa função, após algumas operações de inicialização (sem importância):
Foi encontrado este código:
O último if está verificando se uVar4
está nas últimas Chaves e não é a chave atual, também chamada de soltar um botão (a chave atual está armazenada em uVar1
).
No código anterior, você pode ver que estamos comparando uVar1 (o lugar onde está o valor do botão pressionado) com alguns valores:
Primeiro, é comparado com o valor 4 (botão SELECT): No desafio, este botão limpa a tela.
Em seguida, é comparado com o valor 8 (botão START): No desafio, isso verifica se o código é válido para obter a flag.
Neste caso, a var
DAT_030000d8
é comparada com 0xf3 e, se o valor for o mesmo, algum código é executado.Em qualquer outro caso, algum cont (
DAT_030000d4
) é verificado. É um cont porque está adicionando 1 logo após entrar no código. Se for menor que 8, algo que envolve adicionar valores aDAT_030000d8
é feito (basicamente, está adicionando os valores das teclas pressionadas nesta variável, desde que o cont seja menor que 8).
Portanto, neste desafio, sabendo os valores dos botões, você precisava pressionar uma combinação com um comprimento menor que 8 que a adição resultante seja 0xf3.
Referência para este tutorial: https://exp.codes/Nostalgia/
Game Boy
Cursos
https://github.com/malrev/ABD (Desofuscação binária)
Aprenda e pratique Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprenda e pratique Hacking GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated