Pages: 1 ... 4 5 [6] 7   Go Down
Author Topic: Sovrascrivere un indirizzo di memoria  (Read 5619 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

una altra questione, per nulla chiara fino a quando non si va ad indagare: come si era intuito il ret_addr e' condizionato dalle decisioni della machine layer, quindi un po' mi aspettavo che compilando con diverse direttive avrei ottenuto risultati diversi

gcc -O1 -> usa un registro per il ret_addr, vanifica l'exploit
gcc -O0 -> usa lo stack per il ret_addr, appaga l'exploit

per cui ... credo che diventi molto aleatorio condurre con successo questo tipo di attacco: bisogna sperare e pregare che chi ha compilato il pezzo di codice sotto exploit
1) non abbia usato versioni safe dei manipolatori di buffer, che esistono definite anche per il C
2) non abbia usato direttive di compilazione che usano i registri piuttosto che lo stack per il ret_addr

altrimenti semplicemente e' vano

Sto leggendo piano piano tutto il discorso e sono arrivata qui, dove parlavi dei vari flag.
Sono andata a controllare come arduino 1.5.2 compila il pezzo di codice ed è risultato questo:
Code:
avr-gcc -c -g -Os -w -ffunction-sections -fdata-sections -MMD -mmcu=atmega2560 -DF_CPU=16000000L -DARDUINO=152 -I....
arduino 100:
Code:
avr-gcc -c -g -Os -Wall -ffunction-sections -fdata-sections -mmcu=atmega1280 -DF_CPU=16000000L -DARDUINO=100 -I...
trovandomi dacanti ad un -Os
Nel manuale c'è scritto:
Quote
Optimize for size. -Os enables all -O2 optimizations that do not typically increase code size. It also performs further optimizations designed to reduce code size.

-Os disables the following optimization flags:

          -falign-functions  -falign-jumps  -falign-loops
          -falign-labels  -freorder-blocks  -freorder-blocks-and-partition
          -fprefetch-loop-arrays  -ftree-vect-loop-version
Ma so non se fa qualcosa con il return address...

Lock senza nessun karma non si poteva vedere  smiley

+1 anche da me!
« Last Edit: August 24, 2013, 09:31:19 am by DarkCoffee » 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: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Forse la lettura di queste info può aiutarvi:
http://gcc.gnu.org/wiki/avr-gcc#Register_Layout

Spiega come vengono usati alcuni dei registri che vedete spesso salvati/ripristinati.
Ad esempio, i registri R28/R29 sono usati proprio per accedere allo stack:
Quote
In order to access stack locations, avr-gcc will set up a 16-bit frame pointer in R29:R28 (Y) because the stack pointer (SP) cannot be used to access stack slots.
Logged


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

Difatti disassemblando un qualsiasi sketch per Atmega328P si trovano tra le prime operazioni compiute le seguenti:

Code:
  6c: cf ef        ldi r28, 0xFF ; 255
  6e: d8 e0        ldi r29, 0x08 ; 8

Questo codice carica i registri r29:r28 con i valori $08:$FF
$08FF è l'indirizzo dell'ultimo byte di SRAM del microcontrollore: $08FF = 231010 
(La SRAM ricordo che contiene 256 byte extra usati per mappare i suoi registri. Difatti 2047 (2 kB) + 256 dà proprio 2303)

Quindi R29:R28 formano l'SP.
Logged


0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10448
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

non capita tutti igiorni di avere discussioni di questa corposità smiley

compliemnti lock, per me spieghi molto bene, e come al solito complimenti a leo che non perde un colpo!

Quote
NOTA: perche' l'istruzione successiva alla call addr e' PC+2 ? Perche' le istruzioni sono a 16bit, nel corpetto hardcoded ci sono 6 bit in quei primi 16, e seguono altri 16 bit di LSB addr, per un totale di 6+16=22bit di hardcoded addr, quindi in totale la call si compone di 2 parole da 16bit!
intendevi +3 o sono io che non ho capito qualcosa?

Quote
In order to access stack locations, avr-gcc will set up a 16-bit frame pointer in R29:R28 (Y) because the stack pointer (SP) cannot be used to access stack slots.
cosa vuol dire? non capisco a che serva SP a qusto punto
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

0
Offline Offline
Shannon Member
****
Karma: 130
Posts: 10448
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ahhh ok, capito! molto chiaro l'esempino, uso un sistema simile per inviare più in fretta le letture ADC (10bit) via seriale, concetenandone più di una senza sprecare i 6 bit che avanzerebbero.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

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

