[ << ALL_FEED ]

А вы автоматизируете отладку?

Ещё в группе «Фишинг и песочница»

А вы автоматизируете отладку? 🧐

Команде экспертов PT Sandbox в работе часто приходится отлаживать различные компоненты ядра Windows, и без ядерного отладчика здесь не обойтись. Чем чаще мы этим занимаемся, тем больше желание оптимизировать этот процесс.

Часто при отладке хочется посмотреть изменение переменных, аргументов, различных значений рантайма. Этого можно добиться условными брейк-пойнтами и командами. Много лет назад в WinDbg появилась поддержка новой модели данных. Командой dx можно объявлять свои переменные, структуры, вызывать JavaScript-функции и делать LINQ-запросы.

Например, мы хотим зажурналировать все открытые файлы процессом explorer.exe:

0: kd> dx @$explorer = "explorer.exe"
0: kd> bp /w "@$curprocess.Name.ToLower().StartsWith(@$explorer)" nt!NtCreateFile "dx ((_OBJECT_ATTRIBUTES*)@r8)->ObjectName->Buffer; gc"
Code language: PowerShell (powershell)


Если же условия или логика перехвата более сложная, без скрипта не обойтись. Рассмотрим пример.

Допустим, мы хотим поймать и сохранить шеллкод, внедряемый в удаленный процесс. Для этого потребуется перехватить функцию NtWriteVirtualMemory, проверить, принадлежит ли описатель текущему процессу, и в противном случае сохранить регион памяти на диск. Как это выглядит в скрипте:

"use strict";

function WriteMemoryCallback()
{
    if  (host.currentThread.Registers.User.rcx == -1)
    {
        return;
    }

    let address = host.currentThread.Registers.User.rdx; 
    let buffer  = host.currentThread.Registers.User.r8;
    let length  = host.currentThread.Registers.User.r9;
    let filename = ${host.currentProcess.Name}-${buffer.toString(16)}.dmp;

    let file = host.namespace.Debugger.Utility.FileSystem.TempDirectory.CreateFile(
        filename, 'CreateNew');

    file.WriteBytes(host.memory.readMemoryValues(buffer, length, 1));
    host.diagnostics.debugLog(`dumped ${length} bytes to ${filename}\n`);
    file.Close();
}

function initializeScript()
{
    return [new host.apiVersionSupport(1, 9)];
}

function invokeScript()
{
    let bp = host.namespace.Debugger.Utility.Control.SetBreakpointAtOffset("NtWriteVirtualMemory", 0, "nt");
    bp.Command = `dx @$scriptContents.WriteMemoryCallback(); gc`;
}
Code language: JavaScript (javascript)


Иногда может не хватать набора API JavaScript-движка — с помощью ExecuteCommand можно вызвать любую команду отладчика, например чтобы удалить брейк-пойнт или поставить его по конкретному адресу:

let exec = host.namespace.Debugger.Utility.Control.ExecuteCommand;
let command = `dx @$scriptContents.BreakPointCallback(); gc`;
exec("bc *");
exec(`bp 0xfffffc024d546a88 "${command}"`);
Code language: JavaScript (javascript)


Также JavaScript позволяет дополнять модель данных отладчика, например добавлять инфу о секциях загруженных DLL или дополнительную команду, аналогичную !handle, !address и т. п.

Допустим, мы хотим перечислить коллбэки на создание процесса, потока и загрузку DLL. Для этого нужно создать команду, например !callbacks:

const log  = x => host.diagnostics.debugLog(x + '\n');
const u64  = x => host.memory.readMemoryValues(x, 1, 8)[0];
const exec = x => host.namespace.Debugger.Utility.Control.ExecuteCommand(x);

function ParseCallbacks(Symbol, Size)
{
    log([+] ${Symbol}:);
    let base = host.getModuleSymbolAddress("nt", Symbol);
    if (base == null)
        return;
    for (let i = 0; i < Size; i++)
    {
        let entry = u64(base.add(i * 8));
        if (entry.compareTo(0) != 0)
        {
            entry = entry.bitwiseAnd(-16);
            let callback = u64(entry.add(8));
            log(\t${exec(.printf "%y", ${callback}).First()});
        }
    }
}

function CallbackEnumerator()
{
    ParseCallbacks("PspCreateProcessNotifyRoutine", 64);
    ParseCallbacks("PspCreateThreadNotifyRoutine", 64);
    ParseCallbacks("PspLoadImageNotifyRoutine", 8);
}

function initializeScript()
{
    return [new host.apiVersionSupport(1, 7),
            new host.functionAlias(CallbackEnumerator, "callbacks")];
}
Code language: JavaScript (javascript)


Результат на скрине. Современный WinDbg позволяет сильно автоматизировать процесс реверса, и у опытного аналитика наверняка есть комплект часто используемых скриптов.
#avlab #sandboxteam #tips
@ptescalator

Ещё от global_author

  • Этот ваш Siemens…

    Недавно наши коллеги из Центра промышленной экспертизы Позитива обнаружили на MalwareBazaar один любопытный Windows-образец. Вот его…

  • Анти-антивирус

    Недавно нам на глаза попалась APK-шка с интригующим и внушающим доверие названием «Антивирус ФСБ.apk». Установив его,…

  • .exe .docm .xlsm

    .exe .docm .xlsm Вредоносные файлы с этими расширениями чаще всего встречаются в сетевом трафике компаний. Давайте…

  • Хаос, шок, приватные ключи от не менее приватного GitLab 💻

    Последние пару месяцев злоумышленник распространял трояны с нескольких npm-учеток: alex05255, mdrafiqulislamrabby, b.w1001, abdev8773 и mollspotwood54400. Список…

  • ::%16777216 — так что же ты такое?

    ::%16777216 — так что же ты такое? Известно, что в ходе атак злоумышленники могут использовать туннелирование.…

Ещё от global_author

  • Этот ваш Siemens…

    Недавно наши коллеги из Центра промышленной экспертизы Позитива обнаружили на MalwareBazaar один любопытный Windows-образец. Вот его…

  • Анти-антивирус

    Недавно нам на глаза попалась APK-шка с интригующим и внушающим доверие названием «Антивирус ФСБ.apk». Установив его,…

  • .exe .docm .xlsm

    .exe .docm .xlsm Вредоносные файлы с этими расширениями чаще всего встречаются в сетевом трафике компаний. Давайте…

  • Хаос, шок, приватные ключи от не менее приватного GitLab 💻

    Последние пару месяцев злоумышленник распространял трояны с нескольких npm-учеток: alex05255, mdrafiqulislamrabby, b.w1001, abdev8773 и mollspotwood54400. Список…

  • ::%16777216 — так что же ты такое?

    ::%16777216 — так что же ты такое? Известно, что в ходе атак злоумышленники могут использовать туннелирование.…

Ещё в группе «Фишинг и песочница»