Здравствуйте дзенствуещие! Объясните пожалуйста что это за эпилог такой: 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 Вроде раньше такого небыло :|
leave что ли? получается что обычный буфер оверфлоу не сработает, надо адрес возврата в начали буфера ставить? там где есх сохраняется.....
ebp точно так же может быть заюзан, как и ebx esi и edi. Но тогда непонятно, почему в конце esp=ecx-4. Если было бы esp=ecx+4, то получалось бы, что в стеке просто освобождалось место под DWORD в прологе. А если -4, то... ecx указывает на список аргументов ф-ции... А, что в общем мешает посмотреть пролог?
вот наверное пролог: 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 ??
Aldhissla Ничего не изменилось. Точнее изменилось конечно - компиляторы развиваются и делают все более продвинутый код. Если так написаны пролог и эпилог, значит компилятор посчитал нужным так сделать в целях оптимизации, либо это кто-то делал руками. Ничего более.
Это же main, выделенная функция на Си (точка входа). gcc явно выравнивает esp на границу 16 байт Код (Text): 0x080483c8 <main+4>: and $0xfffffff0,%esp а чтобы ret вернулся куда положено, к концу функции esp должен быть таким же, каким он был в начале. Вот и появляется восстановление esp Код (Text): 0x08048433 <main+83>: lea 0xfffffffc(%ecx),%esp