Проблема с самомодификацией

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by ShkiperLol, 3 Oct 2010.

  1. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Помогите плиз разобраться!!!!!Питаюсь реализовать самомодификацию.Но нифига не работает,подскажите в чем моя ошибка?Что я делаю не так.Данный код пишу в слепую,обосновываясь на теорию.
    Поставленная задача,зделать так чтобы вызвалась функция 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;
    }
    
    
     
  2. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    а ты не пробовал отладчиком пройтись по полученным данным?
     
  3. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    Смотрел,ниче вроде лишнего не затираеться
     
    #3 ShkiperLol, 3 Oct 2010
    Last edited: 3 Oct 2010
  4. 0verbreaK

    0verbreaK Elder - Старейшина

    Joined:
    30 Apr 2008
    Messages:
    318
    Likes Received:
    42
    Reputations:
    -3
    //свободное пространство.Его VA начинаеться с
    //0x4020C0

    Адрес меняется поэтому наверное пишется не туда, попробуй определить адрес через метку
     
  5. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    нет я в IDA pro сотрел,адрес не меняеться.
     
  6. cupper

    cupper Elder - Старейшина

    Joined:
    6 Jun 2007
    Messages:
    369
    Likes Received:
    92
    Reputations:
    5
    а в какой среде делаешь ?
    третья ссылка в гуле http://www.securitylab.ru/contest/212085.php, но думаю ты уже это читал.
    Единственное что могу предположить (из того что я увидел фразу переполнение буфера) что VS пресекает эту возможность, гдето слыхал что в последних вижаках мегафичи навинчины для того чтобы убрать эту уязвимость под корень.
     
  7. ShkiperLol

    ShkiperLol Banned

    Joined:
    17 Apr 2010
    Messages:
    182
    Likes Received:
    1
    Reputations:
    0
    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() вполне хватало для записи оп кода безусловного перехода.
     
  8. noxjoker

    noxjoker Member

    Joined:
    7 Aug 2009
    Messages:
    189
    Likes Received:
    24
    Reputations:
    0
    возможно ето связано с гранулярностью виделения памяти
     
  9. slesh

    slesh Elder - Старейшина

    Joined:
    5 Mar 2007
    Messages:
    2,702
    Likes Received:
    1,224
    Reputations:
    455
    Не не гранулярность, а особенность компилятора. А именно удалять не нужный код, переставлять функции местами, оптимизировать по самим командам. итпд итп