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.
char *strcpy(char *dest, const char *src);
char *strncpy(char *dest, const char *src, size_t n);
Il mio codice:
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:
ciao56§
Ho fatto l'avr-objdump, questa volta mi aspettavo 6 pop, ma... ce ne sono 8!
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.