Bạn đã bao giờ tò mò về những nội dung văn bản ẩn chứa bên trong các tập tin nhị phân trên hệ thống Linux chưa? Việc trích xuất các chuỗi ký tự này thường không hề đơn giản, bởi vì định dạng của chúng không phải là văn bản thông thường mà con người có thể đọc được. Đây chính là lúc lệnh strings tỏa sáng. Công cụ mạnh mẽ này cho phép bạn dễ dàng tìm kiếm và hiển thị các chuỗi văn bản có thể đọc được, dù là ASCII hay Unicode, từ bất kỳ tệp nhị phân nào. Bài viết này sẽ là kim chỉ nam của bạn, hướng dẫn chi tiết từ việc giới thiệu lệnh strings, cách cài đặt, các phương pháp sử dụng cơ bản đến nâng cao, cùng những ứng dụng thực tế trong quản trị hệ thống và phát triển phần mềm. Hãy cùng khám phá cách làm chủ công cụ này để phân tích tập tin hiệu quả hơn.
Giới thiệu và mục đích sử dụng lệnh strings
Trong thế giới Linux, chúng ta có vô số công cụ dòng lệnh để xử lý văn bản, nhưng khi đối mặt với các tệp nhị phân, mọi chuyện trở nên phức tạp hơn. Đây là lúc lệnh strings thể hiện giá trị độc đáo của mình.
Lệnh strings là gì?
Lệnh strings là một tiện ích dòng lệnh trong các hệ điều hành Unix-like, với chức năng chính là tìm và trích xuất các chuỗi ký tự có thể đọc được từ các tập tin nhị phân. “Chuỗi ký tự có thể đọc được” ở đây thường được hiểu là các chuỗi bao gồm các ký tự in được, có độ dài tối thiểu là 4 ký tự theo mặc định.
Nó khác biệt hoàn toàn so với các công cụ khác. Ví dụ, grep được thiết kế để tìm kiếm một mẫu (pattern) cụ thể bên trong các tệp văn bản. grep sẽ không hiệu quả với tệp nhị phân vì nó sẽ cố gắng đọc toàn bộ tệp như một văn bản, dẫn đến kết quả nhiễu và không mong muốn. Trong khi đó, hexdump hay xxd lại hiển thị toàn bộ nội dung của tệp dưới dạng mã thập lục phân (hex), hữu ích cho việc phân tích ở mức độ byte nhưng lại khó đọc và không tập trung vào việc tìm kiếm chuỗi văn bản. Lệnh strings lấp đầy khoảng trống này bằng cách chỉ lọc ra những gì con người có thể đọc, giúp tiết kiệm thời gian và công sức đáng kể.
Mục đích sử dụng phổ biến
Lệnh strings có rất nhiều ứng dụng thực tế, đặc biệt trong lĩnh vực quản trị hệ thống, an ninh mạng và phát triển phần mềm. Dưới đây là một vài mục đích sử dụng phổ biến nhất:
Kiểm tra nội dung file nhị phân: Khi bạn có một tệp thực thi (executable file) hoặc một tệp thư viện (.so, .a) mà không có mã nguồn, strings là công cụ đầu tiên bạn nên nghĩ đến. Nó có thể tiết lộ các thông tin hữu ích như thông báo lỗi, tên hàm, đường dẫn tệp được hardcode, hoặc thậm chí là thông tin về tác giả và phiên bản phần mềm.

Hỗ trợ phân tích malware: Trong lĩnh vực an ninh mạng, các nhà phân tích thường sử dụng strings như một bước đầu tiên trong quá trình “phân tích tĩnh” (static analysis) một mẫu phần mềm độc hại. Malware thường chứa các chuỗi văn bản chỉ ra chức năng của nó, chẳng hạn như địa chỉ IP hoặc tên miền của máy chủ điều khiển (C&C server), các lệnh mà nó có thể thực thi, hoặc các thông báo gỡ lỗi mà lập trình viên vô tình để lại.
Tìm thông tin cấu hình: Đôi khi, các thông tin cấu hình hoặc các khóa API được nhúng trực tiếp vào bên trong tệp nhị phân thay vì được lưu trong một tệp cấu hình riêng. strings có thể giúp bạn nhanh chóng tìm ra những thông tin này mà không cần phải dịch ngược toàn bộ chương trình.
Cách cài đặt và chạy lệnh strings trên Linux
Lệnh strings là một phần của gói công cụ binutils (Binary Utilities), một bộ sưu tập các công cụ lập trình để xử lý các tệp đối tượng. Gói này thường được cài đặt sẵn trên hầu hết các bản phân phối Linux. Tuy nhiên, nếu hệ thống của bạn không có sẵn, việc cài đặt cũng rất đơn giản.
Cách kiểm tra và cài đặt strings
Trước khi cài đặt, bạn nên kiểm tra xem lệnh strings đã tồn tại trên hệ thống của mình hay chưa. Bạn có thể sử dụng lệnh which để xác định vị trí của tệp thực thi hoặc dùng tùy chọn --version để xem thông tin phiên bản.
Mở terminal và gõ một trong hai lệnh sau:
which strings
Nếu lệnh tồn tại, nó sẽ trả về đường dẫn, thường là /usr/bin/strings. Hoặc bạn có thể dùng:
strings --version

Nếu bạn nhận được thông báo lỗi như “command not found”, điều đó có nghĩa là binutils chưa được cài đặt. Dưới đây là cách cài đặt trên các bản phân phối phổ biến:
Trên Ubuntu/Debian:
sudo apt update && sudo apt install binutils
Trên CentOS/Fedora/RHEL:
sudo yum install binutils
Sau khi cài đặt xong, bạn có thể kiểm tra lại bằng lệnh which strings để chắc chắn rằng quá trình đã thành công.
Cách chạy lệnh strings cơ bản
Sử dụng lệnh strings vô cùng đơn giản ở dạng cơ bản nhất. Cú pháp chung của lệnh như sau:
strings [tùy chọn] ten_file
Trong đó, ten_file là đường dẫn đến tệp nhị phân bạn muốn phân tích.
Ví dụ, hãy thử chạy lệnh strings trên một tệp thực thi phổ biến như /bin/bash:
strings /bin/bash
Kết quả trả về sẽ là một danh sách dài các chuỗi ký tự được tìm thấy trong tệp. Đầu ra này được gọi là đầu ra chuẩn (standard output), và bạn có thể dễ dàng chuyển hướng nó sang các lệnh khác để xử lý tiếp, ví dụ như dùng grep để lọc hoặc less để xem từng trang.
Mặc định, strings sẽ tìm kiếm các chuỗi ký tự ASCII có độ dài từ 4 trở lên. Kết quả có thể bao gồm nhiều thứ, từ các thông báo lỗi, tên biến, các chuỗi sử dụng trong chương trình cho đến các đoạn mã HTML hoặc các thông tin mô tả khác. Vì kết quả có thể rất dài, bạn nên kết hợp với less để đọc dễ dàng hơn:
strings /bin/bash | less
Với cách này, bạn có thể cuộn lên xuống để xem toàn bộ kết quả một cách thuận tiện.
Hướng dẫn trích xuất chuỗi ký tự ASCII và Unicode
Một trong những khả năng mạnh mẽ của strings là xử lý được nhiều loại encoding ký tự khác nhau. Mặc dù mặc định là ASCII, bạn hoàn toàn có thể yêu cầu nó tìm kiếm các chuỗi Unicode, điều rất cần thiết khi làm việc với các phần mềm hiện đại hỗ trợ đa ngôn ngữ.
Trích xuất chuỗi ASCII
ASCII (American Standard Code for Information Interchange) là một bộ mã ký tự dựa trên bảng chữ cái tiếng Anh, bao gồm các chữ cái, chữ số, và các ký tự điều khiển. Đây là định dạng encoding cơ bản và phổ biến nhất trong các hệ thống máy tính đời đầu.
Theo mặc định, khi bạn chạy lệnh strings ten_file, nó sẽ tự động tìm kiếm các chuỗi ký tự ASCII. Một chuỗi được định nghĩa là một chuỗi liên tiếp của ít nhất 4 ký tự in được (printable characters) và kết thúc bằng một ký tự NUL (ký tự rỗng) hoặc một ký tự không in được. Con số 4 này là mặc định và bạn có thể thay đổi nó bằng tùy chọn -n.
Hãy xem một ví dụ thực tế. Giả sử chúng ta có một tệp nhị phân tên là my_program. Để trích xuất tất cả các chuỗi ASCII từ nó, chúng ta chỉ cần chạy:
strings my_program

