Tải bản đầy đủ (.docx) (45 trang)

Tool kiểm thử ollydbg

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (4.43 MB, 45 trang )

MỤC LỤC
DANH MỤC THUẬT NGỮ TIẾNG ANH VÀ TỪ VIẾT TẮT....................................... 1
DANH MỤC HÌNH........................................................................................................... 2
LỜI MỞ ĐẦU.................................................................................................................... 4
I.

Cơ sở lý thuyết........................................................................................................... 5
1.

Các thành phần chính bên trong của Windows OS............................................... 5
1.1 User mode và kernel mode................................................................................ 6

2.

Reverse-Engineering............................................................................................. 8
2.1 Reverse-Engineering là gì?................................................................................ 8
2.2 Ứng dụng của RE.............................................................................................. 8
2.3 Các vấn đề chính của RE................................................................................... 8
2.4 RE các chương trình trên Window.................................................................... 9

3.

Tổng quan về OllyDbg......................................................................................... 9
3.1 Khái niệm.......................................................................................................... 9
3.2 Lịch sử............................................................................................................. 10

II.

Giới thiệu về OllyDbg và hướng dẫn cài đặt............................................................ 11
1.


Hướng dẫn cài đặt............................................................................................... 11
1.1 OllyDbg trên Window..................................................................................... 11
1.2 OllyDbg trên Kali Linux.................................................................................. 13

2.

Giới thiệu về OllyDbg........................................................................................ 15
2.1 Nạp một mã độc vào OllyDbg......................................................................... 15
2.2 Mở một file thực thi......................................................................................... 15
2.3 Gán một tiến trình đang chạy vào OllyDbg..................................................... 16
2.4 Giao diện của OllyDbg.................................................................................... 17
2.5 Memory Map................................................................................................... 21
2.6 Rebasing.......................................................................................................... 22
2.7 Base Address................................................................................................... 22
2.8 Địa chỉ tuyệt đối và Địa chỉ tương đối (Absolute-Relative).............................22

3.
III.
1.

So sánh với 1 số tool debug IDA, GNU Project Debugger(GDB)......................25
Xây dựng và thực hiện các bài 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

1


DANH MỤC HÌNH
Hình 1.1: Sơ đồ các thành phần chính trong Windows....................................................... 6
Hình 1.2: Sơ đồ các ring trong Windows......................................................................... 10
Hình 2.1: Chương trình OllyDbg trên Windows.............................................................. 12
Hình 2.2: Giao diện OllyDdg trên Windows.................................................................... 12
Hình 2.3: Cài đặt OllyDbg trên 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 trên Kali Linux.................................................................. 14
Hình 2.6: Giao diện mở file của OllyDbg........................................................................ 15
Hình 2.7: Giao diện System Breakpoint........................................................................... 16
Hình 2.8: Giao diện Attach của OllyDbg......................................................................... 17
Hình 2.9: Giao diện chính của OllyDbg........................................................................... 18
Hình 2.10: Giao diện cửa sổ dịch ngược của OllyDbg..................................................... 18
Hình 2.11: Giao diện cửa sổ thanh ghi của OllyDbg........................................................ 19
Hình 2.12: Giao diện cửa sổ Stack của OllyDbg.............................................................. 20
Hình 2.13: Giao diện cửa sổ memory dump của OllyDbg................................................ 20
Hình 2.14: Giao diện cửa sổ Memory map của OllyDbg................................................. 21
Hình 2.15: Giao diện cửa sổ Dump Memory Map của OllyDbg......................................21
Hình 2.16: Hình minh họa địa chỉ tuyệt đối và tương đối................................................ 22
Hình 2.17: Hình minh họa cơ 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 chỉ 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 đầu tiên................................................................. 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 đầu tiên.......................................................................... 31
Hình 3.10: Chuỗi “5y” trong stack................................................................................... 32
Hình 3.11: Hàm Easy_Cra.00401150............................................................................... 32


Hình 3.12: Địa chỉ 00401181 trong hàm Easy_Cra.00401150.........................................33
Hình 3.13: Gán “345” cho thanh ghi EDI........................................................................ 34
Hình 3.14: Giá trị trả về của hàm Easy_Cra.00401150.................................................... 34
Hình 3.15: Xử lý xong lệnh JNZ thứ 2............................................................................. 35
Hình 3.16: Lệnh JNZ thứ 3.............................................................................................. 36
Hình 3.17: Chuỗi “R3versing”......................................................................................... 36
Hình 3.18: So sánh chuỗi nhập vào và chuỗi “R3versing”............................................... 37
Hình 3.19: Lệnh JNZ thứ 4.............................................................................................. 38
Hình 3.20: Thành cơng tìm ra mật khẩu........................................................................... 38
Hình 3.21: Sửa lệnh trong OllyDbg................................................................................. 39
Hình 3.22:Sửa các 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 hiện nay, mọi người ít ra ngồi và dành nhiều thời gian
trên mơi trường internet, bên cạnh đó, trình độ nhận thức về an tồn trên khơng gian
mạng của 1 bộ phận khơng nhỏ mọi người cịn thấp, lợi dụng tình hình đó, càng ngày
càng nhiều các cuộc tấn công bằng mã độc nổ ra. Đứng trước tình hình đó, cần những
chun gia phân tích mã độc, hoặc những bạn có hứng thú với an tồn thơng tin tìm hiểu

về các cơng cụ phân tích mã độc.
Bên cạnh đó, các bạn trẻ càng đam mê hơn với các cuộc thi CTF, nơi các bạn được thử
sức mình với các lĩnh vực bảo mật, như hiểu cách thức dịch ngược một phần mềm, tại sao
các phần mềm có thể bị crack; tại sao có thể xâm nhập vào một máy tính; các kỹ thuật
khai thác ứng dụng web; Mật mã – mã hóa được áp dụng như thế nào trong thực tế;
forensic – điều tra phần tích truy dấu vết được thực hiện như thế nào… và phần reverse
engineering luôn là 1 trong những phần thi không thể thiếu.
OllyDbg là 1 tool phục vụ cho việc dịch ngược đã có từ rất lâu và được biết đến, sử dụng
rộng rãi. Em sẽ tìm hiểu và trình bày sâu hơn về cơng cụ này trong bài viết dưới đây


I.

Cơ sở lý thuyết
1. Các thành phần chính bên trong của Windows OS
Hình minh họa phía bên dưới cho ta thấy các thành phần chính bên trong hệ
điều hành Window. System Processes là những chương trình của hệ thống.
Ở đây ta lấy Service Control Manager (SCM) làm ví dụ. SCM được khởi
động vào lúc nạp hệ thống (system boot). Nó là một Remote Procedure Call
Server hay còn gọi là RPC Server, cho phép các service configuration và
service control program có thể điều khiển các services trên một remote
machine.
Mỗi service cũng giống như những chương trình bình thường khác. Điểm
khác biệt ở đây giữa service so với những chương trình bình thường khác ở
chỗ chúng hoạt động ở mức nền (background), mà thường khơng có giao
diện dành cho người sử dụng. Chúng thường được viết để cung cấp các
tính năng 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 cả service đều được phát triển bởi
Microsoft. Nhiều ứng dụng và driver đều có service riêng của mình. Ở đây
chúng ta sẽ lấy tập các chương trình liên quan đến security làm ví dụ.

Những chương trình này sẽ sử dụng những lợi thế do hệ điều hành cung cấp
nếu chúng được hoạt động ở dạng service. Một trong những lợi thế là việc
chúng được khởi tạo lúc khởi động hệ thống (system boot), trước những
chương trình khác và tất nhiên là trước cả lúc bạn đăng nhập vào hệ điều
hành Windows của mình. Nhưng quan trọng hơn cả là những chương trình
ở dạng này có thể theo dõi tất cả những gì đang hoạt động trên máy tính
của bạn bằng cách tương tác với Windows Core. Ví dụ như: hoạt động của
firewall
Hardware Abstraction Layer ( HAL ) là một lớp trừu tượng thực thi bởi
phần mềm. Chúng nằm ở giữa Physical Hardware của máy tính và những
phần mềm chạy trên máy tính. Chức năng của nó là che giấu đi sự khác
biệt về phần cứng trong hầu hết các OS kernel. Như vậy, các mã viết ở
kernel mode không cần phải thay đổi để chạy được trên hệ thống với những
thiết bị phần cứng khác. Chúng cho phép những lập trình viên viết những
chương trình Device Driver mà khơng phụ vào chi tiết của phần cứng. Nói
cách khác, ở đây chúng cung cấp những lời gọi hàm tới phần cứng để thực
hiện những công việc nhất định. Rất nhiều hệ thống máy tính đời đầu
khơng cung cấp HAL. Điều này có nghĩa là khi bất cứ một ai muốn viết
một chương trình cho một hệ thống nào đó thì cần phải biết mỗi hardware
device liên kết với phần còn lại của hệ thống như thế nào. Điều này thực sự
gây ra sự khó khăn lớn cho các nhà phát triển bởi vì họ cần phải biết tất cả
hardware device hoạt động như thế nào trên hệ thống và phải đảm bảo về
sự tương thích. Với HAL, sự khó khăn này gần như đã được loại bỏ.


Hình 1.1: Sơ đồ các thành phần chính trong Windows
1.1 User mode và kernel mode
Một bộ vi xử lý khi chạy Windows OS sẽ có hai chế độ khác nhau
được gọi là: User Mode và Kernel Mode. Các chương trình (applications)
thường chạy trên User Mode, còn các thành phần lõi của hệ điều hành sẽ

chạy ở Kernel Mode. Thường thì khái niệm Driver dùng cho những chương
trình chạy tại Kernel Mode, nhưng cũng có một vài Driver chạy trên User
Mode. Hình minh họa phía dưới mơ phỏng sự kết nối giữa các thành phần ở
User Mode và Kernel Mode
Khi viết các ứng dụng chạy trên Windows, Microsoft cung cấp các 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 các Windows API, bạn sẽ phát triển
được các ứng dụng hoạt động ổn định trên tất cả các phiên bản của Windows.
Các Windows API này có thể giao tiếp với các UserMode Drivers để
thực hiện một số nhiệm vụ nhất định trên UserMode. Ngoài ra, Microsoft
cũng hỗ trợ các Native API (thực chất cũng là các Windows API, nhưng
được cung cấp bởi một subsystem module như Kernel32.dll hoăc
NTDLL.dll). Đó là một cơ chế cho phép chương trình ở UserMode có thể
gọi các chương trình con (a subroutine) thực thi ở KernelMode. Ví dụ:
DbgPrint function…
Ở KernelMode, sẽ có một cơ chế phục vụ những yêu cầu từ ứng dụng trên
UserMode và tương tác với các thiết bị (device) theo một cách nào đó. Cơ
chế này đảm bảo cho việc các tham số sử dụng đều là hợp lệ, và đảm bảo
việc không cho phép xử lý tới vùng dữ liệu hoặc địa chỉ mà chương trình ở
UserMode khơng được phép thao tác tới.
1.1.1

User mode

Khi một chương trình khởi tạo trên User Mode, Windows sẽ tạo một tiến
trình (process) cho chương trình đó. Một tiến trình cung cấp cho chương
trình đó một khơng gian địa chỉ ảo (Virtual address space). Bởi vì mỗi
khơng gian địa chỉ ảo của mỗi tiến trình là riêng biệt, nên một chương trình

khó hay cịn có thể nói là không thể thay đổi dữ liệu thuộc về một chương
trình khác. Do mỗi chương trình chạy một cách cơ lập như vậy, nên nếu
một chương trình bị đổ vỡ (crash), thì sự đổ vỡ này sẽ được giới hạn trong
chương trình đó. Những chương trình khác và hệ điều hành sẽ không bị ảnh
hưởng bởi sự đổ vỡ này.
1.1.2
Kernel mode
Khơng gian địa chỉ ảo của mỗi tiến trình ở User Mode bị giới hạn. Một
chương trình chạy tại User Mode sẽ không xử lý được những địa chỉ ảo
(Vrtual address) được dự trữ để sử dụng bởi hệ điều hành. Sự giới hạn
không gian địa chỉ nhằm bảo vệ những chương trình khỏi việc xử lý nhầm
vào những vùng dữ liệu quan trọng, có thể gây hại tới hệ điều hành. Tất cả
đoạn mã được viết ở Kernel Mode chia sẻ một khơng gian địa chỉ duy nhất.
Điều đó có nghĩa một kernel-mode driver sẽ khơng bị cơ lập với những
driver khác và bản thân hệ điều hành. Nếu một kernel mode driver ghi
nhầm địa chỉ hoặc dữ liệu thuộc về hệ điều hành hoặc một driver khác thì
những chương trình này sẽ bị tổn hại. Khi đó, việc xử lý sai này có thể
khiến driver đó bị crash. Mà khi một driver bị crash ở Kernel Mode thì có


thể dẫn tới toàn bộ hệ điều hành bị crash. Khi đó máy tính của bạn sẽ xảy
ra


hiện tượng bị treo hoặc xuất hiện màn hình xanh (Blue Screen of Death –
BsoD)

2. Reverse-Engineering
2.1 Reverse-Engineering là gì?
Reverse-Engineering (RE) là q trình tìm hiểu những cơng nghệ

được sử dụng bởi 1 thiết bị, 1 đối tượng hoặc 1 hệ thống thơng qua
việc phân tích cấu trúc, các chức năng và hoạt động của nó.
RE là 1 khái niệm rất rộng, bao gồm cả RE phần cứng và RE phần
mềm. Nhưng trong bài này, chúng ta chỉ tìm hiểu RE phần mềm. Và
từ đây, trong bài này, nhắc đến RE, chúng ta chỉ nói đến RE phần
mềm.Việc phân tích hoạt động cụ thể của một hệ thống hay 1
chương trình sẽ được sử dụng trong việc bảo trì chính hệ thống hay
chương trình đó. Một mục đích khác của RE là phục vụ cho việc tạo
ra một hệ thống mới hoặc chương trình mới có những chức năng
tương tự mà không sử dụng hoặc chỉ là sao chép đơn giản (khơng có
sự hiểu biết) hệ thống/chương trình gốc.
2.2 Ứng dụng của RE
Có thể kể ra một số cơng việc cần sử dụng đến RE như Phân tích
malware (viruses, trojans, worms...) để biết được chúng lây lan ra
sao, lấy cắp thông tin cá nhân như thế nào? Để xóa chúng khỏi hệ
thống, hay điều tra thông tin về người phát tán, cần thực hiện những
hành động điều tra gì?
Ngồi ra một ứng dụng khác của RE, đó là khi bạn có một phần
mềm thương mại, cần phải trả phí để sử dụng mà bạn không đủ khả
năng để chi trả hoặc thậm chí là khơng muốn trả khoản phí đó. Bạn
có thể RE để tìm hiểu cách thức hoạt động của module thực hiện
công việc bạn cần quan tâm để viết lại 1 chương trình khác thực
hiện cơng việc đó, hay tìm hiểu xem module kiểm tra key của phần
mềm đó hoạt động như thế nào.
Bên cạnh đó RE cịn là một sở thích, thỏa mãn tính tị mị của bạn về
cách thức hoạt động của một hệ thống nào đó.

2.3 Các vấn đề chính của RE



Với mỗi một nền tảng, hệ điều hành khác nhau ta có các chương
trình được xây dựng khác nhau, thực thi theo cách khác nhau. Điều
này tạo ra sự phức tạp trong q trình thực hiện cơng việc RE.
Với đặc trưng của mỗi nền tảng, ta có những hướng khác nhau để
tiếp cận, những công cụ khác nhau để trợ giúp cho cơng việc.
Với các chương trình trên Window ta sử dụng những cơng cụ khác,
các chương trình trên Linux ta dùng cơng cụ khác.
Những chương trình chạy trên nền tảng .Net Framework và các
chương trình được viết bằng python sẽ có những cơng cụ RE khác
nhau.

2.4 RE các chương trình trên Window
Tất cả các chương trình trên Window dù được viết bằng ngơn ngữ nào
thì đều có thể dịch ngược file thực thi cuối cùng về dạng code hợp ngữ
Assembly, điều này đúng với các tất cả các ngôn ngữ lập trình từ bậc
cao như python đến bậc thấp như C hay Assembly.
Bên cạnh đó các chương trình thực thi trên Window phải tuân thủ
đúng cấu trúc PE File.
3. Tổng quan về OllyDbg
3.1 Khái niệm
OllyDbg là một trình gỡ lỗi (ở ring 3) sử dụng hợp ngữ trên nền
Windows 32-bit 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, ngồi ra cịn được
sử dụng trong mục đích dịch ngược và nghiên cứu mã độc



Hình 1.2: Sơ đồ các ring trong Windows
3.2 Lịch sử
Theo như trong tập tin trợ giúp của chương trình, phiên bản 1.10 là
bản cuối cùng của dòng phiên bản 1.x. Bản 2.xx đang được phát triển
và phiên bản đầu tiên là 2.01 đã ra đời vào cuối tháng 9/2013. Phần
mềm là miễn phí (và đầy đủ chức năng, khơng có giới hạn thời gian sử
dụng, v.v...), nhưng có thơng báo đăng ký với tác giả như ở các dạng
phần mềm dùng thử. Phiên bản hiện tại của OllyDbg không thể thao
tác được các tập tin biên dịch cho các bộ vi xử lý 64-bit.
Dựa trên thơng tin có trên trang chủ của OllyDbg, phiên bản
OllyDbg64 dành cho các chương trình 64-bit ra mắt bản “not even an
alpha” vào ngày 24/10/2013
Sau đó vào ngày 20/12/2013, có đăng tải 1 hình ảnh breakpoint thành
cơng lần đầu tiên trên OllyDbg64, bên cạnh đó cũng có nói về tiến
trình hồn thành dự án này:
“Data storage - 95%
Disassembler - 90%
Assembler - 90%
Expressions - 60%
Dialogs - 30%
Debugging engine - 20%
Analysis - 0%
Data base (known data) - 0%”

Và lần cuối cùng vào ngày 05/02/2014, trên trang chủ đăng tải
thơng tin về tiến trình hồn thành dự án này:


“Search - 90%

