LCSAJdump 是一个静态分析框架,旨在发现面向返回编程(ROP)和面向跳转编程(JOP)的 gadget。与传统的扫描器不同,LCSAJdump 是架构无关的,并采用基于图的方法揭示常见线性工具无法看到的漏洞。
常见的 ROP 扫描器使用线性“滑动窗口”方法扫描二进制文件的可执行字节。这种方法系统地无法识别暗影 Gadget:那些遍历由无条件跳转或条件分支连接的非连续内存块的执行链。
LCSAJdump 通过 LCSAJ(线性代码序列和跳转)分析重建**控制流图(CFG)**来克服这一限制。通过将二进制文件建模为基本块的有向图,该工具识别出:
.text 节分割为 LCSAJ 基本块,并通过自定义构建的反向控制流图(轻量级邻接表示,无需重量级图依赖)重建流关系。--depth 跳数内从 gadget 尾部可达的节点,显著减少了大型二进制文件(如 libc)的内存和构建时间,同时产生相同的结果。(参见 基准测试)。
LCSAJdump 被设计为通用框架。当前支持:
config.py 中定义新的配置文件轻松实现。pip install lcsajdump
git clone [https://github.com/Chris1sFlaggin/LCSAJdump.git](https://github.com/Chris1sFlaggin/LCSAJdump.git)
cd LCSAJdump
pip install -r requirements.txt
LCSAJdump 提供了一个强大的 CLI,用于精确的二进制分析:
标准分析(默认 RISC-V):
python LCSAJdump.py <path_to_binary>
高级分析(指定架构和输出文件):
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <path_to_binary>
以 JSON 格式导出并指定坏字符过滤器:
lcsajdump -a x86_64 -d 20 -k 5 -b "000a0d" --json -o gadgets.json <path_to_binary>
注意: 使用
-o在--json之后将 JSON 保存到文件。不指定--json时,-o保存纯文本。
保存纯文本输出:
lcsajdump -a riscv64 -d 15 -k 10 -l 20 -o gadgets.txt <path_to_binary>
分析所有可执行节:
lcsajdump --all-exec -d 25 -k 10 -l 30 <path_to_binary>
强制严格算法排序(绕过 ML):
lcsajdump --algo <path_to_binary>
LCSAJdump 得到位于 benchmarkTests/ 目录中的严格、增量验证的测试套件的支持。
通过 14 次主要的语义特征工程迭代,混合模型已经学会了根据实际内存副作用(通过 angr 符号执行提取)而不是纯语法启发式来区分 gadget。
通过群体感知的 5 折交叉验证(训练期间从未见过的测试二进制文件)进行评估,排序器实现了 NDCG@1 = 0.914 ± 0.047 和 NDCG@10 = 0.922 ± 0.052,这意味着最有用的 gadget 始终被放置在输出的顶部。两阶段引擎成功优先处理干净的栈弹出序列和 ret2csu 样式的调用,同时严重惩罚那些欺骗传统静态扫描器的易崩溃固定偏移跳转。
该仓库结构旨在支持最终用户和机器学习研究人员。
lcsajdump/ml_study/ 目录包含用于训练模型的完整管线:
build_dataset.py:从 CTF 二进制文件语料库中提取结构和语义特征。train_model.py:训练 LightGBM LambdaRank 模型并输出 .pkl 模型。kfold_cv.py:使用 K 折交叉验证验证数据集。该框架欢迎新的实现。要添加新架构:
lcsajdump/core/config.py。ARCH_PROFILES 字典中添加一个新的配置文件,为目标架构(例如 x86_64)定义跳转助记符、返回助记符和寄存器。本项目基于 MIT 许可证发布。有关详细信息,请参见 LICENSE 文件。
访问项目网页:LCSAJdump 网页
| 标志 | 类型 | 默认值 | 描述 |
|---|
-a, --arch | TEXT | auto | 目标架构(auto、riscv64、x86_64、arm64)。从 ELF 头部自动检测。 |
-d, --depth | INTEGER | 20 | LCSAJ 块中的最大搜索深度。控制链长度。 |
-k, --darkness | INTEGER | 5 | 剪枝阈值——每个节点的最大访问次数。值越高,gadget 越多,扫描越慢。 |
-l, --limit | INTEGER | 10 | 输出中显示的 gadget 最大数量。 |
-s, --min-score | INTEGER | 0 | gadget 出现在结果中的最小启发式分数。 |
-i, --instructions | INTEGER | 15 | 单个 LCSAJ 节点中包含的最大指令数。 |
-v, --verbose | FLAG | — | 启用详细输出,显示每个 gadget 的详细信息。 |
-o, --output | PATH | — | 将输出写入文件。默认纯文本;与 --json 一起使用以输出 JSON。 |
-b, --bad-chars | TEXT | — | 要从 gadget 地址中过滤的十六进制字节(例如 "000a0d")。 |
--json | FLAG | — | 以结构化 JSON 格式输出 gadget。与 -o 结合使用以保存到文件。 |
--all-exec | FLAG | — | 分析所有可执行节,而不仅仅是 .text。 |
-al, --algo | FLAG | — | 使用严格算法排序(绕过 ML)。 |
--version | FLAG | — | 显示已安装版本并退出。 |
--help | FLAG | — | 显示帮助信息并退出。 |