Stap 7: Wat berichten te sturen?
ctrl_transfer (bmRequestType, bmRequest, wValue, wIndex, nBytes)
Deze opdracht kan doen zowel verzendende en ontvangende afhankelijk van wat bmRequestType zegt (input of output). Toch is er een heleboel opties hier. Voor het verzenden van de juiste opdracht waarvan u de naam wilt weten van de RequestType en de juiste verzoek en ther recht waarde, evenals de Index en hoeveel bytes te lezen of schrijven.
Als we volledig op onze eigen zouden, zou we beginnen door te proberen om gegevens te lezen van het apparaat. Dit betekent dat we moeten eerst de RequestType
Richting Type ontvanger
D7 D6 D5 D4 D3 D2 D1 D0
Voor bmRequestType is de doorgegeven waarde zeer gestructureerde, dus dat is niet zo moeilijk te raden. (Zie lvr.com voor meer informatie)
Bits, 2, 3 en 4 zijn reserves hen dus ingesteld op 0.
De richting is ingesteld door bits #7, 0 is een 'schrijven' uit het apparaat, 1 is een 'lezen' vanaf het apparaat
Het 'type' bericht is twee bits, 0 = standaard, 1 = klasse, 2 = leverancier, 3 = voorbehouden. Voor veel apparaten die niet-standaard, zult u waarschijnlijk willen 2 voor fabrikanttype. Als het een meer gangbare type apparaat, zoals een camera of microfoon, probeer 0 of 1. 3 wordt niet gebruikt
De laatste twee bits zijn usd om de geadresseerde voor het bericht 0 = apparaat, 1 = Interface, 2 = eindpunt, 3 = andere. Gaan met 0 om te beginnen, kunt u proberen 2 als er andere eindpunten
Het veiligste om te doen is het lezen van gegevens (geen manier om iets te overschrijven of configureren) kunt u dat doen door het verzenden van pakketten met 0b11000000 (Lees leverancier gegevens van het apparaat) = 0xC0.
Als ik moest schrijven van een fuzzer, zou ik beginnen met Index instellen op 0 en doorlopen alle de bytewaarden (255 verschillende waarden) van bmRequest en de eerste paar honderd wValues. Zijn vrij veilig om gewoon lezen willekeurige gegevens op een USB-apparaat. Begin met het lezen van één byte om te zien of om het even wat verschijnt, dan verhogen de waarde
usb.core importeren
usb.util importeren
importeren van sys
# find onze apparaat
dev = usb.core.find (idVendor = 0x045e, idProduct = 0x02B0)
# was het gevonden?
als dev geen:
verhogen van de ValueError ('apparaat niet gevonden')
# Stel de actieve configuratie. Zonder argumenten, de eerste
# configuratie is de actieve
dev.set_configuration()
# Laten we fuzz rond!
# Laat start door het lezen van 1 byte van het apparaat met behulp van verschillende verzoeken
# bRequest is een byte, dus er 255 verschillende waarden zijn
voor bRequest in range(255):
Try:
RET = dev.ctrl_transfer (0xC0, bRequest, 0, 0, 1)
afdrukken van "bRequest", bRequest
afdrukken ret
met uitzondering van:
# fout bij het ophalen van gegevens voor dit verzoek
Pass
Ziet eruit als verzoek waarden 0, 5, 16, 50, 54, 64, 80 en 112 die allemaal een soort van gegevens terug. De rest had niets te lezen
Volgende die we proberen zullen om meer gegevens te lezen door het veranderen van het laatste argument tot 100 bytes
OK veel gegevens, maar wat betekent het? Dit is waar sommige raden gebaseerd op het apparaat zelf zou van pas komen. Ik ben wel erg lui en als gegeven een optie om te voorkomen dat een heleboel giswerk, ik neem het!