Coding a SYN Scanner guide ( source included )

Giorgos Keramidas keramida at ceid.upatras.gr
Fri Mar 30 01:53:35 EEST 2007


On 2007-03-30 01:21, ithilgore <advent.cloud.strife at gmail.com> wrote:
> Giorgos Keramidas wrote:
> >Εδώ πάλι διαφωνώ κάπως...
> >
> >Στο δικό μου λειτουργικό, που χρησιμοποιεί κι αυτό gcc για να κάνει
> >build τα πάντα, το netinet/ip.h header περιέχει:
> >
> >% /*
> >%  * Structure of an internet header, naked of options.
> >%  */
> >% struct ip {
> >% #if BYTE_ORDER == LITTLE_ENDIAN
> >%         u_int   ip_hl:4,                /* header length */
> >%                 ip_v:4;                 /* version */
> >% #endif
> >% #if BYTE_ORDER == BIG_ENDIAN
> >%         u_int   ip_v:4,                 /* version */
> >%                 ip_hl:4;                /* header length */
> >% #endif
> >%         u_char  ip_tos;                 /* type of service */
> >%         u_short ip_len;                 /* total length */
> >%         u_short ip_id;                  /* identification */
> >%         u_short ip_off;                 /* fragment offset field */
> >% #define IP_RF 0x8000                    /* reserved fragment flag */
> >% #define IP_DF 0x4000                    /* dont fragment flag */
> >% #define IP_MF 0x2000                    /* more fragments flag */
> >% #define IP_OFFMASK 0x1fff               /* mask for fragmenting bits */
> >%         u_char  ip_ttl;                 /* time to live */
> >%         u_char  ip_p;                   /* protocol */
> >%         u_short ip_sum;                 /* checksum */
> >%         struct  in_addr ip_src,ip_dst;  /* source and dest address */
> >% } __packed __aligned(4);
> >
> >Το linux έχει αρκετά πιο "περίεργες" ιδέες για το networking.
> 
> Το link δεν δουλευει ? Περιεργο , οσοι το χουν κατεβασει ως τωρα δεν 
> ειχαν προβλημα .
> 
> Οσο για τα headers ουσιαστικα το ιδιο λεμε.

Ναι :)

> Εγω λεω δεν χρειαζεται να ειναι packed ως απλα defined packed αφου
> αποσο ειδα και απο τον gdb ειναι packed by default ( δες το παραδειγμα
> με το ACK που ειπα ).  Αυτο που λεω δηλαδη ειναι οτι μαλλον στο
> συστημα μου ,που το χω δοκιμασει επιτυχως ( Slackware 11 kernel
> 2.2.4.33 ) ,θα ειναι by default packed σε συμπεριφορα ακομα και αν δεν
> ειναι ορισμενο το attribute.

Το 'default' του ενός compiler μπορεί να μην είναι default στον άλλο,
όμως.  Ακόμα και στον ίδιο compiler τα default options δε μπορεί να
θεωρούνται δεδομένα στο header file ή στο definition ενός struct.

Στο magaz, αν γράψεις κάτι για το syn scanner, ίσως είναι καλή ιδέα να
χρησιμοποιήσεις το -fpack-struct option σε παραδείγματα που δείχνουν
πώς να γίνει compile κάτι.  Π.χ. δες το παρακάτω πρόγραμμα:

     1  #include <stdio.h>
     2  
     3  struct A {
     4          char            a_cf1;
     5          char            a_cf2;
     6          unsigned long   a_lf1;
     7          unsigned long   a_lf2;
     8  };
     9  
    10  struct B {
    11          char            b_cf1;
    12          unsigned long   b_lf1;
    13          char            b_cf2;
    14          unsigned long   b_lf2;
    15  };
    16  
    17  int
    18  main(void)
    19  {
    20          struct A va;
    21          struct B vb;
    22  
    23          printf("sizeof A = %zu [%zu, %zu, %zu, %zu]\n",
    24            sizeof(va),
    25            (size_t)((unsigned char *)&(va.a_cf1) - (unsigned char *)&va),
    26            (size_t)((unsigned char *)&(va.a_cf2) - (unsigned char *)&va),
    27            (size_t)((unsigned char *)&(va.a_lf1) - (unsigned char *)&va),
    28            (size_t)((unsigned char *)&(va.a_lf2) - (unsigned char *)&va));
    29  
    30          printf("sizeof B = %zu [%zu, %zu, %zu, %zu]\n",
    31            sizeof(vb),
    32            (size_t)((unsigned char *)&(vb.b_lf1) - (unsigned char *)&vb),
    33            (size_t)((unsigned char *)&(vb.b_cf1) - (unsigned char *)&vb),
    34            (size_t)((unsigned char *)&(vb.b_cf2) - (unsigned char *)&vb),
    35            (size_t)((unsigned char *)&(vb.b_lf2) - (unsigned char *)&vb));
    36  
    37          return 0;
    38  }

Ανάλογα με το αν χρησιμοποιηθεί το -fpack-struct option στο GCC, τα
αποτελέσματα είναι διαφορετικά:

    keramida at kobe:/home/keramida$ cc -O2 foo.c
    keramida at kobe:/home/keramida$ ./a.out 
    sizeof A = 12 [0, 1, 4, 8]
    sizeof B = 16 [4, 0, 8, 12]
    keramida at kobe:/home/keramida$ cc -O2 -fpack-struct foo.c
    keramida at kobe:/home/keramida$ ./a.out 
    sizeof A = 10 [0, 1, 2, 6]
    sizeof B = 10 [1, 0, 5, 6]
    keramida at kobe:/home/keramida$




More information about the unix-admin-gr mailing list