Эпилог в Линуксе

Тема в разделе "WASM.UNIX", создана пользователем Aldhissla, 6 мар 2008.

  1. Aldhissla

    Aldhissla New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    4
    Здравствуйте дзенствуещие!
    Объясните пожалуйста что это за эпилог такой:

    0x0804842e <main+78>: add $0x24,%esp
    0x08048431 <main+81>: pop %ecx
    0x08048432 <main+82>: pop %ebp
    0x08048433 <main+83>: lea 0xfffffffc(%ecx),%esp ?????
    0x08048436 <main+86>: ret

    особенно интересна линия main+83
    Вроде раньше такого небыло :|
     
  2. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Aldhissla
    Вспомни что раньше стояло на месте этой строки, и все встанет на свои места.
     
  3. Aldhissla

    Aldhissla New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    4
    leave что ли?

    получается что обычный буфер оверфлоу не сработает, надо адрес возврата в начали буфера ставить? там где есх сохраняется.....
     
  4. rei3er

    rei3er maxim

    Публикаций:
    0
    Регистрация:
    15 янв 2007
    Сообщения:
    917
    Адрес:
    minsk
    сомневаюсь, т. к перед этим идет pop ebp
    когда раньше?
     
  5. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    ebp точно так же может быть заюзан, как и ebx esi и edi. Но тогда непонятно, почему в конце esp=ecx-4. Если было бы esp=ecx+4, то получалось бы, что в стеке просто освобождалось место под DWORD в прологе. А если -4, то... ecx указывает на список аргументов ф-ции... А, что в общем мешает посмотреть пролог?
     
  6. Aldhissla

    Aldhissla New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    4
    вот наверное пролог:

    0x080483c4 <main+0>: lea 0x4(%esp),%ecx
    0x080483c8 <main+4>: and $0xfffffff0,%esp
    0x080483cb <main+7>: pushl 0xfffffffc(%ecx)
    0x080483ce <main+10>: push %ebp
    0x080483cf <main+11>: mov %esp,%ebp
    0x080483d1 <main+13>: push %ecx
    0x080483d2 <main+14>: sub $0x214,%esp
    0x080483d8 <main+20>: mov %ecx,0xfffffdf8(%ebp)

    получается что возвратный адрес находится в ecx ??
     
  7. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Получается, что ecx указывает на аргументы функции. А вот ecx-4 - на адрес возврата.
     
  8. Aldhissla

    Aldhissla New Member

    Публикаций:
    0
    Регистрация:
    6 мар 2008
    Сообщения:
    4
    спасибо разъяснил

    А когда это поменялось? помню еще года 2 назад вроде такого не было.
     
  9. KeSqueer

    KeSqueer Сергей

    Публикаций:
    0
    Регистрация:
    19 июл 2007
    Сообщения:
    1.183
    Адрес:
    Москва
    Aldhissla
    Ничего не изменилось. Точнее изменилось конечно - компиляторы развиваются и делают все более продвинутый код. Если так написаны пролог и эпилог, значит компилятор посчитал нужным так сделать в целях оптимизации, либо это кто-то делал руками. Ничего более.
     
  10. diamond

    diamond New Member

    Публикаций:
    0
    Регистрация:
    21 май 2004
    Сообщения:
    507
    Адрес:
    Russia
    Это же main, выделенная функция на Си (точка входа). gcc явно выравнивает esp на границу 16 байт
    Код (Text):
    1. 0x080483c8 <main+4>:    and    $0xfffffff0,%esp
    а чтобы ret вернулся куда положено, к концу функции esp должен быть таким же, каким он был в начале. Вот и появляется восстановление esp
    Код (Text):
    1. 0x08048433 <main+83>:   lea    0xfffffffc(%ecx),%esp