La mappatura logica per l'indirizzo fisico viene eseguita dalla segmentazione e dalle unità di paging della CPU. Un processo (che significa sia il tuo programma che qualsiasi codice malevolo che viene eseguito nel suo spazio indirizzo) non conosce questa mappatura; vedono uno spazio di indirizzamento continuo, anche se lo spazio di indirizzamento potrebbe non essere mappato a regioni continue di memoria fisica da parte dell'unità di cercapersone.
Il tuo esempio non funziona, perché la dimensione della pagina, almeno su x86, è almeno di 4k. Quindi non possiamo avere un limite di pagina tra 0x100 e 0x104. Questi indirizzi si assocerebbero alla stessa memoria fisica, perché si troverebbero nella stessa pagina.
Tuttavia, ciò non importa, perché anche se il tuo codice dannoso ha scritto dati su un limite di pagina, ciò non avrebbe magicamente disattivato l'unità di paging; al contrario, l'unità di paging tradurrebbe l'indirizzo virtuale nell'indirizzo fisico dell'altra pagina.
È davvero piuttosto semplice. Supponendo che abbiamo a che fare con pagine 4k, le pagine iniziano con indirizzi fisici con gli ultimi 12 bit azzerati.
Gli ultimi 12 bit di qualsiasi indirizzo virtuale sono un offset in una pagina. Gli altri bit di un indirizzo vengono utilizzati per identificare la pagina in una tabella di pagina multistrato, che a sua volta memorizza l'indirizzo fisico della pagina.
Un programma in esecuzione (e che include qualsiasi codice malevolo in esecuzione nello stesso spazio indirizzo) non può scrivere direttamente agli indirizzi fisici; qualsiasi indirizzo fornito dalle istruzioni della macchina è considerato un indirizzo virtuale e finisce sempre per essere tradotto dalla segmentazione e dall'unità di paging della CPU, quindi il "gap" tra 0x1000 e 0x2000 che si percepisce non esiste per il programma.