IP adresi ayrıştırmanın eğlencesi
(blog.dave.tf)-
Hızlı bir IPv4+v6 ayrıştırıcısı yaparken öğrenilenleri okunması kolay şekilde derleyen bir yazı
-
Resmî (canonical) gösterim
→ v4 : 192.168.0.1 , 1 baytlıkların Dotted Quad biçimi
→ v6 : 1:2:3:4:5:6:7:8 , 2 baytlıkların Colon-Hex biçimi
[IPv6]
- Ortada çok sayıda 0 çıkabildiği için,
::kullanarak bir veya daha fazla 0 kaldırılabilir
→ 1:2::3:4 = 1:2:0:0:0:0:3:4
- Son 32 bit için v4'ün Dotted Quad gösterimi kullanılabilir
→ 1:2:3:4:5:6:77.77.88.88 = 1:2:3:4:5:6:4d4d:5858
→ fe80::1.2.3.4 = fe80:0:0:0:0:0:102:304
::başta/sonda gelen durumlar olduğu için biraz daha karmaşık hale gelir
→ ::1 = 0:0:0:0:0:0:0:1
→ 1:: = 1:0:0:0:0:0:0:0
→ :: = 0:0:0:0:0:0:0:0
- IPv6 Colon-Hex içindeki tüm alanlar 4 basamaklı onaltılık sayılardır; baştaki 0'lar kaldırılabilir
→ :: = 0000:0000:0000:0000:0000:0000:0000:0000
[IPv4]
- İlginç olan şu ki, IPv6'da son 32 bitin Dotted Quad gösterimi resmileştirilmeden önce bununla ilgili hiçbir belgede standartlaştırılmış bir tanım yoktu
→ Bu yüzden fiilî endüstri standardı genelde "4.2BSD bunu yorumlayabiliyor mu?" ve "diğer işletim sistemleri 4.2BSD'yi kopyalarken neyi korudu?" sorularıydı
- Ama 4.2BSD biraz tuhaf
→ 192.168.140.255 = 3232271615 ile aynıdır
→ Yani Chrome'da http://3232271615 ziyaret edilirse http://192.168.140.255 yüklenir. Sonuçta 4 baytlık bir sayı!
→ Sekizlik biçimde http://0300.0250.0214.0377 de mümkündür
→ O zaman doğal olarak onaltılık olan https://0xc0.0xa8.0x8c.0xff de aynı adrestir
- CIDR (Classless Inter-Domain Routing) da IP adreslerini etkiler
→ Sınıf C gösterimi 192.168.140.255, sınıf B olarak http://192.168.36095 ve sınıf A olarak http://192.11046143 biçiminde yazılabilir
→ Bu yüzden ping 127.1 = 127.0.0.1 mümkündür. Bu, IPv6'daki gibi tekrar eden 0'ların kaldırılması değil; 127 sınıf A ağındaki 1 numaralı host anlamına gelir. Yani 24 bitlik sayı 1'dir
- Her Quad içindeki sayının önünde kaç tane 0 olabilir?
→ 001.002.003.004 ? 0000000001.0000000002.0000000003.000000004 ?
→ ( Chrome, http://0000000001.0000000002.0000000003.000000004 biçimini de kabul eder )
→ Bu durumda bu sayıyı sekizlik mi, onaltılık mı okumak gerekir? : Son dönem uygulamalar sekizlik/onaltılık desteğinden vazgeçip baştaki 0'ları ondalık olarak işler
- Baştaki 0 sorunu IPv6'yı da etkiler
→ 000001::00001.00002.00003.00004 = 1::1.2.3.4, or 1::102:304
→ Güncel ayrıştırıcıların çoğu "parse integer" kütüphanesini kullandığı için başta çok sayıda 0 olsa da hepsine izin verir
Yani tüm IP adreslerini ayrıştırmak istiyorsanız bu berbat ayrıntıların hepsini hesaba katmanız gerekir ama..
Yazarın ayrıştırıcısı ise kabaca şunları destekliyor:
-
Klasik v4 biçiminde noktayla ayrılmış tamsayılar; baştaki 0 sayısı sınırsız olabilir
-
Sınıf A/B gösterimleri ve 8/16'lık gösterimler işlenmiyor
-
Her şeyi tek bir
uint32sayısıyla ifade etme biçimi de işlenmiyor -
IPv6 için resmî colon-hex biçimi,
::kısaltması ve son 32 bite IPv4 ekleme biçimi kabul ediliyor (buradaki IPv4 için de yukarıdaki kurallar geçerli). Her alanın başındaki 0 sayısı sınırsız
- Başta, IPv4'ten IPv6'ya kolay geçiş için sona IPv4 adresi ekleme biçimi dahil edilmişti ama pratikte pek görülmüyor. O yüzden destekleniyor olsa da çok faydalı olmadığını düşünüyorum
2 yorum
Oo, eğlenceliymiş! Saldırırken işi bükmeye uygun birçok teknik görünüyor!
Yoksa bir IP adresini yazmak için bu kadar karmaşık kurallar kullanmak gerekecekse, bu biraz gereksiz hesaplama kaynağı israfı değil mi diye düşündürüyor ^^;;