Нечаяная защита от дебаггеров компилятора Dev-C++ 4.9.9.2

Тема в разделе "WASM.BEGINNERS", создана пользователем newbye, 1 авг 2011.

  1. newbye

    newbye New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2011
    Сообщения:
    7
    Разбирался тут с идентификацией функций по книге "Техника хакерских атак" Касперски, и напоролся на такой странный пример... Точнее пример вполне обычный, но код сгенерировался довольно странный: по адресу 401317h, в цикле адрес функции присваевается указателю и через него вызываеться.
    Странность в том, что вызываеться функция по адресу... 0000000Ch! Естественно дальше дизассемблер отказываеться продолжить выполнение. Ошибки быть не может -- проверил на двух дебаггерах: OllyDbg и Immunity Debugger.
    Я думаю о том, что в винде этот файл работает без проблем, и выводит обе тестовые строки можно не говорить :)
    Исходный код и аттач с файлом прилагается.

    Код (Text):
    1. #include <stdio.h>
    2.  
    3. int func_1(){};
    4. int func_2(){printf("Impossible is possible!");};
    5. int func_3(){};
    6.  
    7. int main()
    8. {
    9.       printf("Hello World\n");
    10.       int x;
    11.       int a[3]={(int) func_1(),(int) func_2(), (int) func_3()};
    12.       int (*f)();
    13.  
    14. for (x=0;x < 3;x++)
    15.  {
    16.       f=(int (*)()) a[x];                                                  //Тот цикл, он по адресу 401317h Сам вызов 40132Ah.
    17.       f();
    18.  }
    19. }
    Как такое может быть?

    Скомпилено все на Dev-C++ 4.9.9.2
     
  2. newbye

    newbye New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2011
    Сообщения:
    7
    Странно, что-то я аттача не вижу... Ладно сейчас на файлообменник закину.
    Добавлено:
    Есть! Прошу любить и жаловать -- оно пришло! Только на http://exfile.ru/198563 ! :)
     
  3. rmn

    rmn Well-Known Member

    Публикаций:
    0
    Регистрация:
    23 ноя 2004
    Сообщения:
    2.347
    здесь элементам массива присваиваются не адреса функций, а их возвращаемые значения (соответственно, все три функции вызываются, отсюда и сообщение в консоли).

    в дизассемблере все прозрачно:
    Код (Text):
    1. .text:004012DA                 mov     [esp+68h+var_68], offset aHelloWorld ; "Hello World\n"
    2. .text:004012E1                 call    printf
    3. .text:004012E1
    4. .text:004012E6                 call    func_1
    5. .text:004012E6
    6. .text:004012EB                 mov     [ebp+a], eax
    7. .text:004012EE                 call    func_2
    8. .text:004012EE
    9. .text:004012F3                 mov     [ebp+a+4], eax
    10. .text:004012F6                 call    func_3
    11. .text:004012F6
    12. .text:004012FB                 mov     [ebp+a+8], eax
    13. .text:004012FE                 mov     eax, [ebp+a]
    14. .text:00401301                 mov     [ebp+f], eax
    15. .text:00401304                 mov     eax, [ebp+a+4]
    16. .text:00401307                 mov     [ebp+f+4], eax
    17. .text:0040130A                 mov     eax, [ebp+a+8]
    18. .text:0040130D                 mov     [ebp+f+8], eax
    19. .text:00401310                 mov     [ebp+x], 0
    20. .text:00401310
    21. .text:00401317
    22. .text:00401317 loc_401317:                             ; CODE XREF: _main+81j
    23. .text:00401317                 cmp     [ebp+x], 2
    24. .text:0040131B                 jg      short loc_401333
    25. .text:0040131B
    26. .text:0040131D                 mov     eax, [ebp+x]
    27. .text:00401320                 mov     eax, [ebp+eax*4+f]
    28. .text:00401324                 mov     [ebp+var_3C], eax
    29. .text:00401327                 mov     eax, [ebp+var_3C]
    30. .text:0040132A                 call    eax
    31. .text:0040132A
    32. .text:0040132C                 lea     eax, [ebp+x]
    33. .text:0040132F                 inc     dword ptr [eax]
    34. .text:00401331                 jmp     short loc_401317
     
  4. newbye

    newbye New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2011
    Сообщения:
    7
    Ну надо же, блин, и как я не заметил. Буду повнимательней... И все-же оригинальный способ завершения программы -- через исключение. Разработчикам компилятора большой респект :)
     
  5. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    newbye
    Какой ещё респект? Обычное падение приложения. И валидного завершения работы приложения там нету. А если бы и было, то багрепорт разработчикам писать надо было бы, а не респекты раздавать.
     
  6. newbye

    newbye New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2011
    Сообщения:
    7
    Я иронизирую.
     
  7. newbye

    newbye New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2011
    Сообщения:
    7
    А насчет баг-репорта идея хорошая, отослал. Правда при отправке у меня, отчего-то возникла леденящая душу ассоциация -- с фильмами ужасов -- когда на космическую станцию приходит сообщение, а затем камера отодвигаеться, и показывают покрытые пылью панели управления, треснутый монитор справа, забрызганый чем-то красным, кресло с лежащим в полуразложившихся лохмотьях чьим-то скелетом; все это на фоне фееричекого виде планеты в иллюминаторе, с восходящей за ней звездой...
    Наверное это от того, что на офсайте дата последнего выхода Dev-C++ то ли 2005, то ли 2006-ой год.
     
  8. shchetinin

    shchetinin Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    715
    newbye
    Код (Text):
    1. int a[3]={(int) func_1(),(int) func_2(), (int) func_3()};
    На
    Код (Text):
    1. int a[3]={(int) func_1,(int) func_2, (int) func_3};
     
  9. CatX

    CatX New Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    19
    ...потом наезд на изображение с камеры отодвигается назад, появляется терминал передающий оное изображение, далее появляется смотрящий в монитор мальчик в красном пионерском галстуке с лицензинной коробкой из под диска с надписью 'дев С++', далее откат изображения продолжается, что обнаруживает мальчика в помещении не одного, а с зелеными, похожими на инопланетян, существами сзади него, которые плачут от данной душевной картины и пытаются похлопать мальчика по плечу. Занавес.
     
  10. l_inc

    l_inc New Member

    Публикаций:
    0
    Регистрация:
    29 сен 2005
    Сообщения:
    2.566
    newbye
    Я ж написал: "Надо было бы" (сослагательное наклонение). В данном случае компилятор делает всё правильно, и никакого багрепорта не нужно.
     
  11. newbye

    newbye New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2011
    Сообщения:
    7
    Неожиданный хэппиэнд! Увы, я пока не умею с ходу определять назначение функций, тем более, что оригинал пришлось править, что бы он скомпилировался. Говоря по правде меня конструкции типа " int a[3]={(int) func_1(),(int) func_2(), (int) func_3()};" и "f=(int (*)()) a[x];" пока еще вводят в ступор. Последнее, я так понял кастинг?
    В обшем прошу прощения, зеленым человечкам я тоже отписался.
     
  12. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    Да вы батенька больной :lol:
     
  13. CatX

    CatX New Member

    Публикаций:
    0
    Регистрация:
    27 май 2011
    Сообщения:
    19
    кстати, я сперва подумал, что это вы, ники то похожи как..простите
     
  14. newbye

    newbye New Member

    Публикаций:
    0
    Регистрация:
    1 авг 2011
    Сообщения:
    7
    Да, я тоже заметил после регистрации, правда немного другое -- что неправильно имя написал. Хотел исправить, но в профиле, как это часто водиться такой возможности нет :dntknw:
     
  15. Ezrah

    Ezrah Member

    Публикаций:
    0
    Регистрация:
    22 мар 2011
    Сообщения:
    411
    newbye
    Тот ник уже занят, так что не печальтесь, да и "Новый до свидания" лучше звучит чем "нуб".
     
  16. newbie

    newbie New Member

    Публикаций:
    0
    Регистрация:
    2 дек 2008
    Сообщения:
    1.246
    продам свой акк. 500вмз. пишите в ПМ =)
     
  17. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    /offtop Каждый сам должен свой крест нести