ProgramBench Vetted 这套基准出来前

PromptCube 中级 3小时前 361 浏览 3 点赞 约 2 分钟

之前测过几轮,不管是 GPT-4 还是 CodeLlama,扔个 strip 掉符号表的 ELF 过去,要么给我编个漏洞利用脚本出来,要么把汇编指令当伪代码硬翻,根本跑不通。ProgramBench 早期版本也就是语法层面的匹配,离实际工程场景十万八千里。

这次 Vetted 版本最大的变化,不在模型端,而在数据清洗和评测闭环上。他们没单纯追求样本量,而是把「可运行」做成了硬门槛:每个样本都是完整编译工具链产出的二进制,保留编译器优化痕迹、标准库链接噪音、甚至随机化地址布局带来的副作用。再配上一套基于功能等价的动态执行判分 —— 输入输出一致、副作用一致、系统调用序列一致,才算过。

这直接把「看起来像」和「跑得动」切开了。

我拿里面的 reversing-hard 子集跑了下 Claude 3.5 Sonnet 和 DeepSeek-Coder-V2,有几个观察值得记下来:

  • 控制流恢复依然是短板
面对 -O2 甚至 -O3 下的尾调用消除、循环展开、基本块重排,模型生成的伪代码控制流图(CFG)准确率不到 42%。最典型的是 switch-case 被降级成跳转表后,模型死活写不出 switch 语法,全是 if-else 链,语义对但可读性全无。

  • 标准库识别靠幻觉
没有符号表时,memcpyprintf 这种 libc 函数全靠模型「认指令特征」。Vetted 里专门混入了 muslglibc 不同版本的二进制,模型经常把 musl 的内联实现当成业务逻辑去分析,导致变量命名、参数推断全链路崩。

  • 动态执行判分救了大命
静态 AST 匹配会把 for(;;)while(1) 判不等,动态跑一遍直接过。但这也引入新坑:未定义行为(UB)触发时,原程序和生成代码可能「巧合」输出一致,判分器得加 sanitizer 跑多轮种子才稳。

  • 上下文窗口还是物理瓶颈
单文件 200KB+ 的二进制(含调试节),反汇编后轻松 2M token。塞不进窗口只能切片,切片又丢全局数据流。目前最实用的还是 Ghidra Headless + LLM 填槽 的混合流程:Ghidra 做函数边界、类型传播、交叉引用,LLM 只负责单函数语义命名和逻辑摘要。

Vetted 版本开源的评测脚本里内置了 Docker 沙箱,docker run --rm -v $(pwd):/data programbench/vetted:latest /data/test.bin /data/pred.c 一条命令出分数,省去了自己搭环境踩坑。想做二进制分析 Agent 的,建议先跑通这个基线,别上来就造轮子。

Reverse EngineeringProgramBenchBinary AnalysisLLM EvaluationGhidra

全部回复 (4)

程序员Tom 高级 3小时前
自从加了「必须能跑通」这道坎,模型瞎编的少多了
0 回复
远程办公技术宅 中级 2小时前
现在连幻觉都要过编译器审核了,卷死强迫症模型了属于😂
0 回复
前端大鹏 初级 2小时前
以前丢个 stripped binary 过去全是瞎编 exp,现在总算不敢乱胡诌了
0 回复
自由职业运营喵 高级 2小时前
数据清洗那块怎么保证污染集没混进去?
0 回复

发表回复

支持 Markdown 格式