global main
extern scanf
global vulnerable_function
section .data
format:db "%s",0
section .text
main:
push rbp
mov rbp, rsp
call vulnerable_function
mov rax,0
leave
ret
vulnerable_function:
push rbp
mov rbp, rsp
sub rsp,16
mov rdi, format
lea rsi, [rbp-10]
xor rax, rax
call scanf
leave
ret
Buffer di dimensioni fisse: La funzione vulnerable_function dichiara un buffer di dimensioni fisse char buffer[10];. Questo significa che può contenere al massimo 9 caratteri più il terminatore nullo.
Utilizzo di scanf senza limiti: La funzione scanf("%s", buffer); viene utilizzata per leggere una stringa dall'input utente e memorizzarla nel buffer. Tuttavia, scanf senza limiti di dimensione %s può scrivere più di 9 caratteri nel buffer se l'utente inserisce una stringa più lunga.
Buffer overflow: Se l'utente inserisce una stringa di 10 o più caratteri, scanf scriverà oltre i limiti del buffer di 10 byte, causando un buffer overflow. Questo può sovrascrivere dati importanti nello stack o causare comportamenti imprevisti e potenzialmente pericolosi nel programma.
Per rendere il codice più sicuro, è consigliabile utilizzare scanf in modo sicuro, limitando la lunghezza massima della stringa da leggere. Ad esempio, puoi utilizzare %9s nella stringa di formato per leggere al massimo 9 caratteri più il terminatore nullo.
scanf("%9s", buffer);
Questo assicura che scanf legga al massimo 9 caratteri, evitando così un buffer overflow nel buffer di dimensioni fisse. Inoltre, è sempre consigliabile fare ulteriori controlli e validazioni sui dati di input per garantire la sicurezza e l'integrità del programma.
#include <stdio.h>
#include <stdlib.h>
void vulnerable_function()
{
char buffer[10];
scanf("%s", buffer);
int main(int argc, char *argv[]){
vulnerable_function();
}
Edited by HCF - 2/5/2024, 14:19