[CodeEngn] Basic RCE – Level 20

http://codeengn.com/challenges/basic/20

This program needs a key file.
What does the data in the file crackme3.key have to be to make it print the above message.
Ex) 41424344454647
(This problem has multiple answers, so post your answer on the messageboard in a private thread and we will verify it for you.)

Bài này hơi dài dòng, nếu so với các bài trước đó. Chúng ta sẽ mở nó trong IDA, kết hợp giữa việc debug và đọc code để hiểu xem nó làm gì. Kết quả có thể để như sau:

[c]HWND __cdecl start()
{
HANDLE file_handle; // eax@1
HWND result; // eax@6
bool v2; // [sp-4h] [bp-4h]@2

hInstance = GetModuleHandleA(0);
flag = 0;
file_handle = CreateFileA(“CRACKME3.KEY”, 0xC0000000u, 3u, 0, 3u, 0x80u, 0);
if ( file_handle != -1HINSTANCE_ERROR|HANDLE_FLAG_PROTECT_FROM_CLOSE|HANDLE_FLAG_INHERIT
&& (hFile = file_handle, ReadFile(file_handle, &file_content, 18u, &NumberOfBytesRead, 0), NumberOfBytesRead == 18)
&& (simple_xor(&file_content), flag ^= 0x12345678u, (v2 = get_last_4_chars(&file_content) == flag) != 0) )
goodboy_title(“CrackMe v3.0 “);
else
badboy_title(“CrackMe v3.0 “);
result = FindWindowA(“No need to disasm the code!”, 0);
if ( !result )
{
WndClass.style = 16387;
WndClass.lpfnWndProc = WndProc;
WndClass.cbClsExtra = 0;
WndClass.cbWndExtra = 0;
WndClass.hInstance = hInstance;
WndClass.hIcon = LoadIconA(hInstance, 0x64);
WndClass.hCursor = LoadCursorA(0, 0x7F00);
WndClass.hbrBackground = 5;
WndClass.lpszMenuName = “MENU”;
WndClass.lpszClassName = “No need to disasm the code!”;
RegisterClassA(&WndClass);
hWnd = CreateWindowExA(
0,
“No need to disasm the code!”,
“CrackMe v3.0 “,
0xCF0000u,
180,
110,
32768,
32768,
0,
0,
hInstance,
0);
ShowWindow(hWnd, 1);
UpdateWindow(hWnd);
if ( v2 == 1 )
sub_401362(&file_content, “Cracked by: Now try the next crackme!”, “Now try the next crackme!”);
while ( GetMessageA(&Msg, 0, 0, 0) )
{
TranslateMessage(&Msg);
DispatchMessageA(&Msg);
}
ExitProcess(Msg.wParam);
}
return result;
}[/c]

Thông tin tóm tắt:

  1. Đọc 18 byte từ file CRACKME3.KEY.
  2. Can thiệp 14 byte đầu, tính tổng của các giá trị thu được bằng việc XOR 14 byte này lần lượt với các giá trị từ 65 đến 78.
  3. XOR tổng thu được với 0x12345678, chuyển kết quả về ASCII.
  4. So sánh với 4 byte cuối trong 18 byte ở trên (little-endian).

Chúng ta sẽ đi theo một hướng mất ít công sức thôi, vì giờ cũng khuya rồi.

Tạo file CRACKME3.KEY có nội dung:

123456789012345678

Đặt BP tại 00401093:

[asm]0040108B |. E8 AC020000 call 20.0040133C
00401090 |. 83C4 04 add esp,4
00401093 |. 3B05 F9204000 cmp eax,ds:[4020F9]
00401099 |. 0F94C0 sete al
0040109C |. 50 push eax
0040109D |. 84C0 test al,al
0040109F |.^ 74 96 je short <20.___badboy>
004010A1 |. 68 0E214000 push 20.0040210E ; ASCII “CrackMe v3.0 ”
004010A6 |. E8 9B020000 call 20.00401346
004010AB |. 83C4 04 add esp,4[/asm]

F9 và xem kết quả:

[asm]ds:[004020F9]=12345022
eax=38373635[/asm]

Trong đó EAX = 38373635 chính là 5678 – 4 byte cuối đọc từ file của ta, còn 12345022 sẽ là giá trị ta cần để đạt được goodboy. Tiến hành thay đổi 5678 bằng x22x50x34x12. Chạy lại:

---------------------------
Good work cracker!
---------------------------
Cracked by: pppppppppzz~~z!
Now try the next crackme!
---------------------------
OK   
---------------------------

Bài này có nhiều đáp án, nên sẽ không có → flag = xxx. như mọi khi nữa. :xô xát: too_sad

 

 

You may also like...

Leave a Reply

Your email address will not be published. Required fields are marked *