Sözleşmenin bu işlevini çağırırken, aslında, EVM seviyesinde, bir bayt kodu dizisi geçirilir. Aşağıdaki şekilde gösterildiği gibi, Etherscan'da her işlemin girdi verilerindeki işlev çağrı verisinin tamamını görüntüleyebilirsiniz.
Gelen bayt kodu, yöntemin imzasını (ilk 4 bayt) ve gelen parametre değerini (sırasıyla gelen adres verileri ve miktar verileri dahil olmak üzere veri bölümü) içeren toplam 136 bayta (normalde) sahiptir. Her ikisi de sıfır doldurulmuş yüksek bitlere sahip 32 bayttır). Yukarıdaki resim anormal, sadece 134 bayt, bu benim özel muamelem, aşağıda detaylı olarak anlatacağım.
Yukarıdaki bilgilerden, EVM'nin gelen parametreleri bayt koduna göre tanıdığını ve bayt kodunun olduğu kadar olduğunu ve doğrulanmayacağını bilebiliriz. Tesadüfen, işte bu, boşluk oluştu. Bazı insanlar yasadışı adresleri kullanmak istiyor. Örneğin, adres EVM'nin bunu nasıl ele alacağını görmek için kasıtlı olarak son birkaç rakamı yazıyor. Ancak tesadüfen, EVM yalnızca hataları bildirmekle kalmayacak, aynı zamanda " Adresi tamamlamanıza yardımcı olacak "samimi", nasıl tamamlanır? Adresten sonra yetersiz kalan kısmın miktar verisi kısmının rakamları ile doldurulmasıdır, örneğin adresinizin orijinali
Sonuç olarak, öngörülemeyen entrikalar nedeniyle kasıtlı olarak iki sıfır yazdınız ve şu hale geldiniz
Daha sonra "samimi" EVM, adresi tamamlamak için bayt kodunun miktar verisi kısmından iki bit alacaktır ve miktar verisi kısmının ilk iki hanesi tam olarak 0'dır, o zaman adresiniz hala orijinal adrestir. Ama veri kısmı 2 bit azaldı, ne yapmalıyım? Bu, ABInin bayt sayısıyla uyumlu değil. Sorun değil. "Özel" EVM, normal 136 bayta ulaşana kadar miktar verilerinizin sonuna 0 ekleyecektir. Sonra bazı öğrenciler soracaktır. Adresimde 60 varsa, o zaman adresim kasıtlı olarak 60s daha az yazıyor, veri bölümünde 6 daha fazla 0 var mı? Bu zenginleşmiyor mu?
Cevap: haklısın
Başka bir deyişle, başlangıçta doldurulan veriler 1'dir, ancak bayt kodu olduktan sonra 0x1'dir. Adres 6 bayt eksikse, verileriniz otomatik olarak 0x1000000 olur! Sürpriz yok, sürpriz yok!
Ama bir baş belası olarak, nasıl hafife alınırsınız? Resmi bir onarım planı bulunamadığına göre, en alt seviyede bir sorun olması gerekir, bu yüzden sadece en alt seviyeden başlayabilirim. Güvenlik açığı kurtarma için web3 kullanmayı düşündüm. Mevcut
7. Örnek sözleşmeyi test ağına yerleştirmek ve sözleşmenin adresini almak için remiks kullanın. get abi yöntemi aşağıda kullanılacaktır:
1. Komut satırı istemine girmek için node yazın 2. Projeye web3'ü tanıtın ve sağlayıcıyı ayarlayın (web3'ün nasıl indirileceği burada açıklanmamaktadır, ilgileniyorsanız, kendiniz bulabilirsiniz, çok basit bir işlem)
3. Sözleşme örneği oluşturun:
4. Yukarıda bahsettiğimiz işlemde girdi verilerini yapılandırmak olan abi inşa yöntemi, çünkü EVM yapmak için, kısa adres saldırısı oluşturmak istiyoruz, bu nedenle adresimiz normal adresten daha az bit içeriyor. Eksik adresleri otomatik olarak sıfırlarla tamamlayın, ancak aşağıdaki şekil gibi normal yapı başarısız olacaktır
Ama bir kez daha, bir baş belası olarak, hafife alınamazsın! Bu yüzden özel bir metoda ihtiyacımız var.Başta buraya geldiğimde tespit olmayacağını düşünmüştüm, çok saftı.Aslında bu web3 tespitiydi.Özel bir metoda ihtiyacımız vardı. Bu yöntem iki adıma bölünmüştür
İlk adım normal bir abi oluşturmaktır, bu sefer kullanılan adres '0xdfca6234eb09125632f8f3c71bf8733073b7cd00' şeklindedir.
Şekilde gösterildiği gibi, mevcut abi veya girdi verisi 136 bayttır.
Adım 2: abi'deki adresin arkasındaki iki sıfırı gizlice silmek için küçük bir hile kullanın Başlangıçta 136 bayttı, ancak şimdi sadece 134 bayt, yukarıda bahsettiğim anormal girdi verileri. Şu anda inşa edildi
Yukarıdakiler, sıfırı sildikten sonra abi
tamam herşey hazır olduktan sonra en heyecanlı ana ulaşabilirsin
5. Ethereumjs-tx'i projeye tanıtın (nasıl indirileceği burada ayrıntılı değildir)
6. Özel anahtarınızı içe aktarın ve bazı işlemler yapın:
7. Orijinal işlem verilerini oluşturun Bu çok doğal bir Ethereum işlem verisidir.Her sözleşme görüşmesi aslında aşağıdaki verileri oluşturacaktır. Bu alandaki bilgiler ayrıntılı değildir, ancak nonce hakkında fazla bir şey bilmememiz dışında, remix'teki sözleşmeyi aradığımızda karşılaşacağımız tek şey diğerleri. Nonce ile ilgili açıklama aslında hesap tarafından gönderilir. İşlem sayısı, örneğin, hesabınız 5 işlem gerçekleştirdiyse, o zaman nonce 4'e eşittir (nonce 0'dan başlar). Hesabınızın son işleminin nonce'unu ehterscan'da görüntüleyebilirsiniz.Aşağıdaki özel işlem verileri. :
8. İşlemi imzalayın ve işlem üzerinde biraz işlem yapın
9. İşlem gönder
Önceden ayarlanmış olay olayı aracılığıyla, EVM'nin başarıyla sıfırlarla doldurulduğunu görebiliriz.Giriş orijinal olarak 123'dür, ancak EVM çıkarmanın sonucu 31488'dir. Orijinal onaltılık 1230x7b'dir ve şimdi 0x7b00! canlandırmak!
Bu operasyon bana Feiyue Madhouse'daki cümleyi hatırlattı - Ama denedim, değil mi? Lanet olsun, en azından bunu yaptım.