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

时间:2014-05-06 09:37:31

标签: linux assembly gdb

我希望这个标题不会引起太多误导(我在装配上几乎是个新手)。 我正在玩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 ......但是那个结果是该缓冲区的绝对大小吗?或者有更好的方法来找到指针的大小?提前致谢

1 个答案:

答案 0 :(得分:3)

首先,指针的大小始终相同。

我假设您想知道堆栈中缓冲区的大小是strcpy()中使用的。

您无法确定缓冲区的确切大小。你能说的是以下几点。

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

在函数序言之后,stackpointer递减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

%ebp告诉我们缓冲区在ebp-120以下120字节开始。因此,如果{{1}}和{{1}}之间没有其他变量,我们可以假设缓冲区的大小为120字节。

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