memcpy的溢出边界漏洞? (粉碎堆栈)(memcpy overflow boundary e

2019-10-29 23:25发布

我想弄清楚,如果这可以在某种程度上被溢出:

void print_address(char *p)
{
  arp_ hw;
  int i;

  hw.length = (size) *(p + _OFFSET1); //189 + 4 = 193
  memcpy(hw.addr, packet + _OFFSET2, hw.length);


  return;
}

其中包是从.txt文件中读取输入?

Answer 1:

hwaddr.len是具有一个无符号字符范围为0〜255。因此,一个攻击者可以发送你其中宣布长度255由于分组hwaddr.addr被声明为128字节的缓冲器,攻击者可以然后提供的127个字节的有效载荷。 够了吗?

通常的x86调用约定推回邮地址,推参数,然后纵身跳下,此时被叫方将分配在声明的顺序每个变量。 因此,从开始计数hwaddrhwaddr.len将堆栈指针超过128个字节, packet将高于129个字节,和返回地址将是129 + sizeof(char *)其为至多137个字节,即使在64位系统。 所以,是的,攻击者可以覆盖你的返回地址,另外提供118个字节的shell代码。

编辑我只是想通了OP的混乱。 当你编码长度为unsigned char ,这并不意味着你使用ASCII来表示长度。 也就是说,你不读这种字节,调用atoi()就可以了,并得到从0到9。你只需要使用八位像一个非常窄的单位数int类型,其中每一位代表一个二进制数字。



Answer 2:

是的,它可以溢出; 如果在数据包偏移量为4的值大于128,你会溢出addr在字段hwaddr



Answer 3:

是。

例如,如果该行开始与"nnnn\xff"这将破坏堆栈。



Answer 4:

绝对。 你从来没有检查输入缓冲区足够大。



Answer 5:

即跳出我的主要事情是这样的:

#define _LENGTH 128
...
typedef struct{
    char addr[_LENGTH];
...

再后来:

hwaddr.len = (shsize_t) *(packet + _OFFSET1); //189 + 4 = 193
memcpy(hwaddr.addr, packet + _OFFSET2, hwaddr.len);

这似乎是危险的。 你只分配用于地址128个字节并没有检查以验证的信息的长度被复制在是<= _length。

您可能需要动态地分配这个,当你知道未来的(如果可能)数据的长度或检查,以确保您不会复制额外的数据到地址字符数组:

if (hwaddr.len <= _LENGTH) {
    memcpy(...);
}


Answer 6:

让我们来看看......你把一个包作为一个字符数组,其中在第四个字符是大小的数据包。 字符是8位,所以作为一个无符号标记是覆盖值0-255时。 您的缓冲区长度设置为128。这会溢出,你需要做一些对_length检查。



文章来源: memcpy overflow boundary exploit? (smashing the stack)
标签: c stack overflow