Pages: [1] 2 3 ... 7   Go Down
Author Topic: Sovrascrivere un indirizzo di memoria  (Read 6375 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Jr. Member
**
Karma: 2
Posts: 71
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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:

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...
Logged

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.

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged


Offline Offline
Jr. Member
**
Karma: 2
Posts: 71
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Qui è tutto il codice:
Code:
#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
Logged

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.

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21656
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Ma perché o per cosa vuoi farlo?
Ciao Uwe
Logged

Offline Offline
Jr. Member
**
Karma: 2
Posts: 71
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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

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.

0
Online Online
Faraday Member
**
Karma: 47
Posts: 5903
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

x iscrizione
Logged

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

Offline Offline
Jr. Member
**
Karma: 2
Posts: 71
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Scusa, non ho capito cosa vuoi dire...
Logged

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.

0
Online Online
Faraday Member
**
Karma: 47
Posts: 5903
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley
Logged

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

BZ (I)
Offline Offline
Brattain Member
*****
Karma: 266
Posts: 21656
+39 349 2158303
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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
Logged

Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 332
Posts: 22811
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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  smiley-wink 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  smiley-wink
Logged


Offline Offline
Jr. Member
**
Karma: 2
Posts: 71
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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?
Logged

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.

0
Online Online
Faraday Member
**
Karma: 47
Posts: 5903
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ma vista la struttura della ram basta scrivere uno sketch che la riempie ed hai il tuo bel crash  smiley perche' va a sovrascrivere lo stack
« Last Edit: August 16, 2013, 09:30:21 am by Testato » Logged

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

Offline Offline
Jr. Member
**
Karma: 2
Posts: 71
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

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.
Logged

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.

0
Online Online
Faraday Member
**
Karma: 47
Posts: 5903
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

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 ?
Logged

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

Offline Offline
Jr. Member
**
Karma: 2
Posts: 71
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Si si è a titolo di studio, esattamente per la tesi  smiley-cry
Comunque grazie per cercarmi di aiutare!
Logged

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.

Pages: [1] 2 3 ... 7   Go Up
Jump to: