Untitled

 avatar
unknown
plain_text
6 months ago
1.6 kB
3
Indexable
import angr

def find_call_paths(cfg, start_func, target_func_addr, path=None, paths=None):
    if path is None:
        path = []
    if paths is None:
        paths = []

    # Dodaj funkcję do aktualnej ścieżki
    path = path + [start_func]

    # Jeśli dotarliśmy do funkcji docelowej, dodajemy ścieżkę do wyników
    if start_func.addr == target_func_addr:
        paths.append(path)
        return paths

    # Przechodzimy przez następców (następne funkcje wywołane przez start_func)
    for succ in cfg.get_successors(start_func):
        if succ not in path:  # Unikamy cykli
            find_call_paths(cfg, succ, target_func_addr, path, paths)

    return paths


def main():
    # Ścieżka do pliku binarnego
    binary_path = "/path/to/binary"
    
    # Załaduj projekt angr
    proj = angr.Project(binary_path, auto_load_libs=False)
    
    # Tworzenie CFG
    cfg = proj.analyses.CFGFast()
    
    # Znalezienie adresu funkcji docelowej
    target_func_name = "target_function_name"  # Zmień na nazwę funkcji docelowej
    target_func_addr = proj.loader.find_symbol(target_func_name).rebased_addr

    # Tworzenie listy ścieżek do funkcji docelowej
    paths = []
    for func in cfg.functions.values():
        if func.addr != target_func_addr:  # Omijamy samą funkcję docelową jako punkt startowy
            paths.extend(find_call_paths(cfg, func, target_func_addr))

    # Wypisanie wyników
    for idx, path in enumerate(paths):
        print(f"Ścieżka {idx + 1}:")
        for func in path:
            print(f"  -> {func.name}")
        print("")


if __name__ == "__main__":
    main()
Editor is loading...
Leave a Comment