我正在使用afl.rs用American Fuzzy Lop模糊Rust程序。 AFL找到了导致程序崩溃的输入。现在,我正在尝试调试紧急情况,我想从查看回溯开始。但是我尝试过的任何方法都没有奏效。如何获得追溯?
我希望使用通常的RUST_BACKTRACE
方法进行追溯,并在AFL之外运行我的程序。但是,执行这些步骤不会产生回溯。
cargo afl build
export RUST_BACKTRACE=1
# Echo one of the invalid inputs found by AFL, as logged in the crashes directory
echo 'http://[:]:example.co]:80/fo=bar' | ./target/debug/url-fuzz-target
我也尝试了export RUST_BACKTRACE=1; cargo afl fuzz [arguments]
,但AFL并未将回溯记录保存在输出目录中的任何地方。
当前,我的解决方法是创建第二个不调用extern crate afl
的可执行文件,并将其用于调试。我不想这样做,因为维护两个程序很麻烦。有没有更好的方法来获取回溯?
[dependencies]
afl = "0.4"
# This version of the url crate has a known bug in Url::parse()
url = { git = "https://github.com/servo/rust-url.git", rev = "bfa167b4e0253642b6766a7aa74a99df60a94048" }
main.rs:
#[macro_use]
extern crate afl;
extern crate url;
fn main() {
fuzz!(|data: &[u8]| {
if let Ok(s) = std::str::from_utf8(data) {
let _ = url::Url::parse(&s);
}
});
}