Perché è un buffer di dimensione fissa (array) devono essere pericoloso?
-
04-10-2019 - |
Domanda
dire Let voglio avere un tipo di valore di 7 byte (o 3 o 777).
posso definirlo così:
public struct Buffer71
{
public byte b0;
public byte b1;
public byte b2;
public byte b3;
public byte b4;
public byte b5;
public byte b6;
}
Un modo semplice per definire che usa una buffer fisso
public struct Buffer72
{
public unsafe fixed byte bs[7];
}
Naturalmente la seconda definizione è più semplice. Le bugie problema con la parola pericoloso che deve essere fornita per i buffer fissi. Capisco che questo è implementato utilizzando puntatori e quindi pericoloso.
La mia domanda è perché ha a essere pericoloso? Perché C # non possono fornire matrici lunghezza costante arbitraria e tenere come un tipo di valore invece di renderlo un C # riferimento di tipo matrice o insicuri buffer?
Soluzione
Poiché un "buffer fisso" non è un array reale. Si tratta di un tipo di valore personalizzato, l'unico modo per generare uno nel linguaggio C #, che io sappia. Non v'è alcun modo per il CLR per verificare che l'indicizzazione della matrice è fatto in modo sicuro. Il codice non è verificabile sia. La dimostrazione più grafica di questo:
using System;
class Program {
static unsafe void Main(string[] args) {
var buf = new Buffer72();
Console.WriteLine(buf.bs[8]);
Console.ReadLine();
}
}
public struct Buffer72 {
public unsafe fixed byte bs[7];
}
È possibile accedere arbitrariamente lo stack frame in questo esempio. La tecnica di iniezione di buffer overflow standard sarebbe disponibile a codice dannoso per rattoppare l'indirizzo di ritorno della funzione e forzare il codice per passare a una posizione arbitraria.
Sì, che è abbastanza pericoloso.