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