Lệnh strings trong Linux

Giới thiệu

Trong lab này, bạn sẽ học cách sử dụng lệnh strings của Linux để trích xuất các chuỗi ký tự in được từ các tệp nhị phân, bao gồm các tệp thực thi, thư viện và các dữ liệu nhị phân khác. Bạn sẽ khám phá mục đích và cách sử dụng của lệnh strings, học cách trích xuất các chuỗi từ các tệp được nén và mã hóa, và khám phá các ví dụ thực tế về cách áp dụng lệnh này trong công việc hàng ngày của bạn. Lab này cung cấp một sự hiểu biết toàn diện về lệnh strings và các ứng dụng của nó, cho phép bạn phân tích và khắc phục sự cố các tệp nhị phân một cách hiệu quả trên các hệ thống Linux.

Hiểu Mục đích và Cách sử dụng Cơ bản của Lệnh strings

Lệnh strings trong Linux là một tiện ích trích xuất các chuỗi văn bản mà con người có thể đọc được từ các tệp nhị phân. Các tệp nhị phân, chẳng hạn như các chương trình thực thi và thư viện, chứa cả mã máy và dữ liệu văn bản. Trong khi mã máy không thể đọc được, dữ liệu văn bản thường bao gồm các thông tin có giá trị như thông báo lỗi, cài đặt cấu hình và tài liệu được nhúng.

Hãy bắt đầu bằng cách đảm bảo rằng bạn đang ở đúng thư mục cho lab này:

cd ~/project/strings_lab

Bây giờ, hãy khám phá cách sử dụng cơ bản của lệnh strings bằng cách kiểm tra nội dung của một tệp nhị phân phổ biến - lệnh ls:

strings /bin/ls | head -20

Lệnh này trích xuất 20 chuỗi có thể đọc được đầu tiên từ tệp nhị phân ls. Bạn sẽ thấy đầu ra tương tự như sau:

/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

Theo mặc định, lệnh strings hiển thị bất kỳ chuỗi nào có từ 4 ký tự in trở lên kết thúc bằng một dòng mới hoặc ký tự null. Điều này làm cho nó có giá trị cho:

  1. Tìm văn bản được nhúng trong các tệp thực thi
  2. Khám phá các đường dẫn và cài đặt được mã hóa cứng
  3. Phân tích pháp chứng cơ bản
  4. Khắc phục sự cố các tệp nhị phân

Hãy thử một ví dụ cụ thể hơn. Bạn có thể sử dụng lệnh grep với strings để tìm các loại thông tin cụ thể. Ví dụ: để tìm bất kỳ tham chiếu nào đến "error" trong lệnh ls:

strings /bin/ls | grep error

Đầu ra của bạn có thể bao gồm:

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

Lệnh strings cũng cung cấp một số tùy chọn hữu ích để tùy chỉnh hành vi của nó. Ví dụ: bạn có thể chỉ định độ dài tối thiểu của các chuỗi để hiển thị:

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

Lệnh này chỉ hiển thị các chuỗi có độ dài ít nhất 10 ký tự. Đầu ra có thể trông như sau:

/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

Một tùy chọn hữu ích khác là -t, hiển thị offset của mỗi chuỗi trong tệp:

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

Đầu ra bao gồm các offset thập lục phân:

    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

Các offset này có thể hữu ích cho việc phân tích nâng cao hơn các tệp nhị phân.

Phân tích Các loại Tệp Nhị phân Khác nhau với strings

Trong bước này, bạn sẽ học cách sử dụng lệnh strings để phân tích các loại tệp nhị phân khác nhau, bao gồm các thư viện hệ thống và các tệp nhị phân ứng dụng. Hiểu cách trích xuất văn bản từ các tệp nhị phân khác nhau có thể giúp bạn khắc phục sự cố, xác định vị trí thông tin cụ thể hoặc thậm chí khám phá các chức năng ẩn.

Đầu tiên, hãy đảm bảo rằng bạn vẫn đang ở trong thư mục lab:

cd ~/project/strings_lab

Khám phá Các thư viện Hệ thống

Các thư viện hệ thống chứa mã được chia sẻ giữa nhiều chương trình. Hãy kiểm tra một thư viện hệ thống phổ biến, libc.so.6, là thư viện chuẩn C được sử dụng bởi hầu hết các chương trình trên Linux:

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

Đầu ra của bạn có thể trông tương tự như:

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$)

Như bạn có thể thấy, phần đầu của thư viện bao gồm thông tin phiên bản, thông báo bản quyền và các văn bản mà con người có thể đọc được khác. Thông tin này có thể có giá trị khi khắc phục sự cố tương thích hoặc kiểm tra phiên bản của một thư viện.

Tìm Thông tin Cụ thể trong Các tệp Nhị phân

Giả sử bạn muốn tìm tất cả các biến môi trường có thể được sử dụng bởi một chương trình. Bạn có thể tìm kiếm các chuỗi bắt đầu bằng "$" trong một tệp nhị phân:

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

Lệnh này có thể xuất ra:

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

Điều này cho bạn thấy tất cả các biến môi trường mà shell bash có thể tham chiếu.

Phân tích Thông tin Phiên bản

Bạn cũng có thể sử dụng lệnh strings để tìm thông tin phiên bản trong các tệp nhị phân:

strings /bin/bash | grep -i version

Đầu ra có thể bao gồm:

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

Điều này có thể đặc biệt hữu ích khi bạn cần kiểm tra nhanh phiên bản của một chương trình mà không cần chạy nó.

Tạo Tệp Nhị phân Đơn giản để Phân tích

Hãy tạo một tệp nhị phân đơn giản chứa cả dữ liệu nhị phân và chuỗi văn bản:

## 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

Bây giờ, hãy sử dụng lệnh strings để trích xuất văn bản từ tệp nhị phân này:

strings testfile.bin

Đầu ra của bạn sẽ bao gồm cả ba chuỗi văn bản:

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

Điều này chứng minh cách strings có thể lọc hiệu quả dữ liệu nhị phân và chỉ hiển thị văn bản mà con người có thể đọc được, ngay cả khi nó được trộn lẫn với dữ liệu không phải văn bản.

Làm việc với Các Tệp được Nén và Mã hóa

Trong bước này, bạn sẽ học cách sử dụng lệnh strings với các tệp được nén và mã hóa. Vì các tệp này thường chứa dữ liệu nhị phân, lệnh strings có thể hữu ích để trích xuất văn bản có thể đọc được mà không cần giải nén hoặc giải mã hoàn toàn chúng.

Hãy đảm bảo rằng bạn đang ở trong thư mục lab:

cd ~/project/strings_lab

Phân tích Các Tệp được Nén

Hãy tạo một tệp văn bản và nén nó bằng các phương pháp khác nhau để xem strings xử lý nội dung được nén như thế nào:

Sử dụng nén gzip

Đầu tiên, hãy tạo một tệp văn bản đơn giản với nhiều dòng:

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

Bây giờ, hãy nén tệp này bằng gzip:

gzip -c sample_text.txt > sample_text.gz

Tùy chọn -c yêu cầu gzip ghi vào đầu ra chuẩn thay vì thay thế tệp gốc. Bây giờ, hãy sử dụng strings để xem chúng ta có thể trích xuất những gì:

strings sample_text.gz

Bạn có thể thấy đầu ra như:

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.

Lưu ý rằng strings có thể trích xuất nội dung văn bản gốc ngay cả khi tệp được nén. Điều này là do gzip không mã hóa dữ liệu; nó chỉ nén nó, vẫn để lại nhiều phân đoạn văn bản có thể đọc được còn nguyên vẹn.

Sử dụng các định dạng nén khác nhau

Hãy thử một phương pháp nén khác, bzip2:

bzip2 -c sample_text.txt > sample_text.bz2

Bây giờ, hãy kiểm tra tệp này bằng strings:

strings sample_text.bz2

Đầu ra có thể ít dễ đọc hơn so với gzip:

BZh91AY&SY
s1r
U*T)

Điều này là do các thuật toán nén khác nhau tạo ra các mẫu nhị phân khác nhau và một số thuật toán để lại ít phân đoạn văn bản có thể đọc được hơn những thuật toán khác.

Làm việc với Các Tệp được Mã hóa

Mã hóa được thiết kế để làm cho nội dung không thể đọc được nếu không có khóa thích hợp. Hãy tạo một tệp được mã hóa và xem strings có thể trích xuất những gì:

## 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

Bây giờ, hãy sử dụng strings để kiểm tra tệp được mã hóa:

strings secret.enc

Bạn có thể thấy đầu ra như:

Salted__

Như mong đợi, bạn không thể thấy tin nhắn gốc vì nó đã được mã hóa đúng cách. Văn bản duy nhất có thể đọc được là tiêu đề "Salted__" mà OpenSSL thêm vào đầu các tệp được mã hóa để chỉ ra rằng một salt đã được sử dụng trong quá trình mã hóa.

Ứng dụng Thực tế: Kiểm tra Các Tệp Nhật ký được Nén

Các systemadmin thường nén các tệp nhật ký để tiết kiệm dung lượng. Hãy mô phỏng một tệp nhật ký và kiểm tra nó sau khi nén:

## 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

Bây giờ, hãy sử dụng strings với một số tùy chọn bổ sung để kiểm tra tệp nhật ký được nén:

strings -n 20 system.log.gz

Tùy chọn -n 20 yêu cầu strings chỉ hiển thị các chuỗi có từ 20 ký tự in trở lên. Đầu ra của bạn có thể bao gồm:

[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

Điều này chứng minh cách các systemadmin có thể kiểm tra nhanh nội dung của các tệp nhật ký được nén mà không cần phải giải nén chúng trước, điều này có thể đặc biệt hữu ích khi xử lý các kho lưu trữ nhật ký lớn.

Sử dụng Nâng cao và Các Ứng dụng Thực tế của Lệnh strings

Trong bước cuối cùng này, bạn sẽ khám phá một số mẫu sử dụng nâng cao và các ứng dụng thực tế của lệnh strings. Các kỹ thuật này có thể đặc biệt hữu ích cho quản trị hệ thống, phát triển phần mềm và pháp y kỹ thuật số.

Hãy đảm bảo rằng bạn vẫn đang ở trong thư mục lab:

cd ~/project/strings_lab

Kết hợp strings với Các Lệnh Khác

Sức mạnh thực sự của lệnh strings trở nên rõ ràng khi bạn kết hợp nó với các lệnh Linux khác. Hãy khám phá một số kết hợp hữu ích:

Tìm thông tin xác thực được mã hóa cứng tiềm năng

Các chuyên gia kiểm toán bảo mật thường sử dụng strings để tìm thông tin xác thực được mã hóa cứng trong các tệp nhị phân:

## 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

Bây giờ, hãy tìm kiếm mật khẩu tiềm năng:

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

Điều này có thể xuất ra:

admin
supersecret123
password

Điều này chứng minh cách các chuyên gia kiểm toán bảo mật có thể xác định thông tin xác thực được mã hóa cứng tiềm năng trong các ứng dụng.

Phân tích các loại tệp

Lệnh strings có thể giúp xác định loại tệp khi phần mở rộng bị thiếu hoặc gây hiểu nhầm:

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

Bây giờ, hãy sử dụng strings để tìm kiếm manh mối về loại tệp:

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

Bạn có thể thấy đầu ra như:

PNG
IHDR
pHYs
iDOT

Sự hiện diện của các chuỗi liên quan đến PNG cho thấy rằng tệp này có thể là một hình ảnh PNG, mặc dù thiếu phần mở rộng thích hợp.

Sử dụng strings với File Offsets

Tùy chọn -t cho phép bạn xem offset của mỗi chuỗi trong tệp, có thể có giá trị để phân tích chi tiết hơn:

## 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

Bây giờ, hãy sử dụng strings với tùy chọn -t để xem các offset:

strings -t d offset_example.bin

Tùy chọn -t d hiển thị các offset thập phân. Đầu ra của bạn có thể trông như sau:

         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.

Thông tin này có thể hữu ích để định vị vị trí chính xác của các chuỗi trong các tệp nhị phân, điều này cần thiết cho các tác vụ như vá nhị phân hoặc phân tích tệp chi tiết.

Nghiên cứu Tình huống: Phân tích Lưu lượng Mạng

Các gói mạng thường chứa cả dữ liệu nhị phân và văn bản có thể đọc được. Hãy mô phỏng một gói mạng đã chụp và phân tích nó:

## 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

Bây giờ, hãy phân tích "gói đã chụp" này với strings:

strings captured_packet.bin

Đầu ra của bạn sẽ bao gồm yêu cầu HTTP:

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

Điều này chứng minh cách các nhà phân tích mạng có thể nhanh chóng trích xuất thông tin hữu ích từ lưu lượng mạng đã chụp, ngay cả khi nó được trộn lẫn với dữ liệu giao thức nhị phân.

Tóm tắt Sử dụng Nâng cao

Các kỹ thuật bạn đã học trong bước này chứng minh tính linh hoạt của lệnh strings cho các ứng dụng nâng cao:

  1. Kết hợp strings với grep để tìm kiếm các mẫu cụ thể
  2. Sử dụng strings để xác định các loại tệp
  3. Làm việc với file offsets để phân tích nhị phân chính xác
  4. Trích xuất dữ liệu có thể đọc được từ nội dung nhị phân hỗn hợp như các gói mạng

Các kỹ thuật này có giá trị cho các systemadmin, chuyên gia bảo mật và nhà phát triển phần mềm cần phân tích dữ liệu nhị phân mà không cần các công cụ chuyên dụng.

Tóm tắt

Trong lab này, bạn đã khám phá lệnh strings của Linux và học cách sử dụng nó để trích xuất văn bản có thể đọc được từ các tệp nhị phân. Các điểm chính được đề cập trong lab này bao gồm:

  1. Mục đích của lệnh strings là trích xuất các chuỗi ký tự mà con người có thể đọc được từ các tệp nhị phân, điều này hữu ích cho việc kiểm tra các tệp thực thi, thư viện và các tệp không phải văn bản khác.

  2. Cách sử dụng cơ bản của lệnh strings, bao gồm các tùy chọn như -n để chỉ định độ dài chuỗi tối thiểu và -t để hiển thị file offsets.

  3. Ứng dụng của lệnh strings để phân tích các loại tệp nhị phân khác nhau, bao gồm các thư viện hệ thống và các tệp thực thi ứng dụng.

  4. Các kỹ thuật để làm việc với các tệp được nén và mã hóa, chứng minh cách strings có thể trích xuất thông tin từ các tệp được nén trong khi các tệp được mã hóa thường tiết lộ thông tin tối thiểu.

  5. Các mẫu sử dụng nâng cao, bao gồm kết hợp strings với các lệnh khác như grep để phân tích có mục tiêu, xác định các loại tệp và kiểm tra lưu lượng mạng.

Các kỹ năng bạn đã học trong lab này có giá trị cho quản trị hệ thống, phát triển phần mềm, kiểm toán bảo mật và pháp y kỹ thuật số. Lệnh strings cung cấp một cách đơn giản nhưng mạnh mẽ để xem bên trong các tệp nhị phân mà không cần các công cụ chuyên dụng, khiến nó trở thành một tiện ích thiết yếu trong bộ công cụ của systemadmin Linux.

400+ câu lệnh phổ biến trong Linux