Go Down

Topic: Sovrascrivere un indirizzo di memoria (Read 7938 times) previous topic - next topic

Salve a tutti,

sto cercando di sovrascrivere l'indirizzo di memoria del return con un altro indirizzo di memoria.
Per fare questo ho creato un buffer overflow con questo codice:

Code: [Select]


void readSerialString () {
char buffer[8]; char smallBuffer[4]={0,0,0,0};

int sb;
if(Serial.available()) {
    while (Serial.available()){
        sb = Serial.read();
        buffer[indexB] = sb;
        indexB++;
    }
}
if( indexB > 0) {
    strcpy(smallBuffer,buffer);
    Serial.print("You said: ");
    for(count=0; count < indexB; count++) {
        Serial.print( smallBuffer[count] );
    }
    count = 0;
    indexB  = 0;
    Serial.println();
}

}

Ma non riesco ad andare avanti...
The creatures outside looked from pig to man, and from man to pig, and from pig to man again: but already it was impossible to say which was which.

leo72


sto cercando di sovrascrivere l'indirizzo di memoria del return con un altro indirizzo di memoria

Non mi pare tu stia lavorando con i puntatori. Cos'è che vuoi fare, scusa? Mica l'ho capito.
A me pare che tu stia copiando un array in un altro e poi lo ristampi.

Qui è tutto il codice:
Code: [Select]
#define F_CPU=16000000
#define ARDUINO 100
#include "Arduino.h"
#include <stdio.h>

int  indexB  = 0;
int  count = 0;

void setup();
void loop();
void readSerialString ();
void printHacked();


void setup(){
Serial.begin(115200);
Serial.println("Hello World");
}

void loop(){
readSerialString();
Serial.println ("-");
delay(1500);
}

void readSerialString () {
char buffer[8];
char smallBuffer[4]={0,0,0,0};

int sb;
if(Serial.available()) {
while (Serial.available()){
sb = Serial.read();
buffer[indexB] = sb;
indexB++;
}
}
if( indexB > 0) {
strcpy(smallBuffer,buffer);
Serial.print("You said: ");
for(count=0; count < indexB; count++) {
Serial.print( smallBuffer[count] );
}
count = 0;
indexB  = 0;
Serial.println();
}
}

void printHacked(){
Serial.println("Hacked!");
}


sto cercando di fare una cosa simile a "Exploiting stack buffer overflows" che puoi vedere qui: http://en.wikipedia.org/wiki/Stack_buffer_overflow
The creatures outside looked from pig to man, and from man to pig, and from pig to man again: but already it was impossible to say which was which.

uwefed

Ma perché o per cosa vuoi farlo?
Ciao Uwe

Sto lavorando ad un progetto all'università.
L'idea è di attaccare il codice sulla board in modo da gestire il flusso di memoria.
The creatures outside looked from pig to man, and from man to pig, and from pig to man again: but already it was impossible to say which was which.

Testato

- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Scusa, non ho capito cosa vuoi dire...
The creatures outside looked from pig to man, and from man to pig, and from pig to man again: but already it was impossible to say which was which.

Testato

tranquillo, significa che sono interessato al topic, e quindi mi ritrovero' le risposte automaticamente in alto a destra, sezione Replies.
Del topic in se non so nulla  :)
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

uwefed


Sto lavorando ad un progetto all'università.
L'idea è di attaccare il codice sulla board in modo da gestire il flusso di memoria.


More informations please

leo72

Credo che ci sia alla base un concetto errato.
Un conto è far girare un programma su un computer con un sistema operativo che sovrintende al controllo degli accessi alla memoria, un conto è far girare un programma su un microcontrollore dove non c'è sistema operativo e dove il controllo sulla memoria lo deve fare l'utente stesso in fase di stesura di codice.

