та омг, это не шелл-код! Это просто запись набора байтов в понятный для С языка вид. как раз наоборот, записать бинарный код шелл-кода, в понятном для С языка виде. С этой работой идеально справиться WinHex. Открываешь через данный хекс-редактор файл с опкодами, выделяешь, затем в меню Edit - Copy Block - C Source. Забрать результат можно из буфера обмена. Только здесь нужно учитывать один нюанс, опкоды в файле должны быть не просто скопированы, т.е. в текстовом виде, а записаны именно как байты. Через обычный текстовый редактор такое проделать не удастся.
а если сразу скопировать его в GREP hex то получается сразу типо того \xE8\x6E\x00\x00\x00\x68\x00\x30\x40\x00\x50\xE8\x 5D\x00\x00\x00 а в C Source будет так unsigned char data[1648] = { 0x4D, 0x5A, 0x90, 0x00, а копировать нужно сразу весь .ехе файл в хекс редакторе или только до ExitProcess но я и так и так пробовал не выходит с тем кодом hello world который ты написал скомпелил его через масм норм все скомпелилось ,а дальше я застрял , после как все скомпелил открыл Hello world через хекс редактор как ты сказал собрал код вставил его в компилятор на C ,после компиляции на C файл .ехе (ехплоит просто завис и открылся дебагер показав адрес ошибки
Смотри, когда ты открываешь скомпилированный экзешник через хекс редактор, то ты получаешь просто структурированный (PE-EXE) код. Но ты не учел тот факт, что перед корректной работой шелл-кода нужно выполнить подготавливающий код, который патчит, прописывая адреса. Т.е. тебе нужно вначале выполнить часть программы, и только затем из оперативки выдрать бинарный поток уже пропатченного шелл-кода. Именно из ОЗУ, но никак не из физической памяти. Только в этом случае он будет работоспособным. Именно для этого случая я и написал, что нужно использовать CreatFileA/WriteFile. Таким образом после выполнения подготавливающего кода, уже пропатченный шелл код копируется в файл, который в свою очередь и скармливается хекс редактору.
В общем вот, дописал, не мучайся: Code: .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .data _ExitProcess db 'ExitProcess',0 _MessageBoxA db 'MessageBoxA',0 _user32 db 'user32.dll',0 _kernel32 db 'kernel32.dll',0 [COLOR=Yellow]fName db 'ShellCode.bin',0[/COLOR] temp dd 0 .code Main: [COLOR=Lime];подготавливающий код[/COLOR] ;находим адрес ExitProcess push offset _kernel32 call LoadLibraryA push offset _ExitProcess push eax call GetProcAddress mov __ExitProcess,eax ;находим адрес MessageBoxA push offset _user32 call LoadLibraryA push offset _MessageBoxA push eax call GetProcAddress mov __MessageBoxA,eax [COLOR=Lime] ;шелл-код готов. Можно копировать куда надо либо запускать. ;Размер шелл-кода - SizeOfShellcode. Начало в ShellCode. ;создаем пустой файл[/COLOR] [COLOR=Yellow] xor eax,eax push eax push eax push CREATE_ALWAYS push eax push eax push GENERIC_WRITE push offset fName call CreateFileA push eax[/COLOR] [COLOR=Lime] ;копируем шелл-код в файл, в виде бинарного потока[/COLOR] [COLOR=Yellow] push 0 push offset temp push SizeOfShellcode ;размер шелл-кода push offset ShellCode ;буфер - шелл-код push eax call WriteFile[/COLOR] [COLOR=Lime] ;закрываем файл[/COLOR] [COLOR=Yellow] pop eax call CloseHandle[/COLOR] [COLOR=Lime];шелл-код[/COLOR] ShellCode: call GetDelta GetDelta: pop ebp sub ebp,offset GetDelta push 0 lea eax,[ebp+__Message] push eax push eax push 0 call [ebp+__MessageBoxA] push 0 call [ebp+__ExitProcess] __ExitProcess dd 0 __MessageBoxA dd 0 __Message db 'I am shellcode',0 SizeOfShellcode equ ($-offset ShellCode) end Main После выполнения кода получишь, в папке с прогой, файл под именем ShellCode.bin. Это и есть шелл-код в виде бинарного потока. Открывай его через хекс редактор, преобразовывай в понятный для С язка вид, и можешь исполнять.
спасибо что помогаешь но все таки у меня есть к тебе вопрос смотри на все что ты описал делаю все так же линканул последний исходный код таким образом c:\masm32\bin\Link.exe /SUBSYSTEM:WINDOWS /SECTION:.text,RWE ShellCode.obj pause но не как не создался ShellCode.bin,а создался ShellCode.ехе файл в той же папке где компилятор масм без папки темп после запустил ShellCode.ехе сразу создался ShellCode.bin файл потом открыл его хекс редактором снял код вставил его в С исходный код на С PHP: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <windows.h> int main(){ unsigned char shellcode[]="\xE8\x00\x00\x00\x00\x5D\x81\xED\x6E\x10\x40\x00\x6A\x00\x8D\x85\x97\x10\x40\x00\x50\x50\x6A\x00\xFF\x95\x93\x10\x40\x00\x6A\x00\xFF\x95\x8F\x10\x40\x00\x62\x3D\x40\x77\x19\xD6\x87\x76\x49\x20\x61\x6D\x20\x73\x68\x65\x6C\x6C\x63\x6F\x64\x65\x00"; ((void (*)())shellcode)(); system("PAUSE"); return 0; } компилирую на С бинарный поток выдранный с хекс редактора ,компилирует норм но не запускает .ехе файл ,снова открывается дебагер и указывает адрес ошибки здесь одно но или я не правильно линкую на масме или на С а это сам hello world который ты написал (последний исходник) в бинарном виде на С PHP: unsigned char data[61] = { 0xE8, 0x00, 0x00, 0x00, 0x00, 0x5D, 0x81, 0xED, 0x6E, 0x10, 0x40, 0x00, 0x6A, 0x00, 0x8D, 0x85, 0x97, 0x10, 0x40, 0x00, 0x50, 0x50, 0x6A, 0x00, 0xFF, 0x95, 0x93, 0x10, 0x40, 0x00, 0x6A, 0x00, 0xFF, 0x95, 0x8F, 0x10, 0x40, 0x00, 0x62, 0x3D, 0x40, 0x77, 0x19, 0xD6, 0x87, 0x76, 0x49, 0x20, 0x61, 0x6D, 0x20, 0x73, 0x68, 0x65, 0x6C, 0x6C, 0x63, 0x6F, 0x64, 0x65, 0x00 };
Он и не должен был создаться. ShellCode.exe создает ShellCode.bin в результате своей работы, после выполнения. Шелл-код на выходе получается 100% работоспособный - проверенно. У тебя же проблема, скорее всего, кроется в MessageBoxA. Она экспортируется из ДЛЛ user32.dll, которая твоей программой не используется, а значит её и нету в области памяти процесса. Я на С не писал, не пишу, и писать не буду, потому конкретным куском кода помочь не могу. А так просто возьми, и подключи user32.dll в своей программе и всё заработает.
А еще, как вариант, можно взвесить подгрузку user32.dll на плечи шелл-кода. P.S. Я в коде допустил ошибку, где вызывается функция CloseHandle. Нужно перед ней убрать команду pop eax. И так, вот генерация шелл-кода, который осуществляет подгрузку user32.dll самостоятельно, т.е. в своей программе на С подгрузку делать уже не придется. Code: .386 .model flat, stdcall option casemap:none include \masm32\include\windows.inc include \masm32\include\kernel32.inc include \masm32\include\user32.inc includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .data _kernel32 db 'kernel32.dll',0 _ExitProcess db 'ExitProcess',0 _MessageBoxA db 'MessageBoxA',0 _LoadLibraryA db 'LoadLibraryA',0 fName db 'ShellCode.bin',0 temp dd 0 .code Main: [COLOR=Lime];подготавливающий код ;находим адрес ExitProcess[/COLOR] push offset _kernel32 call LoadLibraryA push eax push offset _ExitProcess push eax call GetProcAddress mov __ExitProcess,eax [COLOR=Lime];находим адрес LoadLibraryA[/COLOR] pop eax push offset _LoadLibraryA push eax call GetProcAddress mov __LoadLibraryA,eax [COLOR=Lime];находим адрес MessageBoxA[/COLOR] push offset _user32 call LoadLibraryA push offset _MessageBoxA push eax call GetProcAddress mov __MessageBoxA,eax [COLOR=Lime];шелл-код готов. Можно копировать куда надо либо запускать. ;Размер шелл-кода - SizeOfShellcode. Начало в ShellCode.[/COLOR] [COLOR=Lime];создаем пустой файл[/COLOR] xor eax,eax push eax push eax push CREATE_ALWAYS push eax push eax push GENERIC_WRITE push offset fName call CreateFileA push eax [COLOR=Lime];копируем шелл-код в файл, в виде бинарного потока[/COLOR] push 0 push offset temp push SizeOfShellcode ;размер шелл-кода push offset ShellCode ;буфер - шелл-код push eax call WriteFile [COLOR=Lime];закрываем файл[/COLOR] [COLOR=Red][B];pop eax не требуется[/B][/COLOR] call CloseHandle [COLOR=Lime];шелл-код[/COLOR] [COLOR=DarkOrange]ShellCode: call GetDelta GetDelta: pop ebp sub ebp,offset GetDelta [COLOR=Lime];подгружаем user32.dll[/COLOR] lea eax,[ebp+_user32] push eax call [ebp+__LoadLibraryA] [COLOR=Lime];вызываем MessageBoxA[/COLOR] push 0 lea eax,[ebp+__Message] push eax push eax push 0 call [ebp+__MessageBoxA] [COLOR=Lime];ExitProcess[/COLOR] push 0 call [ebp+__ExitProcess] [COLOR=Lime];данные шелл-кода[/COLOR] _user32 db 'user32.dll',0 __ExitProcess dd 0 __MessageBoxA dd 0 __LoadLibraryA dd 0 __Message db 'I am shellcode',0 SizeOfShellcode equ ($-offset ShellCode) [/COLOR] end Main Вообще таких вариантов можно написать целую массу. Всё зависит от цели и требуемых размеров кода.
да ладно ,покажи пример как ты запускаешь уже готовый бинарный код сплоита на асме ,а не на с пример хотя бы. заранее благодарю
Кто сказал, что я вообще имею отношению к сплойтам и когда-либо их использовал? о_О Речь идет о базонезависимости, а не об запуске готового кода для получения привилегий используя уязвимости. это к чему? Код в посте #1195 абсолютно работоспособен и проверен через отладчик, в чем ты можешь сам убедиться.
#1195 какие тут могут быть секреты ,не ужели трудно объяснить ,если знаешь хоть я и чайник в асме но в твоем коде я не нахожу того что ты создавая пустой файл для записи бинарного патока для будущего щелкода тут я не нашел запись для PHP: push offset _kernel32 push offset _ExitProcess push offset _LoadLibraryA push offset _user32 push offset _MessageBoxA а твой код такой ;копируем шелл-код в файл, в виде бинарного потока PHP: push 0 push offset temp push SizeOfShellcode ;размер шелл-кода push offset ShellCode ;буфер - шелл-код push eax call WriteFile а если тут добавить к коду эти строки ,а уж потом call WriteFile call CloseHandle RET PHP: push offset _kernel32 push offset _ExitProcess push offset _LoadLibraryA push offset _user32 push offset _MessageBoxA мое мнение наверно бинарный поток копирует не весь опкод а может я и не прав... тут я сделал иначе вод код PHP: .386 .model flat,stdcall option casemap:none .data start: push 0 push 0 jmp string return: pop ebx push ebx; adress of text mov eax,сюда адрес Messagebox call eax; eax-adress_OF_Messagebox push 0 mov eax,сюда адрес ExitProcess string: call return db "my Shellcode" end start на скрине все показано 1 http://i5.pixs.ru/storage/7/3/1/NoNamebmp_7771600_3314731.jpg 2 http://i5.pixs.ru/storage/7/4/9/NoName2bmp_6599566_3314749.jpg 3 http://i5.pixs.ru/storage/7/8/7/NoName445b_1140933_3314787.jpg 4 http://i5.pixs.ru/storage/8/0/1/NoName4bmp_9903130_3314801.jpg 5 http://i5.pixs.ru/storage/8/1/1/NoName44bm_8095798_3314811.jpg 6 http://i2.pixs.ru/storage/8/2/1/NoName4457_1345734_3314821.jpg http://i2.pixs.ru/storage/0/4/8/NoName3bmp_5718757_3315048.jpg не судите строго я Новичок в асме.
Вопросик... Как при помощи ассемблера можно найти симбол в стринге ? Например... 004437A2 68 E8BF5200 PUSH 0052BFE8 ; ASCII "someevilstring" //найти в стринге, допустим, симбол '.
ШТО? Строки - это обычный набор байт, с которым работают любые регистры, и код выше абсолютно верен, но не рационален, т.е. не оптимизирован. Регистры приемник и источник нужны для работы специальных команд, которые предназначены для работы с блоком байт (в него же и входят строки). В ассемблере вообще нету понятия "строки". Если под найти подразумевается вычислить позицию символа внутри текста либо строки, то есть специальная команда scasx Code: mov al,'n' mov edi,<адрес строки> cld repne scasb В edi, после выполнения, адрес искомого символа. Связка repne scasb меняет значение регистра ecx, декрементируется, и если он равняется нулю, то желаемый результат не будет достигнут. Потому можно перед выполнением записать в ecx число -1: Code: xor ecx,ecx dec ecx И в дополнение - флаг D задает направление поиска: если он опущен, то поиск производится с начала строки, если же поднят - с конца. Что касается вот конкретно под этот пример: Code: xor ecx,ecx dec ecx mov al,27h ; ' mov edi,0052BFE8h cld repne scasb И вообще, нахуя я это написал, если всем требуется только тупо готовый код? Что-то я задумался. Замечтался.
вопрос по криптору ,есть исходник криптора на асме скачал с инета для изучения, вопрос такой почему после крипта любого зверя антевирь арет примерно так ,если криптанул пинча то он его видет как пинча после крипта ,если криптанул индюка то после крипта индюк остается индюком то есть антевирь его видит как есть название криптора -=[ yoda's Crypter ]=-
мб АВ уже как с пару лет не просто распаковывает, а имеет собственную виртуальную машину, где эмулирует работу сканируемой программы, и евристически распознает не просто убогие крипторы, а еще и полиморфный код со всем возможными вариантами. Проводит анализ кода и выявляет логически не состыковывающийся мусорные команды на уровне опкодов. И еще куча других способов. SEKTOR3A, о каком крипторе идет речь, если вы не знаете столь примитивной и вседоступной информации, которая лежит наверное даже на википедии? Сами же писали, что новичок в АСМ, а уже беретесь за крипт пинчей? Да вам как минимум пол года только формат исполняемых файлов учить для получения поверхностных знаний. Это тоже, что и в первом классе неопределенный интеграл считать. И не нужно говорить, что делает всё ради знаний, и давить на то, что новичок и хотите научиться. В теме в шелл-кодом всё стало видно. Если вы надеетесь протий быстро учебный курс по написанию криптов, как это делается в книгах по Делфи "Хелло ворлд", что бы рубать баксы за крипт пичней, то это просто лольство. А в исходниках крипта yoda вы и 10 строк не разберете.
Спасибо, но думаю полгода многовато как то этих строк достаточно было изменить чтоб пинч заткнулся PHP: ; encrypt ! mov eax,pMem mov ebx,0 call CryptPE popad
Подскажите по решению задачи из книги Кип Ирвин. Задача:"Напишите программу, которая бы генерировала и отображала последовательность случайных строк, каждая строка должна быть длиной не больше 10 символов, в диапазоне A-Z". Мне тут все понятно, кроме одного - как задать диапазон? Я думал, сделать это с помощью скан-кодов клавиш, т.е. (псевдокод) from (i=1eh;i<=2ch;i++) write i; Но не знаю, какая функция может вывести символ по его скан коду? стандартная функция из книги (writechar) выводит какую-то ерунду, если ей передать что-то типа 1eh.