Quando posso modificare le stringhe in un file binario eseguibile?


11

Ho un file binario eseguibile; chiamiamolo a.out. Vedo che il binario contiene stringhe

$ strings a.out
...
/usr/share/foo
....

Devo cambiare la stringa /usr/share/fooin /usr/share/bar. Posso semplicemente sostituire la stringa con sed?:

sed -i 's@/usr/share/foo@/usr/share/bar@' a.out

Sembra una cosa sicura da fare. Funzionerà anche quando le stringhe non hanno la stessa lunghezza?

Risposte:


17

Non so se la tua versione di sedbinary-clean o se soffocerà su ciò che pensa siano davvero lunghe righe nel suo input, ma escludendo quei problemi, la modifica della stringa sul posto dovrebbe funzionare. Per vedere se lo fa, confronta la vecchia e la nuova versione con cmp -l. Dovrebbe dirti se le uniche tre differenze tra i due file sono o meno quei 3 byte.

La modifica delle stringhe in un eseguibile compilato funzionerà davvero se le stringhe hanno la stessa lunghezza, ma quasi sempre funzionerà anche se si accorcia la stringa, a causa del modo in cui le stringhe funzionano in C. Nelle stringhe C, tutto dopo il NULterminatore non conta, quindi se scrivi un nuovo NULterminatore prima della posizione di quello vecchio, accorcerai efficacemente la stringa.

In generale, non è possibile allungare una stringa utilizzando questo hack.


Che ne dici di accorciare la corda con qualcosa del genere sed -i 's@longstring@foo@' a.out? Questo renderà l'intero binario più piccolo di 7 byte, non corromperà il binario?
Martin Vegter,

Sì, corromperà il file binario. Ecco perché devi tradurre la stringa in una stessa identica lunghezza, ma impostare un NULterminatore in una posizione precedente, come ho spiegato (anche se forse troppo brevemente). Il problema è che non è possibile avere un NULbyte sulla riga di comando, quindi è necessario inserire il sedprogramma in un file e fare riferimento a esso con -f. D'altra parte, la cosa più sicura da fare sarebbe usare uno strumento progettato per funzionare con dati binari invece sedche progettato per funzionare con dati di testo.
Celada,

2
Buona risposta. sed può fare molte cose, ma, in generale, è per questo che sono stati inventati gli editor binari. Possono essere difficili da usare durante la navigazione all'interno di un file binario di grandi dimensioni, ma ti permetteranno di cambiare le cose byte per byte. Uso hexeditquando devo esaminare o modificare un file binario. È possibile utilizzare strings -t x file | lessper individuare gli offset delle stringhe (stampabili) che si desidera modificare prima di passare all'editor.
Joe,

Diciamo che ho una stringa nel mio programma C: "Il mio nome era Mr Robot" e voglio sostituire 'era' con 'è', quindi il riempimento \0dovrà essere fatto con attenzione, perché se la sostituzione fa questo: "Il mio nome è \ 0 Mr Robot ", quindi durante l'esecuzione delle operazioni con la stringa, il carattere '\ 0' creerà problemi poiché la lunghezza si ridurrà involontariamente.
Nehal J Wani,

@NehalJWani no, in tal caso dovresti spostare l'intero resto della stringa in avanti di un byte in modo che il tuo nuovo, extra, terminando NULvada alla fine, adiacente all'esistente NUL.
Celada,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.