Debugging engine - 70%
Analysis - 15% :(
Slowly, 64-bit version of OllyDbg gets shape. Debugging engine is
mostly functional, run trace works well, search is almost ready
and dbghelp.dll is more or less integrated. Now I work on analysis.
First I thought that this will be easy - ha! Small changes in the
command set and different calling conventions force me to rewrite
analysis almost from the scratch. So this will take some time.”
Có vẻ như pha analysis( phân tích) khơng q dễ dàng như tác giả
tưởng tượng, nên gần như phải làm lại mọi thứ từ con số 0. Bản 2.01
hay OllyDbg cũng dừng lại tại đây, bên cạnh hạn chế chỉ có thể chạy
được các file 32 bit, cho đến ngày hôm nay OllyDbg vẫn là 1 công cụ
rất mạnh trong RE và được sử dụng nhiều trong việc phân tích mã độc
hay trong các cuộc thi CTF

II.

Giới thiệu về OllyDbg và hướng dẫn cài đặt
1. Hướng dẫn cài đặt
1.1 OllyDbg trên Window
OllyDbg có thể được download tại trang chủ />dưới dạng chương trình portable, sau khi download có thể giải nén và
chạy được ngay


Hình 2.1: Chương trình OllyDbg trên Windows

Hình 2.2: Giao diện OllyDdg trên Windows


1.2 OllyDbg trên Kali Linux

Có thể được cài đặt qua lệnh sudo apt-get install ollydbg

Hình 2.3: Cài đặt OllyDbg trên Kali Linux
OllyDbg cần được chạy trên giả lập wine32. Vì thế nếu máy kali linux
đang sử dụng là bản 64 bit, ta cần cài gói wine32 với các lệnh sau đây:
sudo dpkg --add-architecture i386
sudo apt-get update
sudo apt-get install wine32


Hình 2.4: Cài đặt package wine32 để giả lập OllyDbg
Sau khi cài đặt xong ta có thể chạy tool qua tool giả lập wine32 của Kali Linux để
hiển thị giao diện của OllyDbg.

Hình 2.5: Giao diện OllyDbg trên Kali Linux


2. Giới thiệu về OllyDbg
2.1 Nạp một mã độc vào OllyDbg
Có nhiều cách để nạp một mã độc vào OllyDbg. Ta có thể nạp trực
tiếp file thực thi hoặc DLL. Trong trường hợp mã độc đang chạy trên hệ
thống, ta có thể gán tiến trình của nó vào OllyDbg..
2.2 Mở một file thực thi
Cách tốt nhất để debug một mã độc là tạo một tiến trình mới cho nó.
Chọn File > Open và điền tham số đầu vào nếu cần thiết. Ta chỉ có thể
truyền tham số dịng lệnh tại bước này.

Hình 2.6: Giao diện mở file của OllyDbg
Sau đó, loader của OllyDbg sẽ nạp file thực thi tương tự như OS loader. Mặc định,
OllyDbg sẽ dừng tại entry point chỉ định bởi lập trình viên, như WinMain chẳng

hạn, nếu nó xác định được vị trí của entry point đó. Nếu không, OllyDbg sẽ dừng
tại entry point định nghĩa trong PE header. Ta có thể thiết lập một số tùy chọn khởi
động trong bảng chọn Debuggin Option (Options > Debugging Options). Chẳng
hạn, để ngắt ngay trước khi thực thi bất kì dịng code nào nào chương trình, ta
chọn System Breakpoint…


Hình 2.7: Giao diện System Breakpoint
2.3 Gán một tiến trình đang chạy vào OllyDbg
File > Attach và chọn process để attach. Nếu có hơn một process có
cùng một tên, cần phân biệt qua PID. OllyDbg sau đó sẽ ngắt và
dừng chương trình cùng mọi thread của nó.


Hình 2.8: Giao diện Attach của OllyDbg
Code của thread đang được thực thi sẽ được hiển thị trên màn hình OllyDbg. Ta
rất dễ dừng thread đúng vào lúc nó đang thực thi code từ một DLL hệ thống. Tất
nhiên, ta khơng bao giờ muốn phân tích một thư viện Windows làm gì và cách đơn
giản để tránh trường hợp này là đặt một breakpoint tại code section. Chương trình
sẽ được ngắt tại lần tới khi nó truy cập code section.
2.4 Giao diện của OllyDbg
Sau khi nạp một chương trình, giao diện chính của OllyDbg như
hình bên dưới.


Hình 2.9: Giao diện chính của OllyDbg
Cửa sổ dịch ngược – góc trái-trên – hiển thị con trỏ lệnh và vùng lệnh thực thi
của chương trình được debug xung quanh vị trí con trỏ. Để sửa đổi lệnh hoặc dữ
liệu hay thêm lệnh mới, click vào dòng lệnh và nhấn dấu spacebar.


Hình 2.10: Giao diện cửa sổ dịch ngược của OllyDbg


Cửa sổ thanh ghi – góc phải-trên – hiển thị trạng thái hiện tại của các thanh ghi
mà chương trình được debug đang sử dụng. Các thanh ghi này sẽ chuyển màu từ
đen sang đỏ nếu lệnh vừa thực thi sửa đổi giá trị của thanh ghi.Ta có thể sửa đổi
dữ liệu trong cửa sổ thanh ghi bằng cách double click vào giá trị của thanh ghi
tương ứng.

Hình 2.11: Giao diện cửa sổ thanh ghi của OllyDbg
Cửa sổ stack – góc phải-dưới – thể hiện trạng thái hiện tại của stack trong bộ nhớ.
Cửa sổ này luôn hiển thị đỉnh stack của một thread nhất định. Ta có thể quản lý
stack bằng cách click phải vào vị trí hoặc giá trị của vùng nhớ và chọn Modify.
OllyDbg cũng tự động thêm comment (cột bên phải giá trị vùng nhớ) cho một số
giá trị stack để mô tả các tham số trước khi chúng được truyền qua một lời gọi
hàm.


Hình 2.12: Giao diện cửa sổ Stack của OllyDbg
Cửa sổ memory dump – góc trái-dưới – thể hiện trạng thái bộ nhớ của process
đang được debug. Để sửa đổi giá trị một ô nhớ, click phải vào giá trị ô nhớ đó và
chọn Edit (Ctr+E). Cách này hữu ích khi cần sửa đổi giá trị một biến toàn cục hoặc
dữ liệu mà mã độc chỉ lưu trữ trên RAM.

Hình 2.13: Giao diện cửa sổ memory dump của OllyDbg


2.5 Memory Map
View > Memory (Alt+M), hiển thị mọi memory block cấp phát cho
chương trình được debug.


Hình 2.14: Giao diện cửa sổ Memory map của OllyDbg
Memory map giúp ta quan sát cách chương trình được bố trí trên bộ nhớ. Trong
hình, trình thực thi được gán nhãn với các code section và data section. Mọi DLL
và các section của chúng cũng được thể hiện trong memory map. Ta chỉ cần
double click tại bất cứ dòng nào để trong memory map để xem memory dump của
section đó. Ta cũng có thể chuyển hướng đến section đó trên cửa sổ dịch ngược
bằng cách click phải và chọn View in Disassembler.

Hình 2.15: Giao diện cửa sổ Dump Memory Map của OllyDbg


2.6 Rebasing
Memory map có thể giúp ta hiểu một PE file được rebase trong lúc thực thi như
thế nào. Rebasing là thao tác xảy ra khi một module trong Windows không được
nạp vào địa chỉ base address chỉ định của nó.
2.7 Base Address
Mọi file PE trong Windows đều có một base address chỉ định, được định nghĩa là
giá trị image base trong PE header.
Image base không phải là địa chỉ mà mã độc nhất thiết phải được nạp vào đó, mã
độc chỉ ưu tiên địa chỉ đó. Đa số các trình thực thi được thiết kế để nạp vào bộ nhớ
tại địa chỉ 0x00400000, là địa chỉ mặc định được sử dụng mởi nhiều trình biên
dịch trên Windows. Developer có thể chọn một địa chỉ khác làm base image.
ASLR (address space layout randomization – bố trí khơng gian nhớ ngẫu nhiên)
Cấp phát lại (relocation) vùng nhớ là cần thiết vì một ứng dụng có thể import
nhiều DLL, mỗi DLL lại dùng một base address chỉ định mà nó muốn được nạp
vào bộ nhớ tại địa chỉ đó. Nếu 2 DLL được nạp và chúng đều chỉ định ưu tiên nạp
vào địa chỉ 0x10000000, chúng không thể cùng được nạp vào địa chỉ đó. Windows
sẽ nạp một DLL vào địa chỉ đó và sau đó cấp phát lại một vùng nhớ khác cho DLL
cịn lại.

Hầu hết các DLL có sẵn trong Windows OS đều có base address chỉ định khác
nhau và chúng sẽ không bị xung đột. Tuy nhiên, các ứng dụng bên thứ ba thường
chỉ định chung một base address.
2.8 Địa chỉ tuyệt đối và Địa chỉ tương đối (Absolute-Relative)
Thủ tục cấp phát lại phức tạp hơn là chỉ việc nạp đoạn code vào một địa chỉ khác.
Nhiều lệnh chỉ định tới những địa chỉ nhớ tương đối nhưng một số lệnh lại làm
việc với những địa chỉ nhớ cụ thể.

Hình 2.16: Hình minh họa địa chỉ tuyệt đối và tương đối


Tài liệu bạn tìm kiếm đã sẵn sàng tải về

Tải bản đầy đủ ngay
×