精华内容
下载资源
问答
  • 越界访问

    2016-02-29 09:59:40
    在basic_string里面挂了,一般是由于内存问题 一般是由于越界访问造成的
    在basic_string里面挂了,一般是由于内存问题

    一般是由于越界访问造成的
    展开全文
  • 内存越界访问

    2019-09-06 08:45:57
    文章目录内存越界访问例子 内存越界访问例子 int *a; *a = 0x12345; //为什么是错误的? 当定义int a时,a的值是不定的,有可能指向代码段前面的区域和系统代码段(这些是属于不可读写区间)。例如当a=0x12345时,...

    内存越界访问例子


    int *a;
    *a = 0x12345; //为什么是错误的?
    

    当定义int a时,a的值是不定的,有可能指向代码段前面的区域和系统代码段(这些是属于不可读写区间)。例如当a=0x12345时,实际上是对a值所指向内容写入,这其指向的内容有可能是不可访问的,所以会出错。

    展开全文
  • 越界访问指访问了不是程序申请的内存区域,比如申请了5个字节的char数组,结果读写数据的第六个元素,或者访问了释放后的内存等等。
  • 2020年2月,我们收到了一份提交文件,详细介绍了Oracle VirtualBox中的一个漏洞,该漏洞可能导致libalias数据包别名库中的越界访问。研究人员Vishnu Dev TJ向我们报告了此问题,并在打补丁时最终将其分配编号为CVE-...

    2020年2月,我们收到了一份提交文件,详细介绍了Oracle VirtualBox中的一个漏洞,该漏洞可能导致libalias数据包别名库中的越界访问。研究人员Vishnu Dev TJ向我们报告了此问题,并在打补丁时最终将其分配编号为CVE-2020-7454。在分析提交内容时,我发现该漏洞也存在于FreeBSD中。这篇文章分析了CVE-2020-7454在VirtualBox和FreeBSD上的影响,并说明为什么维护第三方或共享代码是一项艰巨的任务。

    对于不熟悉的人,libalias是一个用于对IP数据包进行别名和去别名的库。它还用于网络地址转换(NAT)。凭借其NAT功能,可以理解为什么VirtualBox会将其用于各种功能。但是,libalias源自FreeBSD。VirtualBox维护它自己的库分支。不幸的是,此漏洞在各个版本之间都存在。它导致FreeBSD内核和用户模式下的出界(OOB)访问。该漏洞已在VirtualBox 6.1.6和FreeBSD-SA-20:12中修复。

    0x01 Oracle VirtualBox

    以下分析基于VirtualBox 6.1.4。该漏洞的根本原因在于AliasHandleUdpNbtNS()函数,该函数负责解析UDP端口137上的NetBIOS名称服务数据包。下面以简化形式显示了相关部分。

    AliasHandleUdpNbtNS(...)

    {

    /* ... snip ... */

    /* Calculate data length of UDP packet */

    uh = (struct udphdr *)ip_next(pip);

    nsh = (NbtNSHeader *)udp_next(uh);

    p = (u_char *) (nsh + 1);

    pmax = (char *)uh + ntohs(uh->uh_ulen); /* ancount) != 0) {

    p = AliasHandleResource(

    ntohs(nsh->ancount),

    (NBTNsResource *) p,

    pmax,

    &nbtarg

    );

    }

    /* ... snip ... */

    }

    AliasHandleResource(..., char *pmax, ...)

    {

    /* ... snip ... */

    switch (ntohs(q->type)) {

    case RR_TYPE_NB:

    q = (NBTNsResource *) AliasHandleResourceNB(

    q,

    pmax,

    nbtarg

    );

    break;

    /* ... snip ... */

    }

    上面的代码片段中的(1)uh_ulen是UDP头长度字段,该字段是从不受信任的guest OS发送的。可能的最大值是0xFFFF。通过使用较大的uh_ulen值,攻击者可以生成过大的pmax 值.。接下来,如果UDP数据包包含应答记录,并且其类型指定为NetBIOS General Service,则执行将到达AliasHandleResourceNB()函数

    AliasHandleResourceNB(..., char *pmax, ...)

    {

    /* ... snip ... */

    while (nb != NULL && bcount != 0) {

    if ((char *)(nb + 1) > pmax) { /* oldaddr, &nb->addr, sizeof(struct in_addr))) { /* addr = nbtarg->newaddr; /*

    }

    /* ... snip ... */

    nb = (NBTNsRNB *) ((u_char *) nb + SizeOfNsRNB);

    }

    }

    在上面的代码片段的(2)处,while循环尝试在数据包中查找旧地址,并将其替换为新地址,直到pmax。由于pmax该值较大,因此将在(3)处发生越界读取。此外,如果找到旧地址,它也可能在(4)处写OOB。

    guest OS上的攻击者可以构造无效的UDP标头长度来触发主机OS上的OOB访问。UDP端口137在VirtualBox的默认配置中处于打开状态。为了解决此漏洞,Oracle 在上面的代码片段1中添加了对(1)所示UDP标头长度的验证。

    0x02 FreeBSD 12.1

    如上所述,libalias库源自FreeBSD。在分析Oracle VirtualBox中的提交时,我发现此漏洞在ipfw用于NAT 时也会影响FreeBSD 。所述ipfw分组过滤器包含完成NAT的两种不同的方法:一个在内核空间和一个在用户空间。两种实现都使用libalias提供的相同函数。这意味着可以natd根据NAT配置在内核或用户态程序()中触发该漏洞。

    这是触发内核中的漏洞所需的FreeBSD 12.1 Release的相关配置:

    /boot/loader.conf

    alias_nbt_load="YES"

    /etc/rc.conf

    gateway_enable="YES"

    firewall_enable="YES"

    firewall_nat_enable="YES"

    firewall_nat_interface="em0"

    firewall_type="OPEN"

    OOB访问发生在中alias_nbt.ko,这是已加载的内核模块。

    如果NAT配置基于用户域,则OOB访问libalias_nbt.so将在natd进程的上下文中发生。两种情况都可以在不进行身份验证的情况下远程触发。

    在分析过程中,我发现了另一个惊喜。FreeBSD中的libalias库包含CuSeeMe协议处理中同一漏洞的另一个变体,该协议默认情况下侦听UDP端口7648。

    AliasHandleCUSeeMeIn(...)

    {

    /* ... snip ... */

    end = (char *)ud + ntohs(ud->uh_ulen); /*

    if ((char *)oc data_type) == 101)

    /* Find and change our address */

    for (i = 0; (char *)(ci + 1) <= end && i < oc->client_count; i++, ci++)

    if (ci->address == (u_int32_t) alias_addr.s_addr) { /* address = (u_int32_t) original_addr.s_addr; /*

    break;

    }

    }

    }

    但是,该漏洞在VirtualBox中不存在,这意味着FreeBSD 的补丁与VirtualBox的补丁不同。在UdpAliasIn()和UdpAliasOut()函数中都添加了一个验证,这是处理UDP数据包的适当级别。它可以有效地修补任何包含此类漏洞的协议。

    0x03 分析总结

    此研究表明,维护第三方或共享代码是一项艰巨的任务。即使对源代码进行了修补或更新,也必须对上游产品进行这些更改。甚至当你是在与第三方同步,共享代码漏洞具有双倍的影响,因为它影响其他的产品,Oracle VirtualBox在用户和安全研究人员中越来越受欢迎。

    参考及来源:https://www.zerodayinitiative.com/blog/2020/6/29/cve-2020-7454-killing-two-systems-with-one-bug-in-libalias

    展开全文
  • JavaScript数组越界访问

    2021-04-02 16:49:42
    JavaScript数组越界访问不会出错,本质来说,是因为JavaScript数组是一种特殊对象,可以将数组看成以下结构。 let arr = { 0: 't1', 1: 't2' } console.log(arr[0]); // t1 console.log(arr[2]); // ...
    1. JavaScript数组越界访问不会报错,只会返回undefined。

      let arr = ['t1', 't2'];
      console.log(arr[2]);    // undefined
      

      但这样访问会出错:

      let arr = ['t1', 't2'];
      console.log(arr[2][0]);		// 报错
      
    2. JavaScript数组越界访问不会出错,是因为JavaScript数组是一种特殊对象,可以将数组看成以下结构。

      let arr = {
          0: 't1',
          1: 't2'
      }
      console.log(arr[0]);    // t1
      console.log(arr[2]);    // undefined
      
    3. 在第二个例子中,以二维数组形式越界访问报错的原因,是因为不存在undefined[0]这种东西。

    展开全文
  • 数组的越界访问

    2020-10-11 21:22:19
    #include<stdio.h> int main() { int arr[]={1,2,3,4,5,6,7,8,9,10}; int i=0; for(i=0;...我们知道,内存中栈区...再创建了arr数组,数组越界访问是有可能访问到 i,改变了 i 的值,导致了这段程序死循环。 arr[1
  • Linux系统之越界访问

    2020-07-19 23:09:55
    Linux系统之越界访问 Linux系统采用页式存储管理机制通过页目录和页面表将每个线性地址转换为物理地址。MMU在内存映射的过程中若遇到下面几种情况会导致映射失败,使得CPU产生一次页面出错异常(Page Fault ...
  • 数组越界访问

    万次阅读 2018-05-26 22:05:22
    1、什么是数组访问越界? 我们通过数组的下标来得到数组内指定索引的元素。这称作对数组的访问。 如果一个数组定义为有n个元素,那么,对这n个元素(下标为0 到n-1的元素)的访问都合法,如果对这n个元素之外的...
  • 一....C语言允许越界访问,但a[10]存放数据未知,极可能导致结果出错。 二.越界的后果 以下程序将存放余数的数组设为a[100],确保转换后的进制数不越界; #include <stdio.h> int main() { in
  • c++关于越界访问(内存溢出)

    千次阅读 2014-11-13 09:26:42
    越界访问指访问了不是程序申请的内存区域
  • Oracle字符乱码、数据越界访问典型Bug分析前言:作为乙方,在甲方客户那里验收阶段发现两个诡异Bug。以下就问题来源、问题根因、解决方案、如何避免做详细描述。一、Bug1:Oracle读写字符乱码。1、问题来源Oracle...
  • 内存越界访问: c对于数组指针引用不进行任何边界检查,且局部变量和状态信息都存放在栈中。此两种情况结合在一起可能导致严重的程序错误,对越界的数组元素的写操作会破坏存储在栈中的状态信息。当程序使用这个被...
  • 简单说下越界访问的调试方法

    千次阅读 2016-11-06 22:15:59
    越界访问的一般提示是 “access violation reading location 0xXXXXXXXX”,翻译过来就是“内存越界访问”。 这个提示和一般提示的不同之处是,程序不会停在越界访问的错误行上, 而是会停在分配或释放内存的行上...
  • <div><p>addSize不做越界检查,可能会存在buffer空间不够的情况越界访问吧。 如果空间超过exp_, 应该做相应的处理。</p><p>该提问来源于开源项目:yedf/handy</p></div>
  • 在编写关于内存动态分配的程序时,很容易遇到越界访问的问题,如果是在visual studio环境下,一般会报 HEAP CORRUPTION DETECTED 错误。堆栈的越界访问又分为两种:堆前和堆后的越界访问。堆前的越界访问比较少见,VS...
  • 一个容易忽略的数组越界访问错误。
  • 但是简便的另一面就是风险,其中最大的两个问题就是退化(array decay)和越界访问(range errors)。本文介绍如何提前使用C++20新特性span解决数组退化和越界访问的问题。 首先看使用数组的最常见代码: int ...
  • 01前言程序崩溃有很多原因,如栈不平、内存越界等等,对于新手,特别是在多线程环境中,很多与出现程序崩溃的现象,今天,我们简单聊一聊线程中程序崩溃的一大祸根——内存越界访问(操作)。02原理分析·和你说说种田...
  • Oracle字符乱码、数据越界访问典型Bug分析前言: 作为乙方,在甲方客户那里验收阶段发现两个诡异Bug。以下就问题来源、问题根因、解决方案、如何避免做详细描述。一、Bug1:Oracle读写字符乱码。1、问题来源Oracle...
  • 在写C/C++程序时,要小心内存泄漏,内存越界访问,但最粗心的也就是这一块;在程序运行过程中,最担心的也就是突然core掉,或程序占用完内存。此时要么DBG产生的core文件,要么是查看日志再对照源代码,假如此时你的...
  • /// @brief Debug模式下的数组越界访问结果分析 /// 知识点 : 模式地址对齐的数据填充, 浮点数转内存表示, 有符号位扩展, /// 内存值的打印 #include using namespace std; /// Debug模式 int main() { float f...
  • 请检查是否存在语法错误或者数组越界访问等情况。 请问怎么解决? 搜了大量资料,有着么几个原因: 1、数组确实越界了,注意数组的索引。 2、如果递归爆栈,也会报这个错误。内存过大。本地不报错,因为我们本地...
  • C++数组越界访问测试

    2020-07-28 13:29:19
    对int nums[10]进行数组越界测试 文件test.cpp 第一次测试 #include <iostream> #include <vector> using namespace std; int main() { int nums[10] = {0,1,2,3,4,5,6,7,8,9}; cout << nums...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 4,406
精华内容 1,762
关键字:

越界访问