gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:54:06 24 4
gpt4 key购买 nike

我希望标题不会误导人(我在汇编方面几乎是个新手)。我正在玩 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 字节。

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

关于linux - 在堆栈上查找数组/缓冲区的绝对大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23491004/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com