[Writeup] [Crackme] What Do I Want (DevAstatoR)

Standard

Nội dung chính

Download target tại:

Mở nó lên và chạy thử:

31-07-2013 10-14-07

Mình sẽ đặt tên textbox 1 là username, và textbox 2 là password. Điền đại vô:

username = yeuchimse
password = 12345678

31-07-2013 10-16-06

Được, mở nó trong IDA rồi tính tiếp.

Bạn không nghe nhầm đâu, là IDA thật đấy :3 Mình giờ khác rồi, mình đã biết chạy IDA rồi :”>

31-07-2013 10-22-18

Xem qua một chút để lấy tinh thần, rồi debug ngay emo_popo_sure

31-07-2013 10-32-42

Phần trên sẽ lấy username và lưu vô lParam. Đổi tên cho dễ nhìn.

31-07-2013 10-33-13

F8 tiếp:

31-07-2013 10-34-37

Thôi xong =.= Vậy ra username là số emo_popo_sweat

Vẫn F8 thêm chút coi sao T_T:

31-07-2013 10-39-53

EAX = int(username) – 0x200E4. Sau đó được dùng làm tham số Msg cho hàm SendMessageA.

List các giá trị của Msg có thể tham khảo tại:

Ta nhận thấy rằng hàm call này tương tự hàm call dùng để lấy username, và nếu là WM_GETTEXT thì ứng với 0x0D, cộng thêm 0x200E4 sẽ là 0x200F1 (= 131313).

Giá trị 131313 rất đẹp, đó là điều hợp lý thứ nhất. WM_GETEXT để lấy tiếp password sau khi đã lấy username, đó là điều hợp lý thứ hai. Với 2 điều hợp lý, ta đã có đủ cơ sở để đặt niềm tin. Chạy lại với:

username = 131313
password = 12345678

31-07-2013 10-51-40
Xuống dưới:

31-07-2013 10-56-14

Vòng lặp từ 004010A1 đến 004010A6 sẽ làm nhiệm vụ duyệt các ký tự từ vị trí bắt đầu của String2, tăng biến đếm ESI và thoát khi gặp ký tự NULL (0x00). Hiểu đơn giản thì ESI là số ký tự của String2. Giá trị của String2 là:

31-07-2013 11-00-15

'\x24\x0B\x15\x1C\x13\x0A\x04\x36\x06\x17\x2F\x64\x64'

Xuống dưới nữa:

31-07-2013 11-02-35

3 câu lệnh:

.text:004010AA mov     eax, ecx
.text:004010AC cdq
.text:004010AD idiv    esi

thực hiện nhiệm vụ là:

1. EAX = ECX.
2. Chuyển EAX từ Double sang Quad (lưu vào EDX:EAX). Vậy EAX giữ nguyên, EDX = 0.
3. Chia EAX cho ESI, thương trong EAX, phần dư trong EDX.

Ta biết rằng ESI = len(String2) = 0x0D, trong khi vòng lặp trên thực hiện với điều kiện thoát là ECX > 0x0B. Như thế, (3) luôn cho kết quả là EAX = 0 và EDX = EAX. Hay nói cách khác, (1)(2)(3) thực hiện nhiệm vụ hoán đổi EAX và EDX.

Kết quả là, vòng lặp đang xét thực hiện nhiệm vụ xor từng byte của password với từng byte của String2, và lưu lại vào password. Tiếp tục đi xuống sâu hơn:

31-07-2013 11-17-31

Lệnh nhảy jz tại 004010E0 sẽ đưa ta nhảy qua goodboy, mà ta thì không thích điều ấy.

Chú ý đến hàm call ở 004010D5 (GetProcAddress) với tham số lpProcName truyền vào là password sau khi đã được xor ở bước trên (password_encoded). EBX thì vẫn bằng 0 từ nãy giờ. Vậy ta gặp goodboy nếu password_encoded là tên một function có trong user32.dll.

Đặt tên cho arg_8 để dễ nhìn, và kéo xuống dưới một chút để thấy nơi mà nó được sử dụng:

31-07-2013 11-23-34

31-07-2013 11-24-05

Vậy unkownFunction là một hàm với 4 tham số truyền vào, trong đó có 2 tham số là xâu. Thực ra nếu xét theo logic thì ta hoàn toàn có thể đoán được nó là gì, dựa trên mục đích mà các xâu kia sẽ được sử dụng.  Nhưng để đúng bài thì cứ thử ngó list các function trong user32.dll xem sao:

31-07-2013 11-33-08

emo_popo_waaaht emo_popo_oh emo_popo_dribble

Rồi rồi, mình quyết định đoán, quyết định tự đoán vậy emo_popo_pudency Mình đoán nó là MessageBoxA emo_popo_haha

Nó dùng để hiện thông báo “The password is…” đến người dùng, đó là điều hợp lý thứ nhất. Nó dài 11 ký tự, tức nhỏ hơn 0x0D (độ dài xâu String2), đó là điều hợp lý thứ hai. Dù đúng hay sai, chỉ 2 là đủ \m/

password = 'MessageBoxA'
string2 = '\x24\x0B\x15\x1C\x13\x0A\x04\x36\x06\x17\x2F\x64\x64'

pw = ''
for i in range(0, len(password)):
	pw += chr(ord(password[i]) ^ ord(string2[i]))

print pw

Kết quả:

C:\...\WhatDoIWant>python ....py
information

Ok, rất đẹp. Vậy:

username = 131313
password = information

31-07-2013 11-40-41

Bonus

Molybdat-Ion2.svg

4 thoughts on “[Writeup] [Crackme] What Do I Want (DevAstatoR)

    • Dạ viết vui thôi anh ạ.
      FB thì em toàn chat chit linh tinh với mấy đứa bạn chứ không động gì tới mấy này🙂

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s