0xNullll/bin2sc

GitHub: 0xNullll/bin2sc

一款将二进制 payload 转换为多种 shellcode 格式的命令行工具,支持链式编码、坏字符扫描和自动验证。

Stars: 0 | Forks: 0

# bin2sc 将任意二进制文件转换为可用于 shellcode 的输出格式。支持多种输出语言、链式编码、坏字符扫描、分析工具、变换以及验证功能。 ## 目录 - [用法](#usage) - [输出格式](#output-formats) - [--c](#--c) - [--python](#--python) - [--csharp](#--csharp) - [--powershell](#--powershell) - [--java](#--java) - [--go](#--go) - [--rust](#--rust) - [--nasm](#--nasm) - [--fasm](#--fasm) - [--masm](#--masm) - [--base64](#--base64) - [--uuid](#--uuid) - [--hex-dump](#--hex-dump) - [--hex](#--hex) - [--linear](#--linear) - [--raw](#--raw) - [编码](#encoding) - [--xor KEY](#--xor-key) - [--xor-rolling KEYS](#--xor-rolling-keys) - [--not](#--not) - [--add VAL](#--add-val) - [--sub VAL](#--sub-val) - [链式编码](#chained-encoding) - [--xor-auto](#--xor-auto) - [分析](#analysis) - [--badchars CHARS](#--badchars-chars) - [--null-free](#--null-free) - [--printable](#--printable) - [--freq](#--freq) - [--find-pattern BYTES](#--find-pattern-bytes) - [--hash / --stats-only](#--hash----stats-only) - [--diff FILE_B](#--diff-file_b) - [--verify](#--verify) - [变换](#transforms) - [--patch "OFFSET VAL"](#--patch-offset-val) - [--size-align N](#--size-align-n) - [--reverse](#--reverse) - [选项](#options) - [--name NAME](#--name-name) - [--arch ARCH](#--arch-arch) - [--out FILE](#--out-file) - [标准输入支持](#stdin-support) - [组合标志](#combining-flags) - [退出码](#exit-codes) - [安装](#install) - [许可证](#license) ## 用法 ``` bin2sc.py [encoding(s)] [options] bin2sc.py - [encoding(s)] [options] ``` 传入 `-` 作为文件名以从标准输入读取原始字节。 ## 输出格式 多个格式标志可以在一次运行中组合使用。每个标志在输出中生成一个独立的块。 ### --c C `unsigned char` 数组,每行 12 字节。同时生成一个 `_len` 变量。如果存在编码标志,将追加匹配的 C 解码存根。 ``` bin2sc.py payload.bin --c bin2sc.py payload.bin --c --name buf --arch x64 ``` 输出: ``` /* x64 shellcode - 6 bytes */ unsigned char buf[] = { 0x48, 0x31, 0xc0, 0x48, 0x31, 0xff }; unsigned int buf_len = 6; ``` ### --python Python `bytes` 字面量(带括号),每行 16 字节。同时生成一个 `_len` 变量。如果存在编码标志,将追加匹配的 Python 解码存根。 ``` bin2sc.py payload.bin --python bin2sc.py payload.bin --python --name sc --arch x86 ``` 输出: ``` # x86 shellcode - 6 字节 sc = ( b"\x48\x31\xc0\x48\x31\xff" ) sc_len = 6 ``` ### --csharp C# `byte[]` 数组,每行 16 字节。.NET 加载器、Cobalt Strike BOF 以及攻击性 C# 工具的标准格式。 ``` bin2sc.py payload.bin --csharp bin2sc.py payload.bin --csharp --name shellcode --arch x64 ``` 输出: ``` // x64 shellcode - 6 bytes byte[] shellcode = new byte[6] { 0x48, 0x31, 0xc0, 0x48, 0x31, 0xff }; ``` ### --powershell PowerShell `[Byte[]]` 数组,每行 16 字节,使用反引号进行换行续接。 ``` bin2sc.py payload.bin --powershell bin2sc.py payload.bin --powershell --name buf ``` 输出: ``` [Byte[]] $buf = ` 0x48,0x31,0xc0,0x48,0x31,0xff $buf_len = 6 ``` ### --java Java `byte[]` 数组,每行 8 个元素。由于 Java 字节是有符号的,大于 `0x7F` 的值会使用 `(byte)` 进行强制转换。 ``` bin2sc.py payload.bin --java bin2sc.py payload.bin --java --name payload ``` 输出: ``` byte[] payload = { 0x48, 0x31, 0xc0, (byte)0xff }; int payload_len = 4; ``` ### --go Go `[]byte` 切片,每行 12 字节。 ``` bin2sc.py payload.bin --go bin2sc.py payload.bin --go --name sc --arch x64 ``` 输出: ``` // x64 shellcode - 6 bytes var sc = []byte{ 0x48, 0x31, 0xc0, 0x48, 0x31, 0xff, } var scLen = 6 ``` ### --rust Rust `&[u8]` 静态字节数组,每行 12 字节。变量名根据 Rust 约定使用大写。 ``` bin2sc.py payload.bin --rust bin2sc.py payload.bin --rust --name payload --arch x64 ``` 输出: ``` // x64 shellcode - 6 bytes static PAYLOAD: &[u8] = &[ 0x48, 0x31, 0xc0, 0x48, 0x31, 0xff, ]; const PAYLOAD_LEN: usize = 6; ``` ### --nasm NASM `db` 格式,每行 12 字节。使用 `equ $ - label` 计算大小。 ``` bin2sc.py payload.bin --nasm bin2sc.py payload.bin --nasm --name sc --arch x86 ``` 输出: ``` ; x86 shellcode - 6 bytes sc: db 0x48, 0x31, 0xc0, 0x48, 0x31, 0xff sc_len equ $ - sc ``` ### --fasm FASM `db` 格式,每行 12 字节。使用 `$ - label` 计算大小。 ``` bin2sc.py payload.bin --fasm bin2sc.py payload.bin --fasm --name sc --arch x86 ``` 输出: ``` ; x86 shellcode - 6 bytes sc db 0x48, 0x31, 0xc0, 0x48, 0x31, 0xff sc_size = $ - sc ``` ### --masm MASM `BYTE` 格式,使用 `0NNh` 后缀的十六进制风格,每行 12 字节。 ``` bin2sc.py payload.bin --masm bin2sc.py payload.bin --masm --name sc --arch x86 ``` 输出: ``` ; x86 shellcode - 6 bytes sc BYTE 048h, 031h, 0c0h, 048h, 031h, 0ffh sc_len EQU $ - sc ``` ### --base64 Base64 编码输出,每行 76 个字符,包装在 Python 代码块中,包含内联的 `base64.b64decode` 调用,以便在脚本中直接使用。 ``` bin2sc.py payload.bin --base64 ``` 输出: ``` # 6 字节 (8 base64 字符) shellcode_b64 = ( "SDHASDHw" ) import base64 shellcode = base64.b64decode(''.join(shellcode_b64)) ``` ### --uuid 用于 `UuidFromStringA` / `RtlEthernetStringToAddress` 注入技术的 UUID shellcode 格式。使用 NOP 指令(`0x90`)将负载填充至 16 字节边界,然后将每个 16 字节块编码为具有正确小端序字段顺序的 UUID 字符串。 ``` bin2sc.py payload.bin --uuid --arch x64 ``` 输出: ``` # x64 shellcode - 16 字节作为 UUID # 用法:对每个条目调用 UuidFromStringA,写入 RWX buffer shellcode_uuids = [ "c0314831-ff31-9090-9090-909090909090", ] shellcode_count = 1 ``` ### --hex-dump `xxd` 风格的十六进制转储:偏移量、十六进制字节、ASCII 表示。每行 16 字节。不可打印字节在 ASCII 列中显示为 `.`。 ``` bin2sc.py payload.bin --hex-dump ``` 输出: ``` 00000000 48 31 c0 48 31 ff 90 90 90 90 90 90 90 90 90 90 |H1.H1...........| ``` ### --hex 纯净的大写十六进制字符串,无前缀、分隔符或换行符。适用于粘贴到 CyberChef、Wireshark 显示过滤器、调试器搜索框或任何需要原始十六进制输入的工具。 ``` bin2sc.py payload.bin --hex bin2sc.py payload.bin --xor 0x41 --hex ``` 输出: ``` 4831C04831FF ``` ### --linear 单行连续的 `\xNN` 十六进制字符串。可直接粘贴到 Python、C 字符串或任何使用此表示法的工具中。 ``` bin2sc.py payload.bin --linear ``` 输出: ``` \x48\x31\xc0\x48\x31\xff ``` ### --raw 将原始二进制字节写入标准输出或 `--out` 指定的文件。用于管道传输或保存经过二进制变换的负载。 ``` bin2sc.py payload.bin --xor 0x41 --raw --out encoded.bin bin2sc.py payload.bin --raw | xxd | head ``` ## 编码 编码标志支持链式操作,并按固定顺序从左到右应用:`xor` -> `xor-rolling` -> `not` -> `add` -> `sub`。解码存根(随 `--c` 和 `--python` 自动生成)会反转此顺序。 ### --xor KEY 单字节 XOR。每个字节都与相同的密钥进行异或运算。 ``` bin2sc.py payload.bin --xor 0x41 --c ``` 生成 XOR 处理后的字节数组以及一个解码存根,该存根通过再次与 `0x41` 进行 XOR 来还原原始数据。 ### --xor-rolling KEYS 滚动 XOR。循环遍历密钥列表:`byte[0]^keys[0]`,`byte[1]^keys[1]`,...,在最后一个密钥之后回到 `keys[0]`。比单密钥 XOR 更难检测,因为重复模式的宽度为 `len(keys)` 字节。 ``` bin2sc.py payload.bin --xor-rolling "0x41,0x42,0x43" --c ``` ### --not 按位取反。翻转每个字节中的每一位。应用两次 NOT 即可还原原始数据,因此解码器只需再次运行 NOT。 ``` bin2sc.py payload.bin --not --linear ``` ### --add VAL 为每个字节加上一个常数值,超过 256 则回绕。 ``` bin2sc.py payload.bin --add 0x05 --c ``` ### --sub VAL 从每个字节减去一个常数值,低于 0 则回绕。 ``` bin2sc.py payload.bin --sub 0x13 --python ``` ### 链式编码 标志按顺序组合。解码存根按相反顺序撤销它们。 ``` bin2sc.py payload.bin --xor 0x41 --add 0x05 --c bin2sc.py payload.bin --not --xor-rolling "0x11,0x22,0x33" --python ``` ### --xor-auto 尝试所有 255 种可能的单字节 XOR 密钥(跳过 `0x00`),并报告哪些密钥产生的坏字符命中数为零。需要配合 `--badchars` 使用。 ``` bin2sc.py payload.bin --xor-auto --badchars "\x00\x0a\x0d" ``` 输出列出每个可用的密钥,并建议将第一个作为 `--xor` 的参数。 ## 分析 分析标志对变换和编码之前的原始数据进行操作。它们打印到标准错误输出,因此不会干扰标准输出上的格式输出。 ### --badchars CHARS 扫描坏字符并报告其偏移量。接受 `\x00\x0a`、`00 0a` 或 `0x00 0x0a` 表示法。可与任何格式或编码标志一起使用。 ``` bin2sc.py payload.bin --badchars "\x00\x0a\x0d" bin2sc.py payload.bin --xor 0x41 --c --badchars "\x00\x0a\x0d" ``` 当与编码结合使用时,会同时报告原始数据和编码输出的坏字符命中情况,以便您验证编码是否已将其消除。 ### --null-free 检查负载是否包含任何空字节(`0x00`)。如果发现,则报告计数和偏移量,并注明该负载对于基于 `strcpy`/`strlen` 的复制例程是否安全。 ``` bin2sc.py payload.bin --null-free bin2sc.py payload.bin --xor 0x41 --null-free --c ``` ### --printable 查找可打印 ASCII 字符(0x20-0x7e)的连续片段,最少 4 字节。适用于发现嵌入的字符串、识别已知代码模式或检查字母数字 shellcode 约束。 ``` bin2sc.py payload.bin --printable ``` 输出: ``` ============= PRINTABLE RANGES (3 found, min 4 bytes) ============== Offset range Len String -------------------- ----- ---------------------------------------- 0x0005 - 0x000F 11 'Hello World' ``` ### --freq 前 32 个最常见字节的字节频率直方图。条形宽度按最频繁的字节进行缩放。可打印字节会在十六进制值旁边显示其 ASCII 字符。 ``` bin2sc.py payload.bin --freq bin2sc.py payload.bin --xor 0x41 --freq ``` 适用于确认编码是否改变了字节分布,或在选择 XOR 密钥之前发现主导字节(例如稀疏数据中的 `0x00`)。 输出: ``` ========== BYTE FREQUENCY (top 8 of 8 unique) =========== Byte Count Pct Histogram ------ ------ ------ ---------------------------------------- 0x6c l 384 18.8% |########################################| 0x00 256 12.5% |########################## | ``` ### --find-pattern BYTES 搜索特定的字节序列并报告所有匹配的偏移量。接受 `\x90\x90`、`90 90` 或 `0x90 0x90` 表示法。 ``` bin2sc.py payload.bin --find-pattern "\x48\x31\xc0" bin2sc.py payload.bin --find-pattern "90 90 90 90" ``` 输出显示所有偏移量的编号表格,上限为 64 个,并显示溢出计数。适用于定位函数序言、NOP 滑梯、已知签名或验证补丁是否位于正确的位置。 ### --hash / --stats-only 打印大小、熵、空字节数、坏字符(如果设置了 `--badchars`)以及 MD5/SHA1/SHA256 哈希值,然后退出而不产生任何格式输出。这两个标志的行为相同。 ``` bin2sc.py payload.bin --hash bin2sc.py payload.bin --stats-only --badchars "\x00" ``` ### --diff FILE_B 输入文件与 `FILE_B` 之间的逐字节比较。报告大小、总差异数、前 64 个不同偏移量的表格以及两个文件的 MD5 哈希值。 ``` bin2sc.py original.bin --diff modified.bin ``` ### --verify 在应用编码链之后,在内存中按相反顺序解码编码后的负载,并断言其与原始数据逐字节匹配。如果验证失败,则以代码 1 退出并打印第一个不匹配的偏移量。在使用链式编码器时,请使用此标志以捕获诸如密钥错误、顺序错误或滚动 XOR 中的偏差等静默错误。 ``` bin2sc.py payload.bin --xor 0x41 --add 0x05 --c --verify bin2sc.py payload.bin --xor-rolling "0x11,0x22" --not --verify --linear ``` 成功时的输出: ``` ============================= VERIFY ROUND-TRIP ============================== Original size : 2048 bytes Encoded size : 2048 bytes Decoded size : 2048 bytes [+] Result : PASS -- decoded matches original exactly ``` ## 变换 变换在编码之前应用于数据。应用顺序:`--patch` -> `--size-align` -> `--reverse`。 ### --patch "OFFSET VAL" 在输出前修补给定偏移量处的单个字节。偏移量和值均接受十进制或 `0x` 十六进制表示法。 ``` bin2sc.py payload.bin --patch "0x10 0x90" --c bin2sc.py payload.bin --patch "16 144" --linear ``` 适用于替换模板负载中的占位符字节或转换 `jmp` 目标而无需重新汇编。 ### --size-align N 使用 NOP 指令(`0x90`)将负载填充到 N 字节的下一个倍数。在编码之前应用。 ``` bin2sc.py payload.bin --size-align 4096 --c bin2sc.py payload.bin --size-align 16 --uuid ``` 适用于页边界对齐、加载器要求或确保 UUID 格式接收完整的 16 字节块而没有意外的 NOP 填充。 ### --reverse 在编码之前反转整个负载的字节顺序。用于加载器从高地址向低地址向栈写入字节或反向遍历缓冲区的注入技术。 ``` bin2sc.py payload.bin --reverse --linear bin2sc.py payload.bin --reverse --xor 0x41 --c ``` ## 选项 ### --name NAME 设置所有格式输出中使用的变量名。默认值为 `shellcode`。 ``` bin2sc.py payload.bin --c --name buf bin2sc.py payload.bin --python --rust --name stage2 ``` ### --arch ARCH 在输出头中添加架构标签作为注释。对字节本身没有影响。 ``` bin2sc.py payload.bin --c --arch x64 bin2sc.py payload.bin --nasm --arch x86 ``` ### --out FILE 将文本输出写入文件而不是标准输出。二进制输出(`--raw`)也使用此标志,但在同一次运行中不能与文本格式共享。 ``` bin2sc.py payload.bin --c --out shellcode.h bin2sc.py payload.bin --python --out sc.py --name buf --arch x64 ``` ## 标准输入支持 传入 `-` 作为文件名以从标准输入读取。适用于管道操作。 ``` cat payload.bin | bin2sc.py - --linear cat payload.bin | bin2sc.py - --xor 0x41 --c --arch x64 cat payload.bin | bin2sc.py - --xor 0x41 --verify --hex ``` ## 组合标志 大多数标志是正交的,可以自由组合。典型工作流程: ``` # 首先检查 payload bin2sc.py payload.bin --hash --badchars "\x00\x0a\x0d" # 寻找干净的 XOR key bin2sc.py payload.bin --xor-auto --badchars "\x00\x0a\x0d" # 编码、验证并以两种格式输出 bin2sc.py payload.bin --xor 0x41 --verify --c --python \ --badchars "\x00\x0a\x0d" --arch x64 --name buf --out output.h # 编码、保存 raw binary、检查 freq bin2sc.py payload.bin --xor 0x41 --raw --out encoded.bin bin2sc.py encoded.bin --freq ``` ## 退出码 ``` 0 Success 1 Error (file not found, invalid argument, --verify failed) ``` ## 安装 ``` git clone https://github.com/0xNullll/bin2sc cd bin2sc python3 bin2sc.py ``` ## 许可证 本项目基于 **MIT 许可证** 发布。有关全文,请参阅 [LICENSE](LICENSE)。
标签:BadChar扫描, Base64, C# shellcode, CTF工具, DNS 反向解析, Golang, IPv6, PowerShell, Python安全工具, Rust, shellcode, XOR编码, 二进制分析, 二进制转换, 云安全运维, 云资产清单, 代码混淆, 安全测试, 安全编程, 攻击性安全, 数据展示, 文档结构分析, 武器化, 汇编, 漏洞搜索, 红队, 编码器, 网络信息收集, 网络安全, 网络流量审计, 补丁工具, 载荷转换, 逆向工具, 逆向工程, 隐私保护