Lệnh strings trong Linux giúp bạn tìm kiếm các chuỗi ký tự ASCII có thể đọc được trong các file nhị phân hoặc file dữ liệu. Lệnh strings đặc biệt hữu ích khi bạn muốn phân tích các file thực thi hoặc thư viện để tìm thông tin ẩn. Nó sẽ trích xuất các chuỗi này, giúp bạn hiểu rõ hơn về nội dung và chức năng của file đó một cách nhanh chóng.
Lệnh strings trong linux là gì?
Lệnh command strings in linux là một công cụ dòng lệnh mạnh mẽ, giúp bạn tìm kiếm các chuỗi ký tự ASCII có thể in được trong các tệp nhị phân hoặc tệp dữ liệu. Nó đặc biệt hữu ích khi bạn muốn phân tích các tệp thực thi, thư viện hoặc các tệp mà bạn không biết rõ nội dung bên trong. Lệnh này sẽ trích xuất các chuỗi ký tự có độ dài tối thiểu (mặc định là 4 ký tự) và hiển thị chúng trên màn hình. Bạn có thể sử dụng nó để tìm kiếm thông tin như thông báo lỗi, tên hàm hoặc bất kỳ văn bản nào được nhúng trong tệp. Strings giúp bạn hiểu rõ hơn về cấu trúc và chức năng của các tệp nhị phân một cách nhanh chóng và hiệu quả.
Tìm 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 chuỗi văn bản dễ đọc từ các tệp nhị phân. Các tệp nhị phân, như 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. Mã máy thì không dễ đọc, nhưng dữ liệu văn bản thường chứa thông tin giá trị như thông báo lỗi, cài đặt cấu hình và tài liệu nhúng.
Hãy bắt đầu bằng cách đảm bảo 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 dễ đọ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 và kết thúc bằng dòng mới hoặc ký tự null. Điều này làm cho nó có giá trị cho:
- Tìm văn bản nhúng trong các tệp thực thi
- Khám phá các đường dẫn và cài đặt được mã hóa cứng
- Phân tích pháp y cơ bản
- Khắc phục sự 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 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 bằng strings
Trong bước này, bạn sẽ học cách dùng lệnh strings để phân tích các loại tệp nhị phân khác nhau.
Việc này bao gồm các thư viện hệ thống và các tệp nhị phân ứng dụng, giúp bạn hiểu cách trích xuất văn bản.
Việc 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ố hoặc tìm thông tin cụ thể.
Thậm chí, bạn có thể khám phá các chức năng ẩn, vì vậy hãy đảm bảo bạn vẫn ở 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 code được chia sẻ giữa nhiều chương trình khác nhau, rất hữu ích.
Hãy xem xét một thư viện hệ thống phổ biến, libc.so.6, là thư viện C chuẩn được 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
Kết quả đầu ra của bạn có thể tương tự như sau:
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 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à văn bản dễ đọ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 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 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 bằng lệnh sau:
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 đến.
Phân tích thông tin phiên bản
Bạn cũng có thể 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
Kết quả đầ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 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 một 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 để thực hành.
## 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 dùng lệnh strings để trích xuất văn bản từ tệp nhị phân này.
strings testfile.bin
Kết quả đầ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 ra dữ liệu nhị phân và chỉ hiển thị văn bản dễ đọc.
Ngay cả khi văn bản đó được trộn lẫn với dữ liệu không phải văn bản, lệnh vẫn hoạt động tốt.
Làm việc với các tệp tin 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 tin nén và mã hóa.
Vì các tệp này thường chứa dữ liệu nhị phân, strings có thể trích xuất văn bản dễ đọc mà không cần giải nén hoặc giải mã hoàn toàn.
Hãy chắc chắn rằng bạn đang ở trong thư mục lab:
cd ~/project/strings_lab
Phân tích các tệp tin nén
Chúng ta sẽ tạo một tệp văn bản và nén nó bằng nhiều phương pháp khác nhau để xem strings xử lý nội dung 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.
Tiếp theo, hãy sử dụng strings để xem chúng ta có thể trích xuất được gì:
strings sample_text.gz
Bạn có thể thấy kết quả như sau:
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, vẫn để lại nhiều đoạn văn bản dễ đọc.
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
Kết quả có thể khó đọ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.
Một số thuật toán để lại ít đoạn văn bản dễ đọc hơn những thuật toán khác.
Làm việc với các tệp tin đã 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 đã mã hóa và xem strings có thể trích xuất được 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 đã mã hóa:
strings secret.enc
Bạn có thể thấy kết quả như sau:
Salted__
Như dự kiến, bạn không thể thấy thông báo gốc vì nó đã được mã hóa đúng cách.
Văn bản dễ đọc duy nhất là tiêu đề "Salted__" mà OpenSSL thêm vào đầu các tệp đã mã hóa.
Tiêu đề này cho biết 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ý đã nén
Các quản trị viên hệ thống 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ý đã 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ó 20 ký tự in được trở lên.
Kết quả 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 cho thấy cách quản trị viên hệ thống có thể nhanh chóng kiểm tra nội dung của các tệp nhật ký đã nén.
Việc này có thể thực hiện mà không cần giải nén chúng trước, đặc biệt hữu ích khi xử lý các kho lưu trữ nhật ký lớn.
Kết luận cho linux strings command
Tóm lại, lệnh strings là một công cụ nhỏ nhưng vô cùng hữu ích trong Linux, giúp bạn khám phá những chuỗi văn bản ẩn chứa bên trong các tệp nhị phân. Nó giống như một chiếc chìa khóa mở ra những bí mật tiềm ẩn, cho phép bạn hiểu rõ hơn về cấu trúc và nội dung của các chương trình. Với linux strings command, bạn có thể dễ dàng tìm kiếm thông tin quan trọng, gỡ lỗi phần mềm, hoặc đơn giản là thỏa mãn trí tò mò về cách các ứng dụng hoạt động. Hãy thử nghiệm với các tùy chọn khác nhau để khai thác tối đa sức mạnh của nó, bạn sẽ ngạc nhiên về những gì mình có thể khám phá đấy. Đừng ngại thử nghiệm và khám phá, vì đây là cách tốt nhất để làm chủ công cụ này. Chúc bạn thành công trên hành trình khám phá thế giới Linux!