网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载Beignet 是 Sliver Adversary Emulation Framework 在 macOS 平台上生成 shellcode 的核心转换库其作用相当于 Windows 平台上的 Donut把darwin/arm64与darwin/amd64架构的.dylib动态库转换为位置无关PIC的原始 shellcode 缓冲区既可独立作为命令行工具使用也可作为 Go 库被导入。读完本文你将掌握 Beignet 的 CLI 用法、Go API 调用方式、aPLib 压缩选项、源码构建流程以及它如何在 Sliver 的generate管线中被实际调用。Beignet 是什么BeignetREADME.md是 SliverArmory 组织为 macOS 准备的 Donut 等价物。它的核心能力是将darwin/arm64Apple Silicon与darwin/amd64Intel的.dylib文件转换为 macOS PIC shellcode生成的 shellcode 通过一个内嵌的内存加载器embedded loader在目标进程内直接加载 dylib全程不落盘支持以 CLI 二进制形式使用也可以作为 Go 库被其他项目如 Sliver 的server导入。从源码结构看仓库由三大部分组成见 vendor/github.com/sliverarmory/beignet 目录模块路径作用顶层 Go APIshellcode.go、arm64_bootstrap.go、amd64_bootstrap.go入口函数、Mach-O 校验、架构引导桩bootstrap stub生成内存加载器internal/loader/beignet_loader.c基于 dyld 的免落盘 Mach-O 加载器 C 源码压缩器internal/aplibaPLibAP32打包/解包实现加载器镜像internal/stager编译好的 arm64/amd64 加载器二进制及go:generate再生成机制CLI 用法一行命令把 dylib 变成 shellcode构建出beignet可执行文件后最基本的转换命令是./beignet --out payload.bin ./payload.dylib./payload.dylib输入的 macOS 动态库thin 或 fat Mach-O 均可支持darwin/arm64、darwin/amd64两种 slice--out payload.bin指定输出的原始 shellcode 文件。可选地用 aPLib 的 “AP32” safe-packed 格式压缩待加载的 dylib以缩小最终 shellcode 体积./beignet --compress --out payload.bin ./payload.dylib从源码看压缩开关对应 shellcode.go 中的逻辑当Options.Compress为 true 时dylib 字节流会先经aplib.PackSafe()压缩再被拼进输出缓冲区而内嵌加载器在运行时能识别 AP32 魔数AP32定义于 beignet_loader.c自动解包后再交给 dyld 加载因此压缩后的 shellcode 无需额外的解包代码参与。从源码构建仓库根目录执行makeMakefile 默认通过go build -o beignet ./cli构建 CLI 二进制。它还对构建环境做了缓存隔离GOCACHE指向$(CURDIR)/.go-cacheZIG_GLOBAL_CACHE_DIR/ZIG_LOCAL_CACHE_DIR指向$(CURDIR)/.zig-cache。另外Makefile 中还有一个用于交叉编译测试运行器的目标make runner它使用 Zig 将 C 代码编译为aarch64-macos可执行文件说明项目对 arm64 目标的验证依赖 Zig 工具链。重新生成内嵌加载器darwin/arm64 darwin/amd64内嵌加载器镜像不是手工维护的二进制而是由 C 源码生成并go:embed进包的。如果需要针对新版本 macOS 或 dyld 行为重新生成执行go generate ./internal/stager这条命令触发 internal/stager/gen.go 中的指令//go:generate go run ../../internal/tools/genstager -src ../../internal/loader/beignet_loader.c -out .即由genstager工具读取 beignet_loader.c编译并抽取相关 segment 后输出两个产物见 internal/stager 目录stager_darwin_arm64.binstager_darwin_arm64_gen.gostager_darwin_amd64.binstager_darwin_amd64_gen.go生成的 Go 文件例如 stager_darwin_amd64_gen.go通过//go:embed把二进制与入口偏移量如 amd64 的0x4e0编译进最终库中运行时由 stager.go 的LoaderText(cpu)按目标架构返回对应镜像。作为 Go 库使用API 与调用流程Beignet 暴露了两个核心转换函数shellcode.gofunc DylibFileToShellcode(path string, opts Options) ([]byte, error) func DylibToShellcode(dylib []byte, opts Options) ([]byte, error)Options结构体支持两个字段字段默认值说明EntrySymbol_StartW在加载模块中解析的入口符号名未加前导下划线时会被自动补上且不允许包含 NUL 字节Compressfalse是否用 aPLib “AP32” safe-packed 格式压缩 dylib 缓冲区DylibFileToShellcode内部通过macho.NewFatFile解析输入支持 thin 与 fat 两种格式若是 fat Mach-O会优先按当前runtime.GOARCH选择 slice并保持 arm64 优先于 amd64 的确定性回退顺序。若输入既不是MH_DYLIB也不是MH_BUNDLE或架构不受支持会分别返回ErrInvalidMachO与ErrUnsupportedArch见 shellcode.go。输出缓冲区布局DylibToShellcode生成的 shellcode 遵循严格的布局shellcode.go架构引导桩bootstrap stub一段几十字节的位置无关汇编负责设置寄存器参数并跳转到加载器对齐填充加载器镜像要求起始于页边界0x1000以保持 ADRP 相对寻址有效因此 bootstrap 之后会按页对齐补齐内嵌加载器镜像从 C 源码抽取的近似位置无关 Mach-O 镜像载荷区原始 dylib或经 aPLib 压缩后的数据按 16 字节对齐入口符号名以 NUL 结尾的符号字符串供加载器在镜像内查找入口。引导桩的寄存器约定因架构而异arm64arm64_bootstrap.gox0 载荷指针、x1 载荷大小、x2 符号指针最后br跳转到加载器入口固定长度为21 * 4字节。amd64amd64_bootstrap.gordi 载荷指针、rsi 载荷大小、rdx 符号指针通过call rax调用加载器并ret返回调用者保持 System V ABI 的栈对齐固定长度 59 字节。两个引导桩都是运行时用 Keystone 引擎 现场汇编生成并用固定长度断言保证输出稳定性。内嵌加载器的实现原理免落盘加载internal/loader/beignet_loader.c 是整个方案的灵魂其设计要点从源码注释与实现中可以明确归纳源自 Metasploit 的 OSX Stager文件头注明基于 Rapid7 的 OSX stager 源码采用 BSD-3-clause 许可。freestanding 风格不调用 libc文件被编译成 Mach-O 后相关 segment 被抽取为扁平的内存镜像当作 shellcode 执行因此所有系统调用mmap、mprotect、shared_region_check_np都以内联汇编 svc/syscall指令直接发起。主加载路径绝不写盘不使用open/write/unlink创建临时文件。双路径策略x86_64走 libdyld 导出的传统NS*APINSCreateObjectFileImageFromMemory、NSLinkModule、NSLookupSymbolInModule、NSAddressOfSymbol且先把MH_DYLIB归一化为MH_BUNDLE私有副本避免触发基于磁盘的回退路径见 beignet_loader.carm64解析/usr/lib/dyld中 dyld4 的 C 符号dyld4::JustInTimeLoader::make、analyzeSegmentsLayout、loadDependents、applyFixups、runInitializersBottomUpPlusUpwardLinks等用JustInTimeLoader从内存加载 Mach-O 镜像并配合lsl::MemoryManager的可写状态切换与ProtectedStack执行关键流程见 beignet_loader.c。AP32 自动解包若载荷开头是 aPLib safe 头魔数AP32加载器会先用内嵌的aP_depack_safe安全解包器解压到匿名映射内存再进入 dyld 加载流程错误码统一以返回值形式返回如 14/15 表示压缩数据损坏、16/17 表示 NS* 加载失败。在 Sliver 中的实际应用Beignet 不是孤立存在的工具它已被集成进 Sliver 的server/generate模块。在 server/generate/binaries.go 的注释中明确说明Sliver 生成 shellcode 时按平台选择转换器——Windows 用 DonutmacOS 用 BeignetLinux 用 malasada。具体调用点在 server/generate/binaries.goshellcodeBin, err : beignet.DylibToShellcode(dylibData, beignet.Options{ EntrySymbol: config.Exports[0], Compress: compress, })其中compress由ShellcodeConfig.Compress 2决定binaries.go对应 aPLib 压缩模式EntrySymbol直接使用编译出的导出符号。也就是说在 Sliver 中执行generate并选择 macOS 目标时darwin/arm64及darwin/amd64dylib 会经此管线被转成.binshellcode 文件供后续注入/加载使用。适用前提与限制平台限定Beignet 只面向 macOS且仅支持darwin/arm64与darwin/amd64两种架构其他平台/架构会返回ErrUnsupportedArch。入口符号dylib 需要暴露可解析的导出符号默认_StartWBeignet 不做符号注入符号不存在时加载器会返回对应错误码。加载器版本敏感度arm64 路径依赖 dyld4 的内部符号不同 macOS 版本之间可能存在差异这正是提供go generate ./internal/stager重新生成机制的原因——当目标系统 dyld 变化时可重新构建内嵌加载器。压缩权衡--compress会减小 shellcode 体积但载荷区变为 AP32 压缩流加载器运行时需额外解压二者需按场景取舍。总结Beignet 是 Sliver 在 macOS 平台生成 PIC shellcode 的关键组件CLI 与 Go API 双形态、aPLib 压缩、免落盘 dyld 内存加载、跨 arm64/amd64 架构支持再加上go generate可再生的内嵌加载器使其成为一条完整、可维护的 dylib→shellcode 流水线。无论是想独立把 dylib 转成可注入的 macOS shellcode还是理解 Slivergenerate后端对 macOS 目标的处理细节都可以从本仓库的 README.md、shellcode.go 与 beignet_loader.c 入手深入研读。赞分享网络安全【免费下载链接】sliverAdversary Emulation Framework项目地址https://gitcode.com/gh_mirrors/sl/sliver点击查看免费下载相关推荐将 Gatsby Starter 转换为 Gatsby Theme 的完整实战指南将 Gatsby Starter 转换为 Gatsby Theme 的完整实战指南 Gatsby Theme 是可直接发布到 npm 的插件类型它包含 gat前端静态站点Web框架danmaku2ass将弹幕转换为ASS字幕的完整指南danmaku2ass将弹幕转换为ASS字幕的完整指南 danmaku2ass 是一个功能强大的开源工具专门用于将来自Niconico、Acfun、BiliCLI音视频将现有软件转换为 Apify ActorAgentic Awesome Skills 中 Actorization 技能的完整实战指南将现有软件转换为 Apify ActorAgentic Awesome Skills 中 Actorization 技能的完整实战指南 ActorizatioAI 技能AI 插件上一篇OpenTUI Zig 原生依赖离线打包与可复现构建指南zig-deps.tar.gz 的生成、校验与更新流程下一篇emilianJR/chilloutmix_NiPrunedFp32Fix无服务器部署云平台方案对比创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
