Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.

Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palomo_-_oscar_luis_garcia

20 views

Published on

RootedCON https://www.rootedcon.com
Marzo/March 5-7 2020 Madrid (Spain)

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Rooted2020 taller de-reversing_de_binarios_escritos_en_golang_-_mariano_palomo_-_oscar_luis_garcia

  1. 1. Taller de reversing de binarios escritos en GoLang
  2. 2. Who We Are Mariano Palomo • Malware Analyst @voidm4p voidm4p@protonmail.com Oscar García • Malware Analyst @rer0k_ r3r0k@protonmail.com
  3. 3. ¿Por qué estamos aquí? • Como afrontar el reversing ante un “nuevo” lenguaje • Debemos evolucionar y adquirir nuevos conocimientos a medida que también lo hace el malware • Estar preparados y tener nuestro set de herramientas para cuando nos enfrentemos a otros ejemplos en la “vida real”
  4. 4. Go / GoLang • Lenguaje de programación que permite compilar binarios multiplataforma a partir de un mismo código fuente. • Utiliza recolector de basura para reservar y liberar memoria automáticamente. • Código fácil de mantener: sin clases, herencia, constructores, excepciones, etc
  5. 5. Go Malware! • Malware/Packers para Mac, Windows y Linux desde un mismo código fuente • Ejemplos: • Ransomware: EKANS, Phantom, Robin Hood • Go-mimikatz • Merlin Agent • Linux.Rex • …
  6. 6. Proceso de generación de binarios package main import "fmt" func main() { fmt.Println("hello world") } Código Hello World compilado GOOS=<plataforma> GOARCH=<arquitectura> go build hello.go
  7. 7. Desde el punto de vista del reversing _r0_386_windows (Entry Point)  rt0_386  runtime.newproc(*runtime.main)  main.main _rt0_386 runtime_main main_main 1 2 3
  8. 8. Desde el punto de vista del reversing • Casi 2000 subrutinas con tan solo 1 línea de código… main.main Wrapper para los panics Carga de cadena Llamada a println
  9. 9. Binarios stripped GOOS=<plataforma> GOARCH=<arquitectura> go build -ldflags “-s” hello.go “Elimina” el nombre de las funciones
  10. 10. Binarios stripped - Problemas • Las funciones no retienen su nombre cuando se compila stripped. Sin embargo, parecen seguir presentes en el binario si se utiliza el comando strings. • La carga de cadenas de caracteres es “extraña” y cambia con la arquitectura. Además, todas las cadenas se agrupan en una misma región, sin acabar en 0x00, apuntando a offsets concretos dentro de este listado.
  11. 11. Binarios stripped – Recuperando los nombres de las funciones • La sección .gopclntab contiene una estructura que recoge todos los nombres originales de funciones  Presente en ELF, en PE hay que buscarla • Magic header (LE): “FB FF FF FF 00 00” • Estructura (x32): +info: https://lekstu.ga/posts/pclntab-function-recovery/ Struct gopclntab { char cabecera[8]; uint numeroDeFunciones; struct funcion{ char dirección[4]; char offsetNombreFuncion[4]; }[numeroDeFunciones] } magic
  12. 12. Binarios stripped – Strings • Definir como “data” y definir, buscando por el patrón que carga cadenas, cada una de ellas con el tamaño adecuado
  13. 13. IDAGolangHelper • Scripts escritos por George Zaytsev • Cargar el binario en IDA • Cargar script (File  script file) • Determinar versión de Go y seleccionar • Rename functions, add standard go types, parse types by moduledata, strings (Shift+S) IDA 6.8: https://github.com/sibears/IDAGolangHelper/tree/e2ead174d7abda3252f2995783fbf084d88cd56d IDA 7.4: https://github.com/sibears/IDAGolangHelper/tree/8e063fdf573424d5d84ea02b17e73e1601b000e2
  14. 14. Reto: Go go go! • Obtén el flag del siguiente binario f6446fe1d43ecf9b26a6806d13528d11
  15. 15. file • No tenemos mucha información, ¿qué tipo de fichero es? o ELF o Big Endian o MIPS32 o stripped
  16. 16. MIPS • Microprocessor without Interlocked Pipeline Stages • Existen cinco revisiones compatibles hacia atrás del conjunto de instrucciones del MIPS, llamadas MIPS I, MIPS II, MIPS III, MIPS IV y MIPS 32/64 • Manual de conjunto de instrucciones: https://www.dsi.unive.it/~gasparetto/materials/MIPS_Instruction_Set.pdf
  17. 17. IDAGolangHelper + MIPS
  18. 18. IDAGolangHelper + MIPS • Modificación en la función de reconocimiento de Strings para MIPS
  19. 19. Go go go! – Análisis estático
  20. 20. QEMU + IDA $ sudo apt install qemu-user $ qemu-mips -g <PORT> LetsGo
  21. 21. Muchas gracias

×