Kết quả có thể trông như sau:
/lib64/ld-linux-x86-64.so.2
libc.so.6
__cxa_finalize
__libc_start_main
GLIBC_2.2.5
Hello, World!
Invalid input provided.
Usage: ./my_program [options]
Như bạn thấy, chúng ta đã dễ dàng trích xuất được các chuỗi hữu ích như tên thư viện, thông báo lỗi và hướng dẫn sử dụng từ tệp nhị phân.
Trích xuất chuỗi Unicode
Unicode được tạo ra để giải quyết những hạn chế của ASCII, hỗ trợ một bộ ký tự rộng lớn hơn rất nhiều, bao gồm hầu hết các ngôn ngữ trên thế giới. Trong các tệp nhị phân, chuỗi Unicode thường được mã hóa dưới dạng 16-bit (UTF-16) hoặc 32-bit (UTF-32).
Sự khác biệt chính là mỗi ký tự Unicode chiếm nhiều hơn một byte (thường là 2 hoặc 4 byte), trong khi ASCII chỉ dùng 1 byte. Do đó, nếu bạn dùng strings ở chế độ mặc định trên một tệp chứa chuỗi Unicode, bạn sẽ không thấy được kết quả đúng. Để xử lý Unicode, chúng ta cần sử dụng tùy chọn -e (encoding).
Các giá trị phổ biến cho tùy chọn -e bao gồm:
s: 7-bit ASCII (mặc định)
l: 16-bit little-endian Unicode
b: 16-bit big-endian Unicode
L: 32-bit little-endian Unicode
B: 32-bit big-endian Unicode
Little-endian và big-endian là hai cách sắp xếp byte trong bộ nhớ. Hầu hết các hệ thống hiện đại (như x86) đều dùng little-endian.
Ví dụ, để trích xuất chuỗi Unicode 16-bit little-endian từ một tệp có tên unicode_app, bạn sẽ dùng lệnh:
strings -e l unicode_app
Lệnh này sẽ quét tệp và tìm kiếm các chuỗi ký tự được mã hóa theo chuẩn UTF-16LE, giúp bạn khám phá các nội dung đa ngôn ngữ hoặc các chuỗi được sử dụng bởi các framework hiện đại thường mặc định dùng Unicode.
Các tùy chọn phổ biến và cách áp dụng
Lệnh strings không chỉ dừng lại ở việc trích xuất chuỗi cơ bản. Nó cung cấp nhiều tùy chọn mạnh mẽ giúp bạn tinh chỉnh quá trình tìm kiếm, lọc kết quả và định vị dữ liệu một cách chính xác hơn. Nắm vững các tùy chọn này sẽ nâng cao đáng kể hiệu quả phân tích của bạn.
Tùy chọn thường dùng
Dưới đây là một số tùy chọn quan trọng và được sử dụng thường xuyên nhất mà bạn nên biết:
-n <số> hoặc –bytes=<số>: Tùy chọn này cho phép bạn thiết lập độ dài tối thiểu của chuỗi ký tự cần tìm. Mặc định là 4. Nếu bạn thấy kết quả có quá nhiều chuỗi ngắn, vô nghĩa, việc tăng giá trị này lên 6, 8 hoặc thậm chí 10 sẽ giúp lọc bỏ nhiễu và chỉ hiển thị những chuỗi có khả năng chứa thông tin hữu ích cao hơn.
# Chỉ hiển thị các chuỗi có độ dài ít nhất 8 ký tự
strings -n 8 ten_file
-t <định dạng> hoặc –radix=<định dạng>: Tùy chọn này cực kỳ hữu ích khi bạn không chỉ muốn biết chuỗi là gì mà còn muốn biết nó nằm ở đâu trong tệp. Nó sẽ in ra vị trí (offset) của mỗi chuỗi ở đầu dòng. Các định dạng phổ biến bao gồm:
x: Thập lục phân (hexadecimal)
d: Thập phân (decimal)
o: Bát phân (octal)
Định dạng x (hex) là phổ biến nhất trong phân tích nhị phân.
# Hiển thị offset của mỗi chuỗi dưới dạng hex
strings -t x ten_file

