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

RtlDecompressBuffer выкидывает ошибку

Naraku

floppy-диск
Пользователь
Регистрация
21.09.2019
Сообщения
9
Реакции
5
Продолжаю копать темы шелл кодов, сжатия файлов и их динамического запуска. На сей раз кинул взгляд на функцию RtlDecompressBuffer и RtlCompressBuffer соответственно. Если со второй функцией все в порядке, то первая работать отказывается, выкидывая: "The value of ESP was not properly saved across a function call. This is usually a result of calling a function declared with one calling convention with a function pointer declared with a different calling convention." Каким боком нарушается соглашение о вызове не понимаю.
Сам код:

C++:
#include <Windows.h>

int DecompressData(PUCHAR Data, ULONG ulDataSize, PUCHAR lpEncryptData, ULONG ulEncSize)
{
    typedef NTSTATUS(__stdcall * fpRtlDecompressBuffer)(USHORT, PUCHAR, ULONG, PUCHAR, ULONG, PULONG);

    HMODULE ntdll = LoadLibraryA("ntdll.dll");
    if (ntdll)
    {
        fpRtlDecompressBuffer RtlDecompressBuffer = reinterpret_cast<fpRtlDecompressBuffer>(GetProcAddress(ntdll, "RtlCompressBuffer"));

        DWORD dwDecompSize;

        RtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, lpEncryptData, ulEncSize, Data, ulDataSize, &dwDecompSize); // при вызове выкидывает ошибку
    }
    else return -1;
}

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
    unsigned char data[5203] = {
    /* байты упакованного функцией RtlCompressBuffer файла*/
    };

    DWORD dwSize = 0x2200; //Размер распакованного файла

    LPVOID lpEncData = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE); // Память для распакованного файла

    DecompressData(data, sizeof(data), (PUCHAR)lpEncData, dwSize);    // Отправляем на распаковку

    //Здесь запуск кода
    
    return 0;
}
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Где то пропустил __stdcall.
Пробуй так NTSTATUS res;
res = RtlDecompressBuffer(...)

Методом тыка)
 
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Да вроде все правильно в плане вызова, или я не вижу. У себя такую ошибку поймать не получилось. Вот такой пример кода работает без ошибок.
Думаю, там где-то ошибка с размерами буферов, что-то не то передается.

C:
typedef NTSTATUS(NTAPI *pfnRtlDecompressBuffer)(
    IN ULONG CompressionFormat,
    OUT PVOID DestinationBuffer,
    IN ULONG DestinationBufferLength,
    IN PVOID SourceBuffer,
    IN ULONG SourceBufferLength,
    OUT PULONG pDestinationSize);

int DecompressData(PUCHAR Data, ULONG ulDataSize, PUCHAR lpEncryptData, ULONG ulEncSize)
{
    pfnRtlDecompressBuffer xRtlDecompressBuffer;

    if (!(xRtlDecompressBuffer = (pfnRtlDecompressBuffer)GetProcAddress(GetModuleHandleW(L"ntdll.dll"), "RtlDecompressBuffer")))
    {
        printf("Cannot load RtlDecompressBuffer.\n");
        return 1;
    }

        DWORD dwDecompSize;

        xRtlDecompressBuffer(COMPRESSION_FORMAT_LZNT1, lpEncryptData, ulEncSize, Data, ulDataSize, &dwDecompSize); // при вызове не выкидывает ошибку

}

int main()
{
    unsigned char enc_buf[256];
    ULONG encBufLen = 256;

    FillMemory(enc_buf, encBufLen - 1, 0xFA);


    DWORD dwSize = 0x2200;

    LPVOID lpEncData = VirtualAlloc(NULL, dwSize, MEM_COMMIT, PAGE_READWRITE);
    DecompressData(enc_buf, encBufLen, lpEncData, dwSize);
   
    return 0;
}
 


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