格式字符串如何从堆栈中获取其参数

时间:2013-04-17 10:27:22

标签: stack

我正在玩格式字符串,并且发现很难理解,如何从堆栈中检索参数。这是我的示例代码:

#include <stdio.h>

int main(int argc, char **argv)
{
  int i = 123321;
  char a[] = "AAAAA";
  printf(argv[1]);
  printf("\n");
  return 0;
}

现在,我一直在调试器中运行程序,尝试输入,所以像“AAA%x%x”这样的东西,看着堆栈指针和基指针之间的内存段,试图找出哪个格式说明符被替换为单词。

这导致一些混乱。我用“AAAAA%x%x%x%x%x%x%x%p%p%x%x%x%x%x”运行程序,如下图所示。

enter image description here

然后,我检查了从堆栈指针开始的内存,朝向和超出基指针。可以看出输出的0x4141414141和0x1e1b9ca70c100值,即数组a [] =“AAAAA”和值i = 123321(= 0x1e1b9),我能够使用格式将我的局部变量输出给我串。但是,如果我用两个%x替换两个%p,那么我只得到数组的一部分(因为它大于一个字)并且根本不输出0x001e1b9(i的值)。 为什么这些4字节值不会从堆栈中弹出?我必须使用%p,否则它似乎只是在堆栈上跳过这些单词并弹出不同的东西。这是否与局部变量在堆栈上的对齐方式有关?

谢谢, 砖

0 个答案:

没有答案