views:

465

answers:

2

i was palying with the ruby sockets, so i ended up trying to put an IP packet togather, then i took an ip packet and try to make a new one just like it.

now my problem is: if the packet is: 45 00 00 54 00 00 40 00 40 01 06 e0 7f 00 00 01 7f 00 00 01, and this is obviously hexadecimal, so i converted it into a decimal, then into a binary data using the .pack method, and pass it up to the send method, then the Wireshark shows me a very strange different thing from what i created, i doing something wrong ???, i know that, but can't figure it out:

@packet = 0x4500005400004000400106e07f0000017f000001 #i converted each 32 bits together, not like i wrote
@data = ""
@data << @packet.to_s
@socket.send(@data.unpack(c*).to_s,@address)

and is there another way to solve the whole thing up, can i for example write directly to the socket buffer the data i want to send??

thanks in advanced.

A: 

First check your host byte order because what you see in wireshark is in network byte order (BigEndian). Then in wireshark you will be seeing protocol headers (depends upon whether it is TCP socket or a UDP one) followed by data. You can not directly send IP packets. So you can see this particular data in the particular's packet's data section i.e. (data section of TCP/UDP packet).

bhups
"You can not directly send IP packets" ??? r u sure ??, and i was talking about the headers when i said Wireshark, i also said that i'm trying to create a packet, so this is not the data we're talking about, this is the header that i'm trying to create.if u got it wrong then sorry for not explaining very well.
Raafat
+2  A: 

Starting with a hex Bignum is a novel idea, though I can't immediately think of a good way to exploit it.

Anyway, trouble starts with the .to_s on the Bignum, which will have the effect of creating a string with the decimal representation of your number, taking you rather further from the bits and not closer. Somehow your c* seems to have lost its quotes, also.

But putting them back, you then unpack the string, which gets you an array of integers which are the ascii values of the digits in the decimal representation of the numeric value of the original hex string, and then you .to_s that (which IO would have done anyway, so, no blame there at least) but this then results in a string with the printable representation of the ascii numbers of the unpacked string, so you are now light-years from the original intention.

>> t = 0x4500005400004000400106e07f0000017f000001
=> 393920391770565046624940774228241397739864195073
>> t.to_s
=> "393920391770565046624940774228241397739864195073"
>> t.to_s.unpack('c*')
=> [51, 57, 51, 57, 50, 48, 51, 57, 49, 55, 55, 48, 53, 54, 53, 48, 52, 54, 54, 50, 52, 57, 52, 48, 55, 55, 52, 50, 50, 56, 50, 52, 49, 51, 57, 55, 55, 51, 57, 56, 54, 52, 49, 57, 53, 48, 55, 51]
>> t.to_s.unpack('c*').to_s
=> "515751575048515749555548535453485254545052575248555552505056505249515755555157565452495753485551"

It's kind of interesting in a way. All the information is still there, sort of.

Anyway, you need to make a binary string. Either just << numbers into it:

>> s = ''; s << 1 << 2 
=> "\001\002"

Or use Array#pack:

>> [1,2].pack 'c*'
=> "\001\002"
DigitalRoss
thank u for an interesting answer, but i already did the pack like u pointed at the last of it, and put a note "i converted each 32 bits together, not like i wrote", but thanks again, u might hinted me to the answer i'm looking for.one last thing, is there another way to solve the whole thing up, can i for example write directly to the socket buffer the data i want to send ??
Raafat
Well, you could do something like: `a = %w{45 00 00 54 00 00 40 00 40 01 06 e0 7f 00 00 01 7f 00 00 01}; @socket.send [a.join ''].pack('H*'), @address` or, alternatively, something like `@socket.send(['45000054000040...'].pack('H*'), @address)`
DigitalRoss