简体   繁体   English

GCC不会编译程序

[英]GCC won't compile program

Alright, so I'm going crazy over this one. 好吧,所以我为此而疯狂。 I'm currently trying to go through Hacking: Art of Exploitation and I'm on the part about socket programming. 我目前正在尝试“黑客:剥削的艺术”,并且我从事套接字编程方面的工作。 So here is the code and the compiler output below it. 因此,这是代码及其下面的编译器输出。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include "hacking.h"

#define PORT 7890   // the port users will be connecting to

int main(void) {
    int sockfd, new_sockfd;  // listen on sock_fd, new connection on new_fd
    struct sockaddr_in host_addr, client_addr;  // my address information
    socklen_t sin_size;
    int recv_length=1, yes=1;
    char buffer[1024];

    if ((sockfd = socket(PF_INET, SOCK_STREAM, 0)) == -1)
        fatal("in socket");

    if (setsockopt(sockfd, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int)) == -1)
        fatal("setting socket option SO_REUSEADDR");

    host_addr.sin_family = AF_INET;      // host byte order
    host_addr.sin_port = htons(PORT);    // short, network byte order
    host_addr.sin_addr.s_addr = INADDR_ANY; // automatically fill with my IP
    memset(&(host_addr.sin_zero), '\0', 8); // zero the rest of the struct

    if (bind(sockfd, (struct sockaddr *)&host_addr, sizeof(struct sockaddr)) == -1)
        fatal("binding to socket");

    if (listen(sockfd, 5) == -1)
        fatal("listening on socket");

    while(1) {    // Accept loop
        sin_size = sizeof(struct sockaddr_in);
        new_sockfd = accept(sockfd, (struct sockaddr *)&client_addr, &sin_size);
        if(new_sockfd == -1)
            fatal("accepting connection");
        printf("server: got connection from %s port %d\n",inet_ntoa(client_addr.sin_addr), ntohs(client_addr.sin_port));
        send(new_sockfd, "Hello World!\n", 13, 0);
        recv_length = recv(new_sockfd, &buffer, 1024, 0);
        while(recv_length > 0) {
            printf("RECV: %d bytes\n", recv_length);
            dump(buffer, recv_length);
            recv_length = recv(new_sockfd, &buffer, 1024, 0);
        }
        close(new_sockfd);
    }
    return 0;
}

Compiler output: 编译器输出:

root@root-laptop:~ $ gcc simple_server.c
In file included from /usr/include/sys/socket.h:35,
                 from simple_server.c:7:
/usr/include/bits/socket.h:122: error: syntax error before "define"
In file included from /usr/include/sys/socket.h:35,
                 from simple_server.c:7:
/usr/include/bits/socket.h:147: error: syntax error before "sa_family_t"
/usr/include/bits/socket.h:149: error: syntax error before '}' token
/usr/include/bits/socket.h:164: error: syntax error before "sa_family_t"
/usr/include/bits/socket.h:167: error: syntax error before '}' token
In file included from simple_server.c:9:
/usr/include/netinet/in.h:221: error: syntax error before "sa_family_t"
/usr/include/netinet/in.h:226: error: invalid application of `sizeof' to an incomplete type
/usr/include/netinet/in.h:229: error: size of array `sin_zero' is too large
/usr/include/netinet/in.h:230: error: syntax error before '}' token
/usr/include/netinet/in.h:235: error: syntax error before "sa_family_t"
/usr/include/netinet/in.h:240: error: syntax error before '}' token
/usr/include/netinet/in.h:283: error: field `gr_group' has incomplete type
/usr/include/netinet/in.h:292: error: field `gsr_group' has incomplete type
/usr/include/netinet/in.h:295: error: field `gsr_source' has incomplete type
/usr/include/netinet/in.h:327: error: field `gf_group' has incomplete type
/usr/include/netinet/in.h:335: error: field `gf_slist' has incomplete type
In file included from simple_server.c:9:
/usr/include/netinet/in.h:465: error: field `ip6m_addr' has incomplete type
simple_server.c: In function `main':
simple_server.c:17: error: storage size of `host_addr' isn't known
simple_server.c:17: error: storage size of `client_addr' isn't known
simple_server.c:34: error: invalid application of `sizeof' to an incomplete type
simple_server.c:41: error: invalid application of `sizeof' to an incomplete type
simple_server.c: At top level:
/usr/include/netinet/in.h:229: error: storage size of `sin_zero' isn't known

