OllyDbg là một trình gỡ lỗi (ở ring 3) sử dụng hợp ngữ trên nền Windows 32bit chú trọng đến việc phân tích mã nhị phân và rất hữu dụng để gỡ lỗi những chương trình không được cung cấp mã nguồn. Nó dò xét các thanh ghi, nhận diện các thủ tục, các lời gọi hàm API, các khóa chuyển, các bảng, hằng số và các chuỗi, cũng như chỉ ra vị trí các routines từ các tập tin đối tượng và các thư viện. Trình gỡ lỗi( Debugger) là 1 chương trình, tool được phục vụ cho mục đích kiểm thử hoặc gỡ lỗi cho chương trình khác, ngoài ra còn được sử dụng trong mục đích dịch ngược và nghiên cứu mã độc
MỤC LỤC DANH MỤC THUẬT NGỮ TIẾNG ANH VÀ TỪ VIẾT TẮT DANH MỤC HÌNH LỜI MỞ ĐẦU I Cơ sở lý thuyết Các thành phần bên Windows OS 1.1 User mode kernel mode Reverse-Engineering 2.1 Reverse-Engineering gì? 2.2 Ứng dụng RE 2.3 Các vấn đề RE 2.4 RE chương trình Window Tổng quan OllyDbg 3.1 Khái niệm 3.2 Lịch sử 10 II Giới thiệu OllyDbg hướng dẫn cài đặt 11 Hướng dẫn cài đặt 11 1.1 OllyDbg Window 11 1.2 OllyDbg Kali Linux 13 Giới thiệu OllyDbg 15 2.1 Nạp mã độc vào OllyDbg 15 2.2 Mở file thực thi 15 2.3 Gán tiến trình chạy vào OllyDbg 16 2.4 Giao diện OllyDbg 17 2.5 Memory Map 21 2.6 Rebasing 22 2.7 Base Address 22 2.8 Địa tuyệt đối Địa tương đối (Absolute-Relative) 22 III So sánh với số tool debug IDA, GNU Project Debugger(GDB) 25 Xây dựng thực Lab 25 Crack chương trình với OllyDbg 25 1.1 Môi trường 25 1.2 Tiến hành crack 25 KẾT LUẬN 41 DANH MỤC THAM KHẢO 42 DANH MỤC THUẬT NGỮ TIẾNG ANH VÀ TỪ VIẾT TẮT Viết tắt(nếu có) Thuật ngữ tiếng anh Tiếng việt Remote Machine Máy tính điều khiển từ xa CTF Capture The Flag Cướp cờ HAL Hardware Abstraction Lớp phần cứng trừu Layer tượng OS Operating System Hệ điều hành RE Reverse-Engineering Dịch ngược RPC Server Remote Procedure Call Gọi hàm từ xa Server SCM Service Control Manager Trình quản lý dịch vụ Win API Application Giao diện lập trình ứng Programming Interface dụng DANH MỤC HÌNH Hình 1.1: Sơ đồ thành phần Windows Hình 1.2: Sơ đồ ring Windows 10 Hình 2.1: Chương trình OllyDbg Windows 12 Hình 2.2: Giao diện OllyDdg Windows 12 Hình 2.3: Cài đặt OllyDbg Kali Linux 13 Hình 2.4: Cài đặt package wine32 để giả lập OllyDbg 14 Hình 2.5: Giao diện OllyDbg Kali Linux 14 Hình 2.6: Giao diện mở file OllyDbg 15 Hình 2.7: Giao diện System Breakpoint 16 Hình 2.8: Giao diện Attach OllyDbg 17 Hình 2.9: Giao diện OllyDbg 18 Hình 2.10: Giao diện cửa sổ dịch ngược OllyDbg 18 Hình 2.11: Giao diện cửa sổ ghi OllyDbg 19 Hình 2.12: Giao diện cửa sổ Stack OllyDbg 20 Hình 2.13: Giao diện cửa sổ memory dump OllyDbg 20 Hình 2.14: Giao diện cửa sổ Memory map OllyDbg 21 Hình 2.15: Giao diện cửa sổ Dump Memory Map OllyDbg 21 Hình 2.16: Hình minh họa địa tuyệt đối tương đối 22 Hình 2.17: Hình minh họa chế cấp phát lại vùng nhớ 24 Hình 3.1: Giao diện Easy_CrackMe.exe 26 Hình 3.2: Sử dụng Search for để tìm thơng báo “Incorrect Password” 27 Hình 3.3: Thơng báo “Incorrect Password” 27 Hình 3.4: Sử dụng Crtl+G để tới địa cần tìm 28 Hình 3.5: Các câu lệnh gọi tới hàm thông báo “Incorrect Password” .29 Hình 3.6: Đặt BreakPoint lệnh JNZ 29 Hình 3.7: Chạy thử chương trình 30 Hình 3.8: Xem Memory Dump vùng nhớ ESP+5 30 Hình 3.9: Xử lý xong lệnh JNZ 31 Hình 3.10: Chuỗi “5y” stack 32 Hình 3.11: Hàm Easy_Cra.00401150 32 Hình 3.12: Địa 00401181 hàm Easy_Cra.00401150 .33 Hình 3.13: Gán “345” cho ghi EDI 34 Hình 3.14: Giá trị trả hàm Easy_Cra.00401150 34 Hình 3.15: Xử lý xong lệnh JNZ thứ 35 Hình 3.16: Lệnh JNZ thứ 36 Hình 3.17: Chuỗi “R3versing” 36 Hình 3.18: So sánh chuỗi nhập vào chuỗi “R3versing” 37 Hình 3.19: Lệnh JNZ thứ 38 Hình 3.20: Thành cơng tìm mật 38 Hình 3.21: Sửa lệnh OllyDbg 39 Hình 3.22:Sửa lệnh JNZ thành lệnh JE 39 Hình 3.23:Crack thành công 40 LỜI MỞ ĐẦU Với tình hình dịch bệnh nay, người ngồi dành nhiều thời gian môi trường internet, bên cạnh đó, trình độ nhận thức an tồn không gian mạng phận không nhỏ người cịn thấp, lợi dụng tình hình đó, ngày nhiều công mã độc nổ Đứng trước tình hình đó, cần chun gia phân tích mã độc, bạn có hứng thú với an tồn thơng tin tìm hiểu cơng cụ phân tích mã độc Bên cạnh đó, bạn trẻ đam mê với thi CTF, nơi bạn thử sức với lĩnh vực bảo mật, hiểu cách thức dịch ngược phần mềm, phần mềm bị crack; xâm nhập vào máy tính; kỹ thuật khai thác ứng dụng web; Mật mã – mã hóa áp dụng thực tế; forensic – điều tra phần tích truy dấu vết thực nào… phần reverse engineering phần thi thiếu OllyDbg tool phục vụ cho việc dịch ngược có từ lâu biết đến, sử dụng rộng rãi Em tìm hiểu trình bày sâu cơng cụ viết I Cơ sở lý thuyết Các thành phần bên Windows OS Hình minh họa phía bên cho ta thấy thành phần bên hệ điều hành Window System Processes chương trình hệ thống Ở ta lấy Service Control Manager (SCM) làm ví dụ SCM khởi động vào lúc nạp hệ thống (system boot) Nó Remote Procedure Call Server hay gọi RPC Server, cho phép service configuration service control program điều khiển services remote machine Mỗi service giống chương trình bình thường khác Điểm khác biệt service so với chương trình bình thường khác chỗ chúng hoạt động mức (background), mà thường khơng có giao diện dành cho người sử dụng Chúng thường viết để cung cấp tính lõi cho hệ điều hành Ví dụ như: Web serving, File serving, ghi log hay thông báo lỗi Không phải tất service phát triển Microsoft Nhiều ứng dụng driver có service riêng Ở lấy tập chương trình liên quan đến security làm ví dụ Những chương trình sử dụng lợi hệ điều hành cung cấp chúng hoạt động dạng service Một lợi việc chúng khởi tạo lúc khởi động hệ thống (system boot), trước chương trình khác tất nhiên trước lúc bạn đăng nhập vào hệ điều hành Windows Nhưng quan trọng chương trình dạng theo dõi tất hoạt động máy tính bạn cách tương tác với Windows Core Ví dụ như: hoạt động firewall Hardware Abstraction Layer ( HAL ) lớp trừu tượng thực thi phần mềm Chúng nằm Physical Hardware máy tính phần mềm chạy máy tính Chức che giấu khác biệt phần cứng hầu hết OS kernel Như vậy, mã viết kernel mode không cần phải thay đổi để chạy hệ thống với thiết bị phần cứng khác Chúng cho phép lập trình viên viết chương trình Device Driver mà không phụ vào chi tiết phần cứng Nói cách khác, chúng cung cấp lời gọi hàm tới phần cứng để thực công việc định Rất nhiều hệ thống máy tính đời đầu khơng cung cấp HAL Điều có nghĩa muốn viết chương trình cho hệ thống cần phải biết hardware device liên kết với phần lại hệ thống Điều thực gây khó khăn lớn cho nhà phát triển họ cần phải biết tất hardware device hoạt động hệ thống phải đảm bảo tương thích Với HAL, khó khăn gần loại bỏ Hình 1.1: Sơ đồ thành phần Windows 1.1 User mode kernel mode Một vi xử lý chạy Windows OS có hai chế độ khác gọi là: User Mode Kernel Mode Các chương trình (applications) thường chạy User Mode, cịn thành phần lõi hệ điều hành chạy Kernel Mode Thường khái niệm Driver dùng cho chương trình chạy Kernel Mode, có vài Driver chạy User Mode Hình minh họa phía mô kết nối thành phần User Mode Kernel Mode Khi viết ứng dụng chạy Windows, Microsoft cung cấp hàm lập trình ứng dụng (Windows applications programming interface – Win API) để lập trình viên sử dụng Với việc sử dụng Windows API, bạn phát triển ứng dụng hoạt động ổn định tất phiên Windows Các Windows API giao tiếp với UserMode Drivers để thực số nhiệm vụ định UserMode Ngoài ra, Microsoft hỗ trợ Native API (thực chất Windows API, cung cấp subsystem module Kernel32.dll hoăc NTDLL.dll) Đó chế cho phép chương trình UserMode gọi chương trình (a subroutine) thực thi KernelMode Ví dụ: DbgPrint function… Ở KernelMode, có chế phục vụ yêu cầu từ ứng dụng UserMode tương tác với thiết bị (device) theo cách Cơ chế đảm bảo cho việc tham số sử dụng hợp lệ, đảm bảo việc không cho phép xử lý tới vùng liệu địa mà chương trình UserMode khơng phép thao tác tới 1.1.1 User mode Khi chương trình khởi tạo User Mode, Windows tạo tiến trình (process) cho chương trình Một tiến trình cung cấp cho chương trình khơng gian địa ảo (Virtual address space) Bởi khơng gian địa ảo tiến trình riêng biệt, nên chương trình khó hay cịn nói khơng thể thay đổi liệu thuộc chương trình khác Do chương trình chạy cách lập vậy, nên chương trình bị đổ vỡ (crash), đổ vỡ giới hạn chương trình Những chương trình khác hệ điều hành không bị ảnh hưởng đổ vỡ 1.1.2 Kernel mode Không gian địa ảo tiến trình User Mode bị giới hạn Một chương trình chạy User Mode không xử lý địa ảo (Vrtual address) dự trữ để sử dụng hệ điều hành Sự giới hạn không gian địa nhằm bảo vệ chương trình khỏi việc xử lý nhầm vào vùng liệu quan trọng, gây hại tới hệ điều hành Tất đoạn mã viết Kernel Mode chia sẻ không gian địa Điều có nghĩa kernel-mode driver không bị cô lập với driver khác thân hệ điều hành Nếu kernel mode driver ghi nhầm địa liệu thuộc hệ điều hành driver khác chương trình bị tổn hại Khi đó, việc xử lý sai khiến driver bị crash Mà driver bị crash Kernel Mode dẫn tới toàn hệ điều hành bị crash Khi máy tính bạn xảy quay cửa sổ Disassembler, sử dụng tổ hợp phím Crtl+G để mở cửa sổ “Enter expression to follow”, điền vào địa 0040111B để nhảy tới địa cần tìm Hình 3.4: Sử dụng Crtl+G để tới địa cần tìm Ta thấy khơng có câu lệnh nhảy tới hàm gọi MessageBox “Congratulation” đỉa chị 00401114 mà có tới lệnh nhảy tới hàm gọi MessageBox “Incorrect Password”, ta cần kiểm tra hàm để tìm mật Ấn chuột phải vào đầu hàm, chọn Go to, lệnh Jmp tới hàm ra, Ta thấy tất lệnh jmp JNZ Hình 3.5: Các câu lệnh gọi tới hàm thông báo “Incorrect Password” Ta đặt BreakPoint lệnh CMP lệnh JNZ mà ta nhảy tới, thực với lệnh JNZ địa 004010B5 Hình 3.6: Đặt BreakPoint lệnh JNZ Sau ta thử chạy chương trình nhập vào 123 Hình 3.7: Chạy thử chương trình Nhận thấy câu lệnh tiến hành so sánh [ESP+5] với 61, ta chuyển xuống cửa sổ Dump để xem vùng nhớ bên dưới, sử dụng tổ hợp phím Ctrl+G để nhảy tới địa ESP +5 Hình 3.8: Xem Memory Dump vùng nhớ ESP+5 So với chuỗi ký tự 123 mà ta nhập vào, ESP+5 có giá trị => mật cần tìm, ký tự thứ 0x61 = “a” Ta làm tương tự với JNZ thứ 2, với mật có dạng …a… để vượt qua đoạn check Hình 3.9: Xử lý xong lệnh JNZ Sau ta thấy chuỗi “5y” đẩy vào stack sau gọi tới hàm Easy_Cra.00401150 Ta tiếp tới hàm kiểm tra Hình 3.10: Chuỗi “5y” stack Ta thấy có đoạn code jmp cần để ý, đoạn vị trí 00401156, mov ecx, [ebp+10] sau lệnh JECX, thực nhảy short tới 00401181 ECX Hình 3.11: Hàm Easy_Cra.00401150 Ở địa 00401181 câu lệnh để bắt đầu pop ghi stack để trả lại giá trị ban đầu trước kết thúc hàm, hay giống ngơn ngữ lập trình lệnh “return” Tiếp tục chạy tiếp, ta thấy chương trình lấy ký tự đằng sau chữ a, “345” nạp vào ghi ESI Hình 3.12: Địa 00401181 hàm Easy_Cra.00401150 Sau chuyển giá trị sang cho ghi EDI Hình 3.13: Gán “345” cho ghi EDI Thanh ghi ESI sau gán giá trị “5y” push vào stack trước gọi hàm, sau câu lệnh so sánh lệnh JA, JE dựa kết Hình 3.14: Giá trị trả hàm Easy_Cra.00401150 Nếu kết khác nhau, lệnh JA thực nhảy tới câu lệnh NOT ECX Còn ngược lại, kết giống nhau, lệnh JA bị bỏ qua nhảy tới lệnh JE, nhảy tiếp tới lệnh MOV EAX,ECX để lưu kết EAX trước quay lại chương trình Như ta thu ký tự “5y”, mật ta nhập vào tiếp có dạng “…a5y…” cịn biết hàm Easy_Cra.00401150 có chức so sánh chuỗi Nhập mật “1a5y56789” ta thấy qua lệnh JNZ thứ 2, ta nửa chặng đường, cơng việc cịn lại tìm ký tự vị trí ký tự chuỗi cuối Hình 3.15: Xử lý xong lệnh JNZ thứ Ta tiếp tới lệnh JNZ thứ địa 004110B Hình 3.16: Lệnh JNZ thứ Ta thấy có lệnh PUSH ESI sau gán cho ESI chuỗi “R3versing”, tiếp đến vòng lặp để kiểm tra, kiểm tra chuỗi ký tự phía sau “5y” mà ta tìm thấy trước Hình 3.17: Chuỗi “R3versing” Chạy thử chương trình để xem có dự đốn khơng Hình 3.18: So sánh chuỗi nhập vào chuỗi “R3versing” Sau xác định vịng lặp dự đốn, ta cịn thiếu kí tự đầu để có mật Ta thay mật thành 1a5yR3vering để vượt qua lệnh JNZ thứ Tiếp tục đến với lệnh JNZ thứ 4, ta thấy câu lệnh CMP bên so sánh địa [ESP +4] với 0x61, qua cửa sổ Dump ta thấy địa ký tự mà ta nhập vào, ký tự cuối cần tìm E(0x61) Ta có mật cần tìm “Ea5yR3versing” Hình 3.19: Lệnh JNZ thứ Nhập thử thành cơng Hình 3.20: Thành cơng tìm mật Trên cách để tìm mật đúng, ngồi ta cịn đổi hết tất lệnh JNZ thành JZ(JE), lúc ta nhập mật có kết Cách đơn giản, ta cần click đúp vào câu lệnh muốn thay đổi cửa sổ Disassembler, sau sửa lại chạy tiếp Hình 3.21: Sửa lệnh OllyDbg Sau sửa xong, tất câu lệnh gọi tới JE Hình 3.22:Sửa lệnh JNZ thành lệnh JE Kết ta nhập chuỗi kết xác Hình 3.23:Crack thành cơng Với cách thứ 1, thường dùng cho thi CTF, mà mục đích tìm Flag cuối Cịn với cách thứ đơn giản hơn, sử dụng mục đích bypass mật khẩu, thường dùng để crack phần mềm, đa số kiểm tra key qua mạng có chương trình mã hóa qua nhiều lớp khác nhau, nên thời gian việc tìm key mà bypass key tốt KẾT LUẬN Qua việc tìm hiểu sử dụng tool OllyDbg, phân tích ưu, nhược điểm, so sánh với tool loại, em có thêm kiến thức RE, cách sử dụng cơng cụ debugger để phân tích chương trình, hiểu thêm cấu trúc hệ điều hành Windows Từ áp dụng kiến thức vào thực tế công việc gỡ lỗi ứng dụng, phân tích mã độc,… Tuy em cố gắng q trình làm có sai sót, mong thầy góp ý để em hồn thiện DANH MỤC THAM KHẢO Bowne, S (2021, July 1) Retrieved July 1, 2021, from Practical Malware Analysis: Ch 9: OllyDbg: https://www.slideshare.net/SamBowne/practical-malware-analysisch-9-ollydbg Brandon (n.d.) Process Injection Part 2: Modern Process Injection Retrieved June 27, 2021, from https://www.secarma.com/processinjection-part-2-modern-process-injection/ developers, t G (n.d.) Retrieved June 26, 2021, from GDB: The GNU Project Debugger: the GDB developers gogil@reversing.kr (n.d.) Retrieved June 20, 2021, from Reversing.kr: http://reversing.kr/ hex-rays (n.d.) Retrieved June 26, 2021, from IDAPro: https://hexrays.com/cgi-bin/quote.cgi/products Thảo, H (2018, December 12) Retrieved June 28, 2021, from Security Daily: https://securitydaily.net/hieu-ve-user-mode-va-kernel-mode/ ... giả lập OllyDbg Sau cài đặt xong ta chạy tool qua tool giả lập wine32 Kali Linux để hiển thị giao diện OllyDbg Hình 2.5: Giao diện OllyDbg Kali Linux Giới thiệu OllyDbg 2.1 Nạp mã độc vào OllyDbg. .. thông báo đăng ký với tác dạng phần mềm dùng thử Phiên OllyDbg thao tác tập tin biên dịch cho vi xử lý 64-bit Dựa thơng tin có trang chủ OllyDbg, phiên OllyDbg6 4 dành cho chương trình 64-bit mắt... đặt Hướng dẫn cài đặt 1.1 OllyDbg Window OllyDbg download trang chủ http://www .ollydbg. de/ dạng chương trình portable, sau download giải nén chạy Hình 2.1: Chương trình OllyDbg Windows Hình 2.2: