windows下整数溢出分析
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下整数溢出分析的更多相关文章
- Windows下利用Windbg 分析dump
概述: 注册生成dump文件的函数. 当程序收到没有捕获的异常时,调用上述函数,生成dump文件. 利用Windbg结合编译程序时生成的pdb和代码来分析dump文件,定位问题. 如下代码生成dump ...
- windows下使用wineshark分析抓取本地回环包
## 摘要 由于windows系统没有提供本地回环网络的接口,用Wireshark监控网络的话看不到localhost的流量. 想要获取本地的网络数据包,可以通过一款小巧的开源软件RawCap来进行抓 ...
- 干货!分享一款windows下的磁盘分析神器。
作为开发人员的你,肯定遇到过这样的情况,120G SSD系统盘居然满载了,到底是被哪些程序占用了,包含哪些大文件,这个时候脑袋里就开始回忆了.....这对平时没有养成规范化记录安装软件好习惯的同学而言 ...
- Windows下使用doxygen阅读和分析C/C++代码
Windows下使用doxygen阅读和分析C/C++代码 转自:http://blog.sina.com.cn/s/blog_63d902570100gwk6.html 虽然使用各种IDE或者Sou ...
- CVE-2012-0774:Adobe Reader TrueType 字体整数溢出漏洞调试分析
0x01 TrueType 字体 TTF 字体是 Apple 和 Microsoft 两家公司共同推出的字体格式,现在已经广泛的运用于 Windows 操作系统,其中 PDF 文档也可以嵌入 TTF ...
- Ubuntu下缓冲器溢出攻击实验(可以看看问题分析)
缓冲器溢出攻击实验题目: 下边的代码摘自<黑客攻防技术宝典——系统实战篇(第 2 版)>2.5 节,攻击该代码,获得root 权限,实现相应的效果. strcpy(little_array ...
- BEC合约整数溢出漏洞还原与分析
一.币圈一秒,人间一年 有道是币圈一日,人间一年.这个说法又得升级了,叫币圈一秒,人间一年. 前不久,币圈又出大事啦.BEC智能合约被爆出整数溢出漏洞,导致黑客能无限印币,在一次交易中,也就那么几秒钟 ...
- CVE-2013-2551:Internet Explore VML COALineDashStyleArray 整数溢出漏洞简单调试分析
0x01 2013 Pwn2Own 黑客大赛 在 Pwn2Own 的黑客大赛上,来自法国的 VUPEN 安全团队再一次利用 0day 漏洞攻破 Windows8 环境下的 IE10 浏览器,这一次问题 ...
- QTimer源码分析(以Windows下实现为例)
QTimer源码分析(以Windows下实现为例) 分类: Qt2011-04-13 21:32 5026人阅读 评论(0) 收藏 举报 windowstimerqtoptimizationcallb ...
随机推荐
- VM虚拟机上连接usb无反映
主机的usb连接又是正常的,排除了usb3.0的接口原因后,突然想到了是不是虚拟机的什么服务没有开?进入到控制面板->管理工具->服务,找到 V开头的,发现原来确实是虚拟机有关usb的服务 ...
- 2016.6.17——Remove Duplicates from Sorted Array
Remove Duplicates from Sorted Array 本题收获: 1.“删除”数组中元素 2.数组输出 题目: Given a sorted array, remove the du ...
- git clone直接提交用户名和密码
git使用用户名密码clone的方式: git clone http://username:password@remote 例如:我的用户名是abc@qq.com,密码是abc123456,git地址 ...
- C/C++杂记:运行时类型识别(RTTI)与动态类型转换原理
运行时类型识别(RTTI)的引入有三个作用: 配合typeid操作符的实现: 实现异常处理中catch的匹配过程: 实现动态类型转换dynamic_cast. 1. typeid操作符的实现 1.1. ...
- 形参前的&&啥意思?
C++2011标准的 右值引用 语法 去搜索“c++11右值引用” 右值引用,当传入临时对象时可以避免一次拷贝. 右值引用.举个例子 C/C++ code ? 1 2 3 4 5 6 7 8 // ...
- 二、springboot配置
一.启动类 在包根目录下添加启动类,必须包含main方法,再添加Spring Boot启动方法: SpringApplication.run(SampleController.class, args) ...
- 25 The Go image/draw package go图片/描绘包:图片/描绘包的基本原理
The Go image/draw package go图片/描绘包:图片/描绘包的基本原理 29 September 2011 Introduction Package image/draw de ...
- java 内部类可以被覆盖吗
如果创建了一个内部类,然后继承其外围类并重新定义内部类时,"覆盖"内部类就好像是其外围类的一个方法,并不起作用, 这两个内部类是完全独立的两个实体,各自在自己的命名空间内 //: ...
- MySQL学习笔记:coalesce
函数:coalesce 作用:返回传入的参数中第一个非NULL的值 ); # ); # 如果传入的参数所有都是NULL,则返回NULL,比如: SELECT COALESCE(NULL, NULL, ...
- Ansible常见模块介绍
本节内容: ansible命令基础 常见模块举例 一.ansible命令基础 语法: ansible <host-pattern> [-f forks] [-m module_name] ...