-e <encoding> hoặc –encoding=<encoding>: Như đã đề cập ở phần trước, tùy chọn này cho phép bạn chọn bộ mã hóa ký tự. Đây là tùy chọn bắt buộc phải dùng khi bạn nghi ngờ tệp chứa các chuỗi không phải là ASCII, ví dụ như Unicode. Các giá trị thường dùng là l (16-bit little-endian) và b (16-bit big-endian).
# Tìm chuỗi Unicode 16-bit little-endian
strings -e l ten_file
Áp dụng tùy chọn trong tình huống thực tế
Việc kết hợp các tùy chọn này cho phép bạn tạo ra những truy vấn mạnh mẽ và phù hợp với từng ngữ cảnh cụ thể.
Giảm nhiễu và tập trung vào dữ liệu quan trọng: Khi phân tích một tệp thực thi lớn, kết quả từ strings có thể lên tới hàng ngàn dòng, trong đó có rất nhiều chuỗi ngắn không mang ý nghĩa. Bằng cách sử dụng -n, bạn có thể loại bỏ phần lớn “rác” này. Ví dụ, lệnh strings -n 10 /bin/ls sẽ cho kết quả gọn gàng hơn nhiều so với khi không có tùy chọn.

Định vị và phân tích sâu hơn: Giả sử bạn tìm thấy một chuỗi đáng ngờ, ví dụ như “ADMIN_PASSWORD”, bên trong một tệp nhị phân. Chỉ biết sự tồn tại của nó là chưa đủ. Bằng cách sử dụng strings -t x ten_file, bạn sẽ biết chính xác địa chỉ offset của chuỗi đó. Với thông tin này, bạn có thể sử dụng các công cụ khác như hexdump, gdb, hoặc một hex editor như bless để nhảy thẳng đến vị trí đó và phân tích các byte xung quanh. Điều này giúp bạn hiểu rõ hơn về ngữ cảnh sử dụng của chuỗi, chẳng hạn như nó được so sánh với giá trị nào, hoặc được sử dụng bởi hàm chức năng nào.
# Tìm chuỗi "PASSWORD" và hiển thị offset của nó
strings -t x my_app | grep "PASSWORD"
Việc sử dụng thành thạo các tùy chọn này biến strings từ một công cụ đơn giản thành một con dao đa năng trong bộ công cụ phân tích của bạn.
Ví dụ minh họa trong phân tích và kiểm tra dữ liệu tập tin
Lý thuyết sẽ trở nên dễ hiểu hơn rất nhiều khi được áp dụng vào các ví dụ thực tế. Hãy cùng xem cách strings được sử dụng để phân tích các loại tệp nhị phân khác nhau trong các tình huống cụ thể.
Ví dụ 1: Phân tích file thực thi để tìm chuỗi lỗi hoặc thông báo
Các tệp thực thi trên Linux (thường không có đuôi mở rộng, nằm trong các thư mục như /bin, /usr/bin) là đối tượng phân tích phổ biến nhất của lệnh strings. Lập trình viên thường nhúng các chuỗi thông báo lỗi, thông tin phiên bản, hoặc hướng dẫn sử dụng trực tiếp vào mã nguồn, và chúng sẽ được lưu lại trong tệp nhị phân sau khi biên dịch.
Hãy thử phân tích tiện ích curl, một công cụ dòng lệnh để truyền dữ liệu. Chúng ta có thể tìm kiếm các chuỗi liên quan đến “error” hoặc “failed” để xem các thông báo lỗi mà chương trình có thể xuất ra.
strings /usr/bin/curl | grep -i "error"
Cờ -i trong grep có nghĩa là không phân biệt chữ hoa, chữ thường. Kết quả có thể cho ra những dòng như:
TLSv1.3, (INSECURE) TLSv1.2 and later with certificate error frames
Internal server error
curl: (%d) An unknown option was passed in to libcurl
GnuTLS recv error (%d): %s
Proxy CONNECT aborted due to error

Từ kết quả này, chúng ta có thể hiểu thêm về cách curl xử lý lỗi, các thư viện mà nó sử dụng (ví dụ: GnuTLS), và các loại sự cố mà người dùng có thể gặp phải. Đây là một kỹ thuật cực kỳ hữu ích cho việc gỡ lỗi (debugging) khi bạn không có mã nguồn.
Ví dụ 2: Kiểm tra file cấu hình nhúng hoặc file log nhị phân
Không phải lúc nào các tệp cấu hình hay log cũng ở dạng văn bản thuần túy. Một số ứng dụng lưu trữ chúng ở định dạng nhị phân để tối ưu hóa tốc độ truy cập hoặc để làm phức tạp hóa việc chỉnh sửa bởi người dùng. Lệnh strings là công cụ hoàn hảo để “nhìn trộm” vào bên trong các tệp này.
Giả sử bạn có một tệp settings.dat từ một ứng dụng độc quyền. Bạn nghi ngờ nó chứa các thông tin cấu hình mạng nhưng không thể mở bằng trình soạn thảo văn bản thông thường. Hãy thử dùng strings:
strings settings.dat
Kết quả có thể làm bạn ngạc nhiên:
SERVER_IP=192.168.1.100
PORT=8080
USERNAME=admin
TIMEOUT=30
ENABLE_SSL=true
LAST_LOGIN=2023-10-27T10:00:00Z

Trong trường hợp này, strings đã giúp bạn trích xuất thành công các cặp khóa-giá trị cấu hình quan trọng mà không cần đến công cụ chuyên dụng nào khác. Tương tự, đối với các tệp log nhị phân, strings có thể giúp bạn tìm kiếm các chuỗi thời gian, thông báo sự kiện hoặc các định danh người dùng để điều tra sự cố một cách nhanh chóng.
Ứng dụng thực tế của lệnh strings trong quản trị hệ thống và phát triển phần mềm
Ngoài các ví dụ cụ thể đã nêu, strings còn đóng một vai trò quan trọng trong nhiều quy trình công việc hàng ngày của các quản trị viên hệ thống (sysadmin), kỹ sư phần mềm và chuyên gia bảo mật.
Phát hiện malware hoặc phần mềm độc hại: Đây là một trong những ứng dụng quan trọng nhất trong lĩnh vực an ninh mạng. Khi một hệ thống bị nghi ngờ nhiễm mã độc, các nhà phân tích sẽ chạy strings trên các tệp lạ hoặc các tiến trình đáng ngờ. Các chuỗi ký tự được trích xuất có thể tiết lộ những thông tin đắt giá như: địa chỉ IP hoặc tên miền của máy chủ C2 (Command and Control), các lệnh hệ thống mà malware dự định thực thi (ví dụ: rm -rf /), các hàm API của hệ điều hành được gọi, hoặc các chuỗi văn bản đặc trưng của một họ malware đã biết. Việc này giúp nhanh chóng xác định bản chất và mục đích của phần mềm độc hại.

Hỗ trợ debug phần mềm: Đối với các nhà phát triển, strings là một người bạn đồng hành thầm lặng nhưng hiệu quả. Khi một ứng dụng gặp sự cố và chỉ đưa ra một thông báo lỗi chung chung, bạn có thể chạy strings trên tệp thực thi hoặc thư viện của nó để tìm kiếm các chuỗi lỗi chi tiết hơn mà có thể chưa được hiển thị. Đôi khi, bạn sẽ tìm thấy các thông báo gỡ lỗi mà lập trình viên đã để lại, ví dụ: “DEBUG: Failed to allocate memory in function X”. Những thông tin này cung cấp manh mối quý giá để xác định nguyên nhân gốc rễ của vấn đề.
Kiểm tra file nhị phân trước khi triển khai: Trước khi phát hành một phần mềm, việc kiểm tra các tệp nhị phân bằng strings là một bước thực hành tốt. Nó giúp đảm bảo rằng không có thông tin nhạy cảm nào bị vô tình nhúng vào sản phẩm cuối cùng. Ví dụ, bạn có thể kiểm tra xem có khóa API, mật khẩu, hoặc đường dẫn tệp cá nhân của nhà phát triển nào bị “hardcode” trong mã hay không. Việc phát hiện và loại bỏ những thông tin này trước khi sản phẩm đến tay người dùng giúp tăng cường bảo mật và tính chuyên nghiệp của ứng dụng.
Các vấn đề thường gặp và cách khắc phục
Mặc dù strings là một công cụ tương đối đơn giản, người dùng mới đôi khi cũng có thể gặp phải một số vấn đề. Hiểu rõ nguyên nhân và cách khắc phục sẽ giúp bạn sử dụng công cụ này một cách trơn tru và hiệu quả hơn.
Lỗi không tìm thấy lệnh strings
Đây là vấn đề phổ biến nhất, đặc biệt trên các hệ thống được cài đặt tối giản hoặc trong các môi trường container như Docker.
Nguyên nhân: Lỗi bash: strings: command not found xuất hiện khi gói binutils không được cài đặt trên hệ thống của bạn. Lệnh strings không phải là một công cụ độc lập mà là một phần của bộ công cụ này.
Hướng dẫn khắc phục: Giải pháp rất đơn giản là cài đặt gói binutils. Bạn chỉ cần chạy lệnh phù hợp với trình quản lý gói của bản phân phối Linux mà bạn đang sử dụng:
Đối với hệ thống dựa trên Debian/Ubuntu:
sudo apt-get update
sudo apt-get install binutils
Đối với hệ thống dựa trên CentOS/Fedora/RHEL:
sudo yum install binutils
Sau khi cài đặt thành công, bạn có thể xác minh lại bằng cách chạy which strings.
Kết quả đầu ra quá dài, nhiều chuỗi không liên quan
Khi bạn chạy strings trên một tệp nhị phân lớn, kết quả trả về có thể là một “bức tường văn bản” dài hàng ngàn dòng, khiến việc tìm kiếm thông tin hữu ích trở nên khó khăn.
Nguyên nhân: Các tệp nhị phân, đặc biệt là các tệp được biên dịch với thông tin gỡ lỗi, chứa rất nhiều chuỗi ký tự, bao gồm tên biến, tên hàm, và các hằng số. Nhiều chuỗi trong số này rất ngắn và không mang lại giá trị phân tích.
Giải pháp: Có nhiều cách để lọc và quản lý đầu ra này:
- Sử dụng tùy chọn
-n: Đây là cách đơn giản nhất để giảm nhiễu. Bằng cách tăng độ dài chuỗi tối thiểu, bạn có thể loại bỏ phần lớn các chuỗi ngắn, vô nghĩa. Hãy thử với -n 8 hoặc -n 10 để xem sự khác biệt.
strings -n 10 ten_file.bin
Kết hợp với grep: Nếu bạn đang tìm kiếm một thông tin cụ thể, hãy sử dụng pipe (|) để chuyển đầu ra của strings cho grep. Ví dụ, để tìm các chuỗi liên quan đến “http”, bạn có thể dùng:
strings ten_file.bin | grep "http"
Sử dụng less để xem phân trang: Đối với việc khám phá thủ công, chuyển đầu ra sang less là cách tốt nhất. Nó cho phép bạn cuộn lên, cuộn xuống và thậm chí tìm kiếm bên trong kết quả mà không làm lộn xộn màn hình terminal.
strings ten_file.bin | less

