Tải bản đầy đủ (.pdf) (5 trang)

Cracking part 49 docx

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 (169.21 KB, 5 trang )

0040ACA3 . 85C0 TEST EAX,EAX
0040ACA5 . 74 60 JE SHORT Fulldisk.0040AD07
0040ACA7 . 8D4D F0 LEA ECX,DWORD PTR SS:[EBP-10]

-Tôi click vào dòng có lệnh JE xem thử nó sẽ nhảy đến đâu khi đk đáp ứng. Các bạn xem
hình 13 như sau:


(hình 13)
-Các bạn thấy đó, trong cửa sổ code của window CPU, xuất hiện một mủi tên chỉ đến địa
chỉ 0040AD07 :

0040AD07 > \6A 00 PUSH 0 <<<<Trỏ mủi tên đến đây
0040AD09 . 6A 00 PUSH 0
0040AD0B . 68 58E94100 PUSH Fulldisk.0041E958 ; ASCII "Name /
Code mis-match. Try again."
0040AD10 . E8 95B30000 CALL <JMP.&MFC42.#1200>
0040AD15 > C645 FC 00 MOV BYTE PTR SS:[EBP-4],0

Và phía đưới cửa sổ code là cửa sổ chứa địa chỉ mà l
ệnh JE sẽ nhảy đến như hình 14


(hình 14)
Từ những phát hiện trên chúng ta thấy rằng nếu eax=0 thì sẽ bắn Nag Badboy, vậy tại
đây:

0040ACA5 . 74 60 JE SHORT Fulldisk.0040AD07

Đó chính là “tử huyệt” của Soft.
-Như tôi đã nói, chúng ta cần phải biết “điểm đầu” và “điểm cuối” trước khi tìm ra real


serial. “Điểm cuối” chúng ta đã biết. Vậy còn “điểm đầu”. Bây giờ chúng ta sẽ giả định

điểm đầu” bằng cách đặt bp tại hàm Call đầu tiên gần “tử huyệt” nhất.
Chúng ta hảy click trỏ đến hàm:

0040AC88 . E8 030A0000 CALL Fulldisk.0040B690

Và nhấn F2 đặt bp tại đó. (như hình15)



(hình 15)
-Bây giờ chúng ta hảy nhấn F9 đển Run, và nhập Fake Name và Code như lúc đầu.
Chúng ta sẽ bị break tại địa chỉ đặt bp như trên.
-Nhìn vào cửa sổ Stack (“Đống rác” yêu dấu của tôi!!!) chúng ta sẽ thấy có chuối sau:


0012FB30 00328B18 ASCII "6F508A8AC3AAB74FF1C90E771DF722B9"

Như hình dưới đây:



(hình 16)

Hảy ghi nhớ chuổi này. Vào thóat chương trình nhập lại Name và code như sau:
Name: benina
Code: 6F508A8AC3AAB74FF1C90E771DF722B

OH, WOW, nó cám ơn tui kìa, hahahahaha (hình 17)



(hình 17)

Vậy là chưa đầy 5 phút chúng ta đã tìm ra Real Serial đúng ko các bạn!!.
Thật là bu
ồn cười khi ko cần phải hiểu biết nhiều về ASM, cũng như các quá trình tính
tóan phức tạp mà chúng ta đã tìm ra Real Serial một cách dễ dàng. Tội nghiệp cho mấy
cái lão Coder phải ngồi suy nghĩ các thuật tóan mã hóa phức tạp để cuối cùng…. Điềm
10 lại thuộc về chúng ta. Hahaha.

3. Nhận xét:


-Qua bài này các bạn thấy đó, nếu đọc tut về tìm Real Serial mà ko thực hành thì chúng ta
nhiều khi ko hiểu mấy lão cracker sao mà tài tình đền thế.
-Tóm lại , khi thực hành tìm Real Serial chúng ta sẽ trace qua 1 vòng như “cởi ngựa xem
hoa”, rồi thấy có hiện tượng nào “lạ” thì đánh dấu lại bằng cách dùng lệnh Label (phím
“:”) hay Comment (phím “;”) như tui đã chỉ cho các bạn ở các tut trên. Khi đó khi trace
lại lần sau, chúng ta sẽ dễ dàng tìm ra các “điểm rào cản”, thậm chí tìm ra Real Serial một
cách nhanh chóng.
-Ở tut này , chủ yế
u tui muốn hướng dẫn các bạn cách Search string trong Olly một cách
dễ dàng mà ko phải mò mẫm từng dòng từng chử cho mệt . Chỉ có vậy thôi . Hihi.

Benina 31/10/2004

Understanding Code

Author: _[kienmanowar]_

“Cuộc sống luôn đầy cám dỗ
Ngày ngày níu kéo con người
Làm sao thắng được chính mình Làm sao
Ngựa non lớn lên thường háu đá
Tuổi trẻ nào suy tính gì
Nên đi tới con đường bế tắc
Chìm sâu trong bóng tối”

I. Intro :

Chào tất cả anh em REA, chúng ta lại gặp nhau trong bài viết này của tôi viết về
“Understanding Code”. Đây là bài viết của tác giả Kwazy Webbit, đề cập tới vấn đề
đọc hiểu code của các chương trình được Disassembly bằng W32Dasm, IDA v v Tại
sao tôi lại chọn nó là chủ đề cho bài viết thứ 3 này bởi vì một lý do hết sức đơn giản, có
đọc hiểu code chúng ta mới biết được chương trình đang làm gì, đoạn code mà chúng ta
đang RE đượ
c dùng vào mục đích gì, đề từ đó có những thay đổi chỉnh sửa sao cho hợp
lý để phục vụ mục đích của chúng ta. Hầu hết những anh em tôi quen biết đến với RE,
Cracking theo những cách thức khác nhau, có người muốn chỉ trong một thời gian ngắn
có thể Crack được một phần mềm mà không cần tìm hiểu xem tại sao lại làm như thế,
nhiều người chỉ thực hiện theo các tut một cách dập khuôn,
ăn sẵn để rồi cuối cùng vẫn
luẩn quẩn với những câu hỏi “Tại sao lại làm như thế ?” , “Tại sao tôi làm thế không
được ?” v…v… mà không hề có một chút đầu tư nghiên cứu tìm hiểu, nhưng ngược lại
có những người đi từ những viên gạch đầu tiên, từ từ từng bước một, những viên gạch
của quá trình lạo động tìm hiểu nghiêm túc, tốn nhiều mồ hôi, n
ước mắt để rồi bù lại họ
có được những kiến thức làm tôi kinh ngạc.Có những người còn rất trẻ và những người
lớn tuổi hơn tôi, có người chuyên về IT và cũng có người không. Nhưng những người đó
đã để lại cho tôi lòng khâm phục bởi tinh thần làm việc nghiêm túc, lòng đam mê, sự chia

sẻ kiến thức tới cộng đồng không hề vụ lợi.

Việc chúng ta tìm hiểu xem m
ột đoạn binary biểu diễn ý nghĩa gì là một công việc quan
trọng.Các đoạn mã thực thi và dữ liệu được biểu diễn ở mức thấp nhất đó là tập hợp của
các bit 0 và 1.Bạn có thể cố gắng cho thực thi một đoạn dữ liệu như một đoạn mã, nhưng
hầu hết trong các trường hợp việc làm này sẽ dẫn đến crash.Lấy ví d
ụ, việc cố gắng để sử
dụng một đoạn mã thực thi như là một Picture data cũng sẽ là không hợp lệ hoặc ngược
lại, nhưng đó chỉ là một sự ngẫu nhiên nào đó mà thôi. Đó là bởi vì có một cấu trúc để
biểu diễn chúng khiến cho chúng không chỉ đơn thuần là binary mà còn bao hàm nhiều ý
nghĩa khác. Để giúp ích cho bạn, bạn cần phải tìm hiểu về cấu trúc này và từ
đó sẽ diễn
dịch được nó theo đúng cách.

Để cụ thể hơn, tôi sẽ lấy một ví dụ, chẳng hạn tôi có 4 con số như sau :

112, 43, 149, 184

Như các bạn thấy chúng có thể mang rất nhiều ý nghĩa. Nếu như tôi nói với bạn rằng đây
là ví dụ về một đường thẳng, và hãy tưởng tượng rằng đây là một đường thẳng 2 chiều,
bắt đầu tại tọa độ thứ nhất là (112, 43) và kết thúc tại tọa độ thứ hai là (149, 184). Tuy
nhiên nếu như có ai đó lại nói với bạn là đây chính là m
ột hình vuông, liệu bạn có tin
không? Tôi thì tin liền khà khà bởi vì đơn giản tôi nghĩ đây là một hình vuông với 4 các
tọa độ của nó. Như các bạn thấy, 4 con số trên có rất nhiều ý nghĩa đúng không, tất cả
chúng đều phụ thuộc vào sự suy diễn của bạn và tôi. Điều này sẽ dẫn đến nhiều vấn đề,
làm sao chúng ta có thể phán đoán hết được ý nghĩa của chúng, và làm sao chúng ta chọn
được một phươ
ng án đúng nhất trong đó? Máy tính sẽ dùng cách thức nào để có thể hiểu

được? Làm thế nào chúng ta biết được điều gì đang thực sự xảy ra ? Trong bài viết này,
tôi sẽ không đi vào tìm hiểu ngữ nghĩa của data, bởi vì các cấu trúc dữ liệu là quá nhiều
(như các bạn đã thấy trong ví dụ ở trên). Mỗi một định dạng file sẽ có một cấu trúc dữ
liệu. Chương trình sử dụng các phầ
n mở dụng của file (.exe, .dll v v ) như là một ám
hiệu để biết cách cư xử với từng cấu trúc.

