boofuzzのコード読みを前回の続きから行います。
fuzz()のコード読み
_generate_mutations_indefinitely()
def _generate_mutations_indefinitely(self, max_depth=None, path=None): """Yield MutationContext with n mutations per message over all messages, with n increasing indefinitely.""" depth = 1 while max_depth is None or depth <= max_depth: valid_case_found_at_this_depth = False for m in self._generate_n_mutations(depth=depth, path=path): valid_case_found_at_this_depth = True yield m if not valid_case_found_at_this_depth: break depth += 1
while文になにやら処理が書いてありますが、http_simple.py
ではfuzz()
関数実行時にmax_depth
を指定していない、
つまりmax_depth
の初期値はNoneなので、_generate_mutations_indefinitely()
は空のイテレータとして動作することになります。
↑完全に誤解です。次回の記事を参照してください。
_main_fuzz_loop()
for mutation_context in fuzz_case_iterator: if self.total_mutant_index < self._index_start: continue # Check restart interval if ( self.num_cases_actually_fuzzed and self.restart_interval and self.num_cases_actually_fuzzed % self.restart_interval == 0 ): self._fuzz_data_logger.open_test_step("restart interval of %d reached" % self.restart_interval) self._restart_target(self.targets[0]) self._fuzz_current_case(mutation_context) self.num_cases_actually_fuzzed += 1 if self._index_end is not None and self.total_mutant_index >= self._index_end: break
http_simple.py
の例ではfuzz_case_iterator
が空のイテレータとなるので、このfor文の処理は実行されません。
if self._reuse_target_connection: self.targets[0].close()
_reuse_target_connection
の値はデフォルトでFalseなので、このif文も実行されません。
if self._keep_web_open and self.web_port is not None: self.end_time = time.time() print( "\nFuzzing session completed. Keeping webinterface up on {}:{}".format( self.web_address, self.web_port ), "\nPress ENTER to close webinterface", ) input()
ファジングが終わってしまいました。
ソースコードを読んだ結果が明らかに実行結果と矛盾しているので、より正確にコードを読むために、 今度はデバッグを行いながらコードを読み直したいと思います。