¿Cuándo puedo editar cadenas en un binario ejecutable?

11

Tengo un binario ejecutable; Digamos que es a.out. Puedo ver que el binario contiene cadenas

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

Necesito cambiar la cadena /usr/share/fooa /usr/share/bar. ¿Puedo simplemente reemplazar la cadena con sed?:

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

Esto parece algo seguro para hacer. ¿Funcionará esto también cuando las cadenas no tengan la misma longitud?

Martin Vegter
fuente

Respuestas:

17

No sé si su versión de sedserá binary-clean o si se ahogará con lo que cree que son líneas realmente largas en su entrada, pero salvo esos problemas, editar la cadena en el lugar debería funcionar. Para ver si es así, compare las versiones antigua y nueva con cmp -l. Debería decirle si las únicas tres diferencias entre los dos archivos son esos 3 bytes.

Editar cadenas en un ejecutable compilado funcionará si las cadenas son de la misma longitud, pero casi siempre funcionará si acorta la cadena, debido a la forma en que funcionan las cadenas en C. En cadenas C, todo después del NULterminador no cuenta, por lo que si escribe un nuevo NULterminador antes de la posición del anterior, efectivamente acortará la cadena.

En general, no hay forma de alargar una cadena con este truco.

Celada
fuente
¿Qué hay de acortar la cuerda con algo así sed -i 's@longstring@foo@' a.out? Esto hará que todo el binario sea más pequeño en 7 bytes. ¿Esto no corromperá el binario?
Martin Vegter
Sí, corromperá el binario. Es por eso que debe traducir la cadena a una de la misma longitud exacta, pero establecer un NULterminador en una posición anterior como lo expliqué (aunque tal vez demasiado brevemente). El problema es que no puede tener un NULbyte en la línea de comando, por lo que debe colocar su sedprograma en un archivo y consultarlo -f. Por otro lado, lo más seguro sería utilizar una herramienta diseñada para trabajar con datos binarios en lugar de la sedque está diseñada para trabajar con datos de texto.
Celada
2
Buena respuesta. sed puede hacer muchas cosas, pero, en general, para eso se inventaron los editores binarios. Pueden ser difíciles de usar al navegar dentro de un archivo binario grande, pero le permitirán cambiar las cosas byte a byte. Lo uso hexeditcuando tengo que examinar o cambiar un archivo binario. Puede usar strings -t x file | lesspara localizar los desplazamientos de las cadenas (imprimibles) que desea cambiar antes de saltar al editor.
Joe
Digamos que tengo una cadena en mi programa C: "Mi nombre era Mr Robot" y quiero reemplazar 'was' con 'is', entonces el relleno \0tendrá que hacerse con cuidado, porque si el reemplazo hace esto: "Mi nombre es \ 0 Mr Robot ", luego, al realizar operaciones con la cadena, el carácter '\ 0' creará problemas ya que la longitud se reducirá involuntariamente.
Nehal J Wani
@NehalJWani no, en ese caso tendrías que desplazar el resto de la cadena hacia adelante un byte para que tu nueva terminación adicional NULvaya al final, adyacente a la existente NUL.
Celada