Thay vào đó, tôi và các bạn sẽ tập trung vào các đoạn code thực thi, đặc biệt là các đoạn
code cho x86 processor. Chúng ta sẽ bắt đầu từ binary và kết thúc với ngôn ngữ C.



II. Binary to Hexadecimal

Như tôi đã nói ở trên, mức biểu diễn thấp nhất của thông tin (trong một môi trường máy
tính) là binary. Các đoạn mã mà máy tính có thể hiểu được được biểu diễn bằng những
bit 0 và 1 dài vô tận.Điều này dẫn đến con người khó có thể hiểu được những chuỗi 0 và
1 mà họ nhìn thấy thể hiện cái gì, và điều gì sẽ xảy ra. Nếu như bạn có hứng thú trong
việc tìm hiểu nguyên lý hoạ
t động của các mạch trong CPU, tôi gợi ý bạn nên tìm đọc các
quyển sách điện tử.Còn đối với tôi, tôi không biết nhiều về chúng để có thể giải thích cho
bạn một cách chi tiết về nguyên lý hoạt động (Mặc dù có một thời gian tôi đã từng làm
việc với những bộ vi xử lý đơn giản). Nhằm mục đích giảng giải, binary là một định dạng
khó hiểu, vì nếu số lượng các s
ố binary là quá lớn sẽ khiến cho chúng ta khó khăn trong
việc quan sát. Đó chính là lý do tại sao các bạn thấy rằng thông thường chúng ta không
bao giờ chỉnh sửa bất cứ gì theo định dạng binary, mà thay vào đó chúng được chuyển
sang một định dạng dễ hiểu hơn mà tôi và các bạn đều biết, đó chính là
Hexadecimal.Nếu như các bạn thấy trong hệ binary chỉ có 2 số 0 và 1, hệ decimal thì có
10 số (0,1,2,3,4,5,6,7,8,9)còn hệ Hexa sẽ có 16 (0,1,2,3,4,5,6,7,8,9,A,B,C,D,E,F). Bạn có

thể sẽ
rất ngạc nhiên là tại sao định dạng Hexa lại được chọn để biểu diễn mà không phải
là hệ Decimal đã quá thân thuộc ngay từ khi lọt lòng. Câu trả lời hết sức đơn giản.Đó là
bởi vì tất cả các số khi được chuyển đổi vẫn nằm dưới định dang binary.Sử dụng 4bits thì
tại một thời điểm bạn có thể tạo ra chính xác 16 giá trị khác nhau từ 4 bits này, bắt đầ
u từ
0 cho tới 15, theo hệ Hexa thì là từ 0 cho tới F. Điều này khiến cho hệ thống xử lý một
cách dễ dàng hơn đơn giản chỉ bằng thay thế 4 bits bằng một số trong hệ Hexa. Dưới đây
là bảng minh họa quá trình chuyển đổi giữa các hệ, giúp các bạn phần nào hiểu thêm về
những gì mà tôi đã nói :

Binary Decimal Hexadecimal
0000 0 0
0001 1 1
0010 2 2
0011 3 3
0100 4 4
0101 5 5
0110 6 6
0111 7 7
1000 8 8
1001 9 9
1010 10 A
1011 11 B
1100 12 C
1101 13 D
1110 14 E
1111 15 F
10000 16 10


Như các bạn đã thấy trên bảng trên, tại giá trị Binary là 1000 thì giá trị ở hệ Hexa là (10),
đó là vì con số 1 đầu tiên có thể được biểu diễn thành 0001, trong khi số 0 thứ 2 được
biêu diễn bằng (0000). Do đó chúng ta có kết quả là 00010000, giá trị này rất phù hợp với
hệ số Binary.

III. Hexadecimal to Assembly Code

Việc sử dụng kí pháp hexadecimal giúp chúng ta viết các đoạn Binary code một cách
nhanh hơn, và cho phép chúng ta nhiều cái nhìn tổng quát hơn. Tuy nhiên nó vẫn không
có ý nghĩa nhiều lắm cho con người bởi vì thực chất nó vẫn chỉ là những con số. Chúng
ta hãy quan sát một ví dụ về đoạn code Hexa dưới đây :

83EC20535657FF158C40400033DBA39881400053

Như tôi đã nói, đây chỉ là một phương pháp biểu diễn nhanh, ngắn gọn cho các số
binary.Điều
đó có nghĩa là nó không cho chúng ta thấy bất kì một ý nghĩa gì cả, cũng như
nhìn vào đó chúng ta chẳng hiểu nó định làm gì, nhưng cái lợi của nó là ngắn gọn hơn so
với việc biểu diễn dưới dạng binary rất dài với toàn số 0 và 1. Đoạn Hexa ở trên bao gồm

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

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