Sì, è vero.
Anche l'inizializzazione iniziale completa è questa:
Code:
  6c: cf ef        ldi r28, 0xFF ; 255
  6e: d8 e0        ldi r29, 0x08 ; 8
  70: de bf        out 0x3e, r29 ; 62
  72: cd bf        out 0x3d, r28 ; 61
Logged


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

In questi due giorni non sono stata molto bene, quindi ho perso un po' il filo. Domani credo che ritornerò ad avere la giusta concentrazione.

Una domanda al volo per vedere se ho capito bene.
Siccome l'obiettivo è fare l'exploit della memoria in modo tale che quando finisce la funzione possa puntare ad un altro punto della memoria, questa nuova locazione deve per forza far parte della flash, giusto?
Da quanto c'è scritto qui http://arxiv.org/abs/0901.3482 nel capitolo "The memories" potrei anche puntare ad una locazione nella program memory.
Mi sfugge qualcosa  smiley-confuse
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: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

La Flash è divisa in 2 aree, l'Application Flash Section e la Boot Flash Section.
Si tratta sempre di Flash, perché un micro può eseguire del codice solo se questo risiede nella Flash.

Poi c'è distinzione fra area Application e area Boot in quanto un codice eseguito nell'area Boot può scrivere in quella Application a runtime ma un codice che gira in Application non può scrivere su sé stesso.
Logged


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

però lo stack è sull'altra memoria, giusto?

Questo è per l'atmega128, che dovrebbe essere uguale alla 1280


* memory.jpeg (28.7 KB, 430x353 - viewed 17 times.)
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: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Lo stack sta sempre in RAM, come tutto il resto dei dati creati a runtime (tipo heap e variabili)
Logged


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

Aspetta un secondo, cerco di mettere ordine.

Questa è la figura che è a pagina tre nel reply #42, giusto?

Che quindi sarebbe la Data Address Space che però è divisa dalla flash. Guarda  nell'allegato.
Mi sbaglio?



* Memories.jpeg (24.72 KB, 395x423 - viewed 17 times.)
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: 325
Posts: 22498
Logic is my way
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Sì, è la RAM. Che è fisicamente divisa dalla Flash.
Ora, io non conosco bene l'Atmega128 (non potendolo programmare tramite Arduino non ne ho mai studiato il datasheet) però so che può avere RAM esterna, come l'Atmega1280/2560. Non so se può avere Flash esterna, ma dal disegno che metti pare di sì. Ma non credo che possa eseguire da questa Flash esterna un programma perché vedo dallo schema che la Program Address Space è sempre quella interna.

Ma tutto questo per giungere a cosa? Cos'è che stai pensando?  smiley-wink
Logged


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

Una volta fatto l'exploit volevo puntare ad una locazione di memoria dove risiede un pezzo di programma (quindi nell'applicazion code) per poterlo fare eseguire. Sempre facendo tutto passo passo.
Il passo successivo ancora è di completare l'esperimento facendo usare un pezzo di programma, ma che finisce con il ret, così l'attacco non va in crash, ma esegue il codice che desidero.
L'attacco è l'ROP (return-oriented programming).
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.

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

L'idea è quella di mandare un messaggio, e qui si ricollega anche al mio codice iniziale, che possa sovrascrivere lo stack in un modo da andare ad inserire indirizzi di parti di codice che finiscano con il ret, cosicchè una volta che vorrà fare il return troverà gli indirizzi, come in questa situazione (ovviamente non con la libc):



Le slides del paper principale che parla di questo attacco sono qui: http://www.docstoc.com/docs/39341604/Return-oriented-Programming-Exploitation-without-Code-Injection

« Last Edit: August 27, 2013, 06:28:57 pm by DarkCoffee » 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.

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

Grazie, già ce l'avevo smiley-wink
Anzi se sei interessato, qui (clicca) c'è proprio il paper completo

già è molto furbo e raffinato, ma anche molto complicato, soprattutto per l'atmega con l'arduino...
però sul paper che avevo linkato prima ( http://arxiv.org/abs/0901.3482 ) qualcuno l'ha fatto su un atmega128, non credo con arduino...
« Last Edit: August 27, 2013, 07:06:01 pm by DarkCoffee » 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 ... 4 5 [6] 7   Go Up
Jump to: