리눅스 strings 명령어 실전 예제

LinuxLinuxBeginner
지금 연습하기

소개

이 랩에서는 실행 파일, 라이브러리 및 기타 바이너리 데이터를 포함하여 바이너리 파일에서 인쇄 가능한 문자열을 추출하는 Linux strings 명령어를 사용하는 방법을 배우게 됩니다. strings 명령어의 목적과 사용법을 살펴보고, 압축 및 암호화된 파일에서 문자열을 추출하는 방법을 배우며, 이 명령어를 일상 업무에 적용하는 실용적인 예시를 발견하게 됩니다. 이 랩은 strings 명령어와 그 응용 프로그램에 대한 포괄적인 이해를 제공하여 Linux 시스템에서 바이너리 파일을 효과적으로 분석하고 문제 해결할 수 있도록 지원합니다.

Linux 명령어 치트 시트

이것은 가이드 실험입니다. 학습과 실습을 돕기 위한 단계별 지침을 제공합니다.각 단계를 완료하고 실무 경험을 쌓기 위해 지침을 주의 깊게 따르세요. 과거 데이터에 따르면, 이것은 중급 레벨의 실험이며 완료율은 55%입니다.학습자들로부터 100%의 긍정적인 리뷰율을 받았습니다.

strings 명령어의 목적과 기본 사용법 이해

Linux 의 strings 명령어는 바이너리 파일에서 사람이 읽을 수 있는 텍스트 문자열을 추출하는 유틸리티입니다. 실행 프로그램 및 라이브러리와 같은 바이너리 파일에는 머신 코드와 텍스트 데이터가 모두 포함되어 있습니다. 머신 코드는 사람이 읽을 수 없지만, 텍스트 데이터에는 오류 메시지, 구성 설정 및 내장된 문서와 같은 유용한 정보가 포함되는 경우가 많습니다.

이 랩에 적합한 디렉토리에 있는지 확인하는 것으로 시작해 보겠습니다.

cd ~/project/strings_lab

이제 일반적인 바이너리 파일인 ls 명령의 내용을 검사하여 strings 명령어의 기본 사용법을 살펴보겠습니다.

strings /bin/ls | head -20

이 명령어는 ls 바이너리에서 처음 20 개의 읽을 수 있는 문자열을 추출합니다. 다음과 유사한 출력을 볼 수 있습니다.

/lib64/ld-linux-x86-64.so.2
libc.so.6
__stack_chk_fail
__cxa_finalize
setlocale
bindtextdomain
textdomain
__gmon_start__
abort
__errno_location
textdomain
dcgettext
dcngettext
strcmp
error
opendir
fdopendir
dirfd
closedir
readdir

기본적으로 strings 명령어는 줄 바꿈 문자 또는 null 문자로 끝나는 4 개 이상의 인쇄 가능한 문자 시퀀스를 표시합니다. 이는 다음과 같은 경우에 유용합니다.

  1. 실행 파일에서 내장된 텍스트 찾기
  2. 하드 코딩된 경로 및 설정 검색
  3. 기본 포렌식 분석
  4. 바이너리 파일 문제 해결

더 구체적인 예시를 살펴보겠습니다. grep 명령어를 strings와 함께 사용하여 특정 유형의 정보를 찾을 수 있습니다. 예를 들어, ls 명령어에서 "error"에 대한 모든 참조를 찾으려면 다음을 수행합니다.

strings /bin/ls | grep error

출력 결과는 다음과 같을 수 있습니다.

error
strerror
strerror_r
__file_fprintf::write_error
error in %s
error %d

strings 명령어는 동작을 사용자 정의하기 위한 몇 가지 유용한 옵션도 제공합니다. 예를 들어, 표시할 문자열의 최소 길이를 지정할 수 있습니다.

strings -n 10 /bin/ls | head -10

이 명령어는 길이가 10 자 이상인 문자열만 표시합니다. 출력 결과는 다음과 같을 수 있습니다.

/lib64/ld-linux-x86-64.so.2
__stack_chk_fail
__cxa_finalize
bindtextdomain
__gmon_start__
__errno_location
_ITM_registerTMCloneTable
_ITM_deregisterTMCloneTable
__cxa_atexit
__cxa_finalize

또 다른 유용한 옵션은 -t로, 파일 내 각 문자열의 오프셋을 표시합니다.

strings -t x /bin/ls | head -10

출력 결과에는 16 진수 오프셋이 포함됩니다.

    238 /lib64/ld-linux-x86-64.so.2
    4ca __stack_chk_fail
    4dd __cxa_finalize
    4ec setlocale
    4f7 bindtextdomain
    507 textdomain
    512 __gmon_start__
    522 abort
    528 __errno_location
    539 textdomain

이러한 오프셋은 바이너리 파일의 보다 고급 분석에 유용할 수 있습니다.

strings 로 다양한 유형의 바이너리 파일 분석

이 단계에서는 strings 명령어를 사용하여 시스템 라이브러리 및 애플리케이션 바이너리를 포함한 다양한 유형의 바이너리 파일을 분석하는 방법을 배우게 됩니다. 다양한 바이너리 파일에서 텍스트를 추출하는 방법을 이해하면 문제를 해결하고, 특정 정보를 찾거나, 숨겨진 기능을 발견하는 데 도움이 될 수 있습니다.

먼저, 여전히 랩 디렉토리에 있는지 확인합니다.

cd ~/project/strings_lab

시스템 라이브러리 탐색

시스템 라이브러리에는 여러 프로그램 간에 공유되는 코드가 포함되어 있습니다. 일반적인 시스템 라이브러리인 libc.so.6을 살펴보겠습니다. 이는 Linux 에서 대부분의 프로그램에서 사용되는 C 표준 라이브러리입니다.

strings /lib/x86_64-linux-gnu/libc.so.6 | head -20

출력 결과는 다음과 유사할 수 있습니다.

GNU C Library (Ubuntu GLIBC 2.35-0ubuntu3.4) stable release version 2.35.
Copyright (C) 2022 Free Software Foundation, Inc.
This is free software; see the source for copying conditions.
There is NO warranty; not even for MERCHANTABILITY or FITNESS FOR A
PARTICULAR PURPOSE.
Compiled by GNU CC version 11.4.0.
libc ABIs: UNIQUE IFUNC ABSOLUTE
For bug reporting instructions, please see:
<https://bugs.launchpad.net/ubuntu/+source/glibc/+bugs>.
/build/glibc-bBNzrH/glibc-2.35/elf/../sysdeps/x86_64/startup.c
7e
m3
.n
zN
?$
?G
G0
5')
5$)

보시다시피, 라이브러리의 시작 부분에는 버전 정보, 저작권 고지 및 기타 사람이 읽을 수 있는 텍스트가 포함되어 있습니다. 이 정보는 호환성 문제를 해결하거나 라이브러리 버전을 확인할 때 유용할 수 있습니다.

바이너리에서 특정 정보 찾기

프로그램에서 사용할 수 있는 모든 환경 변수를 찾고 싶다고 가정해 보겠습니다. 바이너리 파일에서 "$"로 시작하는 문자열을 검색할 수 있습니다.

strings /bin/bash | grep '^\$' | head -10

이 명령어는 다음과 같이 출력할 수 있습니다.

$HOME
$PATH
$SHELL
$TERM
$USER
$HOSTNAME
$PWD
$MAIL
$LANG
$LC_ALL

이는 bash 셸이 참조할 수 있는 모든 환경 변수를 보여줍니다.

버전 정보 분석

strings 명령어를 사용하여 바이너리 파일에서 버전 정보를 찾을 수도 있습니다.

strings /bin/bash | grep -i version

출력 결과는 다음과 같을 수 있습니다.

GNU bash, version %s (%s)
version
VERSION
version_string
dist_version
show_shell_version
BASH_VERSION
GNU bash, version %s-(%s)
@(#)version.c
version.c

이는 프로그램을 실행하지 않고도 프로그램의 버전을 빠르게 확인해야 할 때 특히 유용할 수 있습니다.

분석을 위한 간단한 바이너리 파일 생성

바이너리 데이터와 텍스트 문자열을 모두 포함하는 간단한 바이너리 파일을 만들어 보겠습니다.

## Create a file with some text and binary data
echo "This is a visible string in our test file." > testfile.bin
echo "Another string that should be extractable." >> testfile.bin
## Add some binary data
dd if=/dev/urandom bs=100 count=1 >> testfile.bin 2> /dev/null
## Add one more text string
echo "Final string after some binary data." >> testfile.bin

이제 strings 명령어를 사용하여 이 바이너리 파일에서 텍스트를 추출합니다.

strings testfile.bin

출력 결과에는 세 개의 텍스트 문자열이 모두 포함되어야 합니다.

This is a visible string in our test file.
Another string that should be extractable.
Final string after some binary data.

이는 strings가 바이너리 데이터를 효과적으로 필터링하고 텍스트가 아닌 데이터와 혼합된 경우에도 사람이 읽을 수 있는 텍스트만 표시하는 방법을 보여줍니다.

압축 및 암호화된 파일 작업

이 단계에서는 strings 명령어를 압축 및 암호화된 파일과 함께 사용하는 방법을 배우게 됩니다. 이러한 파일은 종종 바이너리 데이터를 포함하므로, strings 명령어는 파일을 완전히 압축 해제하거나 해독하지 않고도 읽을 수 있는 텍스트를 추출하는 데 유용할 수 있습니다.

랩 디렉토리에 있는지 확인합니다.

cd ~/project/strings_lab

압축 파일 분석

strings가 압축된 콘텐츠를 처리하는 방식을 확인하기 위해 텍스트 파일을 만들고 다양한 방법으로 압축해 보겠습니다.

gzip 압축 사용

먼저 여러 줄이 있는 간단한 텍스트 파일을 만들어 보겠습니다.

cat > sample_text.txt << EOF
This is a sample text file.
It contains multiple lines of text.
We will compress it in different ways.
Then we'll use the strings command to see what we can extract.
The strings command is useful for examining binary files.
EOF

이제 gzip을 사용하여 이 파일을 압축해 보겠습니다.

gzip -c sample_text.txt > sample_text.gz

-c 옵션은 gzip이 원본 파일을 바꾸는 대신 표준 출력에 쓰도록 지시합니다. 이제 strings를 사용하여 추출할 수 있는 내용을 확인해 보겠습니다.

strings sample_text.gz

다음과 같은 출력을 볼 수 있습니다.

sample_text.txt
This is a sample text file.
It contains multiple lines of text.
We will compress it in different ways.
Then we'll use the strings command to see what we can extract.
The strings command is useful for examining binary files.

strings가 파일이 압축되어 있어도 원래 텍스트 내용을 추출할 수 있음을 알 수 있습니다. 이는 gzip이 데이터를 암호화하지 않고 압축만 하기 때문이며, 이로 인해 많은 읽을 수 있는 텍스트 세그먼트가 그대로 유지됩니다.

다른 압축 형식 사용

다른 압축 방법인 bzip2를 시도해 보겠습니다.

bzip2 -c sample_text.txt > sample_text.bz2

이제 strings로 이 파일을 검사합니다.

strings sample_text.bz2

출력 결과는 gzip 보다 덜 읽기 쉬울 수 있습니다.

BZh91AY&SY
s1r
U*T)

이는 서로 다른 압축 알고리즘이 서로 다른 바이너리 패턴을 생성하고 일부는 다른 것보다 읽을 수 있는 텍스트 세그먼트를 적게 남기기 때문입니다.

암호화된 파일 작업

암호화는 적절한 키 없이는 콘텐츠를 읽을 수 없도록 설계되었습니다. 암호화된 파일을 만들고 strings가 추출할 수 있는 내용을 확인해 보겠습니다.

## Create a file with a secret message
echo "This is a top secret message that should be encrypted." > secret.txt

## Encrypt the file using OpenSSL
openssl enc -aes-256-cbc -salt -in secret.txt -out secret.enc -k "password123" -pbkdf2

이제 strings를 사용하여 암호화된 파일을 검사해 보겠습니다.

strings secret.enc

다음과 같은 출력을 볼 수 있습니다.

Salted__

예상대로 원래 메시지는 제대로 암호화되었기 때문에 볼 수 없습니다. 읽을 수 있는 유일한 텍스트는 OpenSSL 이 암호화 프로세스에 salt 가 사용되었음을 나타내기 위해 암호화된 파일의 시작 부분에 추가하는 "Salted__" 헤더입니다.

실용적인 응용 프로그램: 압축된 로그 파일 검사

시스템 관리자는 공간을 절약하기 위해 종종 로그 파일을 압축합니다. 로그 파일을 시뮬레이션하고 압축 후 검사해 보겠습니다.

## Create a simulated log file
cat > system.log << EOF
[2023-10-25 08:00:01] INFO: System startup completed
[2023-10-25 08:05:22] WARNING: High memory usage detected
[2023-10-25 08:10:15] ERROR: Failed to connect to database
[2023-10-25 08:15:30] INFO: Database connection restored
[2023-10-25 08:20:45] WARNING: CPU temperature above threshold
EOF

## Compress the log file
gzip -c system.log > system.log.gz

이제 strings와 몇 가지 추가 옵션을 사용하여 압축된 로그 파일을 검사해 보겠습니다.

strings -n 20 system.log.gz

-n 20 옵션은 strings가 20 자 이상의 인쇄 가능한 문자 시퀀스만 표시하도록 지시합니다. 출력 결과는 다음과 같을 수 있습니다.

[2023-10-25 08:00:01] INFO: System startup completed
[2023-10-25 08:05:22] WARNING: High memory usage detected
[2023-10-25 08:10:15] ERROR: Failed to connect to database
[2023-10-25 08:15:30] INFO: Database connection restored
[2023-10-25 08:20:45] WARNING: CPU temperature above threshold

이는 시스템 관리자가 먼저 압축을 풀 필요 없이 압축된 로그 파일의 내용을 빠르게 확인할 수 있음을 보여줍니다. 이는 대규모 로그 보관 파일을 처리할 때 특히 유용할 수 있습니다.

strings 명령어의 고급 사용법 및 실용적인 응용

이 마지막 단계에서는 strings 명령어의 몇 가지 고급 사용 패턴과 실용적인 응용 프로그램을 살펴보겠습니다. 이러한 기술은 시스템 관리, 소프트웨어 개발 및 디지털 포렌식에 특히 유용할 수 있습니다.

랩 디렉토리에 있는지 확인합니다.

cd ~/project/strings_lab

다른 명령어와 strings 결합

strings 명령어의 진정한 힘은 다른 Linux 명령어와 결합할 때 나타납니다. 몇 가지 유용한 조합을 살펴보겠습니다.

잠재적으로 하드코딩된 자격 증명 찾기

보안 감사자는 종종 strings를 사용하여 바이너리 파일에서 하드코딩된 자격 증명을 찾습니다.

## Create a sample program with "credentials"
cat > credentials_example.c << EOF
#include <stdio.h>

int main() {
    char* username = "admin";
    char* password = "supersecret123";
    
    printf("Connecting with credentials...\n");
    return 0;
}
EOF

## Compile the program
gcc credentials_example.c -o credentials_example

이제 잠재적인 비밀번호를 검색해 보겠습니다.

strings credentials_example | grep -i 'password\|secret\|admin\|user\|login'

다음과 같은 출력이 나올 수 있습니다.

admin
supersecret123
password

이는 보안 감사자가 애플리케이션에서 잠재적으로 하드코딩된 자격 증명을 식별하는 방법을 보여줍니다.

파일 유형 분석

strings 명령어는 확장자가 없거나 오해의 소지가 있는 경우 파일 유형을 식별하는 데 도움이 될 수 있습니다.

## Create a PNG file without the correct extension
cp /usr/share/icons/Adwaita/16x16/places/folder.png mystery_file

이제 strings를 사용하여 파일 유형에 대한 단서를 찾아보겠습니다.

strings mystery_file | grep -i 'png\|jpeg\|gif\|image'

다음과 같은 출력을 볼 수 있습니다.

PNG
IHDR
pHYs
iDOT

PNG 관련 문자열이 있다는 것은 올바른 확장자가 없더라도 이 파일이 PNG 이미지일 수 있음을 시사합니다.

파일 오프셋과 함께 strings 사용

-t 옵션을 사용하면 파일 내 각 문자열의 오프셋을 볼 수 있으며, 이는 보다 자세한 분석에 유용할 수 있습니다.

## Create a sample binary file
cat > offset_example.bin << EOF
This is at the beginning of the file.
EOF

## Add some binary data
dd if=/dev/urandom bs=100 count=1 >> offset_example.bin 2> /dev/null

## Add another string
echo "This is in the middle of the file." >> offset_example.bin

## Add more binary data
dd if=/dev/urandom bs=100 count=1 >> offset_example.bin 2> /dev/null

## Add a final string
echo "This is at the end of the file." >> offset_example.bin

이제 -t 옵션과 함께 strings를 사용하여 오프셋을 확인해 보겠습니다.

strings -t d offset_example.bin

-t d 옵션은 10 진수 오프셋을 표시합니다. 출력 결과는 다음과 같을 수 있습니다.

         0 This is at the beginning of the file.
       137 This is in the middle of the file.
       273 This is at the end of the file.

이 정보는 바이너리 패칭 또는 자세한 파일 분석과 같은 작업에 필수적인 바이너리 파일 내 문자열의 정확한 위치를 찾는 데 유용할 수 있습니다.

사례 연구: 네트워크 트래픽 분석

네트워크 패킷에는 종종 바이너리 데이터와 읽을 수 있는 텍스트가 모두 포함되어 있습니다. 캡처된 네트워크 패킷을 시뮬레이션하고 분석해 보겠습니다.

## Create a simulated network packet with HTTP data
cat > http_packet.bin << EOF
GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml
EOF

## Add some binary header and footer to simulate packet framing
dd if=/dev/urandom bs=20 count=1 > packet_header.bin 2> /dev/null
dd if=/dev/urandom bs=20 count=1 > packet_footer.bin 2> /dev/null

## Combine them into a complete "packet"
cat packet_header.bin http_packet.bin packet_footer.bin > captured_packet.bin

이제 strings를 사용하여 이 "캡처된 패킷"을 분석해 보겠습니다.

strings captured_packet.bin

출력 결과에는 HTTP 요청이 포함되어야 합니다.

GET /index.html HTTP/1.1
Host: www.example.com
User-Agent: Mozilla/5.0
Accept: text/html,application/xhtml+xml

이는 네트워크 분석가가 바이너리 프로토콜 데이터와 혼합된 경우에도 캡처된 네트워크 트래픽에서 유용한 정보를 빠르게 추출할 수 있는 방법을 보여줍니다.

고급 사용법 요약

이 단계에서 배운 기술은 고급 응용 프로그램에 대한 strings 명령어의 다재다능함을 보여줍니다.

  1. 특정 패턴을 검색하기 위해 stringsgrep과 결합
  2. 파일 유형을 식별하기 위해 strings 사용
  3. 정확한 바이너리 분석을 위한 파일 오프셋 작업
  4. 네트워크 패킷과 같은 혼합 바이너리 콘텐츠에서 읽을 수 있는 데이터 추출

이러한 기술은 특수 도구 없이 바이너리 데이터를 분석해야 하는 시스템 관리자, 보안 전문가 및 소프트웨어 개발자에게 유용합니다.

요약

이 랩에서는 Linux strings 명령어를 살펴보고 바이너리 파일에서 읽을 수 있는 텍스트를 추출하는 방법을 배웠습니다. 이 랩에서 다룬 주요 내용은 다음과 같습니다.

  1. strings 명령어의 목적은 바이너리 파일에서 사람이 읽을 수 있는 문자 시퀀스를 추출하는 것입니다. 이는 실행 파일, 라이브러리 및 기타 텍스트가 아닌 파일을 검사하는 데 유용합니다.

  2. 최소 문자열 길이를 지정하는 -n 옵션과 파일 오프셋을 표시하는 -t 옵션을 포함한 strings 명령어의 기본 사용법.

  3. 시스템 라이브러리 및 애플리케이션 실행 파일을 포함하여 다양한 유형의 바이너리 파일을 분석하기 위한 strings 명령어의 적용.

  4. 압축 및 암호화된 파일 작업 기술. strings가 압축된 파일에서 정보를 추출할 수 있는 반면, 암호화된 파일은 일반적으로 최소한의 정보만 표시합니다.

  5. 대상 분석을 위해 stringsgrep과 같은 다른 명령어와 결합하고, 파일 유형을 식별하고, 네트워크 트래픽을 검사하는 것을 포함한 고급 사용 패턴.

이 랩에서 배운 기술은 시스템 관리, 소프트웨어 개발, 보안 감사 및 디지털 포렌식에 유용합니다. strings 명령어는 특수 도구 없이 바이너리 파일을 들여다볼 수 있는 간단하면서도 강력한 방법을 제공하므로 Linux 관리자의 도구 상자에 필수적인 유틸리티입니다.

Linux Commands Cheat Sheet