
مُحمّل مكتبة لينكس المشتركة إلى شيلكود
دونات لنظام لينكس، يحوّل كائن Linux ELF المشترك (.so) إلى كتلة .bin مستقلة عن الموضع يمكن تنفيذها مباشرة من الذاكرة (على سبيل المثال، عن طريق نسخها إلى منطقة mmap'd والقفز إليها كمؤشر دالة).
يتجنب هذا المشروع عمدًا memfd (memfd_create, execveat على memfd، إلخ).
amd64arm64386المتطلبات:
go generate وللاختبارات)بناء واجهة سطر الأوامر:
make
ابنِ ملف .so ترحيبي، حوّله إلى .bin، وشغّله باستخدام المُشغّل المرفق:
# 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
المخرجات المتوقعة تحتوي على:
hello from go
يضم المستودع كتل stage0 مبنية مسبقًا:
internal/stage0/stage0_linux_amd64.bininternal/stage0/stage0_linux_arm64.bininternal/stage0/stage0_linux_386.binإذا قمت بتعديل internal/stage0/stage0.c أو internal/stage0/linker.ld، أعد توليدها:
go generate ./...
تستخدم واجهة سطر الأوامر دائمًا كتل stage0 المضمّنة (لا حاجة لـ Zig في وقت التشغيل). لتغيير stage0، عدّل internal/stage0/stage0.c وأعد التشغيل:
go generate ./...
يقوم testdata/Dockerfile ببناء واجهة سطر الأوامر، وبناء ملف .so الترحيبي، وتحويله إلى .bin، وبناء المُشغّل باستخدام Zig، وتشغيل اختبار شامل في حاوية لينكس.
أمثلة:
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