сейчас читаю Writing buffer overflow exploits - a tutorial for beginners от Mixter'a Система у меня Slackware-2.6.17, проц athlonXP 2000+ компилю примеры из этого руководства (они для пеньков), запускаю gdb и вижу следующее /*blah.c*/ void lame (void) { char small[30]; gets (small); printf("%s\n", small); } main() { lame (); return 0; } Dump of assembler code for function lame: 0x080483c4 <lame+0>: push %ebp 0x080483c5 <lame+1>: mov %esp,%ebp 0x080483c7 <lame+3>: sub $0x28,%esp 0x080483ca <lame+6>: sub $0xc,%esp 0x080483cd <lame+9>: lea 0xffffff88(%ebp),%eax В то время как в примере 0x80484a0 : pushl %ebp 0x80484a1 : movl %esp,%ebp 0x80484a3 : subl $0x20,%esp 0x80484a6 : leal 0xffffffe0(%ebp),%eax Т.е. тут понятно, что под буфер выделяется 32(0x20) байта. А у меня 0x28(40 байт) и еще не пойму че за 0xc. Менял размер буфера - изменяется только первое значение, а 0xc так и остается... Можете разъяснить или хотя бы ссылок кинуть?
gcc version 3.4.5 (mingw special) Код (Text): .text:004012E0 push ebp .text:004012E1 mov ebp, esp .text:004012E3 sub esp, 38h ; char * .text:004012E6 lea eax, [ebp+var_28] .text:004012E9 mov [esp+38h+var_38], eax .text:004012EC call gets
это понятно, что место в стеке выделяется sub $0x28,%esp я про то, что такое sub 0xC? почему тогда не sub $0x40,%esp? И почему так много выделяется под буфер, когда должно вроде как 32 байта?
0xC + 0x28 = 0x38. Посмотри на мой дизасм. Там хитрости со стеком, посиди с бумажкой и будет более понятно.