Bằng cách áp dụng các kỹ thuật này, bạn có thể biến một lượng lớn dữ liệu khó quản lý thành một tập hợp thông tin hữu ích và dễ tiếp cận hơn.
Những lưu ý và thực hành tốt nhất khi dùng strings
Để khai thác tối đa sức mạnh của lệnh strings và tránh những sai lầm không đáng có, hãy ghi nhớ một vài lưu ý và áp dụng các thực hành tốt nhất sau đây.
Luôn xác định encoding đúng: Đây là điểm quan trọng nhất. Nếu bạn chỉ dùng strings ở chế độ mặc định (ASCII) trên một tệp chứa chuỗi Unicode, bạn sẽ bỏ lỡ thông tin quan trọng hoặc nhận được kết quả sai lệch. Nếu nghi ngờ tệp có chứa ký tự đa ngôn ngữ, hãy thử với tùy chọn -e l (little-endian) hoặc -e b (big-endian). Việc thử nghiệm với các encoding khác nhau có thể khám phá ra những dữ liệu ẩn.
Lọc chuỗi theo độ dài phù hợp: Đừng ngần ngại sử dụng tùy chọn -n. Bắt đầu với giá trị mặc định (4), và nếu kết quả quá nhiễu, hãy tăng dần lên 6, 8, hoặc cao hơn. Tìm ra độ dài tối thiểu phù hợp cho từng trường hợp cụ thể sẽ giúp bạn tập trung vào những chuỗi có khả năng chứa thông tin giá trị nhất.
Kết hợp strings với các công cụ khác: strings hiếm khi là công cụ cuối cùng trong một chuỗi phân tích. Sức mạnh thực sự của nó được phát huy khi kết hợp với các tiện ích dòng lệnh khác. Hãy biến việc sử dụng pipe (|) thành thói quen. Chuyển đầu ra của strings sang grep để lọc, sort để sắp xếp, uniq để đếm các chuỗi duy nhất, hoặc less để xem. Ví dụ, để tìm 5 chuỗi xuất hiện nhiều nhất trong một tệp, bạn có thể dùng:
strings ten_file.bin | sort | uniq -c | sort -nr | head -n 5

Không dùng strings để đọc file văn bản: Điều này nghe có vẻ hiển nhiên, nhưng cần phải nhấn mạnh. strings được thiết kế cho tệp nhị phân. Nếu bạn muốn đọc nội dung của một tệp văn bản (ví dụ: .txt, .log, .c), hãy sử dụng các lệnh phù hợp hơn như cat, less, more, hoặc grep. Sử dụng strings trên tệp văn bản không mang lại lợi ích gì và có thể hoạt động không như mong đợi.
Sử dụng offset để phân tích sâu: Khi bạn tìm thấy một chuỗi quan trọng, đừng chỉ dừng lại ở đó. Hãy sử dụng tùy chọn -t x để lấy địa chỉ offset của nó. Thông tin này là chiếc chìa khóa để bạn sử dụng các công cụ phân tích sâu hơn như gdb (trình gỡ lỗi) hoặc ghidra (công cụ dịch ngược) để hiểu rõ ngữ cảnh và cách chuỗi đó được chương trình sử dụng.
Kết luận
Lệnh strings trên Linux là một công cụ nhỏ gọn nhưng có sức mạnh đáng kinh ngạc. Nó đóng vai trò như một cây cầu nối, cho phép chúng ta nhìn vào thế giới bên trong của các tệp nhị phân—một thế giới thường bị che khuất bởi các byte mã máy khó hiểu. Từ việc trích xuất nhanh một thông báo lỗi, tìm kiếm thông tin cấu hình ẩn, cho đến việc thực hiện những bước đầu tiên trong phân tích phần mềm độc hại, strings đã chứng tỏ vai trò không thể thiếu trong bộ công cụ của bất kỳ quản trị viên hệ thống, nhà phát triển phần mềm hay chuyên gia bảo mật nào.
Qua bài viết này, chúng ta đã cùng nhau tìm hiểu từ những khái niệm cơ bản, cách cài đặt, các tùy chọn nâng cao cho đến những ứng dụng thực tiễn. Lợi ích lớn nhất của strings nằm ở sự đơn giản và hiệu quả, giúp tiết kiệm thời gian và cung cấp những manh mối quan trọng một cách nhanh chóng.
Đừng chỉ đọc, hãy mở terminal của bạn lên và thực hành ngay hôm nay. Hãy thử chạy lệnh strings trên một vài tệp thực thi trên hệ thống của bạn. Bạn sẽ ngạc nhiên với những gì mình có thể khám phá. Việc thành thạo công cụ này sẽ giúp bạn nâng cao kỹ năng phân tích, gỡ lỗi và điều tra trên môi trường Linux Ubuntu.