For some reason GCC isn't finding the predefined struct in the header files. 由于某些原因,GCC在头文件中找不到预定义的结构。 I've tried everything to fix this, from removing header files to adding only certain ones. 我已经尝试了所有方法来解决此问题,从删除头文件到仅添加某些文件。

Also I should note that I'm using the VM image that came with the book. 另外,我还应该注意,我使用的是本书随附的VM映像。 It's an old version of Ubuntu and GCC. 这是Ubuntu和GCC的旧版本。

Edit: Here are the requested files. 编辑:这是请求的文件。

socket.h 套接字

#ifndef __BITS_SOCKET_H
#define __BITS_SOCKET_H

#if !defined _SYS_SOCKET_H && !defined _NETINET_IN_H
# error "Never include <bits/socket.h> directly; use <sys/socket.h> instead."
#endif

#define __need_size_t
#define __need_NULL
#include <stddef.h>

#include <limits.h>
#include <sys/types.h>

/* Type for length arguments in socket calls.  */
#ifndef __socklen_t_defined
typedef __socklen_t socklen_t;
# define __socklen_t_defined
#endif

/* Types of sockets.  */
enum __socket_type
{
  SOCK_STREAM = 1,      /* Sequenced, reliable, connection-based
                   byte streams.  */
#define SOCK_STREAM SOCK_STREAM
  SOCK_DGRAM = 2,       /* Connectionless, unreliable datagrams
                   of fixed maximum length.  */
#define SOCK_DGRAM SOCK_DGRAM
  SOCK_RAW = 3,         /* Raw protocol interface.  */
#define SOCK_RAW SOCK_RAW
  SOCK_RDM = 4,         /* Reliably-delivered messages.  */
#define SOCK_RDM SOCK_RDM
  SOCK_SEQPACKET = 5,       /* Sequenced, reliable, connection-based,
                   datagrams of fixed maximum length.  */
#define SOCK_SEQPACKET SOCK_SEQPACKET
  SOCK_PACKET = 10      /* Linux specific way of getting packets
                   at the dev level.  For writing rarp and
                   other similar things on the user level. */
#define SOCK_PACKET SOCK_PACKET
};

/* Protocol families.  */
#define PF_UNSPEC   0   /* Unspecified.  */
#define PF_LOCAL    1   /* Local to host (pipes and file-domain).  */
#define PF_UNIX     PF_LOCAL /* Old BSD name for PF_LOCAL.  */
#define PF_FILE     PF_LOCAL /* Another non-standard name for PF_LOCAL.  */
#define PF_INET     2   /* IP protocol family.  */
#define PF_AX25     3   /* Amateur Radio AX.25.  */
#define PF_IPX      4   /* Novell Internet Protocol.  */
#define PF_APPLETALK    5   /* Appletalk DDP.  */
#define PF_NETROM   6   /* Amateur radio NetROM.  */
#define PF_BRIDGE   7   /* Multiprotocol bridge.  */
#define PF_ATMPVC   8   /* ATM PVCs.  */
#define PF_X25      9   /* Reserved for X.25 project.  */
#define PF_INET6    10  /* IP version 6.  */
#define PF_ROSE     11  /* Amateur Radio X.25 PLP.  */
#define PF_DECnet   12  /* Reserved for DECnet project.  */
#define PF_NETBEUI  13  /* Reserved for 802.2LLC project.  */
#define PF_SECURITY 14  /* Security callback pseudo AF.  */
#define PF_KEY      15  /* PF_KEY key management API.  */
#define PF_NETLINK  16
#define PF_ROUTE    PF_NETLINK /* Alias to emulate 4.4BSD.  */
#define PF_PACKET   17  /* Packet family.  */
#define PF_ASH      18  /* Ash.  */
#define PF_ECONET   19  /* Acorn Econet.  */
#define PF_ATMSVC   20  /* ATM SVCs.  */
#define PF_SNA      22  /* Linux SNA Project */
#define PF_IRDA     23  /* IRDA sockets.  */
#define PF_PPPOX    24  /* PPPoX sockets.  */
#define PF_WANPIPE  25  /* Wanpipe API sockets.  */
#define PF_BLUETOOTH    31  /* Bluetooth sockets.  */
#define PF_MAX      32  /* For now..  */

