Most of us write our IP addresses the way we’ve been taught, a long time ago: 127.0.0.1
, 10.0.2.1
, … but that gets boring after a while, doesn’t it?
Luckily, there’s a couple of ways to write an IP address, so you can mess with coworkers, clients or use it as a security measure to bypass certain (input) filters.
Not all behaviour is equal
I first learned about the different ways of writing an IP address by this little trick.
On Linux:
$ ping 0 PING 0 (127.0.0.1) 56(84) bytes of data. 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.053 ms 64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.037 ms
This translates the `` to 127.0.0.1
. However, on a Mac:
$ ping 0 PING 0 (0.0.0.0): 56 data bytes ping: sendto: No route to host ping: sendto: No route to host
Here, it translates `` to a null-route 0.0.0.0
.
Zeroes are optional
Just like in IPv6 addresses, some zeroes (0) are optional in the IP address.
$ ping 127.1 PING 127.1 (127.0.0.1): 56 data bytes 64 bytes from 127.0.0.1: icmp_seq=0 ttl=64 time=0.033 ms 64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.085 ms
Note though, a computer can’t just “guess” where it needs to fill in the zeroes. Take this one for example:
$ ping 10.50.1 PING 10.50.1 (10.50.0.1): 56 data bytes Request timeout for icmp_seq 0
It translates 10.50.1
to 10.50.0.1
, adding the necessary zeroes before the last digit.
Overflowing the IP address
Here’s another neat trick. You can overflow a digit.
For instance:
$ ping 10.0.513 PING 10.0.513 (10.0.2.1): 56 data bytes 64 bytes from 10.0.2.1: icmp_seq=0 ttl=61 time=10.189 ms 64 bytes from 10.0.2.1: icmp_seq=1 ttl=61 time=58.119 ms
We ping 10.0.513
, which translates to 10.0.2.1
. The last digit can be interpreted as 2x 256 + 1
. It shifts the values to the left.
Decimal IP notation
We can use a decimal representation of our IP address.
$ ping 167772673 PING 167772673 (10.0.2.1): 56 data bytes 64 bytes from 10.0.2.1: icmp_seq=0 ttl=61 time=15.441 ms 64 bytes from 10.0.2.1: icmp_seq=1 ttl=61 time=4.627 ms
This translates 167772673
to 10.0.2.1
.
Hex IP notation
Well, if decimal notation worked, HEX should work too – right? Of course it does!
$ ping 0xA000201 PING 0xA000201 (10.0.2.1): 56 data bytes 64 bytes from 10.0.2.1: icmp_seq=0 ttl=61 time=7.329 ms 64 bytes from 10.0.2.1: icmp_seq=1 ttl=61 time=18.350 ms
The hex value A000201
translates to 10.0.2.1
. By prefixing the value with 0x
, we indicate that what follows, should be interpreted as a hexadecimal value.
Octal IP notation
Take this one for example.
$ ping 10.0.2.010 PING 10.0.2.010 (10.0.2.8): 56 data bytes
Notice how that last .010
octet gets translated to .8
?
Using sipcalc to find these values
There’s a useful command line IP calculator called sipcalc you can use for the decimal & hex conversions.