[Reverse Engineering] 0x00: From Zero To 0x5A4D
Quá nửa cái series này là học và được truyền cảm hứng từ thầy Kiên “m4nowar” https://kienmanowar.wordpress.com/!
Reverse Engineering là gì?
Reverse Engineering (Tạm dịch: “Kỹ thuật đảo ngược” hay “Dịch ngược” – Dù là chả ai gọi thế cả mà gọi là “rì-vợt” cho gọn) là quá trình lấy một tệp nhị phân đã biên dịch và cố gắng tái tạo (hoặc đơn giản là hiểu) cách thức hoạt động ban đầu của chương trình. Xuất phát từ ý tưởng (“Idea”) về cơ chế hoạt động, lập trình viên sẽ xây dựng mã nguồn (“Source code”), thường bằng ngôn ngữ cấp cao như C/C++ hay C#. Mã nguồn này được biên dịch (“Compile”) thành tập tin thực thi (“Executable”) chứa mã máy (“Machine code”) dành cho hệ điều hành (“OS”) hiểu và điều khiển phần cứng bằng mã máy tương ứng. Ngược lại, từ tập tin thực thi, thông qua biên dịch ngược (“Decompile”), có thể thu được ngôn ngữ cấp thấp (“low-level code” gần với mã máy) như Assembly, hoặc ngôn ngữ cấp cao (“high-level code” gần với ngôn ngữ tự nhiên) như C#, hoặc mã giả (“pseudo-code” - dễ đọc như ngôn ngữ cấp cao nhưng không theo chuẩn cú pháp) để có thể đọc - hiểu (may be?) cơ chế hoạt động của chương trình.
---
config:
flowchart:
curve: linear
---
flowchart TD
idea("Idea") --> scode
subgraph "Compile"
direction LR
scode["Source code"] --> comp{"Compile"} --> bin["Executable"]
end
subgraph "Reverse Engineering"
direction TB
bin["Executable"] --> dec{"Decompile"} --> ascode["Assembly"] & pscode["Psuedo-code"] & hcode["High-level code"]
end
subgraph "System"
bin --> |"Machine Code"| os{"OS"} --> |"Machine Code"| hw("Hardware")
end
pscode & ascode & hcode -.-> |"Understand?"| idea
Lược đồ từ Ý tưởng đến hành vi của Phần cứng và Reverse Engineering
Reverse Engineering cần gì?
Như một ông béo cầm hai cái chảo đã từng nói: “Anyone can cook!”, ai cũng có thể làm Reverse Engineering. Tuy nhiên, cũng cần có mấy thứ cơ bản để bắt đầu:
- Đầu tiên là, Phải có 1 cái MÁY TÍNH, I mean, một cái máy tính đúng nghĩa có bàn phím và màn hình. Ờ thì smartphone thời buổi này cũng là máy tính được, nhưng mà phải khổ râm đến mức nào thì mới đi nhìn cái mớ này ở trên cái màn hình 7 inch:
Giao diện thường thấy khi ngồi reverse
Thứ hai là, Nhìn chung thì sẽ cần đọc được hợp ngữ (“Assembly”) và biết về cơ chế hoạt động của Hệ điều hành. Phân tích mã độc thường sẽ là trên Windows, nên ít nhất phải nhớ rằng trên đời có một quyển sách tên là Windows Internals và một quyển ebook là PE Tutorials của thầy Kiên. Còn hợp ngữ thì lại nhìn lên cái ảnh trên: PUSH, CALL, JMP, NOP… ở đấy mà ra.
Thứ ba là, Kiến trúc máy tính và Hệ điều hành: Nhìn chung thì sẽ cần đọc được hợp ngữ (“Assembly”) và biết về cơ chế hoạt động của Hệ điều hành. Phân tích mã độc thường sẽ là trên Windows, nên ít nhất phải nhớ rằng trên đời có một quyển sách tên là Windows Internals. Còn hợp ngữ thì lại nhìn lên cái ảnh trên: PUSH, CALL, JMP, NOP… ở đấy mà ra.
Quyển Windows Internals là hàng $50/quyển https://learn.microsoft.com/en-us/sysinternals/resources/windows-internals nên chịu khó tìm người lương thiện leak trên Internet thôi. Còn PE Tutorials thì tải của thầy Kiên ở đây https://kienmanowar.wordpress.com/2009/03/07/pe-tutorials/
- Cuối cùng là, 10.000 giờ nghiên cứu: Bên cạnh một đống kiến thức thì cũng phải thực hành công cụ cho quen tay. Kiến thức là phải học, còn kỹ năng thì phải tập. Giả sử 1 ngày tập trung học-tập được 5 tiếng, một tháng 22 ngày (trừ thứ 7 – chủ nhật), thì cũng phải mất 7 năm rưỡi mới thành tài. Còn không chỉ là Tài Xỉu!
Reverse Engineering dùng gì?
Disassembler, Decompiler và Debugger
Đây là đồ chơi chính, và nếu đúng bài bản thì sẽ phải phân loại ra làm 3 như tiêu đề. Tuy nhiên, thời đại này thì tất cả đã được gom thành 1 cục, nên là chỉ so sánh sơ qua thôi nhé:
| Disassembler | Decompiler | Debugger | |
|---|---|---|---|
| Đầu vào | Tập tin thực thi | Tập tin thực thi | Tập tin thực thi |
| Đầu ra | Hiển thị dưới dạng hợp ngữ Assembly | Hiển thị bằng ngôn ngữ cấp cao có cấu trúc. | - Hiển thị dạng hợp ngữ; - Cho phép thực thi, điều hướng thực thi và thay đổi mã nguồn của tập tin (“patch”). |
Một vài công cụ:
OllyDbg https://www.ollydbg.de: Old but gold. Đã có hơn 10 tuổi tính từ bản v2.01 nhưng hồi đấy hình như mình chỉ dùng v1.10 là nhiều. Ngoài ra cũng có kha khá các loại patch, mod, plug-ins để phục vụ nhiều mục đích khác nhau. Tuy nhiên, đây chỉ là trình gỡ lỗi 32-bit (đã có bản 64bit nhưng vẫn chưa và chắc là sẽ không bao giờ được hoàn thiện) hoạt động ở chế độ user mode của Windows.
x64dbg https://github.com/x64dbg: Công cụ mã nguồn mở của Vị thần sức mạnh (Mr. eXoDia), mới hơn OllyBdg, nhìn rối như IDA Pro, gần như là mỗi tháng đều ra bản update mới. Lý do chính để dùng x64dbg là miễn phí và portable, nhưng lý do để không dùng thì hơi nhiều
Xem thêm ở đây https://lifeinhex.com/why-im-not-using-x64dbg/ và ở đây https://lifeinhex.com/x64dbg-2-years-later/.
IDA Pro https://hex-rays.com/ida-pro: $1.100/năm dành cho bản cloud và $3.000/năm dành cho phiên bản 2 decompilers nội bộ tùy chọn. IDA Pro là tiêu chuẩn của Reverse Engineering, mỗi tội đắt. Series này sẽ xoay quanh IDA Pro là chủ yếu, thỉnh thoảng là OllyDbg để có tí hoài niệm, ngoài ra có thể nhắc đến Ghidra hoặc Binary Ninja tùy tâm trạng – cũng để xem có gì hay ho không!
Ghidra https://github.com/NationalSecurityAgency/ghidra: Công cụ mã nguồn mở của National Security Agency (NSA - Cơ quan An ninh Quốc gia, Mẽo)
Binary Ninja https://binary.ninja: Đồ chơi mới nổi có giá $300 cho bản Personal (giảm còn $74 nếu là học sinh – sinh viên)
Dù mọi thứ đều xoay quanh hợp ngữ: Mã giả cũng được suy diễn từ hợp ngữ, mà Debugger cũng điều hướng thực thi và patch mã bằng hợp ngữ, nhưng giang hồ luôn rình rình các bản IDA Pro mới nhất vì mới hơn tức là suy diễn thông minh hơn, đầy đủ hơn, dễ hiểu hơn:
IDA 7.0 nhận diện được hàm main cũng các hàm thư viện – Khung Funtions Window nằm bên trái màn hình
PE Viewer
Mỗi tập tin thực thi được thiết kế để chạy trên máy tính Windows (hay Linux) đều có một phần dữ liệu rất cụ thể ở đầu cho hệ điều hành biết cách thiết lập và khởi tạo chương trình: dung lượng bộ nhớ, thư viện DLL cần thiết… Phần này được gọi là Portable Executable (PE) trong Windows (hoặc Executable and Linkable Format - ELF trong Linux). Cấu trúc byte này (PE Header) cung cấp thông tin cần thiết về mã nhị phân để chuẩn bị trước khi dịch ngược, hoặc là để ghi thông tin file vào paper.
Một vài công cụ:
- CFF Explorer https://ntcore.com/explorer-suite/
- LordPE - Cũ quá lười tìm link
- PE Bear https://github.com/hasherezade/pe-bear
- Detect-it Easy https://github.com/horsicq/Detect-It-Easy
- PE Tools https://petoolse.github.io/petools/
Công cụ giám sát hệ thống
Khi đảo ngược chương trình, đôi khi điều quan trọng (và khi nghiên cứu virus và phần mềm độc hại, điều tối quan trọng) là phải xem ứng dụng tạo ra những thay đổi gì cho hệ thống; có khóa registry nào được tạo hoặc truy vấn không? Có tệp .ini nào được tạo không? Có quy trình riêng biệt nào được tạo ra không, có lẽ để ngăn chặn kỹ thuật đảo ngược ứng dụng? Một vài công cụ:
- Process Monitor https://learn.microsoft.com/en-us/sysinternals/downloads/procmon: Giám sát toàn bộ hành vi hệ thống trên hệ điều hành Windows: hoạt động của hệ thống tệp tin, Registry và quy trình/luồng theo thời gian thực.
- Process Explorer https://learn.microsoft.com/en-us/sysinternals/downloads/process-explorer: Hiển thị thông tin về các thread, process và DLL nào đã được mở hoặc tải.
- TCPView https://learn.microsoft.com/en-us/sysinternals/downloads/tcpview: Hiển thị danh sách chi tiết tất cả các điểm cuối TCP và UDP trên hệ thống, bao gồm địa chỉ cục bộ và từ xa, trạng thái của các kết nối TCP và tên của tiến trình thực hiện kết nối.
- Regshot v1.8.3 https://code.google.com/archive/p/regshot/downloads hoặc v1.9 https://github.com/Seabreg/Regshot: Đồ khá cũ, tính năng chính là snapshot lại Registry ở nhiều thời điểm để so sánh thay đổi.
- Process Hacker https://sourceforge.net/projects/processhacker/ hoặc System Informer https://systeminformer.sourceforge.io: Nhìn chung là phiên bản Process Explorer kết hợp TCP Viewer kết hợp Resource Monitor và nhiều thứ khác. Process Hacker đã đổi tên thành System Informer và mã nguồn mở, thuộc sở hữu của Winsider Seminars & Solutions, Inc (là tác giả của cái quyển sách Windows Internals đã nói ở trên).
Hex Editor và CyberChef
Hex Editor
Hex Editor (trình soạn thảo Hex – nghe ngu vãi) cho phép xem các byte thực tế trong một tệp nhị phân, trong bộ nhớ ổ đĩa (đọc ổ đĩa ở dạng RAW) và có thể tìm kiếm, trích xuất, thay đổi chúng. Phần lớn các công cụ không khác nhau nhiều, có thể kể đến:
- WinHex https://www.x-ways.net/winhex/
- HxD https://mh-nexus.de/en/hxd/
- ImHex https://github.com/WerWolv/ImHex/: Web, Linux và MacOS.
- HexWalk https://www.hexwalk.com: Windows, Linux và MacOS.
- Hex Fiend https://github.com/HexFiend/HexFiend/: MacOS
- HIEW https://www.hiew.ru: Trông rất hoài cổ, và đắt ($25 cho một phiên bản hoặc $250 cho lifetime)
- Hexed https://hexed.it: Web App nên việc upload file lên, nhất là malware cũng cần cân nhắc.
CyberChef
CyberChef https://gchq.github.io/CyberChef/ phải được đứng riêng một chỗ là vì chả còn cái gì ngang hàng được cả. Đây là một web app cho phép mã hóa đơn giản như XOR và Base64, mã hóa phức tạp hơn như AES, DES và Blowfish, tạo nhị phân và hexdump, nén và giải nén dữ liệu, tính toán hàm băm và tổng kiểm tra, phân tích cú pháp IPv6 và X.509, thay đổi mã hóa ký tự, và ti tỉ thứ khác trên đấy.
Mạng Internet và cà phê
Đơn giản là vì chả ai nhớ hết được mọi thứ trong đầu, và…


