Chủ Nhật, 7 tháng 7, 2013

Reverse Engineering: Khai vị

Reverse Engineering và phần mềm cấp thấp

Reverse engineering là một quá trình nơi một sản phẩm được thiết kế (ví dụ như xe ô tô hoặc các chương trình phần mềm) được mổ xẻ theo một cách ta có thể lấy được các chi tiết bên trong của nó, ví dụ như thiết kế của nó ra sao và kiến trúc của nó thế nào.

Trong thế giới phần mềm reverse engineeing sẽ lấy một chương trình với mã nguồn hoặc là các tài liệu về chương trình đó là không có sẵn và cố gắng phục hồi các chi tiết liên quan đến thiết kế và triển khai của nó. Trong một vài trường hợp mã nguồn có sẵn nhưng những người phát triển ban đầu của nó không tiết lộ những mã này. Chúng ta sẽ giải quyết những thứ liên quan đến binary reverse engineering. Các kĩ thuật binary reverse engineering là các kĩ thuật nói về việc triết xuất các thông tin có giá trị từ các chương trình với mã nguồn không có sẵn (mã nguồn đóng). Trong một vài trường hợp, ta có thể phục hồi được mã nguồn thực sự từ program binaries, điều này giúp ta đơn giản hóa công việc bởi vì đọc code được biểu diễn dưới ngôn ngữ cấp cao là dễ hơn rất nhiều so với việc đọc các mã hợp ngữ bậc thấp.

Ứng dụng của Reverse Engineering

Công bằng mà nói ứng dụng được biết đến nhiều nhất của reverse engineering là liên quan đến việc phát triển các sản phẩm có tính cạnh tranh. Một điều thú vị là nó không thực sự phổ biến trong công nghiệp phần mềm như mong đợi. Một vài lý do giải thích cho điều này, nhưng lý do chính là vì phần mềm thì quá phức tạp mà trong nhiều trường hợp reverse engineering cho các mục đích cạnh tranh là một quá trình phức tạp mà về tài chính là vấn đề được cân nhắc.

Vậy thì đâu là các ứng dụng phổ biến của reverse engineering trong thế giới phần mềm ? Nói một cách chung chung, có 2 mảng ứng dụng của reverse engineering : mảng liên quan đến an ninh (security-related) và mảng còn lại liên quan đến phát triển phần mềm (software-related).

Secutiry-Related Reversing

Đối với một vài người thì mối tương quan giữa security và reversing có thể ngay lập tức không rõ ràng. Reversing có liên hệ với một vài khía cạnh khác nhau của computer security. Ví dụ, reversing được sử dụng trong các nghiên cứu về mã hóa - một nhà nghiên cứu reverses một sản phẩm mã hóa và đánh giá mục độ an toàn mà sản phẩm đó đáp ứng. Reversing còn được sử dụng nhiều trong mảng mã độc (malicious software), trên cả 2 "chiến tuyến": nó được sử dụng bởi cả những người phát triển malware lấn đội ngữ tìm diệt mã độc. Cuối cùng, reversing là rất phổ biến với crackers những người sử dụng reversing để phân tích và mục tiêu cuối cùng là hạ gục các cơ chế bảo vệ bản quyền trên sản phẩm. Các phần phía dưới đây tôi sẽ nói về các ứng dụng này. Nào hãy cùng bắt đầu với mã độc.

Malicious Software

Internet đã làm thay đổi hoàn toàn nền công nghiệp máy tính và các vấn đề an ninh đã trở nên bức thiết. Malicious software, ví dụ như viruses và worms, lan đi với một tốc độ chóng mặt trên thế giới với hàng triệu người dùng kết nối đến Internet và sử dụng e-mail bị nhiễm. Chỉ 10 năm trước thôi, một virus có thể tự sao chính bản thân nó vào một ổ đĩa và ổ đĩa đó có thể được nạp vào trong máy tính khác với mục đích lây nhiễm virus. Quá trình truyền nhiễm diễn ra khá chậm, và để chống lại nó thì không có gì là khó khăn bởi vì diện lây lan là hẹp và yêu cầu sự can thiệp từ phía con người mới có thể lây nhiễm. Nhưng tất cả đã là quá khứ - Internet đã tạo một kết nối ảo giữa hầu hết các máy tính trên trái đất. Ngày nay nhiều worms "đời mới" có thể lây lan tự động đến hàng triệu máy tính mà không cần bất cứ sự can thiệp nào của con người.

Reversing được mở rộng sử dụng cho cả 2 đầu của chuỗi malicious software. Những người phát triển thường sử dụng reversing để xác định vị trí của các lỗ hổng (vulnerabilities) trong các hệ điều hành và các phần mềm khác. Những lỗ hổng như vậy có thể được sử dụng để xuyên qua các lớp bảo vệ và cho phép sự lây nhiễm. Ngoài việc lây nhiễm, thủ phạm thỉnh thoảng còn sử dụng các kĩ thuật reversing để xác định vị trí các lỗ hổng phần mềm mà cho phép một malicous program có được quyền truy nhập tới các thông tin nhạy cảm và chiếm được quyền điều khiển hệ thống.

Tại phía bên kia chiến tuyến, các nhà phát triển phần mềm antivirus mổ xẻ và phân tích mọi malicious program rơi vào tay họ. Họ sử dụng các kĩ thuật reversing để lần theo dấu vết một chương trình để lại và đánh giá mối đe dọa nó có thể tạo ra, tỉ lệ lây nhiễm, làm thế nào để loại bỏ chúng khỏi hệ thống bị lây nhiễm, sự lây nhiễm đó có thể tránh được hoàn toàn hay không. Tôi sẽ có một loạt bài giới thiệu về thế giới của malicious software và demo làm thế nào reversing được sử dụng bởi những người viết chương trình antivirus.

Reversing Cryptographic Algorithms

Crytography thường xuyên dựa trên tính bí mật (secrecy): Alice gửi một tin nhắn cho Bob, và mã hóa tin nhắn sử dụng một bí mật và chỉ được biết bởi cô ấy và Bob. Crytographic algorithms được chia thành 2 nhóm: restricted algorithms và key-based algorithms. Restricted algorithms là kiểm dành cho tụi trẻ con; viết một lá thư cho một người bạn với mỗi chữ được dịch đi lên hoặc đi xuống. Sự bí mật trong restricted algorithms là ở chính giải thuật này. Mỗi khi giải thuật bị lộ ra, sẽ không còn sự bảo mật nữa. Restricted algorithms đáp ứng tính an toàn không cao bởi vì reversing có thể làm cho nó rất khó khăn để duy trì tính bảo mật của giải thuật. Bởi vì giải thuật là bí mật, reversing có thể được xem như là một cách bẻ gãy giải thuật.

Mặt khác, trong key-based algorithms, bí mật là một cái chìa khóa (key), một vài giá trị số được sử dụng bởi giải thuật để mã hóa và giải mã thông điệp. Trong key-based algorithms, người dùng mã hóa các thông điệp sử dụng keys được giữ riêng tư. Các giải thuật thường xuyên được tạo công khai, và keys được giữ riêng tư (và thỉnh thoảng bị tiết lộ đến những người nhận không hợp lệ, phụ thuộc vào giải thuật). Điều đó làm cho reversing trở nên vô nghĩa bời vì giải thuật đã được biết rồi. Để giải mã một thông điệp với dạng mã hóa này, bạn phải làm một trong các thứ sau:

  • Lấy được key
  • Thử tất cả những sự kết hợp có thể cho tới khi bạn có được key
  • Tìm kiếm một lỗi trong giải thuật mà có thể được sử dụng để lấy được key hay một thông điệp nguyên thủy. 
Tuy vậy, vẫn có các trường hợp có thể ứng dụng reversing để reverse engineer các triển khai mang tính riêng tư của mã hóa dựa trên key. Thậm chí khi giải thuật mã hóa là nổi tiếng, các chi tiết triển khai thường có tác động không như mong đợi đối với toàn cảnh mức độ an toàn chung cung cấp bởi một chương trình. Các giải thuật mã hóa là tinh vi, các lỗi triển khai phụ có thể thỉnh thoảng làm mất hiệu lực hoàn toàn  mực độ security cung cấp bởi các giải thuật như vậy. Cách duy nhất để biết rằng một sản phẩm security có triển khai một giải thuật mã hóa thực sự bảo mật là đọc mã nguồn của nó hoặc là reverse nó. 

