【问题标题】:Find the absolute size of an array/buffer on the stack在堆栈上查找数组/缓冲区的绝对大小
【发布时间】:2014-05-06 09:37:30
【问题描述】:

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

【问题讨论】:

  • 指针只是一个地址 - 它没有与之关联的隐式大小。

标签: linux assembly gdb


【解决方案1】:

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

我假设您想知道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 中,%eax 又被用于将参数传递给对 strcpy() 的调用。

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

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

【讨论】:

    猜你喜欢
    • 2015-07-03
    • 2021-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-23
    • 2012-11-23
    • 1970-01-01
    • 2018-08-13
    相关资源
    最近更新 更多