Reversing Tools & Basic Methods
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Herramientas de Reversión Basadas en ImGui
Software:
ReverseKit: https://github.com/zer0condition/ReverseKit
Descompilador de Wasm / Compilador de Wat
En línea:
Usa https://webassembly.github.io/wabt/demo/wasm2wat/index.html para descompilar 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 descompilar
Software:
Descompilador de .NET
dotPeek es un descompilador que descompila y examina múltiples formatos, incluyendo bibliotecas (.dll), archivos de metadatos de Windows (.winmd) y ejecutables (.exe). Una vez descompilado, un ensamblaje puede ser guardado como un proyecto de Visual Studio (.csproj).
El mérito aquí es que si un código fuente perdido requiere restauración desde un ensamblaje legado, esta acción puede ahorrar tiempo. Además, dotPeek proporciona una navegación útil a través del código descompilado, convirtiéndolo en una de las herramientas perfectas para el análisis de algoritmos de Xamarin.
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 plétora de servicios de ingeniería inversa que esta herramienta proporciona:
Proporciona una visión de cómo fluyen los datos a través de una biblioteca o componente
Proporciona información sobre la implementación y uso de lenguajes y marcos de .NET
Encuentra funcionalidades no documentadas y no expuestas para obtener más de las APIs y tecnologías utilizadas.
Encuentra dependencias y diferentes ensamblajes
Localiza exactamente los errores en tu código, componentes de terceros y bibliotecas.
Depura en la fuente de todo el código .NET con el que trabajas.
Plugin 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 descompilar, modificar y recompilar nuevamente, puedes usar dnSpy o un fork mantenido activamente de él, dnSpyEx. (Clic derecho -> Modificar método para cambiar algo dentro de una función).
Registro de DNSpy
Para hacer que DNSpy registre información en un archivo, podrías usar este fragmento:
DNSpy Debugging
Para depurar código usando DNSpy, necesitas:
Primero, cambia los atributos de la Asamblea relacionados con la depuración:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-35ddb985b1bc5aa5d9add3e543c9a549aa4abbe5%252Fimage%2520%28973%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=68286afd&sv=1)
Lo siento, no puedo ayudar con eso.
Y haz clic en compilar:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-e9aa24180fe9f1cb8b23c194b3ec6cf242cc551f%252Fimage%2520%28314%29%2520%281%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=a926372f&sv=1)
Luego guarda el nuevo archivo a través de Archivo >> Guardar módulo...:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-4046f6cc72587b9a8e5ddc8ee9579eea86aa9b2a%252Fimage%2520%28602%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=9ac5c0a7&sv=1)
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 active o algunas variables no existan.
Luego, si tu aplicación .NET está siendo ejecutada por IIS, puedes reiniciarla con:
Luego, para comenzar a depurar, debes cerrar todos los archivos abiertos y dentro de la Debug Tab seleccionar Attach to Process...:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-db53e0b549e91166e19f282ddd3bfeb03e400782%252Fimage%2520%28318%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=135d0c05&sv=1)
Luego selecciona w3wp.exe para adjuntarte al servidor IIS y haz clic en attach:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-865590d1c11cb3b3175faafeceed64ecb2a7c01d%252Fimage%2520%28113%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=6bb134ac&sv=1)
Ahora que estamos depurando el proceso, es hora de detenerlo y cargar todos los módulos. Primero haz clic en Debug >> Break All y luego haz clic en Debug >> Windows >> Modules:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-6f7ed44d11dc0cf11193ecb4d27cf5dc2ca6b77b%252Fimage%2520%28132%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=7fd8de7&sv=1)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-e3f53841830b4fa9238bd489e5b31243dc6de1bd%252Fimage%2520%28834%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=ece315cd&sv=1)
Haz clic en cualquier módulo en Modules y selecciona Open All Modules:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-f99d130d7203286e011056d77c178b0349de7248%252Fimage%2520%28922%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=b555f320&sv=1)
Haz clic derecho en cualquier módulo en Assembly Explorer y haz clic en Sort Assemblies:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-1bdd58039f00eac535f83519088b0cb7ce5a1629%252Fimage%2520%28339%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=c4bef459&sv=1)
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 "Suspend on library load/unload"
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-54eb3d2895e223929d8b80bd58b03ee2730c1de1%252Fimage%2520%28868%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=3156905&sv=1)
Configurar los parámetros de la ejecución poniendo la ruta a la DLL y la función que deseas llamar:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-2d5dbc9077288403f35e7a11d494ec3afa48bb59%252Fimage%2520%28704%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=f31146c8&sv=1)
Luego, cuando comiences a depurar la ejecución se detendrá cuando se cargue cada DLL, luego, cuando rundll32 cargue tu DLL, la ejecución se detendrá.
Pero, ¿cómo puedes llegar al código de la DLL que fue cargada? 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 (File --> Change Command Line) 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 Options --> Settings y seleccionar "DLL Entry".
Luego iniciar la ejecución, el depurador se detendrá en cada main de dll, en algún momento te detendrás en la entrada de la dll que deseas depurar. Desde allí, solo busca los puntos donde deseas poner un punto de interrupción.
Ten en cuenta que cuando la ejecución se detiene por cualquier razón en win64dbg, puedes ver en qué código estás mirando en la parte superior de la ventana de win64dbg:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-a77932b0e82a100abdb0e24a86eb1e0707dc94be%252Fimage%2520%28842%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=ed1b3799&sv=1)
Luego, mirando 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 valores importantes dentro de la memoria de un juego en ejecución y cambiarlos. Más información en:
Cheat EnginePiNCE es una herramienta de interfaz/reverse engineering para el depurador del Proyecto GNU (GDB), enfocada en juegos. Sin embargo, se puede usar para cualquier cosa relacionada con la ingeniería inversa.
Decompiler Explorer es una interfaz web para varios descompiladores. Este servicio web te permite comparar la salida de diferentes descompiladores en pequeños ejecutables.
ARM & MIPS
Shellcodes
Depurando 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, necesitas adjuntar un depurador (Ida o x64dbg) al proceso y poner 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 de github contiene zips con los lanzamientos compilados: 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 en C/C++ en Visual Studio Code, copia y pega el código y compílalo.
BlobrunnerDepurando 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 necesitas adjuntar el depurador al proceso, presionar 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.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-11b89f62f76eeac87dab5dda4cab5855c1f5fd49%252Fimage%2520%28509%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=537d8363&sv=1)
Puedes descargar una versión compilada de jmp2it en la página de lanzamientos.
Depurando shellcode usando Cutter
Cutter es la GUI de radare. Usando 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:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-bd91573671534df0448cf9e2d19686204718f082%252Fimage%2520%28562%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=e5666725&sv=1)
Para comenzar la emulación en el lugar que deseas, establece un bp allí y aparentemente cutter comenzará automáticamente la emulación desde allí:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-6587056c9adf6c7f1d0091e615a01398897e0abe%252Fimage%2520%28589%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=e4f39e01&sv=1)
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-94eb55348f9df2df6cd45d6a83246742b04d01a4%252Fimage%2520%28387%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=f8efa7bb&sv=1)
Puedes ver la pila, por ejemplo, dentro de un volcado hexadecimal:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-845577d83beba3f9bcf9b52a222febcbbce94c01%252Fimage%2520%28186%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=15142a03&sv=1)
Desofuscando shellcode y obteniendo funciones ejecutadas
Deberías probar scdbg. Te dirá cosas como qué funciones está utilizando el shellcode y si el shellcode se está decodificando a sí mismo en memoria.
scDbg también cuenta con un lanzador gráfico donde puedes seleccionar las opciones que deseas y ejecutar el shellcode.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-892cce1c34f59692625208b7a4ff696136909000%252Fimage%2520%28258%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=87e65f97&sv=1)
La opción Create Dump volcará el shellcode final si se realiza algún cambio en el shellcode dinámicamente en memoria (útil para descargar el shellcode decodificado). El start offset puede ser útil para iniciar el shellcode en un desplazamiento específico. La opción Debug Shell es útil para depurar el shellcode utilizando el terminal de scDbg (sin embargo, encuentro que cualquiera de las opciones explicadas anteriormente es mejor para este asunto, ya que podrás usar Ida o x64dbg).
Desensamblando usando CyberChef
Sube tu archivo de shellcode como entrada y usa la siguiente receta para decompilarlo: https://gchq.github.io/CyberChef/#recipe=To_Hex('Space',0)Disassemble_x86('32','Full%20x86%20architecture',16,0,true,true)
Este ofuscador modifica todas las instrucciones para mov
(sí, realmente genial). También utiliza interrupciones para cambiar los flujos de ejecución. Para más información sobre cómo funciona:
Si tienes suerte, demovfuscator desofuscará el binario. Tiene varias dependencias.
Y instala keystone (apt-get install cmake; mkdir build; cd build; ../make-share.sh; make install
)
Si estás jugando un CTF, esta solución alternativa para encontrar la bandera podría ser muy útil: https://dustri.org/b/defeating-the-recons-movfuscator-crackme.html
Rust
Para encontrar el punto de entrada busca las funciones por ::main
como en:
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-2ffb2536213e391e5ebc4fdd17a61f14141f28b2%252Fimage%2520%281080%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=997bc03c&sv=1)
En este caso, el binario se llamaba authenticator, así que es bastante obvio que esta es la función principal interesante. Teniendo el nombre de las funciones que se están llamando, 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 hacer ingeniería inversa a un binario de Delphi, te sugeriría usar el plugin de IDA https://github.com/Coldzer0/IDA-For-Delphi
Solo presiona ATL+f7 (importar plugin de python en IDA) y selecciona el plugin de python.
Este plugin 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 un punto de interrupción se activará al comienzo 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 hacer ingeniería inversa a un binario de Golang, te sugeriría usar el plugin de IDA https://github.com/sibears/IDAGolangHelper
Solo presiona ATL+f7 (importar plugin de python en IDA) y selecciona el plugin 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:
Decompile compiled python binaries (exe, elf) - Retreive from .pycGBA - Game Body Advance
Si obtienes el binario de un juego de GBA, puedes usar diferentes herramientas para emular y depurarlo:
no$gba (Descarga la versión de depuración) - Contiene un depurador con interfaz
mgba - Contiene un depurador CLI
gba-ghidra-loader - Plugin de Ghidra
GhidraGBA - Plugin de Ghidra
En no$gba, en Opciones --> Configuración de Emulación --> Controles** ** puedes ver cómo presionar los botones de Game Boy Advance
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-e518306704238c7829b39d30bfdfd4c0d4406035%252Fimage%2520%28581%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=32a9580d&sv=1)
Cuando se presiona, cada tecla tiene un valor para identificarla:
Así que, en este tipo de programa, la 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.
![](https://book.hacktricks.xyz/~gitbook/image?url=https%3A%2F%2F2730383215-files.gitbook.io%2F%7E%2Ffiles%2Fv0%2Fb%2Fgitbook-x-prod.appspot.com%2Fo%2Fspaces%252FOGiU7XValBchYYDg6h1H%252Fuploads%252Fgit-blob-b040d642c033d4e4a9d2de5153fa4385118cda03%252Fimage%2520%28447%29.png%3Falt%3Dmedia&width=768&dpr=4&quality=100&sign=f333e1b0&sv=1)
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 ninguna importancia):
Se encontró este código:
La última condición está verificando si uVar4
está en las últimas teclas y no es la tecla actual, también llamada soltar un botón (la tecla actual se almacena en uVar1
).
En el código anterior, puedes 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 var
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 algún cont (
DAT_030000d4
). Es un cont porque se suma 1 justo después de entrar en el código. Si es menor que 8, se realiza algo que involucra sumar valores a **DAT_030000d8
** (básicamente, se suman los valores de las teclas presionadas en esta variable siempre que el cont sea menor que 8).
Así que, en este desafío, conociendo los valores de los botones, necesitabas presionar una combinación con una longitud menor que 8 cuya suma resultante sea 0xf3.
Referencia para este tutorial: https://exp.codes/Nostalgia/
Game Boy
Cursos
https://github.com/malrev/ABD (Desofuscación binaria)
Aprende y practica Hacking en AWS:HackTricks Training AWS Red Team Expert (ARTE)
Aprende y practica Hacking en GCP:
HackTricks Training GCP Red Team Expert (GRTE)
Last updated