Phát triển các phần mềm cạnh tranh

Như đã đề cập phía trên đây là ứng dụng phổ biến nhất của reverse engineering. Phần mềm thường rất phức tạp và vì vậy reversing toàn bộ sản phẩm phần mềm để tạo ra một sản phẩm cạnh tranh không tạo ra bất cứ ý nghĩa nào cả. Thường là dễ dàng hơn để thiết kế và phát triển một sản phẩm từ đầu. Trong công nghiệp phần mềm, thậm chí nếu một đối thủ cạnh tranh có một công nghệ không có bằng sáng chế, nó không có ý nghĩa gì để reverse engineer toàn bộ sản phẩm của họ. Thường xuyên dễ dàng để phát triển độc lập các phần mềm của chính bạn. Ngoại lệ là các thiết kế hay giải thuật phức tạp và độc nhất gây khó khăn cho việc phát triển. Trong các trường hợp như vậy, hầu hết ứng dụng vẫn có thể được phát triển độc lập, nhưng các thành phần có sự phức tạp cao có thể được dự trữ và triển khai lại trong sản phẩm mới. 

Thẩm định chất lượng phần mềm và tính mạnh mẽ 

Reversing không chỉ có thể kiểm tra (audit) một program binary để đánh giá tính bảo mật và lỗ hổng của nó mà còn có thể thử và lấy mẫu một program binary để có được một ước lượng về chất lượng chung về code sử dụng trong chương trình. Nhu cầu tương tự như: một chương trình mã nguồn mở (open-source software) là một cuốn sách mở cho phép độc giả của nó đánh giá chất lượng của nó trước khi mua nó. Các hãng phần mềm không công khai mã nguồn trong phần mềm của họ chủ yếu là yêu cầu khách hàng của họ "chỉ tin vào họ". Nó giống như là mua một chiếc xe đã qua sử dụng mà bạn không thể mở cái mui xe đó ra. Bạn không biết thứ bạn đang mua nó như thế nào. 

Nhu cầu dành cho việc "chạm" vào được mã nguồn để khóa các sản phẩm phần mềm ví dụ như các hệ điều hành được tạo ra từ các tổ chức lớn; một vài năm trước khi Microsoft một số lượng lớn khách hàng mua hơn 1000 chỗ có thể có được truy nhập đến mã nguồn Windows cho các mục đích thẩm định. Nhiều người sau đó thiếu khả năng mua đã thuyết phục một tổ chức chính để cấp cho họ quyền truy nhập  đến mã nguồn của sản phẩm phải hoặc là lấy những phát ngôn của công ty rằng sản phẩm được xây dựng tốt hoặc là trông cậy vào reversing. Lại một lần nữa, reversing có thẻ không làm lộ ra nhiều thông tin về chất lượng code của sản phẩm và tính tin cậy như khi ta trực tiếp nhìn vào mã nguồn, nhưng nó có thể là các thông tin có chất lượng. Không có một kĩ năng đặc biệt nào được yêu cầu ở đây. Miễn là bạn cảm thấy thoải mái với reversing bạn có thể làm việc với binary code, bạn có thể sử dụng khả năng đó để thử và đánh giá chất lượng sản phẩm. 

Trên đây chỉ là một số it ứng dụng của reverse engineering, nhiều ứng dụng do thời gian hạn chế tôi chưa thể liệt kê. Những ứng dụng trong phát triển phần mềm, Auditing program binaries,... các bạn có thể tìm hiểu thêm như là một bài tập. 

Bài viết tiếp theo mình sẽ trình bày về những thứ cần thiết khi học reverse engineering. Cụ thể là hợp ngữ. 



Tài liệu tham khảo: Secrets of Reverse Engineering, Eldad Eilam.

Không có nhận xét nào:

Đăng nhận xét