Kodėl C struktūra gali sukurti netinkamą SOCKS užklausą
Tikrinkite aiškius laukų pločius, baitų tvarką ir srauto I/O, o ne laikykite kompiliatoriaus išdėstymo tinklo formatu.
Galiojantis tarpinio serverio adresas nepadaro ranka rašyto SOCKS pranešimo galiojančiu. Siunčiant C arba C++ struktūrą galima nusiųsti užpildą arba sveikuosius skaičius šeimininko tvarka, kurių protokolas niekada nereikalavo.
SOCKS5 CONNECT užklausai su domeno vardu, suserializuokite šią seką tiesiogiai po metodo derybų ir pasirinktos autentifikacijos:
- Versija, komanda, rezervuotas baitas ir adreso tipas
- Domeno ilgis ir domeno baitai
- Dviejų baitų paskirties prievadas tinklo baitų tvarka
Adresų ilgiai priklauso nuo SOCKS versijos ir adreso tipo. Fiksuoto pločio skaitmeniniams laukams reikia nustatyto jų vaizdavimo; domenų eilutės turi savą ilgio kodavimą. C eilutės terminatorius nėra bendra instrukcija pridėti nulį prie tinklo pranešimo.
| Diegimo trumpinys | Tikrintina problema |
|---|---|
| 32 bitų reikšmės priskyrimas per 8 bitų rodyklę | Jis neišveda visų keturių baitų |
| Buferio konvertavimas į didesnio sveikojo skaičiaus rodyklę | Lygiavimą ir baitų tvarką vis tiek reikia apdoroti |
| Manyti, kad vienas skaitymas ar rašymas yra vienas pranešimas | TCP gali perduoti tik dalį protokolo sekos |
Palyginkite kiekvieną lauką su numatytu tikslu ir apdorokite dalinį I/O. Gavus du baitus neįrodyta, kad atėjo visas atsakymas. Šių ribų patikrinimas gali atskirti netaisyklingą užklausą nuo serverio, atsisakančio teisingai aprašyto ryšio.