首页
社区
课程
招聘
[旧帖] [求助]求验证函数调用时的栈内结构 0.00雪花
发表于: 2012-12-9 22:05 1050

[旧帖] [求助]求验证函数调用时的栈内结构 0.00雪花

2012-12-9 22:05
1050
int main(void)
{
int i=1,j=2,k=3;
char buf[]="test";
printf("%s %d %d %x\n",buf,i,j);  //最后故意少写了一个参数
return 0;
}
由于printf函数中没有与%x控制字符相对应的变量,本人通过编程测试,发现不同的编译器会有不同的结果。所以本人想知道输出的最后一个十六进制串代表的什么。
所以这个就需要知道栈中存储的内容以及其次序。

我看到一个分析是这样说的

i)  调用main()函数之前首先把返回地址压栈;
ii) 然后压入的是EBP,并把ESP拷贝到EBP;
iii)把ESP减去一定的数量,也就是把堆栈扩大,给变量i,j,k,buf留出空间;
iv) 开始调用printf(),把printf()的4个参数j,i,buf和格式串"%s %d %d %x\n"依次压入堆栈;
v)  压入printf()的返回地址;
vi) 压入此时的EBP;
vii)开始执行printf()。

    这时候的堆栈看起来应该是这个样子的:

   栈顶                                                                栈底
  --------------------------------------------------------------------------
  | EBP | EIP | 格式串| buf地址| i | j |buf内容| \0 | k | j | i | EBP | EIP|
  --------------------------------------------------------------------------

printf()首先找到第一个参数格式串"%s %d %d %x\n",然后就开始按照对应关系依次打印前面堆栈中内容,%s对应buf地址,也就打印出了buf[]的内容,第一个%d对应i,第二个%d对应j,%x本来是应该对应k的,可是由于我们提供给printf()的参数中没有k,而j前面正好是buf内容,所以就把buf的内容作为16进制数输出了,也就是我们看到的74736574。可以预测,如果提供给printf()的格式串中再多几个%x的话,printf()还会继续打印前面堆栈里的"\0"(buf的结束符),k,j,i,EBP,EIP等内容。
所以输出结果为test 1 2  74736574

请教一下各位,这种分析正确吗?怎么我测试的结果中输出的最后一个十六进制串都不是74736574?   谢谢!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回
//