Học Pwnable thì nên bắt đầu từ kiến trúc nào ?
Trong Binary Exploitation (Pwnable), người học và hành trong mảng này thường không ít lần “đụng độ” những loại kiến trúc CPU khác nhau bao gồm x86 (32-bit), x64 (x86-64, 64-bit), ARM và MIPS. Mỗi kiến trúc có đặc điểm riêng và ứng dụng khác nhau, ảnh hưởng đến cách triển khai exploit. Tuy nhiên với người mới học thì việc chọn kiến trúc làm nơi bắt đầu để dấn thân vào mảng này cũng là điều cần tìm hiểu để có thể định hướng cho bản thân được rõ ràng hơn và đi xa hơn với nghề nghiệp tương lai. Mình sẽ cùng nhau tìm hiểu về các loại kiến trúc CPU dưới đây:
Tổng quan các kiến trúc CPU
- x86 (32-bit, CISC): Ra đời từ vi xử lý Intel 8086 (1978), là kiến trúc CISC nổi tiếng. Ban đầu là tập lệnh 16-bit, sau đó mở rộng lên 32-bit (x86) giữ tương thích ngược hoàn toàn. Hệ thống x86 dùng rộng rãi trên máy tính cá nhân và server đời cũ; nó mạnh về hiệu suất nhưng tiêu thụ điện năng cao hơn RISC. Tuy hiện tại x86 đã không còn xuất hiện trong các bộ PC người dùng hiện đại ngày nay nhưng trong các thiết bị doanh nghiệp vẫn chiếm thị phần lên đến 90% như Server và Data Center, hệ thống nhúng trong ATM, thiết bị công nghiệp,… Không những thế các bài lab pwnable vẫn xuất hiện kiến trúc này.
- x64 (x86-64, AMD64, 64-bit):
Là kiến trúc kế thừa từ x86, được phát triển bởi AMD (nên còn gọi là AMD64) vào đầu những năm 2000, rồi sau đó được Intel áp dụng dưới tên Intel 64. Kiến trúc này mở rộng thanh ghi và địa chỉ bộ nhớ lên 64-bit, giữ tương thích ngược với x86 (32-bit). Ngày nay, x64 là kiến trúc phổ biến nhất trong các hệ điều hành máy tính hiện đại như Windows, Linux, macOS. Nó xuất hiện ở hầu hết PC, laptop, workstation, và server hiện đại, cung cấp hiệu năng cao hơn hẳn x86 nhờ tập lệnh 64-bit, số lượng thanh ghi lớn và khả năng xử lý dữ liệu lớn hơn. Trong các cuộc thi CTF, các bài lab pwnable đa số hướng đến x64 vì độ phổ biến của nó. - ARM (RISC): ARM là kiến trúc RISC (Reduced Instruction Set Computing) được phát triển từ thập niên 1980 bởi Acorn Computers (Anh quốc) và hiện do ARM Holdings thiết kế. Nó được cấp phép rộng rãi cho các hãng như Apple, Qualcomm, MediaTek,... Kiến trúc ARM có hai biến thể phổ biến: Do tính tiết kiệm điện, nhỏ gọn, hiệu suất cao trên mỗi watt, ARM đang mở rộng mạnh mẽ vào server, và đặc biệt là các thiết bị edge. Trong các cuộc thi CTF, ARM ít được phổ biến như x64, chủ yếu tập trung ở những cuộc thi quy mô lớn, nơi có nhiều người chơi “tay to” xuất hiện.
- ARM32 (ARMv7): Dùng phổ biến trong smartphone cũ, thiết bị IoT, hệ nhúng giá rẻ.
- ARM64 (AArch64, ARMv8): Hiện đại hơn, được dùng trong smartphone, tablet, Raspberry Pi, laptop như Mac M1/M2/M3, và cả server tiết kiệm điện năng.
- MIPS (RISC): MIPS (Microprocessor without Interlocked Pipeline Stages) là kiến trúc RISC ra đời vào thập niên 1980, từng được sử dụng phổ biến trong hệ thống nhúng, router, switch, thiết bị mạng (như Linksys, Cisco), và một số thiết bị điện tử dân dụng như đầu thu kỹ thuật số, máy chơi game PS1/PS2, Nintendo 64. Hiện tại, MIPS đã giảm mạnh về thị phần, bị ARM thay thế ở hầu hết phân khúc thiết bị nhúng. Tuy nhiên, cũng như ARM, nó vẫn xuất hiện nhiều trong các bài lab pwnable CTF ở các cuộc thi có nhiều anh chàng “tay to”, nhờ vào hệ sinh thái giả lập dễ dùng, tài liệu đầy đủ và tập lệnh đơn giản, dễ học.
So sánh các kiến trúc ở nhiều khía cạnh đối với người mới học pwnable
- Mô hình tập lệnh (CISC vs RISC): x86/x64 theo kiến trúc CISC có nhiều tập lệnh phức tạp, trong khi đó ARM và MIPS theo kiến trúc RISC thì đơn giản hơn và thường cho hiệu quả năng lượng cao. Tuy nhiên x86/x64 (CISC) đang chiếm ưu thế trên PC/Server, rất phổ biến nên việc chọn x86/x64 sẽ dễ tiếp cận hơn.
- Tài liệu và công cụ: Trong thực tế, x86/x64 được nghiên cứu rộng rãi nhất. Có vô số tài liệu hướng dẫn và công cụ hỗ trợ x86/x64 (IDA, Ghidra, GDB, radare2, pwntools, pwndbg, gef, peda,…). So với đó, tài liệu về ARM/MIPS có ít hơn. Ví dụ, Slava Moskvin khuyên “nên bắt đầu với x86” vì “có rất nhiều tài liệu và công cụ hỗ trợ nó hơn bất kỳ kiến trúc nào khác”. Ngược lại, học RISC (ARM/MIPS) có thể dễ hiểu về khái niệm tập lệnh, nhưng thực hành exploit trên RISC sẽ khó khăn hơn một chút vì ít được cập nhật tài liệu và các điều kiện hỗ trợ khác.
- Môi trường và thiết bị: Trong thực tế, x86/x64 được ứng dụng trên hầu hết các thiết bị máy tính người dùng phổ thông, cho nên việc nghiên cứu học tập sẽ dễ dàng hơn, dễ debug, giả lập hay ảo hóa,… Do đó việc có sẵn thiết bị sẽ tiện lợi hơn cho người mới học pwnable. Trong khi đối với ARM, MIPS thì sẽ khó khăn hơn vì thiết bị có sẵn môi trường để thực hành thì ít phổ biến và cần phải giả lập bằng các công cụ như Qemu,v.v… Vì vậy ở chiều hướng tiếp dận dễ dàng thì x86/x64 sẽ là lựa chọn phù hợp cho người mới học pwnable
- Phổ biến trong CTF/pwnable: Hầu hết challenge pwnable (đặc biệt trên Linux) sử dụng x86 hoặc x86-64. Ví dụ, nền tảng CTF như pwnable.kr, pwnable.tw, ROP Emporium chủ yếu thực hành lab trên x86/x64. Đối với người mới học pwnable thì có thể bắt đầu từ các lab như pwnable.kr, HackTheBox,v.v… ARM và MIPS có một số challenges nhưng ít hơn, thường sẽ xuất hiện nhiều trong các cuộc thi CTF về đặc thù IoT/embedded.
- Độ khó cho người mới: Về lý thuyết, RISC đơn giản hơn nên nếu chỉ học cơ bản thì ARM/MIPS có thể dễ hơn. Tuy nhiên, khi chuyển sang triển khai exploit thực tế, bạn cần nhiều ví dụ, hướng dẫn và thực hành thì x86/x64 sẽ cung cấp nhiều hơn và nhiều điều kiện để rèn luyện hơn. Ngoài ra kiến thức trên trường thường đi từ các ngôn ngữ căn bản như C/C++ làm nền tảng phát triển đi lên nên việc tiếp cận x86/x64 sẽ dễ dàng hơn nhiều so với ARM hay MIPS vốn gặp nhiều hạn chế về một số điều kiện và tiêu chí nêu trên.
- Mục đích thực hành: Tùy vào mục đích mà bạn hướng tới cũng như thời gian hiện tại mà bạn có để xem xét nên ưu tiên tìm hiểu và tiếp cận kiến trúc nào trước và sau này đi sâu hơn vào nó. Chẳng hạn nếu bạn muốn đi sâu vào hệ thống nhúng, các thiết bị công nghiệp và bạn không có nhiều thời gian, muốn đi nhanh thì có thể nghĩ đến hướng tiếp cận từ ARM/MIPS, hoặc nếu bạn muốn đi sâu vào phân tích mã độc thì x86/x64 là mảnh đất màu mỡ để bạn khai phá và đào sâu thì hướng tiếp cần từ x86/x64 sẽ phù hợp với bạn, sau đó có thể tìm hiểu ARM/MIPS sau nếu bạn còn thời gian và muốn mở rộng thêm
Tài liệu và nguồn học pwnable hiệu quả
- Sách và bài giảng:
- Nghệ thuật tận dụng lỗi phần mềm (Nguyễn Thành Nam) - tài liệu tiếng việt giải thích về các lỗ hổng cơ bản như buffer overflow, format string,…
- Hacking: The Art of Exploitation (Jon Erickson) – giải thích sâu về buffer overflow và shellcode trên Linux;
- The Shellcoder’s Handbook (Hoglund & Butler) – hướng dẫn phát hiện và khai thác lỗ hổng trên x86;
- Computer Systems: A Programmer’s Perspective (Bryant & O’Hallaron) – giúp hiểu hệ thống máy tính, bộ nhớ và tương tác C/Assembly;
- Practical Binary Analysis – về reversings và exploit. Ngoài ra có nhiều slide, video (ví dụ khóa học x86 của OpenSecurityTraining) và các series blog tutorial về exploit (thường minh họa bằng x86).
- Công cụ: Người mới học pwnable có thể lựa chọn nhiều công cụ hoặc một vài công cụ mình yêu thích để thực hành các bài lab như:
- Công cụ debug: IDA, GDB (kèm plugin Pwndbg/gef), radare2, ghidra, binaryninja,…
- Công cụ để giả lập: Unicorn, Qemu,…
- Thư viện xây dựng exploit: Pwntools
- CTF, lab thực hành: Các bạn có thể tập luyện trên các nền tảng CTF và wargame để nâng cao kiến thức và kỹ năng bản thân. Đa số các nền tảng đều có challenge từ đơn giản đến nâng cao, chủ yếu là x86/x64 giúp bạn làm quen với pwnable:
- pwnable.vn - Một trang web thực hành lab pwnable do anh em người Việt xây dựng
- pwnable.kr
- ROPEmporium
- pwnable.tw
- Hack The Box
- VulnHub
- OverTheWire
- Root-Me.org
Tóm lại, mỗi kiến trúc đều có những đặc điểm và những điều kiện tiếp cận khác nhau, có những điều kiện thuận lợi và hạn chế khác nhau, với người mới học pwnable thì nên xem xét các khía cạnh trên và đưa ra hướng đi cho mình tùy vào điều kiện mà bạn đang có và mục đích mà bạn hướng đến.