Paso 7: ¿Qué mensajes para enviar?
ctrl_transfer (bmRequestType, bmRequest, wValue, wIndex, nBytes)
Este comando puede hacer tanto enviar y recibir dependiendo de lo que bmRequestType dice (entrada o salida). Aún así, hay un montón de opciones aquí. Para enviar el comando derecho necesita conocer el RequestType y la petición de derecho y allí derecho valor así como el índice y cuántos bytes para leer o escribir.
Si estuviéramos totalmente solos, comenzamos por intentar leer datos desde el dispositivo. Esto significa que tenemos que establecer primero el RequestType
Tipo de dirección destinatario
D7 D6 D5 D4 D3 D2 D1 D0
Para bmRequestType el valor pasado es muy estructurado, por lo no es tan difícil de adivinar. (Véase lvr.com para más información)
Brocas de 2, 3 y 4 son reservas así les a 0.
La dirección está fijada por broca #7, 0 es un 'escritura' hacia fuera el dispositivo, 1 es una lectura desde el dispositivo
Tipo de mensaje es de dos bits, 0 = estándar, 1 = clase, 2 = vendedor, 3 = reservado. Para muchos dispositivos que no son estándar, usted probablemente querrá 2 para el tipo vendedor. Si es un tipo más estándar de dispositivo, como una cámara o un micrófono, trate de 0 o 1. 3 es
Los dos últimos bits son usd para determinar el destinatario para el mensaje 0 = dispositivo, 1 = interfaz, 2 = extremo, 3 = otro. Ir con 0 para empezar, usted puede intentar 2 si hay otros extremos
La cosa más segura a hacer es leer los datos (no modo Sobrescribir nada ni configurar) puede hacerlo mediante el envío de paquetes con 0b11000000 (datos de proveedores de lectura de dispositivo) = 0xC0.
Si tuviera que escribir a un fuzzer, empezaría índice 0 y recorrer todos los valores de byte (255 valores diferentes) de bmRequest y el primer cientos wValues pocos. Su caja fuerte bastante para solo lee datos al azar a un dispositivo USB. Empezar por leer un byte para ver si algo demuestra para arriba, a continuación, aumentar el valor
importación usb.core
importación usb.util
Import sys
# encontrar nuestro dispositivo
dev = usb.core.find (idVendor = 0x045e, idProduct = 0x02B0)
¿# fue encontrado?
Si dev ninguno:
elevar ValueError ('dispositivo no encontrado')
# establecer la configuración activa. Sin argumentos, el primero
# configuración será el activo
dev.set_configuration()
# Vamos a pelusa alrededor!
# Permite inicio de lectura de 1 byte desde el dispositivo usando diversas peticiones
bRequest de # es un byte, por lo que existen 255 valores diferentes
para bRequest en range(255):
tratar de:
RET = dev.ctrl_transfer (0xC0, bRequest, 0, 0, 1)
Imprimir "bRequest", bRequest
impresión ret
excepto:
# no se pudo obtener datos para esta solicitud
pasar
Se parece a petición los valores 0, 5, 16, 50, 54, 64, 80 y 112 que todos volver a algún tipo de datos. El resto no tenía nada que leer
A continuación intentaremos leer más datos cambiando el argumento pasado a 100 bytes
OK muchos datos, pero ¿qué significa? Esto es donde algunas adivinanzas basado en el dispositivo sí mismo vendría práctico. Sin embargo estoy terriblemente perezoso y si se les da una opción para evitar un montón de conjeturas, me quedo!