0x00前言

整数溢出就是往存储整数的内存单位存放的数据大于该内存单位所能存储的最大值,整数溢出有时候间接导致缓冲区溢出。如JPEG溢出漏洞(MS04-028)。

0x01整数溢出分类

整数溢出可以分为无符号整数的下溢和上溢,有符号数的问题。

 

0x02无符号数的下溢和上溢

无符号数的下溢是由于无符号数不能识别负数导致的,看一个例子:

#include<stdio.h>
#include<windows.h>
unsigned char shellcode[] ="\x41\x41\x41\x41\x42\x42\x42\x42\x43\x43\x43\x43\x0f\x10\x02\x50\x90\x90\x90\x90";
int main(int argc,char **argv)
{
unsigned int i;
char str[8]="1234567";
LoadLibrary("c:\\netfairy.dll");
scanf("%d",&i);
if(i>7)
{ MessageBox(NULL,"输入太大","ERROR",NULL);
return false;
}
else
{
for(unsigned int j=0;j<=i-1;j++)
{
str[j]=shellcode[j];
if(j>=64)
break;
}
printf("%s\n",str);
} getchar();
return true;
}

在上面的代码中,假设shellcode是我们可以控制的。本意是想把shellcode的前n个字节复制到str中,n在if(i>7)做了检查,所以最大复制7个字节,我们看n不大于7的时候

n不大于7的时候输出正常,但是i是一个无符号数,如果我们输入0的话,可以绕过if(i>7)的检查进入for循环,j也是一个无符号数,j<i-1,如果i=0,那么i-1就是-1,由于无符号数不能识别负数,所以i-1转为正的0xffffffff。那么就会复制超长的数据到str,导致覆盖返回地址,而shellcode假如我们可以控制的话,这就是一个由于无符号整数下溢造成的漏洞。验证如图:

无符号整数的上溢也差不多,稍微修改上面的代码如下:

//在32位的编译器上,unsigned int最大值:4294967295==0xffffffff
#include<stdio.h>
#include<windows.h>
unsigned char shellcode[] ="\x41\x41\x41\x41\x42\x42\x42\x42\x43\x43\x43\x43\x0f\x10\x02\x50\x90\x90\x90\x90";
int main(int argc,char **argv)
{
unsigned int i;
char str[8]="1234567";
LoadLibrary("c:\\netfairy.dll");
scanf("%d",&i);
if(i>7)
{ MessageBox(NULL,"输入太大","ERROR",NULL);
return false;
}
else
{
printf("%d\n",i);
MessageBox(NULL,"输入正确","Congratulations",NULL);
} getchar();
return true;
}

程序初起来没有问题,如果输入大于7,就提示错误。然而,我们知道无符号整数最大容纳的值为0xffffffff,也就是十进制4294967295。假如在上面我们输入4294967296会怎么样呢?我们可以看一下:

哇,竟然绕过了检查。原因在于4294967296=0xffffffff+1=0。这就是无符号整数的上溢问题,在某些情况下也能产生漏洞。

0x03有符号整数的问题

有符号数见得比较多的问题就是有符号数被当成无符号数使用,比如下面的这个例子:

//在32位的编译器上,unsigned int最大值:4294967295==0xffffffff. int 最大值2147483647。也就是0x7fffffff
#include<stdio.h>
#include<windows.h>
unsigned char shellcode[] ="AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA";
int main(int argc,char **argv)
{
int len;
char str[256];
scanf("%d",&len);
if(len>=256) //这是个有符号数,如果太大,就被看成是负数,能绕过这里的检查
{
MessageBox(NULL,"输入有误","ERROR",NULL);
return false;
}
printf("%d",len);
memcpy(str,shellcode,len); //memcpy把len看成是无符号数使用,会溢出str getchar();
return true;
}

本来是想把不大于255个字符由shellcode复制到str,在if(len>=256)做了检查,但是,int 是有符号数,正数的范围最大值是2147483647。也就是0x7fffffff。如果再加1,它就会转为0x80000000,十进制是-2147483648,就可以绕过if(len>=256)检查,因为负数肯定比256小。然后memcpy(str,shellcode,len);把len看成无符号数使用,就是2147483648,复制这个多字符,缓冲区肯定溢出啦。

0x04小结

大家平时普遍重视堆栈溢出,其实整数溢出也比较常见,虽然大多时候整数溢出不能利用。尤其在Fuzzing技术中,更多的是挖掘到整数溢出问题。典型的暴力修改为0xffff,这是一个临界值。

