简单看下https://github.com/quarkslab/pastis/的样本同步相关的代码
fuzz端
fuzz端就两个功能,发送新增的样本或者crash,以及接收新样本
发送新增样本或者crash
会对corpus_dir和crash_dir的文件创建进行hook,一旦有新的文件创建,就调用__send_seed
和__send_crash
函数, afl的fuzzer_stats文件有修改也会调用__send_telemetry
发送
1 | # Configure hookds on workspace |
下面就是发送函数
1 | def __send_seed(self, filename: Path): |
接收新样本
在class AFLPPDriver
类的__init__
函数会调用self.__setup_agent()
来初始化回调函数
1 | def __setup_agent(self): |
接收函数
1 | def __seed_received(self, typ: SeedType, seed: bytes): |
通过add_seed可以看到,通过md5文件名存储,说明通过md5去重的
1 | def add_seed(self, seed: bytes): |
服务端
下面是收到样本(seed)的回调函数
1 | def register_seed_callback(self, cb: Callable) -> None: |
在set_proxy函数中会设置这个回调函数
1 | def _register_all(self): |
而在PastisBroker类的__init__
函数会调用self._register_all()
,收到种子后就调用seed_received函数
可以看到这里哦天哪故宫md5计算,但是没用来判断,只是用_seed_pool
这个字段判断,
1 | def seed_received(self, cli_id: bytes, typ: SeedType, seed: bytes): |