Friday , 20 September 2019
Home » Bảo Mật » Shellcode là gì?

Shellcode là gì?

Shellcode là gì?

Định nghĩa về shellcode (có rất nhiều định nghĩa)

  • Shellcode, là đoạn chương trình giúp bạn có được…một cái shell. Thế shell là cái gì? Theo Wikipedia, shell là một phần mềm cung cấp một giao diện dòng lệnh (command line interface) giúp bạn có thể tương tác với hệ điều hành. Shell sẽ nhận lệnh của bạn, gửi xuống phần lõi (kernel) của hệ điều hành để thực thi, rồi nhận kết quả trả về và gửi lại cho bạn. Có thể hiểu nôm na rằng, có shell trên một máy tính nào đó có nghĩa là bạn có quyền thực thi lệnh trên máy tính đó.shellcode-metasploit
  • Shellcode là payload của các đoạn mã khai thác lỗ hổng bảo mật (exploit). Khi viết exploit, bạn phải giải quyết hai vấn đề chính: a) injection vector: xác định cách chèn shellcode vào trong hệ thống muốn tấn công; b) payload: xác định shellcode mà bạn muốn chạy trên hệ thống đó. Shellcode có thể làm được mọi thứ, từ việc điều chỉnh giở hệ thống hay download và thực thi một file từ Internet cho đến gửi một email ra ngoài. Mục tiêu chính của các exploit là làm sao có thể chạy được shellcode nằm trong phần payload của nó.
  • Shellcode còn được gọi là bytecode, tạm dịch là mã máy. Chúng ta đều biết mã máy là thứ ngôn ngữ duy nhất mà bộ vi xử lí có thể hiểu được. Tất cả các chương trình viết bằng bất kì ngôn ngữ nào đều phải được biên dịch sang mã máy trước khi máy tính có thể chạy được chương trình đó. Khác với các chương trình này, shellcode được thể hiện như một nhóm các mã máy, do đó máy tính có thể hiểu và thực thi trực tiếp shellcode mà không cần phải trải qua bất kì công đoạn biên dịch nào cả.

Như vậy muốn viết được shellcode, tôi phải học cách viết mã máy? Câu trả lời là không. Không ai trực tiếp viết ra mã máy khi muốn tạo shellcode. Thay vào đó, bạn có thể: a) sử dụng các shellcode có sẵn trên Internet; b) viết bằng C, dịch sang Assembly rồi tiếp tục dịch sang mã máy; c) viết bằng Assembly rồi dịch luôn ra mã máy.

Đối với cách a), tin vui là có rất nhiều thư viện shellcode trên Internet, thậm chí có một số chương trình cho phép bạn tạo shellcode và viết exploit bằng một ngôn ngữ cao cấp như Python hay Ruby. Tin buồn là nếu bạn nhào vào sử dụng liền các shellcode có sẵn mà không tìm hiểu chúng, bạn có thể bị gài bom. Nên nhớ rằng, shellcode có thể làm được tất cả mọi chuyện, hành động lấy shellcode từ Internet rồi chạy mà không thật sự hiểu shellcode đó làm gì giống như việc chạy các file .exe nhận được từ một người lạ mặt! Đến một lúc nào đó, bạn sẽ sử dụng các chương trình tạo shellcode tự động kể trên để đơn giản hóa việc viết exploit nhưng trước mắt, bạn cần phải tự viết được shellcode đã.

Trong tài liệu này chúng ta sẽ sử dụng luân phiên hai cách b) và c) để viết shellcode. Bạn nên sử dụng cách b) khi mới bắt đầu hoặc khi cần phải triển khai một loại shellcode phức tạp. Nhìn vào hai cách này, bạn có thể thấy rằng viết shellcode đòi hỏi phải có sự thông hiểu về ngôn ngữ Assembly của kiến trúc máy tính mà bạn dự định sẽ chạy shellcode trên đó. Đây là điều hiểu nhiên bởi lẽ các loại máy khác nhau (x86, x86-64, sparc, ppc, amd hay mips…) chỉ hiểu được một nhóm mã máy khác nhau. Ngoài ra, bạn còn phải thông hiểu cách giao tiếp với hệ điều hành (linux, windows, solaris hay freebsd…) để có thể thực thi được lệnh trong shellcode. Thông thường, bạn cần phải có một phiên bản shellcode khác nhau cho mỗi loại hệ điều hành chạy trên mỗi loại kiến trúc phần cứng khác nhau. Nói cách khác, shellcode phụ thuộc vào hệ điều hành và kiến trúc phần cứng.

Bạn vẫn còn đang đọc bài này đó chứ :p? Nếu có bất kì chỗ nào còn mù mờ, bạn nên đọc lại từ đầu và đừng ngại hỏi nếu bạn muốn. Những gì tôi trình bày về shellcode từ đầu đến giờ là những ý quan trọng nhất về shellcode, nếu bạn chỉ muốn biết shellcode để nói chuyện cho vui thì bạn có thể dừng lại ở đây. Còn nếu bạn muốn tự viết cho mình những đoạn shellcode tối ưu thì hãy đi tiếp cùng tôi nhé.

Trong bài tiếp theo, tôi sẽ trình bày những kiến thức căn bản về Assembly đủ để bạn có thể hiểu và viết được shellcode đầu tiên của mình. Sau đó tôi sẽ đề cập đến hai trở ngại quan trọng nhất mà bạn cần phải vượt qua khi viết shellcode: vấn đề địa chỉ ô nhớ (addressing problem) và vấn đề của các byte có giá trị null (null byte problem). Chúng ta cũng sẽ thảo luận sơ lược một số ví dụ về shellcode trên kiến trúc máy Intel 32-bit (còn gọi là x86).

Cần chuẩn bị những gì để học viết shellcode?

Như đã nói từ đầu, bài viết này không yêu cầu bạn phải có kiến thức trước về Assembly hay C. Yêu cầu duy nhất là bạn phải có sự khao khát học hỏi cái mới. Ngoài ra, tôi sử dụng Ubuntu Linux trên máy x86 để viết các shellcode mẫu trong bài này, do đó bạn cũng cần phải chuẩn bị một máy tính có cấu hình tương tự (Linux-x86) như tôi. Bạn chọn distro nào cũng được, nhưng tốt nhất là nên chọn Ubuntu như tôi luôn. Các phần mềm khác mà bạn cần phải chuẩn bị:

  • nasm là bộ phần mềm bao gồm một assembler tên nasm và một disassembler mang tên ndisasm. nasm dùng để biên dịch các mã lệnh Assembly sang mã máy, còn ndisasm làm công việc ngược lại.
  • gdb là phần mềm giúp bạn debug (bắt lỗi) hoặc disassemble các chương trình viết bằng C. gdb thường có sẵn trong distro của bạn.
  • objdump là công cụ giúp bạn xem các thông tin quan trọng trong các file object hay file executable. Tương tự như gdb, objdump thường có sẵn trong distro của bạn.
  • strace là công cụ xem các syscall (tôi sẽ giải thích khái niệm này sau) mà một chương trình gọi khi nó được thực thi

(vnhacker)

Lượt xem (795)

About Nguyễn Thanh Sơn

Nguyễn Thanh Sơn
Network Security, Web Design, Computer Science

Xem thêm

header in c++

Tách chương trình lớn thành các file riêng

Tại sao cần phải tách Khi lập trình với bất cứ ngôn ngữ nào thì …

Để lại bình luận:

Loading Facebook Comments ...

Leave a Reply

Your email address will not be published. Required fields are marked *