/* Address families.  */
#define AF_UNSPEC   PF_UNSPEC
#define AF_LOCAL    PF_LOCAL
#define AF_UNIX     PF_UNIX
#define AF_FILE     PF_FILE
#define AF_INET     PF_INET
#define AF_AX25     PF_AX25
#define AF_IPX      PF_IPX
#define AF_APPLETALK    PF_APPLETALK
#define AF_NETROM   PF_NETROM
#define AF_BRIDGE   PF_BRIDGE
#define AF_ATMPVC   PF_ATMPVC
#define AF_X25      PF_X25
#define AF_INET6    PF_INET6
#define AF_ROSE     PF_ROSE
#define AF_DECnet   PF_DECnet
#define AF_NETBEUI  PF_NETBEUI
#define AF_SECURITY PF_SECURITY
#define AF_KEY      PF_KEY
#define AF_NETLINK  PF_NETLINK
#define AF_ROUTE    PF_ROUTE
#define AF_PACKET   PF_PACKET
#define AF_ASH      PF_ASH
#define AF_ECONET   PF_ECONET
#define AF_ATMSVC   PF_ATMSVC
#define AF_SNA      PF_SNA
#define AF_IRDA     PF_IRDA
#define AF_PPPOX    PF_PPPOX
o   define  AF_WANPIPE  PF_WANPIPE
#define AF_BLUETOOTH    PF_BLUETOOTH
#define AF_MAX      PF_MAX

/* Socket level values.  Others are defined in the appropriate headers.

   XXX These definitions also should go into the appropriate headers as
   far as they are available.  */
#define SOL_RAW     255
#define SOL_DECNET      261
#define SOL_X25         262
#define SOL_PACKET  263
#define SOL_ATM     264 /* ATM layer (cell level).  */
#define SOL_AAL     265 /* ATM Adaption Layer (packet level).  */
#define SOL_IRDA    266

/* Maximum queue length specifiable by listen.  */
#define SOMAXCONN   128

/* Get the definition of the macro to define the common sockaddr members.  */
#include <bits/sockaddr.h>

/* Structure describing a generic socket address.  */
struct sockaddr
  {
    __SOCKADDR_COMMON (sa_);    /* Common data: address family and length.  */
    char sa_data[14];       /* Address data.  */
  };


/* Structure large enough to hold any socket address (with the historical
   exception of AF_UNIX).  We reserve 128 bytes.  */
#if ULONG_MAX > 0xffffffff
# define __ss_aligntype __uint64_t
#else
# define __ss_aligntype __uint32_t
#endif
#define _SS_SIZE    128
#define _SS_PADSIZE (_SS_SIZE - (2 * sizeof (__ss_aligntype)))

struct sockaddr_storage
  {
    __SOCKADDR_COMMON (ss_);    /* Address family, etc.  */
    __ss_aligntype __ss_align;  /* Force desired alignment.  */
    char __ss_padding[_SS_PADSIZE];
  };


/* Bits in the FLAGS argument to `send', `recv', et al.  */
enum
  {
    MSG_OOB     = 0x01, /* Process out-of-band data.  */
#define MSG_OOB     MSG_OOB
    MSG_PEEK        = 0x02, /* Peek at incoming messages.  */
#define MSG_PEEK    MSG_PEEK
    MSG_DONTROUTE   = 0x04, /* Don't use local routing.  */
#define MSG_DONTROUTE   MSG_DONTROUTE
#ifdef __USE_GNU
    /* DECnet uses a different name.  */
    MSG_TRYHARD     = MSG_DONTROUTE,
# define MSG_TRYHARD    MSG_DONTROUTE
#endif
    MSG_CTRUNC      = 0x08, /* Control data lost before delivery.  */
#define MSG_CTRUNC  MSG_CTRUNC
    MSG_PROXY       = 0x10, /* Supply or ask second address.  */
#define MSG_PROXY   MSG_PROXY
    MSG_TRUNC       = 0x20,
#define MSG_TRUNC   MSG_TRUNC
    MSG_DONTWAIT    = 0x40, /* Nonblocking IO.  */
#define MSG_DONTWAIT    MSG_DONTWAIT
    MSG_EOR     = 0x80, /* End of record.  */
#define MSG_EOR     MSG_EOR
    MSG_WAITALL     = 0x100, /* Wait for a full request.  */
#define MSG_WAITALL MSG_WAITALL
    MSG_FIN     = 0x200,
#define MSG_FIN     MSG_FIN
    MSG_SYN     = 0x400,
#define MSG_SYN     MSG_SYN
    MSG_CONFIRM     = 0x800, /* Confirm path validity.  */
#define MSG_CONFIRM MSG_CONFIRM
    MSG_RST     = 0x1000,
#define MSG_RST     MSG_RST
    MSG_ERRQUEUE    = 0x2000, /* Fetch message from error queue.  */
#define MSG_ERRQUEUE    MSG_ERRQUEUE
    MSG_NOSIGNAL    = 0x4000, /* Do not generate SIGPIPE.  */
#define MSG_NOSIGNAL    MSG_NOSIGNAL
    MSG_MORE        = 0x8000  /* Sender will send more.  */
#define MSG_MORE    MSG_MORE
  };


