Untitled
unknown
plain_text
a year ago
1.6 kB
6
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