我希望这个标题不会引起太多误导(我在装配上几乎是个新手)。 我正在玩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 ......但是那个结果是该缓冲区的绝对大小吗?或者有更好的方法来找到指针的大小?提前致谢
答案 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字节。
如果不清楚,请发表评论,我会尝试改进解释。