0
#define NORMAL_BUFFER_SIZE 32 
int getbuf()
{
    char buf[NORMAL_BUFFER_SIZE];
    Gets(buf);
    return 1;
}

このような C コードがあり、スタックに 32 バイトを割り当てる必要があります。

分解してみると、

0804919e <getbuf>:
 804919e:   55                      push   %ebp
 804919f:   89 e5                   mov    %esp,%ebp
 80491a1:   83 ec 38                sub    $0x38,%esp
 80491a4:   8d 45 d8                lea    -0x28(%ebp),%eax
 80491a7:   89 04 24                mov    %eax,(%esp)
 80491aa:   e8 ef f9 ff ff          call   8048b9e <Gets>
 80491af:   b8 01 00 00 00          mov    $0x1,%eax
 80491b4:   c9                      leave  
 80491b5:   c3                      ret    
 80491b6:   90                      nop
 80491b7:   90                      nop

私はこのようなものを取得します。最初に $0x38 バイトをスタックに割り当て、buf を Gets に渡します。buf は配列であるため、ベース ポインターを Gets に渡します。buf のサイズは 32 バイトです。つまり、16 進数で 0x20 を意味します。では、lea -x020(%ebp), %eax を渡さないのはなぜですか?

私が知っているように、スタックの構造はこのようなものでなければなりません

--------------
ret addr
--------------
old ebp
--------------
32 bytes for
buf
--------------
something else
here
--------------
4

1 に答える 1