Помогите плиз разобраться!!!!!Питаюсь реализовать самомодификацию.Но нифига не работает,подскажите в чем моя ошибка?Что я делаю не так.Данный код пишу в слепую,обосновываясь на теорию. Поставленная задача,зделать так чтобы вызвалась функция test(),посредством SEH. Итак суть кода.Входная функция записует оп код в свободные страници по адресу 0x4020c0. Оп код из себя представляет установку нового seh фрейма и генерацию исключения в следствии которого управление должно передаться моей функции. Ниже все подробно описано Code: #include <iostream.h> //свободное пространство.Его VA начинаеться с //0x4020C0 //В дальнейшем по данному адресу я запишу оп код ********************* //Оп код- //push 401360 ;адрес функции test() //push 1 ;передаем физическую память странице в стеке,которая находиться ниже //mov fs:[0],esp ;регестрируем новый seh фрейм //xor eax,[eax] ;исключение ********************* asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop } //Данной функции передасться управление при //необратном исключении,которое я спровоцирую extern "C" __declspec(dllexport)test() { cout<<"Exeption Succesfull!"<<"\n"; } //В данной функции также содержаться нопы.Из етой //функции я буду переходить к выполнению записаного мною в память кода,который по адресу 0x4020c0.В ету функцию я через HIEW запишу команду jmp 4020C0 extern "C" __declspec(dllexport)call() { asm { nop nop nop nop nop nop } } int main(int argc, char* argv[]) { //Резервируем регионпо адресу 0x4020с0,передаем ему физическую память void*addr=(void*)0x4020C0; VirtualAlloc((void*)0x4020C0,4096,MEM_RESERVE|MEM_COMMIT,PAGE_READWRITE|PAGE_EXECUTE); cout<<"Main"<<"\n"; char buff[12]; //Поочередно пишем в зарезервированый регион оп код ZeroMemory(buff,sizeof(buff)); buff[0]=0x68; buff[1]=0x60; buff[2]=0x13; buff[3]=0x40; WriteProcessMemory(GetCurrentProcess(),addr,buff,4,NULL); addr=(void*)0x4020c5; ZeroMemory(buff,sizeof(buff)); buff[0]=0x6A; buff[1]=0x01; WriteProcessMemory(GetCurrentProcess(),addr,buff,2,NULL); addr=(void*)0x4020c7; ZeroMemory(buff,sizeof(buff)); buff[0]=0x67; buff[1]=0x64; buff[2]=0x89; buff[3]=0x26; buff[4]=0x00; buff[5]=0x00; WriteProcessMemory(GetCurrentProcess(),addr,buff,5,NULL); addr=(void*)0x4020CD; ZeroMemory(buff,sizeof(buff)); buff[0]=0x33; buff[1]=0x00; WriteProcessMemory(GetCurrentProcess(),addr,buff,2,NULL); call(); Sleep(4000); return 0; }
//свободное пространство.Его VA начинаеться с //0x4020C0 Адрес меняется поэтому наверное пишется не туда, попробуй определить адрес через метку
а в какой среде делаешь ? третья ссылка в гуле http://www.securitylab.ru/contest/212085.php, но думаю ты уже это читал. Единственное что могу предположить (из того что я увидел фразу переполнение буфера) что VS пресекает эту возможность, гдето слыхал что в последних вижаках мегафичи навинчины для того чтобы убрать эту уязвимость под корень.
Borland 6.0 Решение нашел,добавив в функцию call() больше нопов. Code: extern "C" __declspec(dllexport)call() { asm { nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop nop } } Можна щитать что поставленная задача выполнена. Но я так и не понял с чем ето связано,нопов в функции call() вполне хватало для записи оп кода безусловного перехода.
Не не гранулярность, а особенность компилятора. А именно удалять не нужный код, переставлять функции местами, оптимизировать по самим командам. итпд итп