• XSS.stack #1 – первый литературный журнал от юзеров форума

Получаем неограниченное количество образцов для реверса (минуя скачивание с VirusTotal)

salsa20

(L2) cache
Пользователь
Регистрация
03.05.2019
Сообщения
498
Реакции
110
Гарант сделки
1
Немного кликбейт, но все же.

Нам пригодится файл из https://github.com/sophos/SOREL-20M который зовется meta.mmdb
Это sql база

Она лежит на aws в папке processed-data

Скачать можно
Код:
aws s3 cp s3://sorel-20m/09-DEC-2020/processed-data/meta.db . --no-sign-request
Открыв бд увидим
1711975111014.png

Дальше нужно сформировать список хешей по меткам
Python:
import sqlite3

# Подключение к базе данных SQLite
conn = sqlite3.connect(r"путь к бд\meta.db")
cursor = conn.cursor()

# Список меток для извлечения
labels = ['dropper', 'installer', 'downloader']
# Извлечение данных и сохранение в файлы
for label in labels:
    # Выполнение запроса к базе данных с сортировкой
    query = f"SELECT sha256, {label} FROM meta WHERE {label} >= 1 ORDER BY {label} DESC"
    cursor.execute(query)

    # Получение результатов запроса
    results = cursor.fetchall()

    # Сохранение результатов в файл
    filename = f"{label}.txt"
    with open(filename, 'w') as file:
        for row in results:
            sha256 = row[0]
            label_value = row[1]
            file.write(f"{sha256}\n")

    print(f"Значения sha256 с меткой '{label}' сохранены в файл '{filename}' в порядке убывания значений метки.")

# Закрытие соединения с базой данных
conn.close()

Хорошо, файлы мы сделали

1711975174694.png


Много хешей. Не так ли? Одних дропперов там ~3.5 миллиона
1711975247044.png


Теперь нужно эти файлики скачать на ПК
Лучше автоматизировать
Python:
import os
import subprocess

def download_files_from_s3(hash_file, download_folder):
    # Создание папки для скачивания, если она не существует
    os.makedirs(download_folder, exist_ok=True)

    with open(hash_file, 'r') as file:
        hashes = file.read().splitlines()

    for hash_value in hashes:
        s3_path = f"s3://sorel-20m/09-DEC-2020/binaries/{hash_value}"
        local_path = f"{download_folder}/{hash_value}"

        command = f"aws s3 cp \"{s3_path}\" \"{local_path}\" --no-sign-request"
        subprocess.run(command, shell=True)

    print("File download completed.")

# Specify the path to the text file containing the hashes
hash_file = 'hashes.txt'

# Specify the folder where you want to download the files
download_folder = r'путь к папке\downloaded-aws'

# Download the files based on the hashes
download_files_from_s3(hash_file, download_folder)

Окей, на этом всё? Нет!

Скачанные файлы еще нельзя открывать в IDA PRO или другой смежной прожке.
Их нужно еще разархивировать из zlib формата.

Снова питухон) Юзаем скрипт
Python:
import os
import zlib
import argparse


def extract_zlib_file(input_file, output_dir):
    with open(input_file, 'rb') as f_in:
        compressed_data = f_in.read()
        decompressed_data = zlib.decompress(compressed_data)

        output_file_path = os.path.join(output_dir, os.path.basename(input_file))
        with open(output_file_path, 'wb') as f_out:
            f_out.write(decompressed_data)


def main(input_dir, output_dir):
    if not os.path.exists(output_dir):
        os.makedirs(output_dir)

    for file_name in os.listdir(input_dir):
        input_file_path = os.path.join(input_dir, file_name)
        extract_zlib_file(input_file_path, output_dir)


if __name__ == "__main__":
    parser = argparse.ArgumentParser(description="Extract zlib files from input directory to output directory")
    parser.add_argument("input_dir", help="Input directory containing zlib files")
    parser.add_argument("output_dir", help="Output directory where extracted files will be stored")
    args = parser.parse_args()

    main(args.input_dir, args.output_dir)

На этом все)

Смотри файлик в иде
Чтобы запустить нужно жать окей. потому что файлы обезвредили затерев заголовок
1711975487161.png


1711975503904.png


hex rays работает)

1711975524917.png
 
А это вообще актуально?
Себестоимость данных получинных путем реверса огромна, и скорее всего все что вы оттуда нареверсите будет просто валятся на гите в виде сорцев.
 
Обновлю тему. Вот ретривер файлов скачанных с aws
Теперь вы сможете в ida запустить exe вирусик и проследить его работу!

Python:
import os
import mmap
import pefile

class PEFactory:
    @staticmethod
    def create_pe(file_obj):
        try:
            # Create a memory-mapped file
            mmap_file = mmap.mmap(file_obj.fileno(), 0, access=mmap.ACCESS_READ)
            return pefile.PE(data=mmap_file)
        except Exception as e:
            print(f"Error creating PE object: {e}")
            return None


class PEFileModifier:
    def __init__(self, pe_file):
        self.pe = pe_file

    def modify_subsystem(self):
        self.pe.OPTIONAL_HEADER.Subsystem = pefile.SUBSYSTEM_TYPE['IMAGE_SUBSYSTEM_WINDOWS_CUI']

    def modify_machine(self):
        self.pe.FILE_HEADER.Machine = 0x014C

    def save_modified_file(self, modified_file_path):
        self.pe.write(filename=modified_file_path)
        print(f"PE file '{modified_file_path}' modified successfully.")
        # Close the file handle explicitly
        self.pe.close()

    def modify_and_save(self, modified_file_path):
        self.modify_subsystem()
        self.modify_machine()
        self.save_modified_file(modified_file_path)


class FileProcessor:
    def process_file(self, file_path):
        with open(file_path, 'rb') as f:
            pe_file = PEFactory.create_pe(f)
            if pe_file:
                modifier = PEFileModifier(pe_file)
                modified_file_path = file_path + "_restored.exe"
                modifier.modify_and_save(modified_file_path)
                # Close the file handle explicitly
                f.close()
                return file_path
        return None


class FolderProcessor:
    def __init__(self, folder_path, file_processor):
        self.folder_path = folder_path
        self.file_processor = file_processor
        self.processed_files = {}

    def process_files(self):
        for root, _, files in os.walk(self.folder_path):
            for file in files:
                file_path = os.path.join(root, file)
                processed_file_path = self.file_processor.process_file(file_path)
                if processed_file_path:
                    self.processed_files[file] = processed_file_path

    def remove_original_files(self):
        for file_name, file_path in self.processed_files.items():
            try:
                os.remove(file_path)
                print(f"Original file '{file_path}' removed.")
            except PermissionError as e:
                print(f"Error removing file '{file_path}': {e}")


if __name__ == "__main__":
    folder_path = r"RestoreFiles\files"
    file_processor = FileProcessor()
    processor = FolderProcessor(folder_path, file_processor)
    processor.process_files()
    processor.remove_original_files()

После обработки получаем годные файлы

1712336145961.png


запускаем рандом exe (условно)

1712336761374.png




Пойдя дальше можете попытаться deepseek coder (ставится в oobabooga/text-generation-webui) + Gepetto (github, плагин для ida pro)
 
Последнее редактирование:
Там устаревшие образцы за 2020г, им уже 4 года. Актуальные беру тут https://bazaar.abuse.ch/browse/
новое — это хорошо забытое старое

проверял файл оттуда на ВД, речеком его показывает как чистый (лоадер)
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх