Coding a SYN Scanner guide ( source included )

ithilgore advent.cloud.strife at gmail.com
Fri Mar 30 02:20:54 EEST 2007


Giorgos Keramidas wrote:
> 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$
>
>   
Done .  thanks for pointing out




More information about the unix-admin-gr mailing list