在阅读有关汇编程序的文章时,我经常遇到人们在写文件时他们推送处理器的某个寄存器并稍后再次弹出它以恢复它之前的状态.
C++
ATT大会
我试图理解以下两条指令的行为:
pushl %esp
Run Code Online (Sandbox Code Playgroud)
和:
popl %esp
Run Code Online (Sandbox Code Playgroud)
请注意,它们将计算出的值存储回来%esp.
我正在独立地考虑这些指令,而不是按顺序.我知道存储的值%esp总是递增/递减之前的值,但是我怎么能用汇编语言表示行为呢?这是我到目前为止所提出的:
推送:
movl %esp, %edx 1. save value of %esp
subl $4, %esp 2. decrement stack pointer
movl %edx, (%esp) 3. store old value of %esp on top of stack
Run Code Online (Sandbox Code Playgroud)
对于pop:
movl (%esp), %esp You wouldn’t need the increment portion.
Run Code Online (Sandbox Code Playgroud)
它是否正确?如果没有,我哪里错了?谢谢.
我正在检查 Ericksons Hacking: The Art of Exploitation 中的这段代码片段:
\nvoid test_function(int a, int b, int c, int d) {\n int flag;\n char buffer[10];\n flag = 31337;\n buffer[0] = \'A\';\n}\n\nint main() {\n test_function(1, 2, 3, 4); \n}\nRun Code Online (Sandbox Code Playgroud)\nvoid test_function(int a, int b, int c, int d) {\n int flag;\n char buffer[10];\n flag = 31337;\n buffer[0] = \'A\';\n}\n\nint main() {\n test_function(1, 2, 3, 4); \n}\nRun Code Online (Sandbox Code Playgroud)\n我在 main 和 test_function 处设置了断点。\n当中断 main 时,我得到以下输出:
\ngcc -g stack_example.c\n\ngdb -q ./a.out\n\ngef\xe2\x9e\xa4list main\n\n\n 0x555555555192 …Run Code Online (Sandbox Code Playgroud)