![](https://img-blog.csdnimg.cn/c028a1af1bfc415eaee159c99ea7fbf1.png)
1.Buffer[]中存储输入的变量(密码值);
2.authenticated中存储strcmp()返回值,相等返回0,大于返回1(0x00000001),小于返回-1(oxFFFFFFFF)
数值0x00000001在内存中的存储为01 00 00 00
实验记录:
在strcmp函数结束后查看函数verify_password的栈帧情况:
1.输入1234567
函数verify_password的栈帧:
(字符q的ASCII码为0x71)
0019FAD0:strcmp()返回值;
0019FAD4:上一个栈帧EBP;
0019FAD8:函数verify_password返回地址;
此时authenticated值为0.
2.输入qqqqqqq>1234567
栈帧:
3.输入qqqqqqqq(8个q)
此时阶段符NULL溢出,覆盖authenticated值。
整体情况:
#include <stdio.h>
#include<string.h>
#define PASSWORD "1234567";
int verify(char *password)
{
int authenticated; //注意authenticated,buffer[]声明位置
char buffer[8];
authrnticated = strcmp(password, "1234567");
strcpy(buffer, password);//创造栈溢出的条件
return authenticated;
}
int main()
{
int valid_flag = 0;
char password[1024];
while (1)
{
printf("please input password: ");
scanf("%s", password,10);
valid_flag = verify(password);
if (valid_flag)
{
printf("incorrect!");
}
else
{
printf("congratultions!");
}
}
}