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

Riprendo questo topic perchè non ancora  riesco a capire alcune cose.

Ok, questo codice funziona:

Code:
void setup ()
  {
  Serial.begin (115200);
  }  // end of setup

void bar ()
  {
  Serial.println ("hacked!");
  while (true);  
  }
  
void foo ()
  {
  Serial.println ("in foo.");
  // corrupt return address
  unsigned int * stack = (unsigned int *) SP;
  stack [1] = (unsigned int) bar;
  }
  
void loop ()
  {
  foo ();
  }  // end of loop

Ma non è  quello il modo in cui volevo raggiungere printHacked().

Sto provando a mandare una stringa come input e cercare di fare il buffer overflow con quella stringa scrivendoci anche l'indirizzo di printHacked().

Code:
int  indexB  = 0;
int sb;

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


void setup(){
    unsigned long val;
    Serial.begin(115200);
    Serial.println("Hello World");
    val = (unsigned long) printHacked;
    Serial.print("Address of printHacked is ");
    Serial.println(val,HEX); //I use it to print the address of the function
        
}

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

void readSerialString () {
char buffer[4];
if(Serial.available()) {
while (Serial.available()){
sb = Serial.read();
buffer[indexB] = sb;
indexB++;
}
 }
        Serial.println(buffer);
        
}

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

Ho messo in input
Code:
ciao\xa0\x00\x00\x00
ed in output ho avuto
Code:
Hello World
Address of printHacked is A0
-

-
ciao\xa0\x00\x00CCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCCÿ
Hello World
Address of printHacked is A0

-

(ho cancellato tante C per accorciare il post)

E' possibile che non riesce a riconoscere \xa0\x00\x00\x00 ?
Come posso fare secondo voi per farlo riconoscere come esadecimale?

Ho provato anche a mettere "ciaocia" ed ecco l'output
Code:
Hello World
Address of printHacked is A0

-

ciaocia
è%
e si è bloccato con è%
Mentre con "ciaociao"
Code:
Hello World
Address of printHacked is A0

-

-
ciaHello World
Address of printHacked is A0

-

« Last Edit: August 31, 2013, 08:32:34 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.

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

Però così non lo inserisco con il messaggio, 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.

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

Grazie per l'aiuto!

Già inizialmente avevo provato questo metodo "bovino" (eheheh, mi piace l'espressione), ma avevo cambiato strada non avendo avuto buoni risultati.
Ora che posso condividerli con voi è tutta un'altra cosa.  smiley

Il discorso che hai fatto con get() è simile al strcpy e strncpy, dove il primo non ha nessun controllo, mentre il secondo copia gli n byte passati come parametro.
Quote
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);

Il mio codice:

Code:
char buff1[13]={'c','i','a','o','5','6',0xA7,0x00,0x00,0x00,'\0'}; //il 5 e il 6 sono per i due pop finali

void setup(){
    unsigned long val;
    Serial.begin(115200);
    Serial.println("Hello World");
    val = (unsigned long) printHacked;
    Serial.print("Address of printHacked is ");
    Serial.println(val,HEX); //I use it to print the address of the function
        
}

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

void readSerialString () {
char buff2[4];
strcpy(buff2,buff1);
        Serial.println(buff2);
}

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

Ma stampa:
Code:
ciao56§

Ho fatto l'avr-objdump, questa volta mi aspettavo 6 pop, ma... ce ne sono 8!

