REVERSING WITH IDA FROM SCRATCH (P1)

Lời tựa

Loạt bài viết này không phải tôi nghĩ ra, tôi đã xin phép viết lại từ bộ tuts của thầy Ricardo Narvaja – ông là linh hồn và là người sáng lập ra nhóm Crackslatinos, hiện ông đang làm việc tại Core Security dưới vai trò là Exploit Writer. Bộ OllyDbg tôi đã viết trước đây (vẫn còn đang dở ) cũng là dựa vào các bài viết mà ông chia sẻ. Tôi ngưỡng mộ ông bởi trong thời gian nhiều năm sinh hoạt ở CLS, Ricardo đã viết và chia sẻ vô số các bài viết về Cracking và Reverse Engineering.

Ricardo Narvaja

Ý tưởng ra đời của loạt bài viết này rất đơn giản, đó là cập nhật bộ tài liệu về Cracking và Reversing với OllyDbg nhưng thay vào đó sẽ sử dụng công cụ nổi tiếng là IDA. Các bạn sẽ làm quen với IDA trên môi trường hệ điều hành Windows, từ những phần cơ bản nhất cho tới những kiến thức nâng cao hơn.

Bộ này tôi nghĩ dành cho những người mới bắt đầu tìm hiểu về IDA, bạn nào đã “expert” rồi thì có thể đọc cho vui và góp ý để tôi chỉnh lại những chỗ còn thiếu sót. Bạn nào cảm thấy mất thời gian khi đọc những gì tôi viết, hãy chuyển sang làm những việc khác khiến bạn thấy hứng thú hơn.

Tại sao lại là IDA Pro?

Vậy lý do gì mà tôi và các bạn cần phải học sử dụng IDA? Đó là vì, trong khi OllyDbg bó hẹp chúng ta bởi nó chỉ là một trình gỡ lỗi 32-bit, hoạt động ở chế độ user mode của Windows thì IDA Pro là một công cụ reversing hoàn chỉnh, sử dụng được trên cả hai nền tảng 32-bit và 64-bit, vừa là một trình disassembler đồng thời cũng hỗ trợ debug như một trình debugger.

