0x0000 名词解释
漏洞利用(exploit) 恶意代码(shellcode)
0x0001 初级栈溢出
代码:
#include <stdio.h>
#define PASSWORD "1234567"
int verify_password (char *password)
{
int authenticated;
char buffer[8]; // add local buff to be overflowed
authenticated=strcmp(password,PASSWORD);
strcpy(buffer,password); //over flowed here!
return authenticated;
}
main()
{
int valid_flag=0;
char password[1024];
while(1)
{
printf("please input password: ");
scanf("%s",password);
valid_flag = verify_password(password);
if(valid_flag)
{
printf("incorrect password!\n\n");
}
else
{
printf("Congratulation! You have passed the verification!\n");
break;
}
}
}
代码分析:定义PASSWORD = 1234567与输入的password比较,一样返回0 ,否则1或-1,把password给buffer,主函数if(flag)为0则假,不执行,
溢出原因分析:没考虑buffer的容纳长度,如果输入大于8个长度,则超出buffer申请的内存长度,造成溢出。
详解:当函数verify_password被调用时,会分配一段连续内存空间变量与紧紧相邻
用户输入拷贝进buffer,当超过8个,就会溢出到紧邻的authenticated,破坏他的值,内存中的数据按照4字节(DWORD)逆序存储,所以authenticated为1时,内存中存的是0x01000000,而代码中
If(0)则为假,所以当你错误密码进入时,改变值后,程序就会出错。