Очень много слышал про атаку, связанную с переполнением буфера. Подскажите, пожалуйста, в каких источниках максимально подробно и с примерами это всё описано. Заранее спасибо.
Например The Shellcoder`s Handbook. Ну и в инете очень много инфы по этой теме. Достаточно заюзать гугл (вбиваем в поиск "buffer overflow how to").
Code (Text): #include <Windows.h> //прототипы void show_array(int arrlen, char array[]); int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR cmdLine, int cmdShow) { char mystr[] = "111112222233333444445555566666777778" "\x01\x38\x14\x13";//адрес вызова функции "после переполнения" 01381413 show_array(51, mystr); MessageBox(NULL, "до переполнения", "до переполнения", MB_OK); MessageBox(NULL, "после переполнения", "после переполнения", MB_OK); return 0; } void show_array(int arrlen, char array[]) { char buffer[32]; int i; for (i = 0; i < arrlen; i++) buffer[i] = array[i]; } Нужно при помощи переполнения стека проскочить вызов MessageBox "до переполнения" и сразу вызвать MessageBox "после переполнения". функция Call MessageBox (посмотрел в OllyDbg) находится по адресу 01381413 Самое главное, выскакивает не ошибка "обращение по несуществующему адресу", а просто Windows 7 выдаёт сообщение о том что прекращена работа программы. Предлагает отладку, поиск решений в Интернете и закрыть программу. Я не так адрес функции передал?
Dimarik__ Брось ты это дело. Написание шеллов требуют понимания и упорства, а не упрощения себе жизни. Твой исходник ПО-РАЗНОМУ компилируется - например в VS2005 в релизе вообще нет никакого затирания стека и выводятся оба сообщения. В режиме дебаг еще хитрее - с вероятностью 1/2(приблизительно) либо ловится затирание стека, либо память не может быть 'read'. Кстати адрес вызова нужно задавать задом-наперед "\0x13\0x14\0x38\0x01" Ну и народ утверждает, что в 7-ке чтобы жизнь не казалась медом адрес загрузки меняется и вы могли просто не попасть туда, куда попадаете под отладчиком.
Dimarik__ Соглашаясь с valterg добавлю, что еще вам стоит поизучать ассемблер. Иначе я не понимаю, зачем в разделе по WASM.ASSEMBLER, вы приводите код на Си.