Pages: 1 [2] 3 4 ... 7   Go Down
Author Topic: Sovrascrivere un indirizzo di memoria  (Read 6542 times)
0 Members and 1 Guest are viewing this topic.
Global Moderator
Italy
Offline Offline
Brattain Member
*****
Karma: 333
Posts: 22973
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Uhm.. non credo che tu possa fare quello che vuoi.  Non sono un esperto come mi dipinge Testato, però nell'Atmega le variabili statiche sono salvate nella prima parte della SRAM mentre lo stack è creato a partire dall'ultima locazione di SRAM a crescere verso il basso.
In mezzo c'è l'heap e l'area che raccoglie le variabili non inizializzate del programma. E la memoria libera.






* sram.jpeg (16.8 KB, 645x160 - viewed 38 times.)
Logged


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

Ma se creo una funzione mettiamo caso in c, senza pensare all'arduino language, in questo modo:

Code:
getInput(){
  char buff[8];
  getc(buff);
  putc(buff);
}

int main(){
  getInput();
  return 0;
}

la memoria sarà buff(8 byte), indirizzo del fp(2 byte), return address(2 byte). Quindi se sovrascrivo il buff mettendo 10caratteri da tastiera dovrei arrivare al return address, giusto?
Ora, vorrei applicarlo usando l'arduino language o comunque il c dentro un programmino arduino per la mia atmega2560.
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.

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 5017
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Solo una precisazione, non esiste un "Arduino language".
In uno sketch Arduino si scrive in C o C++ in quanto il tutto viene compilato dal avr-gcc (compilatore gnu c per gli avr).
Arduino ha dietro un framework chiamato Wire, un insieme di librerie e un main che "nasconde" la solita struttura main() di un qualsiasi programma C e che richiama una volta la setup() e in un ciclo infinito la loop().
I sorgenti di questi codici sono nelle cartelle dell'IDE (....\arduino-IDE\hardware\arduino\cores\arduino). Ci troverai anche un bel main.c

Code:
#include <Arduino.h>
int main(void)
{  init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
    for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}

Logged

my name is IGOR, not AIGOR

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 5017
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Hai partecipato a questa discussione (vedo un Darkcoffee)?
http://electronics.stackexchange.com/questions/78880/exploiting-stack-buffer-overflows-on-an-arduino
Sembra l'unica cosa che si trovi in internet sull'argomento

E poi mi sembra che il grande @Gammon del forum ti ha trovato la soluzione :
http://forum.arduino.cc/index.php?topic=182559.msg1356108#msg1356108

Però quel che non mi è chiaro è la motivazione su un Atmel. Il codice che viene iniettato è comunque nel tuo sketch.
Di solito un attacco del genere su PC viene fatto da un codice sul codice di un altro programma.
Al limite mi viene in mente un attacco del genere ad un Arduino su cui gira un server (Ethernet library) e attraverso http gli passi richieste anomale.
« Last Edit: August 17, 2013, 04:47:14 am by nid69ita » Logged

my name is IGOR, not AIGOR

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

Solo una precisazione, non esiste un "Arduino language".
In uno sketch Arduino si scrive in C o C++ in quanto il tutto viene compilato dal avr-gcc (compilatore gnu c per gli avr).
Arduino ha dietro un framework chiamato Wire, un insieme di librerie e un main che "nasconde" la solita struttura main() di un qualsiasi programma C e che richiama una volta la setup() e in un ciclo infinito la loop().
I sorgenti di questi codici sono nelle cartelle dell'IDE (....\arduino-IDE\hardware\arduino\cores\arduino). Ci troverai anche un bel main.c

Code:
#include <Arduino.h>
int main(void)
{  init();
#if defined(USBCON)
USBDevice.attach();
#endif
setup();
    for (;;) {
loop();
if (serialEventRun) serialEventRun();
}
return 0;
}



mmm, sono un po' confusa.
Dalla pagina di arduino,  ho letto questo
Quote
Can I program the Arduino board in C?
In fact, you already are; the Arduino language is merely a set of C/C++ functions that can be called from your code. Your sketch undergoes minor changes (e.g. automatic generation of function prototypes) and then is passed directly to a C/C++ compiler (avr-g++). All standard C and C++ constructs supported by avr-g++ should work in Arduino. For more details, see the page on the Arduino build process.
Mentre qui c'è una serie di funzioni, strutture e variabili: http://arduino.cc/en/Reference/HomePage
Inoltre quando ho voluto usere printf e scanf ho dovuto configurare l'uart e aprire stdout e stdin.


Hai partecipato a questa discussione (vedo un Darkcoffee)?
http://electronics.stackexchange.com/questions/78880/exploiting-stack-buffer-overflows-on-an-arduino
Sembra l'unica cosa che si trovi in internet sull'argomento

E poi mi sembra che il grande @Gammon del forum ti ha trovato la soluzione :
http://forum.arduino.cc/index.php?topic=182559.msg1356108#msg1356108

Però quel che non mi è chiaro è la motivazione su un Atmel. Il codice che viene iniettato è comunque nel tuo sketch.
Di solito un attacco del genere su PC viene fatto da un codice sul codice di un altro programma.
Al limite mi viene in mente un attacco del genere ad un Arduino su cui gira un server (Ethernet library) e attraverso http gli passi richieste anomale.

Si, la discussione su electronics.stackexchange l'ho aperta io. Le risposte sono stati interessanti, il paper che mi ha proposto Warren Young l'avevo già letto. Il problema è che ho bisogno di trovare la strada giusta, perchè non riesco, in modo pratico, ad andare avanti.
E' vero, Gammon mi sta aiutando, è molto bravo e spiega bene. 
Spero che con questo forum, molto preparato, riesco ad uscire da questo problema.

Inizialmente sto creando io la vulnerabilità, dopo che questo primo esperimento è stato fatto, dovrei cercarlo di applicarlo ad un programma che mi hanno dato loro. Ed infatti, proprio in questo programma c'è l'invio di messaggi tramite tcp. Quindi l'idea è quella di mandare un pacchetto con una grandezza giusta e con il giusto payload.
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
Offline Offline
Faraday Member
**
Karma: 47
Posts: 5981
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ho provato anche io per curiosita' il codice di Gammon, ed anche a me non funziona sulla mega, probabilmente funziona solo sul 328P ?

qualcuno mi spiega come funziona il codice di Gammon ?  smiley-roll-sweat
Code:
unsigned int * stack = (unsigned int *) SP;
  stack [1] = (unsigned int) bar;

grazie
Logged

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

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 5017
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

@Testato: da quel che dice @gammon SP è un variabile che ritorna indirizzo dello stack (messo a disposizione non sò da chi, forse il compilatore).  Assegna questo valore a variabile stack. Poi con stack[1] va a scrivere oltre al puntatore di una cella. e ci scrive indirizzo della funzione bar. In teoria all'uscita della funzione loop() non dovrebbe tornare al chiamante (la main) ma alla bar() stampando il msg e fermandosi (non siamo più nella main)
Invece di usare array uoi anche scrivere:
Code:
*(stack+1) = (unsigned int) bar;  

A me funziona su Arduino Uno R3 con IDE 1.0.5.  
NON funziona su Mega   smiley-sad
« Last Edit: August 17, 2013, 08:18:39 am by nid69ita » Logged

my name is IGOR, not AIGOR

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 5017
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Come dice alla prima pagina, è C++.  Poi alla reference si "parla" di linguaggio Arduino per semplicità , secondo me.

Mentre qui c'è una serie di funzioni, strutture e variabili: http://arduino.cc/en/Reference/HomePage
Inoltre quando ho voluto usere printf e scanf ho dovuto configurare l'uart e aprire stdout e stdin.

Ma tu non usi l'IDE Arduino ma Atmel Studio. Arduino IDE magicamente mette insieme le librerie e il core senza doverle includere nel progetto. Se usi il IDE Arduino e metti il verbose vedi tutti le cose automatiche che fa di sotto Arduino. Mi sembra che alcune librerie le capisce da quali include tu metti. Credo che l'IDE analizzi anche il sorgente per capire quali librerie includere.
Logged

my name is IGOR, not AIGOR

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

In realtà ho iniziato ad usare Atmel Studio perchè volevo fare il debugging per capire l'indirizzi di memoria. Ho dovuto settarlo aggiuggendoci tutte le librerie di Arduino per linkarle in compilazione. In più ho aggiunto anche il core di arduino.
Ma alla fine, se riesco a capire come sovrascrivere il return address senza Atmel Studio, per me va bene lo stesso.
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.

ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 5017
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

A me l'esempio funziona. Se togli il while() dalla funzione bar() non capisco perchè ma su Monitor Seriale vedi solo una y con puntini sopra
(non funziona su Mega!!!)

Ho provato a anche a pacioccare un pò ma funziona ancora:
Code:
void setup ()
{ delay(2000);
  Serial.begin(9600);
}  // end of setup

void bar ()
{ Serial.println ("hacked!");
  while (true);  
}

void mybar()
{ bar();
  while (true);  
}
  
void foo ()
{ Serial.println ("in foo.");
  // corrupt return address
  unsigned int * stack = (unsigned int *) SP;
  *(stack+1) = (unsigned int) mybar;
}
  
void loop ()
{ foo ();
}  // end of loop
« Last Edit: August 17, 2013, 08:19:06 am by nid69ita » Logged

my name is IGOR, not AIGOR

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

Ci sono alcune costanti predefinite in alcuni file della toolchain che il compilatore, quando le trova, le sostituisce con determinati indirizzi. Ad esempio SP è lo Stack Pointer. Ci sono valori generici per tutti i chip ed altri specifici per singolo micro. Aprite la cartella della toolchain in /avr/avr/include/avr.
Common.h ad esempio contiene gli indirizzi dello stack SP, poi c'è iom328p.h che contiene le cose specifiche dell'Atmega328P e iom2560.h che contiene quelle dell'ATmega2560.
Logged


ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 5017
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Grazie per le info @Leo   smiley
Logged

my name is IGOR, not AIGOR

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

Una domanda, dato che non ho la Mega.
Cos'è che fa, esattamente, lo sketch di Gammon su questa scheda? Che output da?
Logged


ivrea (to)
Offline Offline
Faraday Member
**
Karma: 87
Posts: 5017
miaaao ^-^
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Una domanda, dato che non ho la Mega.
Cos'è che fa, esattamente, lo sketch di Gammon su questa scheda? Che output da?

Code:
in foo.
hacked!

Il codice di gammon a me funziona solo su Uno. non su Mega.
Logged

my name is IGOR, not AIGOR

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

Appunto chiedevo l'output della Mega  smiley-sweat smiley-sweat
Una domanda, dato che non ho la Mega.
Cos'è che fa, esattamente, lo sketch di Gammon su questa scheda? Che output da?
smiley-yell
Logged


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