Go Down

Topic: Sovrascrivere un indirizzo di memoria (Read 7937 times) previous topic - next topic

#90
Aug 31, 2013, 03:27 pm Last Edit: Aug 31, 2013, 03:32 pm by DarkCoffee Reason: 1
Riprendo questo topic perchè non ancora  riesco a capire alcune cose.

Ok, questo codice funziona:

Code: [Select]
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: [Select]
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: [Select]
ciao\xa0\x00\x00\x00
ed in output ho avuto
Code: [Select]
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: [Select]
Hello World
Address of printHacked is A0

-

ciaocia
è%

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

-

-
ciaHello World
Address of printHacked is A0

-

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.

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

#92
Sep 04, 2013, 01:42 am Last Edit: Sep 04, 2013, 02:39 am by DarkCoffee Reason: 1
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.  :)

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: [Select]
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: [Select]

ciao56§


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

Code: [Select]
   
    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.
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.

#93
Sep 04, 2013, 02:44 am Last Edit: Sep 04, 2013, 03:59 am by DarkCoffee Reason: 1


Code: [Select]

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: [Select]

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: [Select]

314
168
A8

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.

leo72


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

lesto




Code: [Select]

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: [Select]

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: [Select]

314
168
A8




secondo me succede qualcosa di strano all'interno dell'array circolare che usa la classe Serial
sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Go Up