Mặc dù, hiện nay các chuyên gia đang chuyển dần sang sử dụng x64dbg (https://github.com/x64dbg) để thay thế cho OllyDbg, nhưng dường như để vượt qua được cái bóng của OllyDbg thì sẽ vẫn còn cần một thời gian nữa. Minh chứng là các chuyên gia phân tích của China hiện nay vẫn dùng OllyDbg hàng ngày: https://ti.360.net/blog/articles/suspected-molerats-new-attack-in-the-middle-east-en/ hay chuyên gia Vitali Kremez vẫn dùng OllyDbg để phân tích song song với IDA: https://www.vkremez.com/2018/12/lets-learn-dissecting-apt28-zebrocy.html. Tác giả Kao tại Blog https://lifeinhex.com đã đưa ra những nhận xét cá nhân vì sao ông chưa sử dụng x64dbg trong công việc. Các bạn có thể đọc thêm tại đây: https://lifeinhex.com/why-im-not-using-x64dbg/https://lifeinhex.com/x64dbg-2-years-later/

Lý do nữa để cần phải biết sử dụng IDA là bởi công cụ này cung cấp khả năng phân tích tĩnh (static analysis) tốt hơn nhiều so với việc thực hiện bằng OllyDbg. Tuy nhiên, đối với những người ban đầu mới làm quen IDA sẽ thấy việc sử dụng nó khá phức tạp. Bù lại, khác với OllyDbg/x64dbg, IDA có thể hoạt động được trên các môi trường hệ điều hành khác nhau như Windows, Linux hoặc Mac OS X và thậm chí là remote (từ xa):

Danh sách các kiến trúc vi xử lý mà IDA hỗ trợ cũng rất rộng:

Qua đó, các bạn thấy việc học cách sử dụng IDA sẽ cho phép chúng ta mở rộng phạm vi công việc của mình, mặc dù trong loạt bài viết này tôi sẽ chỉ tập trung vào hai môi trường Windows 32 và 64 bit, ở chế độ user mode và đôi khi là kernel mode. Thực tế cho thấy, khi làm quen với công cụ này sẽ cho phép chúng ta dễ dàng thích ứng với bất kỳ môi trường nào.

Như đã nói ở trên, loạt bài viết này sẽ bắt đầu từ những kiến thức cơ bản nhất, do vậy sẽ có nhiều nội dung lặp lại mà có thể các bạn đã đọc trong loạt bài viết về OllyDbg. Các kiến thức đó sẽ được trình bày lại ở đây một lần nữa nhưng là với IDA và tôi sẽ cố gắng đi thêm nhiều vấn đề hơn. Nếu ai đó thấy những gì bạn đọc trong loạt bài viết này là rất phức tạp hoặc nhàm chán, có lẽ bạn nên dành thời gian thời gian để đọc các bài viết về OllyDbg trước để cảm thấy dễ dàng hơn hoặc làm công việc khác mà khiến bạn cảm thấy có hứng thú. Loạt bài viết này sẽ bao gồm tất cả các kĩ thuật như phân tích tĩnh (static) và động (dynamic), cracking, exploit và unpacking. Tôi sẽ cố gắng để đề cấp tới càng nhiều kĩ năng càng tốt. Hi vọng thế!!

Nhiệm vụ đầu tiên

Việc đầu tiên để có thể tìm hiểu về IDA là ta cần phải có công cụ này trước đã. Tuy nhiên, vấn đề ở chỗ, IDA là một chương trình mất phí. Để có được quyền sử dụng IDA Pro thì chúng ta phải bỏ tiền ra mua và cái giá của nó không hề rẻ. Hơn nữa, không phải cứ có tiền là mua được. Vì lý do trên, tôi không thể cung cấp IDA trực tiếp cho các bạn được. Tuy nhiên, với kĩ năng Google trong thời đại CMCN 4.0, tôi nghĩ các bạn hoàn toàn có thể tìm kiếm được các phiên bản đã leaked trên mạng là IDA Pro 6.8 hoặc 7.0 + Hexrays. Đây là ảnh minh họa phiên bản IDA 6.8 mà tôi có:

Trong hình trên, các bạn thấy có các tệp nén zip cùng với trình cài đặt của IDA là idapronw_hexarmw_hexx64w_hexx86w_150413_cb5d8b3937caf856aaae750455d2b4ae. Mật khẩu để cài đặt nằm trong file install_pass.txt. Ngoài ra, khi cài đặt IDA, nó cũng sẽ tự động cài đặt thêm phiên bản Python 2.7.6. Khuyến nghị các bạn nên sử dụng bản Python đi kèm với IDA. Do đó, trước khi cài đặt IDA, bạn nên gỡ bỏ bản Python khác đã được cài đặt trên máy để tránh xung đột.

Bên lề: trên thực tế ta vẫn có thể cài đặt riêng phiên bản Python khác mà không cần sử dụng bản đi kèm theo bộ cài đặt IDA. Ví dụ, tôi đang sử dụng bản 2.7.10:

Sau khi cài đặt xong ta sẽ mở IDA lên để làm quen, và tương tự như trong loạt bài viết về OllyDbg, chúng ta sẽ sử dụng crackme là Cruehead để thực hành (crackme này bạn nào đọc bộ OllyDbg chắc sẽ có hoặc có thể download tại đây: https://mega.nz/#!KbAWzK7D!LOnvJeYpXpxkMIH_jLGzx7VKVTQg1LifsFQMnOj_WeM). Vì crackme là file thực thi 32-bit nên ta sẽ mở nó bằng phiên bản IDA 32-bit.

Bên lề: Để kiểm tra xem một file exe là 32 hay 64 bit sẽ có nhiều cách, ở đây tôi sử dụng một chương trình Hex Editor, chẳng hạn như là HxD (https://mh-nexus.de/en/downloads.php?product=HxD). Dựa vào dấu hiệu sau để biết file là 32-bit hay 64-bit:

Như trên hình, khi tôi mở công cụ SnippingTool (có trên các phiên bản Windows mới) trong HxD, dựa vào vào dấu hiệu sau chữ PE: PE..d† thì ta khẳng định đây là một file 64-bit. Trong khi, đối với crackme Cruehead của chúng ta, sau PE có: PE..L, vậy đây là một file 32-bit:

Từ thông tin đó, chúng ta biết sẽ phải mở Crackme bằng phiên bản 32-bit của IDA. Khi giao diện của IDA xuất hiện, chọn New để mở một tệp tin mới, tìm đường dẫn tới Crackme để load nó vào IDA:


Khi bạn nạp một file vào IDA, IDA sẽ có gắng nhận diện định dạng của file đó (ví dụ: IDA đã nhận biết chính xác crackme là một PE file) cùng với kiểu kiến trúc vi xử lý. Quá trình này cho ta thấy IDA hành xử giống với Windows loader. Mặc định, IDA sẽ không load kèm PE header hay resource section trong quá trình phân rã code của nó. Nếu bạn tích chọn Manual load, IDA sẽ hỏi bạn khi bạn muốn nạp từng section, kèm theo PE header.

Giữ nguyên các thiết lập mặc định và nhấn OK để IDA tiến hành phân tích file. Nếu chúng ta đồng ý hiển thị chế độ Proximity View (có từ phiên bản IDA v6.2), một màn hình graph sẽ xuất hiện cung cấp thông tin về các hàm mà IDA nhận diện được trong Crackme theo mô hình cây như bên dưới. Tóm lại, ở chế độ proximity view này, địa chỉ hiện tại, hàm gọi (caller) và hàm được gọi (callee) được biểu diễn dưới dạng tập hợp các node có liên kết với nhau:

Để chuyển qua lại giữa chế độ đồ hoạ (Graph) hoặc các lệnh ở chế độ Text bình thường, ta sử dụng phím tắt là spacebar. Tại Options – General, tích chọn Line prefixes để hiện thị thêm thông tin về địa chỉ bộ nhớ ở bên cạnh các lệnh trong chế độ đồ hoạ của IDA và tại Number of opcode bytes, nếu chúng ta thay đổi giá trị tại đó (mặc định là bằng 0), chúng ta sẽ thấy các opcodes hoặc các bytes xuất hiện tại mỗi lệnh.

Khi phân tích một tệp tin thực thi, đầu tiên IDA mở ở chế độ Disassembler (hay có thể được gọi là Loader) và sẽ không thực thi chương trình. IDA lúc này chỉ phân tích tĩnh để phục vụ cho mục đích reversing và tạo tệp tin .idb (cơ sở dữ liệu) để lưu toàn bộ quá trình phân tích của chúng ta.

Để có thể debug được, chúng ta phải lựa chọn các tùy chọn debuggers khác nhau được hỗ trợ bởi IDA và thực hiện trong chế độ Debugger mà chúng ta sẽ tìm hiểu ở các bài viết sau này. IDA cung cấp rất nhiều cửa sổ được xem như là các tab và khi truy cập View-Open Subview, chúng ta có thể mở các tab này theo mục đích sử dụng riêng của từng người.

Mới đầu, khi dùng IDA các bạn sẽ thấy chưa quen và có cảm giác hơi ngợp vì có quá nhiều tính năng. Thậm chí tại màn hình graph của IDA bạn sẽ thấy xuất hiện nhiều chỗ có cùng một địa chỉ. Ví dụ như tại điểm bắt đầu của một hàm, các địa chỉ được lặp lại nhiều lần, điều này xảy ra là bình thường vì có rất nhiều thông tin từ địa chỉ đó và nó không đủ để biểu diễn / hiển thị trên cùng một dòng.

Mẹo nhỏ là tìm điểm kết thúc của cùng một địa chỉ được lặp lại, tại đó chúng ta sẽ thấy nơi bắt đầu của lệnh được disassembly. Trong trường hợp này, lệnh tương ứng với địa chỉ 401000 là push 0.

Trong IDA, ta có thể độc lập tùy chỉnh giao diện mặc định cho Loader và Debugger. Tại màn hình Loader, khi đã thiết lập các cửa sổ và các tab mà chúng ta sử dụng nhiều nhất theo ý thích của mình, ta có thể lưu lại bằng cách vào Windows-Save Desktop và tích chọn Default để lưu vào cấu hình mặc định. Tương tự, trong chế độ Debugger, ta cũng có thể tùy chỉnh theo ý muốn và lưu lại thành cấu hình mặc định.

Tại bất kỳ tab nào của IDA như Functions, Strings, Names, v.v …

Chúng ta có thể tìm kiếm tại các cửa sổ này bằng cách nhấn CTRL + F, khung tìm kiếm nhỏ sẽ xuất hiện bên dưới, cho phép lọc theo những gì chúng ta nhập vào. Trong View-Open Subview-Strings như ở ví dụ bên dưới, IDA sẽ hiển thị cho ta những chuỗi có chứa “try”:

Ngoài ra, nếu tôi chọn View-Open Subview-Disassembly, tôi có thể mở một cửa sổ disassembly thứ hai, qua đó có thể truy xuất tới các hàm khác với cửa sổ đầu tiên và như vậy ta có thể phân tích được nhiều hàm tại cùng một thời điểm. Đây là chính là một lợi thế của IDA so với OllyDbg/x64dbg:

IDA cũng cung cấp một cửa sổ hiển thị dạng hexadecimal tương tự như cửa sổ Dump của OllyDBG/x64dbg. Trong IDA, cửa sổ này có tên là Hex View. Nếu bạn không thấy cửa sổ này, có thể hiển thị nó thông qua View – Open Subview- Hex dump:

Cũng từ Open Subview, ta có thể truy xuất thông tin về các hàm được chương trình import thông qua Imports tab như hình dưới đây:

Cũng tại màn hình Loader của IDA, các bạn cũng sẽ thấy một màn hình nhỏ khác có tên là Graph overview (Nếu không thấy, vào View – Graph Overview để mở nó), nằm ở góc dưới trái. Cửa sổ này rất hữu ích, nó hiển thị các code block của hàm mà ta đang phân tích, qua đó ta có thể di chuyển qua lại giữa các code block một cách nhanh chóng và dễ dàng.

IDA cũng có các tab dành riêng khác như Structures, Exports, Names, Segments v..v… chúng sẽ được giải thích khi chúng ta tìm hiểu và sử dụng tới các Tab này. Thanh điều hướng (navigator) phía trên hiển thị các phần khác nhau của một file đang phân tích bằng các màu khác nhau.

Ngay bên dưới là các thông tin mô tả cho chúng ta biết mỗi màu có ý nghĩa gì, ví dụ màu xám là .data section và nếu bạn nhấp vào phần màu xám đó, IDA sẽ chuyển tới section có địa chỉ màu xám. Trong hình trên, chúng ta thấy có màu hồng tương ứng với external symbol hay .idata section và màu xanh tương ứng với các hàm được phát hiện tại code section.

Phần thứ nhất đến đây là hết, trong phần này tôi đã cung cấp cho các bạn một cái nhìn tổng quan về IDA. Trong các phần tiếp theo, chúng ta sẽ tìm hiểu chi tiết hơn.

Bên lề: trong loạt bài viết này có thể tôi sẽ sử dụng lẫn lộn giữa IDA 6.8 và IDA 7. Khác biệt giữa hai bản này tôi xin đưa ra một hình minh họa sau (phân tích cùng một binary) để các bạn thấy vì sao “giang hồ mạng” thường chờ đợi bản leak mới nhất của IDA 😀

IDA 6.8
IDA 7.0 (nhận diện được hàm main cũng các hàm thư viện)

Kết thúc phần 1. Hẹn các bạn trong phần 2.

m4n0w4r

Xin gửi lời cảm ơn chân thành tới thầy Ricardo Narvaja!

Ủng hộ tác giả

Nếu bạn cảm thấy những gì tôi chia sẻ trong bài viết là hữu ích, bạn có thể ủng hộ bằng “bỉm sữa” hoặc “quân huy” qua địa chỉ:

Tên tài khoản: TRAN TRUNG KIEN
Số tài khoản: 0021001560963
Ngân hàng: Vietcombank

4 thoughts on “REVERSING WITH IDA FROM SCRATCH (P1)

Leave a Reply