strings 이용하기

바이너리 파일에서 문자열을 추출하기 위한 툴.  GNU Binutils 에 포함되어 있다.
사용법은 추출하고자 하는 바이너리 파일을 인수로 넘기기만 하면 된다.
바이너리 파일은 /binls 와 같은 실행파일이나 foo.jp, bar.mp3 와 같은 임의의 파일 모두 가능한다.
root@boggle70-desktop:tmp# strings main.o | head -5
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
printf
표준 입력으로부터 바이너리 데이터를 읽어들여서 처리할수도 있다.
strings 는 grep 명령과 함께 사용하면 편리하다. 다음 예는 'ignoreing' 이 포함된 에러 메세지를 검색한다.

root@boggle70-desktop:tmp# cat /bin/ls | strings | grep ignoring
ignoring invalid value of environment variable QUOTING_STYLE: %s
ignoring invalid width in environment variable COLUMNS: %s
ignoring invalid tab size in environment variable TABSIZE: %s

-tx 옵션을 사용하면 문자열의 위치를 16진수로 출력이 가능한다.
10진수는 -td
8진수는 -to 이다.
문자열은 기본적으로 "ASCII 문자(7비트)로 구성된 4 바이트 이상의 표현 가능한 문자열" 이라는 규칙을 갖는다.
따라서 UTF-8 로 프로그램에 삽입해 놓은 한글은 기본적으로 출력되지 않는다.
UTF-8 문자열을 출력하려면 -eS 옵션을 주면 되지만 터미널 환경에 따라서 깨질수도 있다.
--byte 옵션은 기본 규칙의 문자열의 수를 규정한다.

root@boggle70-desktop:tmp# strings --byte 3 main.o | head -5
/lib/ld-linux.so.2
GNU
GNU
4JY
NO9
root@boggle70-desktop:tmp# strings --byte 4 main.o | head -5
/lib/ld-linux.so.2
__gmon_start__
libc.so.6
_IO_stdin_used
printf

이렇게 문자열의 수를 지정할수도 있다.

strings는 내부적으로 BFD(바이너리에 접근하는 방법을 제공하는 GNU 라이브러리)가 해석 가능한
오브젝트 파일인지를 판별해서 오브젝트인 경우 데이타 섹션만을 문자열 추출 대상으로 하게 되어 있다.
강제적으로 파일 전체를 대상으로 하려면  -a 혹은 -all 옵션을 사용하면 된다.

표준 입력의 경우에도 BFD로 판별이 불가능하기 때문에 이런 경우도 파일 전체를 대상으로 하게 된다.



참고 자료 : Binary Hacks - O'REILLY