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 ...
随机推荐
- pywin32记录备忘
项目地址:http://sourceforge.net/projects/pywin32/ 文档地址:http://docs.activestate.com/activepython/2.7/pywi ...
- VMware 增加硬盘ubuntu
http://blog.csdn.net/Timsley/article/details/50742755
- Memcached服务器UDP反射放大攻击
1.前言 2月28日,Memcache服务器被曝出存在UDP反射放大攻击漏洞.攻击者可利用这个漏洞来发起大规模的DDoS攻击,从而影响网络正常运行.漏洞的形成原因为Memcache 服务器UDP 协议 ...
- 【小程序开发】购物车加减几件demo
<!-- 主容器 --> <view class="stepper"> <!-- 减号 --> <text class="{{m ...
- js函数前加分号和感叹号的作用
js函数前加分号和感叹号是什么意思?有什么用? 一般看JQuery插件里的写法是这样的 (function($) { //... })(jQuery); 今天看到bootstrap的javascrip ...
- INSTEAD OF与AFTER触发器
INSTEAD OF 触发器 AFTER 触发器(也叫“FOR”触发器)会在触发 insert.update 或是delect 动作之后执行.例如,一个 Employees 表上的 AFTER 触发器 ...
- centos7 PDI(Kettle)安装
kettle介绍 PDI(Kettle)是一种开源的 ETL 解决方案,书中介绍了如何使用PDI来实现数据的剖析.清洗.校验.抽取.转换.加载等各类常见的ETL类工作. 除了ODS/DW类比较大型的应 ...
- GridLayout 计算器
<?xml version="1.0" encoding="utf-8"?> <GridLayout xmlns:android=" ...
- js获取光标位置并插入内容
先来几个网上找的参考资源,我爱互联网,互联网使我变得更加强大. https://blog.csdn.net/mafan121/article/details/78519348 详细篇,该作者很用心的解 ...
- lr自带网站WebTours打不开