
Linux Shared Library zu Shellcode Loader
Donut für Linux, wandelt eine Linux-ELF-Shared-Object-Datei (.so) in einen positionsunabhängigen .bin-Block um, der direkt aus dem Speicher ausgeführt werden kann (z. B. indem er in einen mit mmap reservierten Bereich kopiert und als Funktionszeiger angesprungen wird).
Dieses Projekt vermeidet absichtlich memfd (memfd_create, execveat auf memfd usw.).
amd64arm64386Anforderungen:
go generate und für Tests)CLI erstellen:
make
Erstelle eine Hello-World-.so, konvertiere sie in eine .bin und führe sie mit dem mitgelieferten Runner aus:
# 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
Erwartete Ausgabe enthält:
hello from go
Das Repository enthält vorgebaute stage0-Blöcke:
internal/stage0/stage0_linux_amd64.bininternal/stage0/stage0_linux_arm64.bininternal/stage0/stage0_linux_386.binWenn Sie internal/stage0/stage0.c oder internal/stage0/linker.ld bearbeiten, generieren Sie sie neu:
go generate ./...
Die CLI verwendet immer die eingebetteten stage0-Blöcke (kein Zig zur Laufzeit erforderlich). Um stage0 zu ändern, bearbeiten Sie internal/stage0/stage0.c und führen Sie erneut aus:
go generate ./...
testdata/Dockerfile erstellt die CLI, erstellt die Hello-.so, konvertiert sie in eine .bin, erstellt den Runner mit Zig und führt den End-to-End-Test in einem Linux-Container aus.
Beispiele:
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