Code:
   
     15c: 0f 93       push r16
     15e: 1f 93       push r17
     160: df 93       push r29
     162: cf 93       push r28
     164: 00 d0       rcall .+0       ; 0x166 <_Z16readSerialStringv+0xa>
     166: 00 d0       rcall .+0       ; 0x168 <_Z16readSerialStringv+0xc>
     168: cd b7       in r28, 0x3d ; 61
     16a: de b7       in r29, 0x3e ; 62
     16c: 8e 01       movw r16, r28
     16e: 0f 5f       subi r16, 0xFF ; 255
     170: 1f 4f       sbci r17, 0xFF ; 255
     172: c8 01       movw r24, r16
     174: 61 e3       ldi r22, 0x31 ; 49
     176: 72 e0       ldi r23, 0x02 ; 2
     178: 0e 94 a0 00 call 0x140 ; 0x140 <strcpy>
     17c: 83 e7       ldi r24, 0x73 ; 115
     17e: 94 e0       ldi r25, 0x04 ; 4
     180: b8 01       movw r22, r16
     182: 0e 94 bb 07 call 0xf76 ; 0xf76 <_ZN5Print7printlnEPKc>
     186: 0f 90       pop r0
     188: 0f 90       pop r0
     18a: 0f 90       pop r0
     18c: 0f 90       pop r0
     18e: cf 91       pop r28
     190: df 91       pop r29
     192: 1f 91       pop r17
     194: 0f 91       pop r16
     196: 08 95       ret

Allora ho cambiato il buff1 in:
char buff1[13]={'c','i','a','o','5','6','7','8',0xA7,0x00,0x00,0x00,'\0'};
e sono usciti 5 caratteri stranissimi con una serie di HelloWorld consecutivi che hanno bloccato tutto fino alla chiusura forzata...

Piano piano sono andata ad aggiungere carattere per carattere e fino a
char buff1[13]={'c','i','a','o','5','6','7','8','\0'};
stampava ciao con i relativi numeri

mentre con
char buff1[13]={'c','i','a','o','5','6','7','8','9','\0'};
ha scritto qualcosa e poi ciao56789 in continuazione. Quindi effettivamente dopo gli 8 pop ha iniziato a "sclerare"

Quindi ho riprovato con
char buff1[13]={'c','i','a','o','5','6','7','8',0xA7,0x00,'\0'};
ma niente come prima...

Inizio ad avere paura che non c'è modo per uscirne...  

Edit: Ho capito perchè sono 8 pop! Per colpa della print.
Fatto sta, che con print o non print ha sempre lo stesso comportamento, ossia calcolando con 6 o 8 pop.
Edit:
Ho provato anche con unsigned char* e memcpy.
« Last Edit: September 03, 2013, 07:39:02 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


Code:
ciao56§

Cosa interessante.
Se si mette nel convertitore ASCII/Hex il valore "§" si ottiene "c2 a7"
dove a7 è proprio quello che ho inserito! Ma c2 cos'è?

Edit:
Credo proprio che ci sia un problema di lettura. Non riesce a capire il valore giusto quando è nell'array.
Ho provato una cosa simile:
Code:
int value=0xa8;
int buff[1]={'0xa8'}; //anche con int buff[1]={0xa8}
Serial.println(buff[1],HEX);
Serial.println(value,DEC);
Serial.println(value,HEX);
Output:
Code:
314
168
A8
« Last Edit: September 03, 2013, 08:59: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.

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

Ho fatto l'avr-objdump, questa volta mi aspettavo 6 pop, ma... ce ne sono 8!

Andrebbero seguiti i vari jmp e call e vedere se vengono eseguite altre push
Logged


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


Code:
ciao56§

Cosa interessante.
Se si mette nel convertitore ASCII/Hex il valore "§" si ottiene "c2 a7"
dove a7 è proprio quello che ho inserito! Ma c2 cos'è?

Edit:
Credo proprio che ci sia un problema di lettura. Non riesce a capire il valore giusto quando è nell'array.
Ho provato una cosa simile:
Code:
int value=0xa8;
int buff[1]={'0xa8'}; //anche con int buff[1]={0xa8}
Serial.println(buff[1],HEX);
Serial.println(value,DEC);
Serial.println(value,HEX);
Output:
Code:
314
168
A8


secondo me succede qualcosa di strano all'interno dell'array circolare che usa la classe Serial
Logged

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

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