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. Redis—数据结构之list

    Redis的列表对象底层所使用的数据结构其中之一就是list. list Redis的list是一个双端链表,其由3部分构成:链表节点.链表迭代器.链表.这一设计思想和STL的list是一样的,STL ...

  2. spark和hadoop比较

    来源知乎 计算模型:hadoop-MapReduce,Spark-DAG(有向无环图)评注:经常有人说Spark就是内存版的MapReduce,实际上不是的.Spark使用的DAG计算模型可以有效的减 ...

  3. 你真的了解js伪数组吗?深入js伪数组

    关于js伪数组 具有length属性: 按索引方式存储数据: 不具有数组的push().pop()等方法: 你可能知道怎么把伪数组转换为数组,但是你知道这里边的原理吗? 假如页面有一组li元素 < ...

  4. java基础59 JavaScript运算符与控制流程语句(网页知识)

    1.JavaScript运算符 1.1.加减乘除法 加法:+(加法,连接符,正数)          true是1,false是0    减法:-    乘法:*    除法:/ 1.2.比较运算符 ...

  5. python_selenium自动化测试框架

    设计思路 本文整理归纳以往的工作中用到的东西,现汇总成基础测试框架提供分享. 框架采用python3 + selenium3 + PO + yaml + ddt + unittest等技术编写成基础测 ...

  6. TStringList 与 泛型字典TDictionary 的 哈希功能效率PK

    结论: 做HashMap 映射 功能的时候 ,字典TDictionary 功能更强大,且效率更高,比如不仅仅可以存String,还可以存结构和类. TDictionary类是一个name,value容 ...

  7. Elasticsearch doc_value认识

    一.doc_value是什么 绝大多数的fields在默认情况下是indexed,因此字段数据是可被搜索的.倒排索引中按照一定顺序存放着terms供搜索,当命中搜索时,返回包含term的documen ...

  8. 解决insert语句插入时,需要写列值的问题

    今天发现解决这个问题其实很简单,闲话不多谈,我直接附上语句 ) select @s = isnull(@s+',', '') + [name] from syscolumns where id = o ...

  9. python 删除前3天的文件

    一.需求分析 1. 删除前3天的文件 2.如果目录为空,也一并删除掉 如果使用shell脚本,一条命令就搞定了.干啥还要用python? 1. 因为需要记录一些日志,使用shell不好实现 2. 作为 ...

  10. WDK10+VS2015 驱动环境搭建

    其实做驱动或者说底层安全的最大问题就是没有合适的资料去参考,网上很难找到想要的信息.比如搭建驱动环境我以前一直用的都是WDK7.1基于控制台去编译的,之前尝试过搭建WDK10+VS2015的组合环境, ...