windows下整数溢出分析的更多相关文章

  1. Windows下利用Windbg 分析dump

    概述: 注册生成dump文件的函数. 当程序收到没有捕获的异常时,调用上述函数,生成dump文件. 利用Windbg结合编译程序时生成的pdb和代码来分析dump文件,定位问题. 如下代码生成dump ...

  2. windows下使用wineshark分析抓取本地回环包

    ## 摘要 由于windows系统没有提供本地回环网络的接口,用Wireshark监控网络的话看不到localhost的流量. 想要获取本地的网络数据包,可以通过一款小巧的开源软件RawCap来进行抓 ...

  3. 干货!分享一款windows下的磁盘分析神器。

    作为开发人员的你,肯定遇到过这样的情况,120G SSD系统盘居然满载了,到底是被哪些程序占用了,包含哪些大文件,这个时候脑袋里就开始回忆了.....这对平时没有养成规范化记录安装软件好习惯的同学而言 ...

  4. Windows下使用doxygen阅读和分析C/C++代码

    Windows下使用doxygen阅读和分析C/C++代码 转自:http://blog.sina.com.cn/s/blog_63d902570100gwk6.html 虽然使用各种IDE或者Sou ...

  5. CVE-2012-0774:Adobe Reader TrueType 字体整数溢出漏洞调试分析

    0x01 TrueType 字体 TTF 字体是 Apple 和 Microsoft 两家公司共同推出的字体格式,现在已经广泛的运用于 Windows 操作系统,其中 PDF 文档也可以嵌入 TTF ...

  6. Ubuntu下缓冲器溢出攻击实验(可以看看问题分析)

    缓冲器溢出攻击实验题目: 下边的代码摘自<黑客攻防技术宝典——系统实战篇(第 2 版)>2.5 节,攻击该代码,获得root 权限,实现相应的效果. strcpy(little_array ...

  7. BEC合约整数溢出漏洞还原与分析

    一.币圈一秒,人间一年 有道是币圈一日,人间一年.这个说法又得升级了,叫币圈一秒,人间一年. 前不久,币圈又出大事啦.BEC智能合约被爆出整数溢出漏洞,导致黑客能无限印币,在一次交易中,也就那么几秒钟 ...

  8. CVE-2013-2551:Internet Explore VML COALineDashStyleArray 整数溢出漏洞简单调试分析

    0x01 2013 Pwn2Own 黑客大赛 在 Pwn2Own 的黑客大赛上,来自法国的 VUPEN 安全团队再一次利用 0day 漏洞攻破 Windows8 环境下的 IE10 浏览器,这一次问题 ...

  9. QTimer源码分析(以Windows下实现为例)

    QTimer源码分析(以Windows下实现为例) 分类: Qt2011-04-13 21:32 5026人阅读 评论(0) 收藏 举报 windowstimerqtoptimizationcallb ...

随机推荐

  1. Java并发编程(2) AbstractQueuedSynchronizer的设计与实现

    一 前言 上一篇分析AQS的内部结构,其中有介绍AQS是什么,以及它的内部结构的组成,那么今天就来分析下前面说的内部结构在AQS中的具体作用(主要在具体实现中体现). 二 AQS的接口和简单示例 上篇 ...

  2. ==和equals区别

    java中的数据类型,可分为两类:  1.基本数据类型,也称原始数据类型.byte,short,char,int,long,float,double,boolean    他们之间的比较,应用双等号( ...

  3. plsql链接数据库配置

    一. 目录结构 D:\install\PLSQL        |-- instantclient_11_2            |-- tnsnames.ora        |-- PLSQL ...

  4. 存储过程简单Demo

    --创建存储过程 delimiter // create procedure p1() begin end // --调用存储过程 call p1(); --删除存储过程 drop procedure ...

  5. imperva 网管替换

    事情是这样的 某某银行的imperva DAM审计设备出现蜂鸣的响声.经检查电源没有问题,怀疑是硬盘坏了 . 然后我就去底层查看 运行命令 :impctl platform storage raid ...

  6. mvc4 @foreach 如何写@if 判断

    不知道你想写在里面还是外面,我里外都写上,你可以参考下:@if(Model!=null){ foreach(var item in Model) { if(item.Name=="李四&qu ...

  7. 2017北京网络赛 Bounce GCD加找规律

    题目链接:http://hihocoder.com/problemset/problem/1584 题意:就是求一个小球从矩阵的左上角,跑到矩形的右下角不能重复经过的格子,小球碰到墙壁就反射. 解法: ...

  8. Python-Web框架的本质

    Web框架的本质 我们可以这样理解:所有的Web应用本质上就是一个socket服务端,而用户的浏览器就是一个socket客户端. 这样我们就可以自己实现Web框架了. Python中使用socket和 ...

  9. 打开mvc项目无法运行,报"Unable to launch the IIS Express Web server"

    今天遇到一个问题,打开asp.net mvc 项目,右击浏览器运行,无法运行... 提示下面错误, 解决方案: 删除项目文件夹下的 .vs 文件夹,然后重新打开项目运行即可 参考:http://www ...

  10. 洛谷P3396哈希冲突

    传送门啦 非常神奇的分块大法. 这个题一看数据范围,觉得不小,但是如果我们以 $ \sqrt(x) $ 为界限,数据范围就降到了 $ x < 400 $ 我们设数组 $ f[i][j] $ 表示 ...