我想弄清楚,如果这可以在某种程度上被溢出:
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文件中读取输入?
我想弄清楚,如果这可以在某种程度上被溢出:
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文件中读取输入?
hwaddr.len
是具有一个无符号字符范围为0〜255。因此,一个攻击者可以发送你其中宣布长度255由于分组hwaddr.addr
被声明为128字节的缓冲器,攻击者可以然后提供的127个字节的有效载荷。 够了吗?
通常的x86调用约定推回邮地址,推参数,然后纵身跳下,此时被叫方将分配在声明的顺序每个变量。 因此,从开始计数hwaddr
, hwaddr.len
将堆栈指针超过128个字节, packet
将高于129个字节,和返回地址将是129 + sizeof(char *)
其为至多137个字节,即使在64位系统。 所以,是的,攻击者可以覆盖你的返回地址,另外提供118个字节的shell代码。
编辑我只是想通了OP的混乱。 当你编码长度为unsigned char
,这并不意味着你使用ASCII来表示长度。 也就是说,你不读这种字节,调用atoi()
就可以了,并得到从0到9。你只需要使用八位像一个非常窄的单位数int
类型,其中每一位代表一个二进制数字。
是的,它可以溢出; 如果在数据包偏移量为4的值大于128,你会溢出addr
在字段hwaddr
。
是。
例如,如果该行开始与"nnnn\xff"
这将破坏堆栈。
绝对。 你从来没有检查输入缓冲区足够大。
即跳出我的主要事情是这样的:
#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(...);
}
让我们来看看......你把一个包作为一个字符数组,其中在第四个字符是大小的数据包。 字符是8位,所以作为一个无符号标记是覆盖值0-255时。 您的缓冲区长度设置为128。这会溢出,你需要做一些对_length检查。