/* Structure describing messages sent by
   `sendmsg' and received by `recvmsg'.  */
struct msghdr
  {
    void *msg_name;     /* Address to send to/receive from.  */
    socklen_t msg_namelen;  /* Length of address data.  */

    struct iovec *msg_iov;  /* Vector of data to send/receive into.  */
    size_t msg_iovlen;      /* Number of elements in the vector.  */

    void *msg_control;      /* Ancillary data (eg BSD filedesc passing). */
    size_t msg_controllen;  /* Ancillary data buffer length.
                   !! The type should be socklen_t but the
                   definition of the kernel is incompatible
                   with this.  */

    int msg_flags;      /* Flags on received message.  */
  };

/* Structure used for storage of ancillary data object information.  */
struct cmsghdr
  {
    size_t cmsg_len;        /* Length of data in cmsg_data plus length
                   of cmsghdr structure.
                   !! The type should be socklen_t but the
                   definition of the kernel is incompatible
                   with this.  */
    int cmsg_level;     /* Originating protocol.  */
    int cmsg_type;      /* Protocol specific type.  */
#if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L
    __extension__ unsigned char __cmsg_data __flexarr; /* Ancillary data.  */
#endif
  };

/* Ancillary data object manipulation macros.  */
#if (!defined __STRICT_ANSI__ && __GNUC__ >= 2) || __STDC_VERSION__ >= 199901L
# define CMSG_DATA(cmsg) ((cmsg)->__cmsg_data)
#else
# define CMSG_DATA(cmsg) ((unsigned char *) ((struct cmsghdr *) (cmsg) + 1))
#endif
#define CMSG_NXTHDR(mhdr, cmsg) __cmsg_nxthdr (mhdr, cmsg)
#define CMSG_FIRSTHDR(mhdr) \
  ((size_t) (mhdr)->msg_controllen >= sizeof (struct cmsghdr)             \
   ? (struct cmsghdr *) (mhdr)->msg_control : (struct cmsghdr *) NULL)
#define CMSG_ALIGN(len) (((len) + sizeof (size_t) - 1) \
             & (size_t) ~(sizeof (size_t) - 1))
#define CMSG_SPACE(len) (CMSG_ALIGN (len) \
             + CMSG_ALIGN (sizeof (struct cmsghdr)))
#define CMSG_LEN(len)   (CMSG_ALIGN (sizeof (struct cmsghdr)) + (len))

extern struct cmsghdr *__cmsg_nxthdr (struct msghdr *__mhdr,
                      struct cmsghdr *__cmsg) __THROW;
#ifdef __USE_EXTERN_INLINES
# ifndef _EXTERN_INLINE
#  define _EXTERN_INLINE extern __inline
# endif
_EXTERN_INLINE struct cmsghdr *
__NTH (__cmsg_nxthdr (struct msghdr *__mhdr, struct cmsghdr *__cmsg))
{
  if ((size_t) __cmsg->cmsg_len < sizeof (struct cmsghdr))
    /* The kernel header does this so there may be a reason.  */
    return 0;

  __cmsg = (struct cmsghdr *) ((unsigned char *) __cmsg
                   + CMSG_ALIGN (__cmsg->cmsg_len));
  if ((unsigned char *) (__cmsg + 1) > ((unsigned char *) __mhdr->msg_control
                    + __mhdr->msg_controllen)
      || ((unsigned char *) __cmsg + CMSG_ALIGN (__cmsg->cmsg_len)
      > ((unsigned char *) __mhdr->msg_control + __mhdr->msg_controllen)))
    /* No more entries.  */
    return 0;
  return __cmsg;
}
#endif  /* Use `extern inline'.  */

/* Socket level message types.  This must match the definitions in
   <linux/socket.h>.  */
enum
  {
    SCM_RIGHTS = 0x01       /* Transfer file descriptors.  */
#define SCM_RIGHTS SCM_RIGHTS
#ifdef __USE_BSD
    , SCM_CREDENTIALS = 0x02    /* Credentials passing.  */
# define SCM_CREDENTIALS SCM_CREDENTIALS
#endif
  };

/* User visible structure for SCM_CREDENTIALS message */

struct ucred
{
  pid_t pid;            /* PID of sending process.  */
  uid_t uid;            /* UID of sending process.  */
  gid_t gid;            /* GID of sending process.  */
};

/* Get socket manipulation related informations from kernel headers.  */
#include <asm/socket.h>


/* Structure used to manipulate the SO_LINGER option.  */
struct linger
  {
    int l_onoff;        /* Nonzero to linger on close.  */
    int l_linger;       /* Time to linger.  */
  };

#endif  /* bits/socket.h */

hacking.h 骇客

#include <stdlib.h>



//This function is used to display packet data by the server program.
void dump(const unsigned char *data_buffer, const unsigned int length){
   unsigned char byte;
   unsigned int i, j;
   for(i = 0; i < length; i++){
      byte = data_buffer[i];
      printf("%02x ", data_buffer[i]); //Display byte in hex
      if((( i % 16) == 15 ) || ( i == length - 1)) {
         for( j = 0; j < 15 - ( i % 16 ); j++ )
            printf("   ");
         printf("| ");
         for(j = ( i - ( i % 16 )); j <= i; j++) { //Display printable bytes from line.
            byte = data_buffer[j];
            if((byte > 31) && (byte < 127))//Outside printable char range
               printf("%c", byte);
            else
               printf(".");
         }
         printf("\n"); // End of the dump line (each line is 16 bytes)
      }//End if
   }//End for 
}



void fatal(char *message){
    char error_message[100];


    strcpy(error_message, "[!!] Fatal Error");
    strncat(error_message, message, 83);
    perror(error_message);
    exit(-1);
    }


 void *ec_malloc(unsigned int size){
    void *ptr;
    ptr = malloc(size);
    if(ptr== NULL)
        fatal("in ec_malloc() on memory allocation");

    return ptr;
}

in.h https://pastebin.com/RTjSdA2e in.h https://pastebin.com/RTjSdA2e

Ok. 好。 So the problem was in socket.h. 所以问题出在socket.h中。 Basically this line 基本上这条线

o   define  AF_WANPIPE  PF_WANPIPE

needed to be changed to this 需要更改为此

#define  AF_WANPIPE  PF_WANPIPE

Thanks David Wohlferd. 感谢David Wohlferd。

the contents of the hacking.h header file are not correct. hacking.h标头文件的内容不正确。

The contents should be the 'prototypes' for those functions and the actual functions should be in a separate .c file, probably named hacking.c 内容应为这些函数的“原型”,而实际函数应位于单独的.c文件中,该文件可能名为hacking.c

IE the contents of the hacking.h file should be: IE hacking.h文件的内容应为:

#ifndef HACKING_H
#define HACKING_H



//This function is used to display packet data by the server program.
void dump(const unsigned char *data_buffer, const unsigned int length);

void fatal(char *message);

void *ec_malloc(unsigned int size);

#endif // HACKING_H

Notice the 'include only once' wrapper; 注意“仅包含一次”包装器; consisting of the #ifndef , #define , and the trailing #endif statements #ifndef#ifndef #define和尾随的#endif语句组成

notice the file only contains the prototypes (it could also contain any other #define statements and/or data definitions and/or macro definitions, although in this case there are none.) 请注意,该文件仅包含原型(它也可以包含任何其他#define语句和/或数据定义和/或宏定义,尽管在这种情况下没有。)

Then there should be a separate file hacking.c that contains the actual functions (and a statement: #include "hacking.h" ) 然后应该有一个单独的文件hacking.c ,其中包含实际功能(和一条语句: #include "hacking.h"

in general, neither function bodies nor data declarations should be in a header file. 通常,函数主体和数据声明都不应位于头文件中。 (later on, you will learn of certain exceptions to this statement, like when declaring inline functions (随后,您将了解此语句的某些异常,例如在声明inline函数时

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM