En este artículo voy a demostrar cómo utilizar la herramienta strings
para extraer todo el texto presente dentro de un archivo en formato binario.
Cuántas veces hemos tratado de volcar por pantalla el contenido de un archivo binario sólo para ver una catarata de chirimbolos:
root@debian:~# head /bin/bash ELFx4dX4 (44 TTT� � ����H����hhhDDP�tdx� �<�<Q�tdR�td���/lib/ld-linux.so.2GNU▒GNU�F /�{�V{([O��x������\����v�A��Cx����p�/bm>A �"8��E����.��B���6���X��*�����▒�o�=z�/4��Y�3�'��A�d�z�&'� �XI�kn��v� _�w�!�pBc7Q��L��$��5�����-�_�&�f��]h{�35�5)�N�R���N ��g�U|���/�A���]V�� ����@�s5p� uq����k��Sg���?>�Z%���N�,K�h��ty�H����h��pT�D�pzS55Y▒9���$��q��u�������� ��Y��1��is%��w�����:��+{6'3n���eP��E��X����z���,=��i���������L�����+�0O6�d� ����%@�zL�@��Bn�G&�� ��� �NB��U���OZ��� {�U����I�K�W�����Z|�[������&�K�+��������t(��6�d�y�L�▒�n$!|�t�T���▒!�����{�i���4G�8.�c�4� ?������px2��0�s�� G��2��"������,*x����n�O?7���������y�_�G���Y���o0�A�q4 C�v��8a�G�|�E������/C���P��I�1�5�x%��D�;Xor�k��J�N�6��������sD��4<r���8j��J�� �F�=#�I���/��� ��w�.&��P��j�$������Tm}�����}<JG����I�.F��O���m����9�qv ^��,�Le3▒(��`�Mf�<�S�Q�A]fY�[a▒��w#=\����y?�O��{����y����7�DT�W_��l��=��X�h�lR�1���r;� �f )x��9x|�J��h���qN!�;�Y O�V�k�D���}���\'N~����}���qQ*qb#)�_������/�Jcr�0��f?b�m�C���[l�{`� ���mEI�ej�"�}�T���E���d>���U�tG{ ���7"a���<b�e��@���ZF�%R2�d��� �"�C��u9>U�� �������(;!r�($��%ia����U8�u��v�`�1�K�lj��r0F���o�����.R�&�� �s)��*�_w>���+▒~g^����<H��"���SDr�>�J-#��m�b�FL~+n��yg�R:▒,��_$+]▒�e����/� ��4v��2:����f�����2�Y|���:Vk'�:\���9�-�|-
Esto se debe a que los archivos binarios (típicamente los ejecutables) utilizan un formato a nivel bit, donde el conjunto de bytes en su mayoría no coincide con el rango de caracteres imprimibles ASCII.
Existen alternativas para volcar el contenido de archivos binarios por pantalla en diferentes formatos, tales como hexdump. Sin embargo, si lo que queremos es extraer sólo el texto plano presente en un binario, es posible recurrir directamente a strings
.
La herramienta strings
simplemente vuelca todos los caracteres imprimibles presentes en un archivo pasado como parámetro. Esta herramienta es parte del paquete GNU Binutils.
Simplemente pasar un archivo como parámetro y opcionalmente redirigir la salida a un paginador como more
o less
utilizando un pipe (|
):
root@debian:~# strings /bin/bash | tail malloc: %s:%d: assertion botched free: called with already freed block argument free: called with unallocated block argument free: underflow detected; mh_nbytes out of range free: start and end chunk sizes differ malloc: block on free list clobbered realloc: called with unallocated block argument realloc: underflow detected; mh_nbytes out of range realloc: start and end chunk sizes differ ;*2$"
Esta herramienta nos da la posibilidad de buscar cadenas de texto dentro de un binario utilizando grep
(alabado sea grep):
root@debian:~# strings /bin/bash | grep 'syntax error' syntax error near `%s' syntax error syntax error near unexpected token `%s' syntax error: unexpected end of file syntax error in conditional expression: unexpected token `%s' syntax error in conditional expression syntax error: `;' unexpected syntax error: `((%s))' syntax error: arithmetic expression required syntax error in expression syntax error: operand expected syntax error: invalid arithmetic operator
Referencias
man strings
- GNU Binutils
Tal vez pueda interesarte