Se tu su un computer crei un array e poi cerchi di andare fuori dai suoi limiti credo (ma non lo so con certezza non essendo un sistemista) che sia lo stesso sistema operativo che vede accedere ad un'area di memoria non assegnata a quel programma a bloccare il software, e poi quindi generare l'errore di overflow.
Su un microcontrollore, invece, puoi benissimo accedere al di fuori di un array. Non riceverai nessun tipo di errore perché non c'è nessuno a dirti che hai fatto una cosa che non potevi fare. Te ne potresti accorgere, però, per via di effetti indesiderati che la tua azione potrebbe provocare. Tu sai che un microcontrollore come l'Atmel Atmega328P lavora con architettura Harvard, quindi ha la memoria del programma (Flash) separata dalla memoria dei dati (SRAM). In questa ultima memoria il micro crea le variabili del programma, tiene l'heap per l'allocazione dinamica delle risorse e crea lo stack. Accedendo al di fuori dei limiti di un array potresti semplicemente andare a leggere/scrivere in un'area di SRAM inutilizzata che però contiene dati precedentemente salvati lì. Scrivendoci sopra non avresti nessun problema, leggendoci potresti tirare fuori informazioni senza senso che potrebbero alterare il tuo programma. Oppure potresti anche andare a scrivere su parti usate dal resto del programma oppure dalla stessa CPU, ad esempio potresti scrivere su una porzione dello stack! Pensa se in quel momento il chip avesse salvato i registri per una chiamata ad una ISR, tu andresti ad alterare lo stato salvato del micro. Al ripristino, le conseguenze potrebbero essere qualunque, anche un improvviso blocco e reset.

A me è capitato l'altro giorno. Lavoravo ad un progetto molto complesso e leggevo/scrivere diverse decine di dati dalla EEPROM . Mi sono accorto che all'avvio il progetto funzionanva come doveva, mentre al successivo reset perdevo l'uso di una fila di pulsantini di una tastierina 4x4 collegata  ;) Alla fine ho capito che al primo avvio scrivevo le info sulla EEPROM e contemporaneamente caricavo i dati in un array, mentre al reset seguente andavo a caricare i dati in un array al di fuori dei suoi limiti, ed il chip si comportava nel modo che ti ho descritto  ;)

Grazie per l'aiuto!

Il progetto su cui sto lavorando è far un attacco sulla board (precisamente una atmega2560), utilizzando proprio il buffer overflow.
Quello che devo fare è sovrascrivere lo stack fino al raggiungimento del return address e quindi sovrascriverlo con un puntatore.
Secondo te è possibile farlo?
Il return address dovrebbe essere salvato nello stack, come i dati del buffer che vado a scrivere, giusto?
The creatures outside looked from pig to man, and from man to pig, and from pig to man again: but already it was impossible to say which was which.

Testato

#11
Aug 16, 2013, 04:27 pm Last Edit: Aug 16, 2013, 04:30 pm by Testato Reason: 1
ma vista la struttura della ram basta scrivere uno sketch che la riempie ed hai il tuo bel crash  :) perche' va a sovrascrivere lo stack
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

perchè quando sovrascrivo il return address con un puntatore ad un altro punto della memoria posso far partire una parte del programma che non era previsto.
The creatures outside looked from pig to man, and from man to pig, and from pig to man again: but already it was impossible to say which was which.

Testato

ok, alzo le mani allora, non e' il mio campo, Leo di certo sapra' risponderti
ma e' a titolo di studio ? credo stiamo parlando di una specie di virus ? integri nello sketch un qualcosa e solo tu poi saprai come arrivare a farlo partire ?
- [Guida] IDE - http://goo.gl/ln6glr
- [Lib] ST7032i LCD I2C - http://goo.gl/GNojT6
- [Lib] PCF8574+HD44780 LCD I2C - http://goo.gl/r7CstH

Si si è a titolo di studio, esattamente per la tesi  =(
Comunque grazie per cercarmi di aiutare!
The creatures outside looked from pig to man, and from man to pig, and from pig to man again: but already it was impossible to say which was which.

Go Up