Кто подскажет как найти сразу 3 и более символов следующих друг за другом?Вот код: Code: mov ecx,100 mov edi,offset stroka mov eax,'H' repne scasb Один символ могу найти, а 3 нет.Заранее благодарен.
потому что ты ищешь символ,а тебе надо искать слово.Значит уже как минимум будет использоваться адрес источника и адрес приемника,соответственно придется сравнивать пару строк,надеюсь понятно намекнул?
DooD, спасибо, как добавил add esp, 8, так все и заработало. В Си есть много интересных функций, они проще и удобней некоторых апи, поэтому было интересно, как их вызывать.
плз покажите пару примеров на асме написания шелкода hello world на примере этого исходного кода , как ксорить нулевые байты PHP: format pe gui 4.0 include 'D:/include/win32ax.inc' section '.data' data readable writeable message db 'hello world',0 start: invoke MessageBox,NULL,message,message,MB_OK invoke ExitProcess,1 .end start
SEKTOR3A Code: option casemap:none .386 .model flat, stdcall include z:\asm\include\windows.inc include z:\asm\include\user32.inc include z:\asm\include\kernel32.inc includelib z:\asm\lib\user32.lib includelib z:\asm\lib\kernel32.lib .data msg01 db 'Assembler Hello World!!!', 0 msg02 db 'Hello World Programm', 0 .code start: invoke MessageBox,NULL,addr msg01,addr msg02, MB_OK invoke ExitProcess, 0 end start Может как-нибудь так?прошу не пинать сильно,сам начал только что изучать асм.
пробовал на масме твоё код скомпелить выдает ошибку include c:\masm32\include\windows.inc :inc(98) error A2005 symbol redefinition: char хотя у тебя в исходниках вроде нет ошибок но у меня инклуд не дает скомпелить в чем может проблема тут быть
.386 .model flat, stdcall option casemap:none include D:\masm32\include\windows.inc include D:\masm32\include\user32.inc include D:\masm32\include\kernel32.inc includelib D:\masm32\lib\user32.lib includelib D:\masm32\lib\kernel32.lib .data msg01 db 'Assembler Hello World!!!', 0 msg02 db 'Hello World Programm', 0 .code start: invoke MessageBox,NULL,addr msg01,addr msg02, MB_OK invoke ExitProcess, 0 end start
Проблема в порядке подключения инклудов, я сам когда-то долго с этим разбирался. Надо сначала кернел.инк подключать, потом виндоуз, а не наоборот. Почему так - хз, может кто нибудь более грамотный (типа d_x или slesh) мог бы объяснить
надо сначала windows.inc подключать,пример выше правильный ,только я так и не понял при чем тут шелкод и ксор байт?
а разницы нет чем скомпелить фасмом или масмом главное чтоб сработало делаю следующее компелю этот код FASM PHP: format pe gui 4.0 include 'D:/include/win32ax.inc' section '.data' data readable writeable message db 'hello world',0 start: invoke MessageBox,NULL,message,message,MB_OK invoke ExitProcess,1 .end start ,после смотрю в дебагер PHP: 00401007 > 6A 00 PUSH 0 аргумент <- стиль сообщения 00401009 68 00104000 PUSH Hellowor.00401000 ; ASCII "hello " на строку с заголовком 0040100E 68 00104000 PUSH Hellowor.00401000 ; ASCII "hello " на строку с с текстом 00401013 6A 00 PUSH 0 <- параметр - хендл окна 00401015 FF15 7C204000 CALL DWORD PTR DS:[USER32.MessageBoxA>>; USER32.MessageBoxA 0040101B 6A 01 PUSH 1 0040101D FF15 5E204000 CALL DWORD PTR DS:[KERNEL32.ExitProces>; kernel32.ExitProcess потом собераю опкод в бенарный вид вот так , PHP: 6A0068001040006800104000FF157C2040006A01FF155E204000 после преобразую его в шелкод таким образом PHP: "\х6A\х00\х68\х00\х10\х40\х00\х68\х00\х10\х40\х00\хFF\х15\х7C\х20\х40\х00\х6A\х01\хFF\х15\х5E\х20\х40\х00" после всего запускаю с++ и компелю таким образом PHP: #include <stdio.h> #include <string.h> #include <stdlib.h> #include <iostream> #include <windows.h> int main(){ unsigned char shellcode[]= "\х6A\х00\х68\х00\х10\х40\х00\х68\х00\х10\х40\х00\хFF\х15\х7C\х20\х40\х00\х6A\х01\хFF\х15\х5E\х20\х40\х00"; system("PAUSE"); ((void (*)())shellcode)(); return 0; } но так как присутствую нули будет ошибка открывается автоматом дебагер и указывает адрес access violation at 0x0022ff18 :write of address 0xf54337f5.process stopped поэтому и спрашиваю как избавится от нулевых байтов или я может не так что то делаю?
Когда явно запускаешь шеллкод, нули тебе никак не помешают. Просто ты, кажется, неправильно его преобразовал в двоичный вид в си, забыв об обратном порядке следования байтов в архитектуре x86. Плюс ко всему, в программе на асме строки в куче статической хранятся, и в шеллкод их будет очень проблематично перенести. Поэтому лучше их записывать в стек и оттуда же использовать. И да, еще, вызов винапи-фукцкий тоже производится через таблицу импорта по абсолютному адресу, ее тоже не перенесешь.
Спасибо за ответ. вот сделал пример со стекам PHP: format pe gui 4.0 include 'D:\include\win32ax.inc' section '.data' data readable writeable message db '*H','e','l','l','o', '***','A','n','t','i','c','h','a','t*',0 start: push dword MB_OK push dword message push dword message push dword 0 call [MessageBox] call [ExitProcess] .end start , а как тут прикрутить к этому исходному коду импорт библиотек пример этого section '.idata' import data readable writeable library kernel32,'kernel32.dll' import kernel32,\ ExitProcess,'ExitProcess' и.т.д PS: да еще в отладчике не меняются адреса что со стеками работать что без них ,если смотреть по первому исходному коду и по второму не имеет значение адреса одни и те же
Почитай лучше что-нибудь на тему написания подобного http://forum.antichat.ru/showthread.php?t=38435 http://www.vividmachines.com/shellcode/shellcode.html
Шелл-код - это базонезависимый код, т.е. может функционировать без ошибок независимо от того, в каком месте программы он находится. Какой же это шелл-код? Code: 00401007 > 6A 00 PUSH 0 аргумент <- стиль сообщения 00401009 68 00104000 PUSH Hellowor.00401000 ; ASCII "hello " на строку с заголовком 0040100E 68 00104000 PUSH Hellowor.00401000 ; ASCII "hello " на строку с с текстом 00401013 6A 00 PUSH 0 <- параметр - хендл окна 00401015 FF15 7C204000 CALL DWORD PTR DS:[USER32.MessageBoxA>>; USER32.MessageBoxA 0040101B 6A 01 PUSH 1 0040101D FF15 5E204000 CALL DWORD PTR DS:[KERNEL32.ExitProces>; kernel32.ExitProcess Где здесь наблюдается базонезависимость? При преобразовании такого кода в бинарный поток нарушается все смещения относительно базы и адреса. Он никогда не будет работать. Нулевые байты тут вообще не при чем. Вы перечитали литературы по написанию сплойтов используя уязвимость stack overflow. Это заблуждение. Базонезависимый код можно написать в двух вариантах: полный базонезависимый и частично. Как написать полную базонезависимость, включая "ручной" поиск и вычисления адресов API функций, я даже и пытаться не буду объяснить, а вот второй метод - частичная базонезависимость, могу. Суть частичной базонезависимости заключается в предварительном пропатчивание шелл-кода уже найденными адресами функций. Таким образом программа разбивает на две части: подготавливающий код, и собственно сам базонезависимый. Писал под MASM: 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 .code Main: [COLOR=Lime];подготавливающий код[/COLOR] [COLOR=Lime];находим адрес ExitProcess[/COLOR] push offset _kernel32 call LoadLibraryA push offset _ExitProcess push eax call GetProcAddress mov __ExitProcess,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] [COLOR=DarkOrange]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) [/COLOR] end Main При линковке обязательно нужно разрешить секцию кода для записи, ключом /SECTION:.text,RWE Минусы данного метода: в разных версиях одной и той же win, адреса API функций - разные. Потому данный шелл-код будет работать не везде. Плюсы данного метода: охренеть какая компактность, по сравнению с полной независимость. В принципе теперь через CreateFileA/WriteFile можно записать готовый шелл-код в виде бинарного потока в отдельный файл, указав начало шелл-кода - адрес метки ShellCode, а размер, он же число записываемых байт - константу SizeOfShellcode.
еще один вопрос хотел бы спросить, как можно перехватить API MessageBoxA при помощи хука этой же программы (hello world) чтоб при запуске программы hello world просто исчезло само окно MessageBox ,мне известно что можно это сделать при помощи .dll библиотеки которая и будет перехватывать MessageBox окно , что нужно учитывать при написание такой .dll нужно ли смотреть на загрузку exe файла (hello world ) в память списков адресов функций импортируемых из различных Dll. oткомпилированный вызов функции через таблицу импорта или этого мало
Есть разные способы перехвата (через таблицу импорта, через запись своего кода в начало нужной API-функции и т.д.) http://kaimi.ru/2010/08/your-own-injector/
SEKTOR3A, советую перед прочтением http://kaimi.ru/2010/08/your-own-injector/ ознакомится с http://www.rsdn.ru/article/baseserv/IntercetionAPI.xml - тут больше теории и собственно сама суть.
плиз подскажите какой утилитой быстрей собрать бинарный код (опкод) в шелкод нужно ли его собирать с право налево или как обычно ,я делаю таким образом запускаю олю выбираю себе нужный .ехе файл для сплоита жму в оли на ф8 смотрю начало точку входа и останова после собираю весь код стр+с но не меняю байты так иду как обычно с лево на право, пример куска кода PHP: 00401005 . E86E000000 call 00401078 ; \LoadLibraryA 0040100A . 68 00304000 push 403000 ; /ProcNameOrOrdinal = "ExitProcess" 0040100F . 50 push eax ; |hModule 00401010 . E8 5D000000 call 00401072 ; \GetProcAddress беру опкоды PHP: E86E000000680030400050E85D000000 потом так \xE8\x6E\x00\x00\x00\x68\x00\x30\x40\x00\x50\xE8\x5D\x00\x00\x00 правильно я делаю? PS:смотрел раздел по адресу http://www.shellcode.ru/index.php?name=News&file=print&sid=18 автор описывает то что От хакера требуется всеми силами избегать ситуации, когда в шелл-коде появляются нулевые байты а тут описание шелкода опкоды заносятся с лева на право как тогда правильней? http://www.safemode.org/files/zillion/shellcode/doc/Writing_shellcode.html