查找堆栈上数组/缓冲区的绝对大小



我希望这个标题不会误导太多(我几乎是组装新手(。我正在使用gdb调试器,并有一些汇编代码,如下所示:

   0x00000000004005d7 <+0>:     push   %rbp
   0x00000000004005d8 <+1>:     mov    %rsp,%rbp
   0x00000000004005db <+4>:     add    $0xffffffffffffff80,%rsp
   0x00000000004005df <+8>:     mov    %rdi,-0x78(%rbp)
   0x00000000004005e3 <+12>:    mov    -0x78(%rbp),%rdx
   0x00000000004005e7 <+16>:    lea    eax, [epb-120]
   0x00000000004005eb <+20>:    mov    %rdx,%rsi
   0x00000000004005ee <+23>:    mov    %rax,%rdi
   0x00000000004005f1 <+26>:    callq  0x400480 <strcpy@plt>
   0x00000000004005f6 <+31>:    leaveq 
   0x00000000004005f7 <+32>:    retq 

我想存档的是找出"[EPB-120]"处的缓冲区的大小。我尝试的事情是在:0x00000000004005e7设置断点并让代码运行以然后检查 epb 的值,所以我这样做并从该值中减去0x120......但结果会是该缓冲区的绝对大小吗?或者有没有更好的方法来找到该指针的大小?提前致谢

首先,指针的大小总是相同的。

我假设您想找出堆栈上使用的缓冲区有多大strcpy().

您无法判断缓冲区的确切大小。您可以知道以下内容。

0x00000000004005d7 <+0>:     push   %rbp
0x00000000004005d8 <+1>:     mov    %rsp,%rbp
0x00000000004005db <+4>:     add    $0xffffffffffffff80,%rsp

在函数序幕之后,堆栈指针递减 128 (0xffffffffffffff80 = -128(。所以我们有空间容纳 128 字节的局部变量。

0x00000000004005e7 <+16>:    lea    eax, [epb-120]
0x00000000004005eb <+20>:    mov    %rdx,%rsi
0x00000000004005ee <+23>:    mov    %rax,%rdi
0x00000000004005f1 <+26>:    callq  0x400480 <strcpy@plt>

现在,在strcpy()之前,%ebp-120的地址被加载到%eax中,该被移动到%rdi而又用于将参数传递给对strcpy()的调用。

%ebp-120告诉我们缓冲区从低于 %ebp 120 个字节开始。因此,如果 %ebpebp-120 之间没有其他变量,我们可以假设缓冲区的大小为 120 字节。

如果不清楚,请发表评论,我会尽力改进解释。