-
-
[翻译]Linux (x86) Exploit 开发系列教程之二(整数溢出)
-
发表于:
2017-4-5 20:35
9915
-
[翻译]Linux (x86) Exploit 开发系列教程之二(整数溢出)
整数溢出
虚拟机安装: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来测试它。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!