PWN溢出——整数溢出漏洞分析
程序员文章站
2024-01-20 09:05:34
...
漏洞原理
漏洞其实就是利用了本机宽度,我的环境是32位的XP,
因此它就有自己的最大宽度,当存储的值超过了本机宽度,就产生了整数溢出。
测试代码
#include <stdio.h> //头文件
int main() //程序入口
{
FILE*fp; //定义文件流指针
char FileStr[20] = {0}; //定义一个数组
int integer = 0x10; //定义一个变量integer
int multi = 0; //定义一个变量multi用来存值
printf("Welcome!\n"); //输出字符串
printf("Please input an integer to get through:");
scanf("%d",&multi); //获取输入的字符串转化为整型并赋值给multi
integer = integer * multi; //将integer的值与multi的值相乘
if((multi != 0)&&(integer == 0)) //判断multi的值与integer的值是否符合条件
{
printf("You've got the flag:\n"); //符合输出字符串
if(fp = fopen("flag.txt","r")) //判断当前文件夹是否存在flag.txt文件并读取
{
fgets(FileStr,48,fp); //读取文件内容输出到控制台
printf("%s\n",FileStr);
fclose(fp);
}
else //若不符合输出字符串
{
printf("File error!\n");
}
}
else //若不符合输出字符串
{
printf("Good Bye!\n");
}
return 0; //程序结束
}
这里变量integer = 0x10,那么我们使multi = 0x10000000,则0x10 * 0x10000000=0x100000000,但是int类型的integer是4字节,这里超出了它的最大宽度,所以程序发生了溢出,integer清零,成功符合条件输出文件夹内的flag.txt文件内容。
0x10000000转为十进制为268435456,我们看一下运行结果: