Ejemplo n.º 1
0
def store_binary_in_databse(binary_path: str, package: str, afl_dir_path,
                            configuration_dir: str):
    p = pathlib.Path(afl_dir_path)
    p = p.relative_to(*p.parts[:2])
    package, created = Package.objects.get_or_create(
        name=package, version=ArchCrawler.get_package_version(package))
    binary, created = Binary.objects.get_or_create(path=binary_path,
                                                   package=package)
    binary.afl_dir = os.path.abspath(os.path.join(configuration_dir, str(p)))
    binary.save()
Ejemplo n.º 2
0
def store_in_database(basepath: str, package_info_filepath: str,
                      binary_path: str, parameter: str, crash_dir_path: str,
                      crash_db_path: str, afl_dir_path: str,
                      configuration_dir: str):
    print("Package info for package {0}".format(package_info_filepath))
    package_info_dict = {}
    with open(basepath + "/" +
              package_info_filepath) as package_info_filepointer:
        text = package_info_filepointer.read()
        tmp_list = [item.strip().split(":", 1) for item in text.split("\n")]
        for item in tmp_list:
            if len(item) == 2:
                package_info_dict[item[0].strip()] = item[1].strip()
    package, created = Package.objects.get_or_create(
        name=package_info_dict["Name"],
        version=ArchCrawler.get_package_version(package_info_dict["Name"]))
    binary, created = Binary.objects.get_or_create(path=binary_path,
                                                   package=package)
    p = pathlib.Path(afl_dir_path)
    p = p.relative_to(*p.parts[:2])  # type: pathlib.PosixPath
    binary.afl_dir = os.path.abspath(configuration_dir + "/" +
                                     str(p))  # First path is the volume path
    # binary.afl_dir= configuration_dir+"/"+afl_dir_path
    binary.save()
    crash_db_full_path = basepath + "/" + crash_db_path
    if not os.path.exists(crash_db_full_path):
        print("Error: The database {0} does not exist".format(
            crash_db_full_path))
        print(crash_db_path)
        return
    print("Opening database {0}".format(crash_db_full_path))
    connect = sqlite3.connect(basepath + "/" + crash_db_path)
    c = connect.cursor()
    c.execute(
        "select count(*) from sqlite_master where type='table' and name='Data';"
    )
    if c.fetchone()[0] != 1:
        print("Error: The table Data does not exist")
        return
    c.execute("select count(*) from Data;")
    conv = Ansi2HTMLConverter()
    if c.fetchone()[0] > 0:
        print("Crashes for package {0} binary {1}".format(
            package, binary_path))
        for row in c.execute('SELECT * FROM Data'):
            print(basepath + "/" + crash_dir_path + "/" + row[0])

            if not os.path.exists(basepath + "/" + crash_dir_path + "/" +
                                  row[0]):
                continue
            with open(basepath + "/" + crash_dir_path + "/" + row[0],
                      "rb") as crash_filepointer:
                crash_data = crash_filepointer.read()
            try:
                rendered_text = conv.convert(row[5].decode("utf-8"))
            except Exception as e:
                rendered_text = ""
            crash, created = Crash.objects.get_or_create(
                binary=binary,
                parameter=parameter,
                exploitability=row[1],
                file_blob=crash_data,
                description=row[2],
                execution_output=rendered_text)
            crash.name = row[0]
    else:
        print("No crashes for package {0} binary {1}".format(
            package, binary_path))