为什么push指令会改变rsp的值?
为什么push指令会改变rsp的值?
这个问题已经有答案了:
我正在检查来自Erickson的《黑客:利用技术的艺术》中的这段代码片段:
void test_function(int a, int b, int c, int d) { int flag; char buffer[10]; flag = 31337; buffer[0] = 'A'; } int main() { test_function(1, 2, 3, 4); }
gcc -g stack_example.c gdb -q ./a.out gef➤list main 0x555555555192 <main+0> endbr64 0x555555555196 <main+4> push rbp 0x555555555197 <main+5> mov rbp, rsp → 0x55555555519a <main+8> mov ecx, 0x4 0x55555555519f <main+13> mov edx, 0x3 0x5555555551a4 <main+18> mov esi, 0x2 0x5555555551a9 <main+23> mov edi, 0x1 0x5555555551ae <main+28> call 0x555555555149 0x5555555551b3 <main+33> mov eax, 0x0
我在主函数和test_function处设置断点。
当我在主函数中断点时,我得到以下输出:
gef➤ i r rsp rbp rip rsp 0x7fffffffdfc8 0x7fffffffdfc8 rbp 0x0 0x0 rip 0x555555555192 0x555555555192
现在当我在test_function处断点时,寄存器包含:
gef➤ i r rsp rbp rip **rsp 0x7fffffffdfc0 0x7fffffffdfc0** **rbp 0x7fffffffdfc0 0x7fffffffdfc0** rip 0x55555555519a 0x55555555519a <main+8>
我的问题是,为什么指令执行后,寄存器rsp的值从0x7fffffffdfc8
更改为0x7fffffffdfc0
?
0x555555555196 <main+4> push rbp 0x555555555197 <main+5> mov rbp, rsp
admin 更改状态以发布 2023年5月23日