Pages: 1 ... 5 6 [7] 8   Go Down
Author Topic: Sovrascrivere un indirizzo di memoria  (Read 4359 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Edison Member
*
Karma: 11
Posts: 1489
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

intendevi +3 o sono io che non ho capito qualcosa?

Code:

     ------------------
PC+0 CALL_OP   xx.xx.xx <- 6bit MSB_ADDR
     ------------------
PC+1 xxxxxxxxxxxxxxxxxx <- 16bit LSB_ADDR
     ------------------
PC+2 .. nextinstruction


x significa hardcoded nella stessa istruzione call, che porta 6bit+16bit = 22bit ADDR!
Logged

0
Offline Offline
Shannon Member
****
Karma: 117
Posts: 10102
:(){:|:&};: TOX id: fcb8e918bef08581e23f6ddf9d4dba77697c25b217bf372736ed959a95fde36df5b8c5b90fbb
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

my Arduino code: https://github.com/lestofante/arduinoSketch
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Edison Member
*
Karma: 11
Posts: 1489
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Su Avr8 l'iter con cui si accede ad SP non e' diretto ma indiretto, osservo nella machine layer (oltre ad un sacco di segnalazioni bugs) che copiarne il valore corrente in {r28,r29} passa da due istruzioni "In from I/O location".

Code:

        push r28
        push r29
        in r28,__SP_L__
        in r29,__SP_H__

Da quanto osservo, const:
__SP_L__ = 0x3D
__SP_H__ = 0x3E
Logged

Global Moderator
Italy
Online Online
Brattain Member
*****
Karma: 313
Posts: 21616
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
Online Online
Brattain Member
*****
Karma: 313
Posts: 21616
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 9 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
Online Online
Brattain Member
*****
Karma: 313
Posts: 21616
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 10 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
Online Online
Brattain Member
*****
Karma: 313
Posts: 21616
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
Edison Member
*
Karma: 11
Posts: 1489
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Come funziona la seconda cosa che hai citato ? Rientrando non hai, o meglio come fai, ad avere uno stack corretto per poter chiudere il giro indolore ?
Io se noti metto una cpu_halt() nella hacked proprio perche' una volta che corrompi la ret_addr e finisci altrove, e' dura ripristinare lo stack in modo corretto.

Non che non si possa fare, pero' mi sfugge come farlo in un attacco, cioe', per farlo io introduco del codice apposito, un attacco va su sistemi vittima.
Logged

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
Edison Member
*
Karma: 11
Posts: 1489
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Molto raffinato e furbo.

p.s.
stesso pdf (clicca), ma che puoi scaricare liberamente.
Logged

Pages: 1 ... 5 6 [7] 8   Go Up
Jump to: