Gli stack overflow sono possibili usando memcpy con i moderni compilatori?

1

In questi giorni memcpy è protetto da un'interfaccia chiamata _memcpy_chk, che controlla la dimensione del buffer di destinazione in fase di runtime. Dopo aver letto il codice sorgente per _memcpy_chk all'indirizzo link sembra che una solida mitigazione.

I buffer overflow con memcpy sono semplicemente impossibili su computer moderni semplicemente impossibili a questo punto? Dovremmo anche preoccuparci di cercarli su programmi compilati correttamente?

    
posta baordog 09.03.2016 - 00:50
fonte

1 risposta

1

Sembra che sia ancora possibile traboccare se provi (o fai semplicemente un errore) con questo esempio implementazione di memcpy :

$ cat mc.c
#include <string.h>
#include <stdio.h>

#undef memcpy
#define bos0(dest) __builtin_object_size (dest, 0)
#define memcpy(dest, src, n) \
    __builtin___memcpy_chk (dest, src, n, bos0 (dest))

int main() {
    char baz[64];
    char bar[16];    
    char foo[16];
    char* f = foo;
    char* b = baz;
    int len = 26;

    strncpy(baz, "abcdefghijklmnopqrstuvwxyz", 26);
    memset(bar, 0, sizeof(bar));
    memcpy(f, b, len); // [a-z] is bigger than foo, will overflow into bar
    printf("Evidence of buffer overflow: %s\n", bar);
    printf("now press enter to see runtime detection working properly: \n");
    (void)getchar(); // pause for user input
    memcpy(foo, bar, len);  // buffer overflow detected at runtime
    return 0;
}
$ g++ -Wall mc.c
$ ./a.out
Evidence of buffer overflow: qrstuvwxyz
now press enter to see runtime detection working properly: 

*** buffer overflow detected ***: ./a.out terminated
======= Backtrace: =========
/lib/x86_64-linux-gnu/libc.so.6(+0x731af)[0x7fe0327391af]
    <snip>
Aborted
$ 
    
risposta data 09.03.2016 - 02:49
fonte

Leggi altre domande sui tag