-
-
[旧帖] [求助]求验证函数调用时的栈内结构 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? 谢谢!
{
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期)
赞赏
他的文章
- [求助]求验证函数调用时的栈内结构 1051
- [求助]下列代码中存在什么安全隐患 1439
- [求助]调试时出现Cannot find or open the PDB file 1238
- [求助]利用IDA找到某一个函数 1464
- [求助]IDA pro反汇编金山WPS 1921
看原图
赞赏
雪币:
留言: