15 puan yazan xguru 2020-12-28 | 2 yorum | WhatsApp'ta paylaş
  • 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 uint32 sayı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

 
minhoryang 2020-12-28

Oo, eğlenceliymiş! Saldırırken işi bükmeye uygun birçok teknik görünüyor!

 
galadbran 2020-12-28

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 ^^;;