Go Down

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

DarkCoffee

#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

-


DarkCoffee

Però così non lo inserisco con il messaggio, giusto?

DarkCoffee

#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.

DarkCoffee

#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


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

lestofante




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
Guida per principianti http://playground.arduino.cc/Italiano/newbie
Unoffical Telegram group https://t.me/genuino

Go Up