以下代码显示分段错误
问题描述:
为什么下面的代码显示分段错误?以下代码显示分段错误
int CreateRawSocket(int protocol_to_sniff)
{
int rawsock;
if((rawsock = socket(PF_PACKET, SOCK_RAW, htons(protocol_to_sniff)))== -1)
{
perror("Error creating raw socket: ");
exit(-1);
}
return rawsock;
}
int BindRawSocketToInterface(char *device, int rawsock, int protocol)
{
struct sockaddr_ll sll;
struct ifreq ifr;
bzero(&sll, sizeof(sll));
bzero(&ifr,sizeof(ifr));
/* First Get the Interface Index */
char *t=(char*)ifr.ifr_name;
strncpy(t, device, 1024);
if((ioctl(rawsock, SIOCGIFINDEX, &ifr)) == -1)
{
printf("Error getting Interface index !\n");
exit(-1);
}
/* Bind our raw socket to this interface */
sll.sll_family = AF_PACKET;
sll.sll_ifindex = ifr.ifr_ifindex;
sll.sll_protocol = htons(protocol);
if((bind(rawsock, (struct sockaddr *)&sll, sizeof(sll)))== -1)
{
perror("Error binding raw socket to interface\n");
exit(-1);
}
return 1;
}
void PrintPacketInHex(unsigned char *packet, int len)
{
unsigned char *p = packet;
printf("\n\n---------Packet---Starts----\n\n");
while(len--)
{
printf("%.2x ", *p);
p++;
}
printf("\n\n--------Packet---Ends-----\n\n");
}
main(int argc, char **argv)
{
int raw;
unsigned char packet_buffer[2048];
int len;
int packets_to_sniff;
struct sockaddr_ll packet_info;
int packet_info_size = sizeof(packet_info);
/* create the raw socket */
raw = CreateRawSocket(ETH_P_IP);
/* Bind socket to interface */
BindRawSocketToInterface(argv[1], raw, ETH_P_IP);
/* Get number of packets to sniff from user */
packets_to_sniff = atoi(argv[2]);
/* Start Sniffing and print Hex of every packet */
while(packets_to_sniff--)
{
if((len = recvfrom(raw, packet_buffer, 2048, 0, (struct sockaddr*)&packet_info, &packet_info_size)) == -1)
{
perror("Recv from returned -1: ");
exit(-1);
}
else
{
/* Packet has been received successfully !! */
PrintPacketInHex(packet_buffer, len);
}
}
return 0;
}
答
崩溃是由这条线在你的日常BindRawSocketToInterface造成的:
strncpy(t, device, 1024);
在这里,你问过strncpy
写1024个字节到char *t
。 请注意,strncpy
用指定数量的空字节填充目标字符串,请参阅man strncpy)。
但是t
指向一个不够大的数组,即ifr.ifr_name[IFNAMSIZ]
。在我的linux系统上,IFNAMSIZ
只有16个。所以strncpy
溢出并且会造成内存不应该被触及。
改变strncpy
参数如下修复崩溃匹配数组的正确尺寸:
strncpy(t, device, IFNAMSIZ);
答
当您没有提供足够的命令行参数,因为您没有检查argc,所以存在内存违规。
它在哪里崩溃?它在什么地址崩溃?什么是缓冲区的大小? – Patrick 2010-11-11 13:52:53
我甚至拒绝看这个。做一些调试并缩小范围。你显然对编程并不陌生,或者你不会编写这种复杂的程序。一旦你缩小到特定的模块和线路崩溃,发回。 – 2010-11-11 13:53:29
唉,我的眼睛。太多的空白! – 2010-11-11 13:55:44