
Cargador de shellcode desde biblioteca compartida de Linux
Donut para Linux, convierte un objeto compartido ELF de Linux (.so) en un blob .bin independiente de posición que se puede ejecutar directamente desde la memoria (por ejemplo, copiándolo en una región mmap y saltando a él como un puntero a función).
Este proyecto evita intencionadamente memfd (memfd_create, execveat en memfd, etc.).
amd64arm64386Requisitos:
go generate y para pruebas)Compilar la CLI:
make
Compilar un .so hello-world, convertirlo en .bin y ejecutarlo con el runner incluido:
# Build payload .so
go build -buildmode=c-shared -o /tmp/hello.so ./testdata/hello
# Convert .so -> .bin (call the exported symbol "Hello")
./malasada --call-export Hello -o /tmp/hello.bin /tmp/hello.so
# Optional: compress the embedded payload (stage0 will depack before loading)
./malasada --compress --call-export Hello -o /tmp/hello.compressed.bin /tmp/hello.so
# Build the runner (PIC shellcode executor) with zig cc
zig cc -O2 -o /tmp/runner ./testdata/runner/runner.c
# Run it (stage0 hands off to ld-linux; runner will not return)
/tmp/runner /tmp/hello.bin
La salida esperada contiene:
hello from go
go generate (Precompilación e incrustación de stage0)El repositorio incrusta blobs stage0 precompilados:
internal/stage0/stage0_linux_amd64.bininternal/stage0/stage0_linux_arm64.bininternal/stage0/stage0_linux_386.binSi editas internal/stage0/stage0.c o internal/stage0/linker.ld, regenéralos:
go generate ./...
La CLI siempre usa los blobs stage0 incrustados (no se necesita Zig en tiempo de ejecución). Para cambiar stage0, edita internal/stage0/stage0.c y vuelve a ejecutar:
go generate ./...
testdata/Dockerfile compila la CLI, compila el .so hello, lo convierte en un .bin, compila el runner con Zig y ejecuta la prueba de extremo a extremo en un contenedor Linux.
Ejemplos:
docker buildx build --platform linux/amd64 -f testdata/Dockerfile .
docker buildx build --platform linux/arm64 -f testdata/Dockerfile .
docker buildx build --platform linux/386 -f testdata/Dockerfile .
# Or via Makefile:
make docker-test-386