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

/del

Пожалуйста, обратите внимание, что пользователь заблокирован
Всем привет, возник недавно вопрос, есть умельцы которые работали с шеллкодами, и актуально ли это еще, как факт хочу сгенерировать Шеллкод из небольших строчек ботнета Mirai на винду, да, да я владелец простых сорсов коннекта виндовс юзера к ботнету, есть ли способ сгенерировать Шеллкода и способ внедрения в 2к 19 ? Конечно способ есть на примете, не факт что сработает, люди кто может помочь, подсказать за бесплатно хотя бы каплю ?
Metasploit умеет генерировать шеллкод'ы на любой вкус в любом формате. Каждый шеллкод по себе уникален. Поэтому их очень много... Не стоит тут забивать голову про 2к19... Могу сказать что сейчас модно reflective dll injection техника
 
Всем привет, возник недавно вопрос, есть умельцы которые работали с шеллкодами, и актуально ли это еще, как факт хочу сгенерировать Шеллкод из небольших строчек ботнета Mirai на винду, да, да я владелец простых сорсов коннекта виндовс юзера к ботнету, есть ли способ сгенерировать Шеллкода и способ внедрения в 2к 19 ? Конечно способ есть на примете, не факт что сработает, люди кто может помочь, подсказать за бесплатно хотя бы каплю ?
Откопал интересную инфу для тебя:

Авторство:

Posted by Cr4sh on 2007-03-14


Базонезависимый код на С - это просто ;)

Многие кодеры придерживаютя ошибочного мнения, что базонезависимый код можно писать только на асме, однако есть сравнительно малоизвратные способы его написания и на языках более высокго уровня, например c/c++.

При разработке кода достаточно придерживаться нескольких простых правил:
1. Никаких явных импортов.
Т.е. в вашем бинарнике таблицы импорта не должно быть как таковой. Если вам необходимо вызвать какую-либо API-функцию - ищите ее адресс разбирая таблицу экспорта нужной библиотеки руками (и используйте хэш вместо имени функции), предварительно подгрузив эту библиотеку с помошью LoadLibraryA (сама LoadLibraryA импортируется из библиотеки kernel32.dll, которая дефолтно грузится во все процессы, и есть масса способов найти адресс ее загрузки, см. сорцы в конце)

2. Никаких глобальных переменных.
Как известно, если в коде встечается глобальная переменная, компилер помещает ее в секцию инициализированых/неинициализированых данных (или в начало кодовой секции, если вы обьеденили ее с секцией данных директивой типа #pragma comment(linker,"/MERGE:.rdata=.text") ), и все обращения к ней осуществляются по абсолютному адрессу, что в данном случае совершенно не подходит для нас...
Если все-таки есть необходимость использовать глобальные переменные, то храните их в массиве, выделяя память под него в главной функции, и передавая его аддресс во все отсальные вызываемые функции.

3. Все строки должны формироваться в стеке.
Это вытекает из правила 2, т.к. строки обычно помещаются в секцию инициализированых данных... что это значит на практике - вместо кода вроде:
char str[] = "shit";
мы должны писать:
char str[] = {'s','h','i','t',0};
и компилятор прреобразует это в следующие инструкции:

Код:
00401006 |. C645 F8 73 MOV BYTE PTR SS:[EBP-8],73
0040100A |. C645 F9 68 MOV BYTE PTR SS:[EBP-7],68
0040100E |. C645 FA 69 MOV BYTE PTR SS:[EBP-6],69
00401012 |. C645 FB 74 MOV BYTE PTR SS:[EBP-5],74
00401016 |. C645 FC 00 MOV BYTE PTR SS:[EBP-4],0

Вот, собственно, и все =) Те, кому это нужно было, скорее всего знали и так, но думаю кому-нибуть все-таки будет интиресно...
Ну и собсно для тех кто в танке, зачем все это нужно:
- код можно будет выполниь откуда угодно и как угодно, что есессно является необходимостью при написании инфекторов/инжекторов
- подобный код достаточно легко поддается мутации, т.к. нет никаких данных

Уже написаный обычный код переделать в базонезависимый с учетом вышесказанного будет очень просто.

В заключение приведу пример кода, который выводит мессаджбокс:
Код:
#include <windows.h>

#pragma comment(linker,"/ENTRY:WinMain")

template <DWORD h, DWORD hash, class A>
inline LPVOID pushargEx(A a1)
{ 
typedef LPVOID (WINAPI *newfunc)(A);
newfunc func = (newfunc)GetProcAddressEx(h, hash);
return func(a1);
}

