Miks C-struktuur võib tekitada vigase SOCKS-päringu
Uurige selgesõnalisi väljalaiusi, baitide järjekorda ja voolu-I/O-d, selle asemel et pidada kompilaatori paigutust juhtmeprotokolli vorminguks.
Kehtiv puhverserveri aadress ei muuda käsitsi kirjutatud SOCKS-sõnumit kehtivaks. C või C++ struktuuri saatmine võib saata polsterdust või hostijärjekorras täisarve, mida protokoll ei nõudnud kunagi.
SOCKS5 domeeninimega CONNECT-päringu jaoks serialiseerige see jada selgesõnaliselt pärast meetodi läbirääkimist ja valitud autentimist:
- Versioon, käsk, reserveeritud bait ja aadressitüüp
- Domeeni pikkus ja domeeni baidid
- Kahebaidine sihtport võrgu baitide järjekorras
Aadresside pikkused sõltuvad SOCKS-i versioonist ja aadressitüübist. Fikseeritud laiusega numbriväljad vajavad ettenähtud esitust; domeeni stringidel on oma pikkuse kodeering. C-stringi lõpetaja ei ole üldine juhis lisada juhtmesõnumile null.
| Teostuse otsetee | Kontrollitav probleem |
|---|---|
| 32-bitise väärtuse omistamine 8-bitise osuti kaudu | See ei väljasta kõiki nelja baiti |
| Puhvri teisendamine suurema täisarvu osutiks | Joondust ja baitide järjekorda tuleb siiski käsitleda |
| Eeldada, et üks lugemine või kirjutamine on üks sõnum | TCP saab edastada ainult osa protokolli järjestusest |
Võrrelge iga välja kavandatud sihtkohaga ja käsitlege osalist I/O-d. Kahe baidi vastuvõtmine ei tõesta, et kogu vastus saabus. Nende piiride uurimine võib eristada vigast päringut serverist, mis keeldub õigesti kirjeldatud ühendusest.