当前位置: 首页 > Linux

整数溢出

时间:2023-04-06 21:49:28 Linux

什么是整数溢出?由于整数在内存中存储的是固定长度的空间,所以它能存储的最大值和最小值是固定的。如果我们试图存储一个大于这个最大值固定的数,就会导致整数溢出的危险。如果使用整数来计算一些敏感值,例如缓冲区大小或数字索引,则会造成潜在的危险。通常,整数溢出不会覆盖额外的内存,也不会直接导致任意代码执行,但它会导致堆栈和堆溢出,这两者都可能导致任意代码执行。由于整数溢出的发生,很难立即被检测到,也很难用有效的方法判断是否发生或可能发生整数溢出。整数溢出整数的异常主要有以下三种:溢出只有有符号数才会溢出。有符号数的最高位表示符号。将两个正数或负数相加时,可能会改变符号位的值并产生溢出。溢出标志OF可以检测有符号数的溢出,并环绕无符号数0-1。它将成为最大的。比如一个1字节的无符号数会变成255,255+1会变成最小数0。出现高阶截断常见问题整数转换回绕和溢出截断整数转换--newbugku整数溢出问题f4n_pwnmainfunctionint__cdeclmain(intargc,constchar**argv,constchar**envp){v4;//[esp+Ch][ebp-1Ch]unsignedintbuf;//[esp+10h][ebp-18h]intv6;//[esp+14h][ebp-14h]intfd;//[esp+18h][ebp-10h]inti;//[esp+1Ch][ebp-Ch]setvbuf(stdout,0,2,0);puts("######欢迎来到ctf游戏######\n输入你的名字长度:");读名();puts("让我们开始猜数字游戏");fd=open("/dev/urandom",0);if(fd<0||read(fd,&buf,4u)<0){puts("错误");退出(0);}关闭(fd);srand(缓冲器);for(i=0;i<=9;++i){v6=rand()%9+3;printf("第%d轮,请猜数字:\n",i);fflush(标准输出);fflush(标准输入);__isoc99_scanf("%d",&v4);if(v4!=v6){printf("你失败了");退出(0);}}printf("你很棒!这是你的旗帜");获取标志();return0;}猜随机数得到flag,hhh漏洞函数read_name()intread_name(){chars[80];//[esp+8h][ebp-60h]unsignedintv2;//[esp+58h][ebp-10h]unsignedinti;//[esp+5Ch][ebp-Ch]memset(s,0,0x50u);__isoc99_scanf("%ld",&v2);if((signedint)v2>48){puts("太长了!!!你是黑客!!!");退出(0);}puts("请告诉我你的名字:");fflush(标准输出);fflush(标准输入);for(i=0;i