template <DWORD h, DWORD hash, class A, class B, class C, class D>
inline LPVOID pushargEx(A a1, B a2, C a3, D a4)
{ 
typedef LPVOID (WINAPI *newfunc)(A, B, C, D);
newfunc func = (newfunc)GetProcAddressEx(h, hash);
return func(a1,a2,a3,a4);
}

#define GLoadLibraryA pushargEx<1, 0xC8AC8026>
#define GMessageBoxA pushargEx<2, 0xABBC680D>

inline DWORD CalcHash(char *str)
{
DWORD hash = 0;
char* copystr = str;
while(*copystr) 
{
hash = ((hash << 7) & (DWORD)(-1))|(hash >> (32-7));
hash = hash^(*copystr);
copystr++;
}
return hash;
}

inline HMODULE GetKernel32(void)
{
__asm 
{
mov eax,dword ptr fs:[30h]
mov eax,dword ptr [eax+0ch]
mov esi,dword ptr [eax+1ch]
lodsd
mov eax,dword ptr [eax+08h]
}
}

#define RVATOVA(base, offset) ((DWORD)base + (DWORD)offset) 

LPVOID GetProcAddressEx(DWORD dwModule, DWORD dwProcNameHash)
{
HMODULE hModule;

char user32_dll[]={'u','s','e','r','3','2',0};

switch (dwModule) 
{
case 1: 
hModule = GetKernel32();
break;

case 2:
hModule = (HMODULE)GLoadLibraryA(user32_dll);
break;

default:
return 0;
}

PIMAGE_OPTIONAL_HEADER poh = (PIMAGE_OPTIONAL_HEADER)
((char*)hModule + ((PIMAGE_DOS_HEADER)hModule)->e_lfanew + 
sizeof(DWORD) + sizeof(IMAGE_FILE_HEADER));

PIMAGE_EXPORT_DIRECTORY ped = (IMAGE_EXPORT_DIRECTORY*)RVATOVA(hModule, 
poh->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress); 

int nOrdinal;
if (HIWORD((DWORD)dwProcNameHash) == 0) 
{
nOrdinal = (LOWORD((DWORD)dwProcNameHash)) - ped->Base;
} else {
DWORD *pdwNamePtr = (DWORD*)RVATOVA(hModule, ped->AddressOfNames);
WORD *pwOrdinalPtr = (WORD*)RVATOVA(hModule, ped->AddressOfNameOrdinals);

for (unsigned int i = 0; i < ped->NumberOfNames; i++, pdwNamePtr++, pwOrdinalPtr++)
{
if (CalcHash((char*)RVATOVA(hModule, *pdwNamePtr)) == dwProcNameHash)
{
nOrdinal = *pwOrdinalPtr;
break;
}
}

if (i == ped->NumberOfNames) 
return 0;
}

PDWORD pAddrTable = (PDWORD)RVATOVA(hModule, ped->AddressOfFunctions);
DWORD dwRVA = pAddrTable[nOrdinal];
DWORD ret = (DWORD)RVATOVA(hModule, dwRVA);

return (LPVOID)ret;
}

int APIENTRY WinMain(HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow)
{
char str[]={'s','h','i','t',0};

GMessageBoxA(0, str, str, 0);

return 0;
}

ЗЫ:
Это не статья, просто у меня уже вторые сутки безсонница, мне очень хуево, и мне нужно было занять себя чем-то не очень напряжным для мозгов (возможные неточности или бредовость так же можете списывать на это))))
 
Если опыта мало, начни с азов вирусописательства - чтобы понять основы не лишним будет исследовать опыт культовых личностей и почитать езины(журналы электронные):
z0mbie.daemonlab.org
hellknights.void.ru
vxheaven.org
phrack.org
Некоторые недоступны - добивай через archive.org
 
По шагам.
1. Компилируеш свой ц или ц++ с выводом асм листинга.
2. Пишеш парсер который этот листинг преобразует в синтаксис который примет твой компиль асма. На этом этапе придется повозиться но инструмент получиш хороший. Тобой будут встречены разные нюансы на этом пути, все они преодолимы.
3. Компилируеш асмом шеллкод.
И добрый совет - на асме пишеш только то что ну никак(_100_ раз проверь что _ДЕЙСТВИТЕЛЬНО_НИКАК_) не написать на ц++.
 


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