загрузка библиотеки ws2_32 для работы с сокетами и ее инициализация
Имя в своем распоряжении функцию LoadLibraryA, shell-код загружает библиотеку ws_2_32 для работы с сокетами, имя которой передается непосредственно через стек и завершается двумя нулевыми байтами (хотя было бы достаточно и одного), формируемого командой PUSH BH (как мы помним, несколькими строками выше, EBX был обращен в ноль — см. листинг 9). PUSH BH
это двухбайтовая команда, в то время как PUSH EBX – однобайтовая. Но не будем придираться по мелочам.
Процедура MyGetProcAddress
снова принимает "магическое" число 3BFCEDCBh, которое после расшифровки под отладчиком оказывается API-функций WSAStartup, вызов которой совершенно неоправдан, поскольку для инициализации библиотеки сокетов ее достаточно вызвать один-единственный раз, что уже давно сделало уязвимое приложение, иначе как бы мы ухитрились его удаленно атаковать?
Последовательность последующих вызовов вполне стандартна: WSASocketA(2, 1, 0,0,0,0) à bind(s, {sockaddr_in.2; sin_port.0x621Eh}, 0x10) à listen(s,2) à accept
(s, *addr, *addrlen) à closesocket(s).
Дождавшись подключения на заданный порт, shell-код считывает ASCII-строку, передавая ее командному интерпретатору cmd.exe по следующей схеме: CreateProcessA(0, "cmd...", 0,0, 1,0,0,0, lpStartupInfo, lpProcessInformation) à WaitForSingleObject(hProc, -1) à ExitThread(0).
Злоумышленник может запускать любые программы и выполнять пакетные команды, что дает ему практически неограниченную власть над системой, разумеется, если брандмауэр будет не прочь, но про обход брандмауэров уже неоднократно писали.