Простейшая функция, Код (Text): int main(int argc, char** argv) { } gcc -ggdb -o exp2 exp2.c gdb exp2 Код (Text): В ATT (gdb) disassemble main Dump of assembler code for function main: 0x08048374 <main+0>: push %ebp 0x08048375 <main+1>: mov %esp,%ebp 0x08048377 <main+3>: sub $0x8,%esp 0x0804837a <main+6>: and $0xfffffff0,%esp 0x0804837d <main+9>: mov $0x0,%eax 0x08048382 <main+14>: add $0xf,%eax 0x08048385 <main+17>: add $0xf,%eax 0x08048388 <main+20>: shr $0x4,%eax 0x0804838b <main+23>: shl $0x4,%eax 0x0804838e <main+26>: sub %eax,%esp 0x08048390 <main+28>: leave 0x08048391 <main+29>: ret End of assembler dump. Код (Text): В INTEL ((gdb) disassemble main Dump of assembler code for function main: 0x08048374 <main+0>: push ebp 0x08048375 <main+1>: mov ebp,esp 0x08048377 <main+3>: sub esp,0x8 0x0804837a <main+6>: and esp,0xfffffff0 0x0804837d <main+9>: mov eax,0x0 0x08048382 <main+14>: add eax,0xf 0x08048385 <main+17>: add eax,0xf 0x08048388 <main+20>: shr eax,0x4 0x0804838b <main+23>: shl eax,0x4 0x0804838e <main+26>: sub esp,eax 0x08048390 <main+28>: leave 0x08048391 <main+29>: ret End of assembler dump. Зачем вообще уменьшать ESP, ведь нет никаких переменных. Зачем эти add shr shl, они этим хотят флаги изменить? Буду рад любому коментарию.
lcat ХЗ быть может специфика main (непонятно только почему) все остальные пустые функции имеют обычный пролог/эпилог Код (Text): void F() { } int main() { F(); return 0; } Код (Text): ... .globl F F: pushl %ebp movl %esp, %ebp popl %ebp ret ...
lcat Включите оптимизцию - часть мусора уйдёт. Вам ещё повезло, что он SEH не инициализирует. В одной из старых версий он это тоже добавлял всегда в main. Кстати, а какой командой в gdb включается интеловский синтаксис? Что-то в манах я ничего подобного не вижу...
даже с -O3 "мусор" есть (почти в таком же количестве) а причем здесь SEH и *N?X? имхо, автор сам перевел
Quantum set disassembly-flavor intel set disassembly-flavor att /* кстати, если надо могу выслать свое руководство по gdb, краткий конспект основных команд из манов, довольно удобное */
rei3er omit-frame-pointer форсирует удаление пролога, а в данном случае он и не нужен. Как гарантированно избавиться от лишнего выравнивания стека - не знаю, но у меня при O3 оно обычно опускается. Можно заменить main на обычную функцию, а потом через опции линкера обозначить её главной или вообще избавиться от LIBC, но это всё извратные способы. Наверное, выравнивание стека в main можно отключить каким-то штатным ключиком. С остальным мусором не знаю как быть. У меня такого не наблюдается. Версий GCC несколько: есть старые и новые в разных дистрибутивах Линукса и FreeBSD. Что-то он в FS пихал, а я по привычке списал на SEH Только сейчас задумался. kaspersky Ух ты! Суперские доки! Спасибо!!! Очень пригодилось.
Код (Text): $ gcc -mpreferred-stack-boundary=2 -S test.c $ cat test.s .file "test.c" .text .globl main .type main, @function main: pushl %ebp movl %esp, %ebp popl %ebp ret .size main, .-main .ident "GCC: (GNU) 4.1.1 (Gentoo 4.1.1-r3)" .section .note.GNU-stack,"",@progbits
Я задал этот вопрос так как пробую себя в реверс инженренги. Читал как использовать ошибки в BUFFER OVERFLOWS и получал немного другие команды после компиляции. Самым удобным для себя нашел ключ -mpreferred-stack-boundary=2, получается почти то что ожидаешь. Использую gcc 3.4.6.
ShadOS > Крис, когда у вас будет нормальный сайт уже? на инсидепро мои статьи выложены в нормальной форме (хотя это и не мой сайт), а у меня пока что стоит простой web/ftp сервер на домашней машине и все никак не хватает времени заняться им вплотную ;(