.. | ||
angr | ||
blobrunner.md | ||
cheat-engine.md | ||
README.md | ||
satisfiability-modulo-theories-smt-z3.md |
Herramientas de Reversing y Métodos Básicos
Aprende hacking en AWS de cero a héroe con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén el oficial PEASS & HackTricks swag
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.
Encuentra vulnerabilidades que importan más para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. ¡Pruébalo gratis hoy.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Herramientas de Reversing basadas en ImGui
Software:
- ReverseKit: https://github.com/zer0condition/ReverseKit
Decompilador Wasm / Compilador Wat
En línea:
- Usa https://webassembly.github.io/wabt/demo/wasm2wat/index.html para decompilar de wasm (binario) a wat (texto claro)
- Usa https://webassembly.github.io/wabt/demo/wat2wasm/ para compilar de wat a wasm
- También puedes intentar usar https://wwwg.github.io/web-wasmdec/ para decompilar
Software:
Decompilador .Net
dotPeek
dotPeek es un decompilador que descompila y examina múltiples formatos, incluyendo bibliotecas (.dll), archivos de metadatos de Windows (.winmd) y ejecutables (.exe). Una vez descompilado, un ensamblado se puede guardar como un proyecto de Visual Studio (.csproj).
El mérito aquí es que si se necesita restaurar un código fuente perdido de un ensamblado heredado, esta acción puede ahorrar tiempo. Además, dotPeek proporciona una navegación práctica a lo largo del código descompilado, convirtiéndolo en una de las herramientas perfectas para el análisis de algoritmos de Xamarin.
.Net Reflector
Con un modelo de complemento integral y una API que extiende la herramienta para adaptarse a tus necesidades exactas, .NET Reflector ahorra tiempo y simplifica el desarrollo. Echemos un vistazo a la multitud de servicios de ingeniería inversa que esta herramienta proporciona:
- Proporciona una visión de cómo fluye los datos a través de una biblioteca o componente
- Proporciona información sobre la implementación y el uso de lenguajes y marcos .NET
- Encuentra funcionalidades no documentadas y no expuestas para sacar más provecho de las APIs y tecnologías utilizadas.
- Encuentra dependencias y diferentes ensamblados
- Rastrea la ubicación exacta de errores en tu código, componentes de terceros y bibliotecas.
- Depura en el origen de todo el código .NET con el que trabajas.
ILSpy & dnSpy
Complemento de ILSpy para Visual Studio Code: Puedes tenerlo en cualquier sistema operativo (puedes instalarlo directamente desde VSCode, no es necesario descargar el git. Haz clic en Extensiones y busca ILSpy).
Si necesitas decompilar, modificar y recompilar nuevamente, puedes usar: https://github.com/0xd4d/dnSpy/releases (Clic derecho -> Modificar método para cambiar algo dentro de una función).
También puedes probar https://www.jetbrains.com/es-es/decompiler/
Registro de DNSpy
Para hacer que DNSpy registre cierta información en un archivo, puedes usar estas líneas de .Net:
using System.IO;
path = "C:\\inetpub\\temp\\MyTest2.txt";
File.AppendAllText(path, "Password: " + password + "\n");
Depuración de DNSpy
Para depurar código usando DNSpy, necesitas:
Primero, cambiar los atributos de ensamblado relacionados con la depuración:
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints)]
A:
[assembly: Debuggable(DebuggableAttribute.DebuggingModes.Default |
DebuggableAttribute.DebuggingModes.DisableOptimizations |
DebuggableAttribute.DebuggingModes.IgnoreSymbolStoreSequencePoints |
DebuggableAttribute.DebuggingModes.EnableEditAndContinue)]
Y haz clic en compilar:
Luego guarda el nuevo archivo en Archivo >> Guardar módulo...:
Esto es necesario porque si no lo haces, en tiempo de ejecución se aplicarán varias optimizaciones al código y podría ser posible que mientras depuras un punto de interrupción nunca se alcance o algunas variables no existan.
Luego, si tu aplicación .Net está siendo ejecutada por IIS puedes reiniciarla con:
iisreset /noforce
Luego, para comenzar a depurar, debes cerrar todos los archivos abiertos y dentro de la pestaña Depurar seleccionar Adjuntar a proceso...:
Luego selecciona w3wp.exe para adjuntarlo al servidor IIS y haz clic en adjuntar:
Ahora que estamos depurando el proceso, es hora de detenerlo y cargar todos los módulos. Primero haz clic en Depurar >> Detener todo y luego haz clic en Depurar >> Ventanas >> Módulos:
Haz clic en cualquier módulo en Módulos y selecciona Abrir todos los módulos:
Haz clic derecho en cualquier módulo en Explorador de ensamblados y selecciona Ordenar ensamblados:
Descompilador de Java
https://github.com/skylot/jadx
https://github.com/java-decompiler/jd-gui/releases
Depuración de DLLs
Usando IDA
- Cargar rundll32 (64 bits en C:\Windows\System32\rundll32.exe y 32 bits en C:\Windows\SysWOW64\rundll32.exe)
- Seleccionar el depurador Windbg
- Seleccionar "Suspender en carga/descarga de biblioteca"
- Configurar los parámetros de la ejecución colocando la ruta de la DLL y la función que deseas llamar:
Entonces, al comenzar a depurar, la ejecución se detendrá cuando se cargue cada DLL, por lo que cuando rundll32 cargue tu DLL, la ejecución se detendrá.
Pero, ¿cómo puedes acceder al código de la DLL que se cargó? Usando este método, no sé cómo.
Usando x64dbg/x32dbg
- Cargar rundll32 (64 bits en C:\Windows\System32\rundll32.exe y 32 bits en C:\Windows\SysWOW64\rundll32.exe)
- Cambiar la línea de comandos ( Archivo --> Cambiar línea de comandos ) y establecer la ruta de la DLL y la función que deseas llamar, por ejemplo: "C:\Windows\SysWOW64\rundll32.exe" "Z:\shared\Cybercamp\rev2\\14.ridii_2.dll",DLLMain
- Cambiar Opciones --> Configuración y seleccionar "Entrada de DLL".
- Luego iniciar la ejecución, el depurador se detendrá en cada dll principal, en algún momento te detendrás en la Entrada de DLL de tu dll. Desde allí, simplemente busca los puntos donde deseas colocar un punto de interrupción.
Ten en cuenta que cuando la ejecución se detiene por cualquier motivo en win64dbg, puedes ver en qué código estás mirando en la parte superior de la ventana de win64dbg:
Luego, al observar esto, puedes ver cuándo se detuvo la ejecución en la dll que deseas depurar.
Aplicaciones GUI / Videojuegos
Cheat Engine es un programa útil para encontrar dónde se guardan los valores importantes dentro de la memoria de un juego en ejecución y cambiarlos. Más información en:
{% content-ref url="cheat-engine.md" %} cheat-engine.md {% endcontent-ref %}
ARM & MIPS
{% embed url="https://github.com/nongiach/arm_now" %}
Shellcodes
Depuración de un shellcode con blobrunner
Blobrunner asignará el shellcode dentro de un espacio de memoria, te indicará la dirección de memoria donde se asignó el shellcode y detendrá la ejecución.
Luego, debes adjuntar un depurador (Ida o x64dbg) al proceso y colocar un punto de interrupción en la dirección de memoria indicada y reanudar la ejecución. De esta manera estarás depurando el shellcode.
La página de lanzamientos en GitHub contiene archivos zip que contienen las versiones compiladas: https://github.com/OALabs/BlobRunner/releases/tag/v0.0.5
Puedes encontrar una versión ligeramente modificada de Blobrunner en el siguiente enlace. Para compilarlo, simplemente crea un proyecto C/C++ en Visual Studio Code, copia y pega el código y compílalo.
{% content-ref url="blobrunner.md" %} blobrunner.md {% endcontent-ref %}
Depuración de un shellcode con jmp2it
jmp2it es muy similar a blobrunner. Asignará el shellcode dentro de un espacio de memoria y comenzará un bucle eterno. Luego debes adjuntar el depurador al proceso, iniciar, esperar 2-5 segundos y presionar detener y te encontrarás dentro del bucle eterno. Salta a la siguiente instrucción del bucle eterno, ya que será una llamada al shellcode, y finalmente te encontrarás ejecutando el shellcode.
Puedes descargar una versión compilada de jmp2it en la página de lanzamientos.
Depuración de shellcode usando Cutter
Cutter es la interfaz gráfica de radare. Con Cutter puedes emular el shellcode e inspeccionarlo dinámicamente.
Ten en cuenta que Cutter te permite "Abrir archivo" y "Abrir shellcode". En mi caso, cuando abrí el shellcode como un archivo, lo descompiló correctamente, pero cuando lo abrí como un shellcode, no lo hizo:
Para iniciar la emulación en el lugar que desees, establece un punto de interrupción allí y aparentemente Cutter iniciará automáticamente la emulación desde allí:
Puedes ver la pila, por ejemplo, dentro de un volcado hexadecimal:
Desofuscación de shellcode y obtención de funciones ejecutadas
Deberías probar scdbg.
Te dirá cosas como qué funciones está utilizando el shellcode y si el shellcode se está descodificando en la memoria.
scdbg.exe -f shellcode # Get info
scdbg.exe -f shellcode -r #show analysis report at end of run
scdbg.exe -f shellcode -i -r #enable interactive hooks (file and network) and show analysis report at end of run
scdbg.exe -f shellcode -d #Dump decoded shellcode
scdbg.exe -f shellcode /findsc #Find offset where starts
scdbg.exe -f shellcode /foff 0x0000004D #Start the executing in that offset
scDbg también cuenta con un lanzador gráfico donde puedes seleccionar las opciones que deseas y ejecutar el shellcode
La opción Crear volcado volcará el shellcode final si se realiza algún cambio en el shellcode dinámicamente en la memoria (útil para descargar el shellcode decodificado). El desplazamiento de inicio puede ser útil para iniciar el shellcode en un desplazamiento específico. La opción Depurar Shell es útil para depurar el shellcode utilizando la terminal scDbg (sin embargo, considero que cualquiera de las opciones explicadas anteriormente es mejor para este propósito, ya que podrás usar Ida o x64dbg).
Desensamblaje usando CyberChef
Cargue su archivo de shellcode como entrada y utilice la siguiente receta para descompilarlo: https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)
Movfuscator
Este ofuscador modifica todas las instrucciones por mov
(sí, realmente genial). También utiliza interrupciones para cambiar los flujos de ejecución. Para obtener más información sobre cómo funciona:
- https://www.youtube.com/watch?v=2VF_wPkiBJY
- https://github.com/xoreaxeaxeax/movfuscator/blob/master/slides/domas_2015_the_movfuscator.pdf
Si tienes suerte, demovfuscator desofuscará el binario. Tiene varias dependencias
apt-get install libcapstone-dev
apt-get install libz3-dev
Y instala keystone (apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install
)
Si estás participando en un CTF, este método para encontrar la bandera podría ser muy útil: https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html
Encuentra las vulnerabilidades más importantes para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. Pruébalo gratis hoy.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Rust
Para encontrar el punto de entrada busca las funciones por ::main
como en:
En este caso, el binario se llamaba authenticator, por lo que es bastante obvio que esta es la función principal interesante.
Teniendo el nombre de las funciones que se llaman, búscalas en Internet para aprender sobre sus entradas y salidas.
Delphi
Para binarios compilados en Delphi puedes usar https://github.com/crypto2011/IDR
Si tienes que revertir un binario de Delphi te sugiero que uses el complemento de IDA https://github.com/Coldzer0/IDA-For-Delphi
Simplemente presiona ATL+f7 (importa el complemento de Python en IDA) y selecciona el complemento de Python.
Este complemento ejecutará el binario y resolverá los nombres de las funciones dinámicamente al inicio de la depuración. Después de iniciar la depuración, presiona nuevamente el botón de inicio (el verde o f9) y se detendrá en el inicio del código real.
También es muy interesante porque si presionas un botón en la aplicación gráfica, el depurador se detendrá en la función ejecutada por ese botón.
Golang
Si tienes que revertir un binario de Golang te sugiero que uses el complemento de IDA https://github.com/sibears/IDAGolangHelper
Simplemente presiona ATL+f7 (importa el complemento de Python en IDA) y selecciona el complemento de Python.
Esto resolverá los nombres de las funciones.
Python compilado
En esta página puedes encontrar cómo obtener el código Python de un binario compilado en ELF/EXE:
{% content-ref url="../../forensics/basic-forensic-methodology/specific-software-file-type-tricks/.pyc.md" %} .pyc.md {% endcontent-ref %}
GBA - Game Body Advance
Si obtienes el binario de un juego de GBA, puedes usar diferentes herramientas para emularlo y depurarlo:
- no$gba (Descarga la versión de depuración) - Contiene un depurador con interfaz
- mgba - Contiene un depurador de CLI
- gba-ghidra-loader - Complemento de Ghidra
- GhidraGBA - Complemento de Ghidra
En no$gba, en Options --> Emulation Setup --> Controls** ** puedes ver cómo presionar los botones de Game Boy Advance
Cuando se presiona, cada tecla tiene un valor para identificarla:
A = 1
B = 2
SELECT = 4
START = 8
RIGHT = 16
LEFT = 32
UP = 64
DOWN = 128
R = 256
L = 256
Entonces, en este tipo de programas, una parte interesante será cómo el programa trata la entrada del usuario. En la dirección 0x4000130 encontrarás la función comúnmente encontrada: KEYINPUT.
En la imagen anterior puedes ver que la función es llamada desde FUN_080015a8 (direcciones: 0x080015fa y 0x080017ac).
En esa función, después de algunas operaciones de inicialización (sin importancia alguna):
void FUN_080015a8(void)
{
ushort uVar1;
undefined4 uVar2;
undefined4 uVar3;
ushort uVar4;
int iVar5;
ushort *puVar6;
undefined *local_2c;
DISPCNT = 0x1140;
FUN_08000a74();
FUN_08000ce4(1);
DISPCNT = 0x404;
FUN_08000dd0(&DAT_02009584,0x6000000,&DAT_030000dc);
FUN_08000354(&DAT_030000dc,0x3c);
uVar4 = DAT_030004d8;
Se encuentra este código:
do {
DAT_030004da = uVar4; //This is the last key pressed
DAT_030004d8 = KEYINPUT | 0xfc00;
puVar6 = &DAT_0200b03c;
uVar4 = DAT_030004d8;
do {
uVar2 = DAT_030004dc;
uVar1 = *puVar6;
if ((uVar1 & DAT_030004da & ~uVar4) != 0) {
El último if está verificando que uVar4
esté en las últimas Keys y no sea la clave actual, también conocida como soltar un botón (la clave actual se almacena en uVar1
).
if (uVar1 == 4) {
DAT_030000d4 = 0;
uVar3 = FUN_08001c24(DAT_030004dc);
FUN_08001868(uVar2,0,uVar3);
DAT_05000000 = 0x1483;
FUN_08001844(&DAT_0200ba18);
FUN_08001844(&DAT_0200ba20,&DAT_0200ba40);
DAT_030000d8 = 0;
uVar4 = DAT_030004d8;
}
else {
if (uVar1 == 8) {
if (DAT_030000d8 == 0xf3) {
DISPCNT = 0x404;
FUN_08000dd0(&DAT_02008aac,0x6000000,&DAT_030000dc);
FUN_08000354(&DAT_030000dc,0x3c);
uVar4 = DAT_030004d8;
}
}
else {
if (DAT_030000d4 < 8) {
DAT_030000d4 = DAT_030000d4 + 1;
FUN_08000864();
if (uVar1 == 0x10) {
DAT_030000d8 = DAT_030000d8 + 0x3a;
En el código anterior se puede ver que estamos comparando uVar1 (el lugar donde está el valor del botón presionado) con algunos valores:
- Primero, se compara con el valor 4 (botón SELECT): En el desafío este botón borra la pantalla.
- Luego, se compara con el valor 8 (botón START): En el desafío esto verifica si el código es válido para obtener la bandera.
- En este caso, la variable
DAT_030000d8
se compara con 0xf3 y si el valor es el mismo se ejecuta algún código. - En cualquier otro caso, se verifica un cont (
DAT_030000d4
). Es un cont porque se suma 1 justo después de ingresar el código.
Si es menor que 8, se hace algo que implica agregar valores aDAT_030000d8
(básicamente se están sumando los valores de las teclas presionadas en esta variable siempre y cuando el cont sea menor que 8).
Por lo tanto, en este desafío, sabiendo los valores de los botones, necesitabas presionar una combinación con una longitud menor que 8 para que la suma resultante sea 0xf3.
Referencia para este tutorial: https://exp.codes/Nostalgia/
Game Boy
{% embed url="https://www.youtube.com/watch?v=VVbRe7wr3G4" %}
Cursos
- https://github.com/0xZ0F/Z0FCourse_ReverseEngineering
- https://github.com/malrev/ABD (Deobfuscación binaria)
Encuentra vulnerabilidades que importan más para que puedas solucionarlas más rápido. Intruder rastrea tu superficie de ataque, ejecuta escaneos proactivos de amenazas, encuentra problemas en toda tu pila tecnológica, desde APIs hasta aplicaciones web y sistemas en la nube. Pruébalo gratis hoy.
{% embed url="https://www.intruder.io/?utm_campaign=hacktricks&utm_source=referral" %}
Aprende hacking en AWS desde cero hasta experto con htARTE (HackTricks AWS Red Team Expert)!
Otras formas de apoyar a HackTricks:
- Si quieres ver tu empresa anunciada en HackTricks o descargar HackTricks en PDF ¡Consulta los PLANES DE SUSCRIPCIÓN!
- Obtén la merchandising oficial de PEASS & HackTricks
- Descubre The PEASS Family, nuestra colección exclusiva de NFTs
- Únete al 💬 grupo de Discord o al grupo de telegram o síguenos en Twitter 🐦 @carlospolopm.
- Comparte tus trucos de hacking enviando PRs a los repositorios de HackTricks y HackTricks Cloud.