我希望这个标题不会误导太多(我几乎是组装新手(。我正在使用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 个字节开始。因此,如果 %ebp
和 ebp-120
之间没有其他变量,我们可以假设缓冲区的大小为 120 字节。
如果不清楚,请发表评论,我会尽力改进解释。