漏洞原理
漏洞其實就是利用了本機寬度,我的環境是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,我們看一下運行結果: