首页
社区
课程
招聘
[翻译]Linux (x86) Exploit 开发系列教程之二(整数溢出)
发表于: 2017-4-5 20:35 9915

[翻译]Linux (x86) Exploit 开发系列教程之二(整数溢出)

2017-4-5 20:35
9915

整数溢出

虚拟机安装:Ubuntu 12.04(x86)

什么是整数溢出?

存储大于最大支持值的值称为整数溢出。整数溢出本身不会导致任意代码执行,但整数溢出可能会导致堆栈溢出或堆溢出,这可能导致任意代码执行。在这篇文章中,我将仅谈论整数溢出导致堆栈溢出,整数溢出导致堆溢出将在后面的单独的帖子中讨论。


数据类型大小及范围:


当我们试图存储一个大于最大支持值的值时,我们的值会被包装 。例如,当我们尝试将2147483648存储到带符号的int数据类型时,它将被包装并存储为-21471483648。这被称为整数溢出,这种溢出可能导致任意代码执行


整数下溢


类似地,存储小于最小支持值的值称为整数下溢。例如,当我们尝试将-2147483649存储到带符号的int数据类型时,它将被包装并存储为21471483647.这称为整数下溢。在这里我只会谈论整数溢出,但是这个过程对于下溢也是一样的!

漏洞代码:


编译命令


上述漏洞代码的[1]行显示了一个整数溢出错误。strlen()的返回类型是size_t(unsigned int),它存储在unsigned char数据类型中。因此,任何大于unsigned char的最大支持值的值都会导致整数溢出。因此当密码长度为261时,261将被包裹并存储为“passwd_len”变量中的5!由于这个整数溢出,可以绕过行[2]执行的边界检查,从而导致基于堆栈的缓冲区溢出!而且在这篇文章中看到,基于堆栈的缓冲区溢出导致任意的代码执行。

在研究漏洞代码之前,为了更好的理解,我们可以反汇编并绘制出漏洞代码的堆栈布局!

反汇编:


堆栈布局:

由于我们已经知道长度为261的密码,所以绕过边界检查,并允许我们覆盖堆栈中的返回地址。让我们通过发送一系列的A来测试它。


[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!

收藏
免费 2
支持
分享
最新回复 (14)
雪    币: 341
活跃值: (143)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
2
太厉害了
2017-4-6 11:05
0
雪    币: 1746
活跃值: (227)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
3
地狱怪客 太厉害了
你这让我这菜鸟很慌张啊
2017-4-6 14:56
0
雪    币: 704
活跃值: (228)
能力值: ( LV12,RANK:230 )
在线值:
发帖
回帖
粉丝
4

那个图没问题,是你的梯子挂了。

2017-5-3 10:30
0
雪    币: 268
活跃值: (3238)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
5
r  sploitfun  `python  -c  'print  "A"*261'`    这句话的sploitfun  是啥意思
2017-5-25 11:41
0
雪    币: 268
活跃值: (3238)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
6
知道是啥了@@
2017-5-25 11:59
0
雪    币: 268
活跃值: (3238)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
7
261将被包裹并存储为“passwd_len”变量中的5!    楼主能解析下这是啥意思么。为什么就越位了呢
2017-5-25 18:02
0
雪    币: 1746
活跃值: (227)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
8
gtict 261将被包裹并存储为“passwd_len”变量中的5! 楼主能解析下这是啥意思么。为什么就越位了呢
unsigned  char  范围0~255,261超过255,就是5了,建议搜索下整数溢出相关知识,
2017-5-25 21:18
0
雪    币: 268
活跃值: (3238)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
9
hackyzh unsigned char 范围0~255,261超过255,就是5了,建议搜索下整数溢出相关知识,
知道了,,是我理解错误,261对应100000101二进制,取右边八位,填充是左边,我理解是上溢。反向搞反了
2017-5-26 16:30
0
雪    币: 1
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
10
??攻击代码里那个ret_addr是怎么计算出来的
2018-5-27 20:10
0
雪    币: 3
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
11
lllion ??攻击代码里那个ret_addr是怎么计算出来的
ret_addr可以用gdb断点调试找出passwd_buf[0]的地址,ret_addr=&passwd_buf[0]+0x18+4+100.亲测可以
2018-6-10 21:03
0
雪    币: 3170
活跃值: (129)
能力值: ( LV3,RANK:30 )
在线值:
发帖
回帖
粉丝
12
楼主,你画的那个图片,passwd_buf[8-11],应该是[8-10]才对吧
最后于 2018-8-7 18:54 被我是一条咸鱼编辑 ,原因:
2018-8-7 18:53
0
雪    币: 1849
活跃值: (57)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
13
学习了
2018-11-1 14:17
0
雪    币: 3352
活跃值: (10987)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
14
gtict r sploitfun `python -c 'print "A"*261'` 这句话的sploitfun 是啥意思
是指用sploitfun的用户身份执行吗?
2019-2-22 10:43
0
雪    币: 3352
活跃值: (10987)
能力值: ( LV9,RANK:240 )
在线值:
发帖
回帖
粉丝
15
xinpoo 是指用sploitfun的用户身份执行吗?
argv[1]
2019-2-22 10:52
0
游客
登录 | 注册 方可回帖
返回
//