satumaimoの備忘録

個人的なメモ中心

boofuzzコード読み(2)

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()

ファジングが終わってしまいました。

ソースコードを読んだ結果が明らかに実行結果と矛盾しているので、より正確にコードを読むために、 今度はデバッグを行いながらコードを読み直したいと思います。