[Question] RE challenges |
27/06/2008 17:23:05 (+0700) | #1 | 138323 |
Reversing...
Member
|
0 |
|
|
Joined: 31/12/2007 06:28:04
Messages: 117
Location: -1.-1.-1.-1
Offline
|
|
Tui có vài bài về RE gọi là giải trí, anh em có hứng giải chơi.
Target:
Code:
http://rapidshare.com/files/125190622/coolhacker.rar.html
Trong này có chứa file .com , khi chạy sẽ in ra 3 dòng chữ "Cool Hacker".
Thử thách là: chỉ sửa 1 byte trong binary code để khi chạy thu được 5 dòng "Cool Hacker".
ps: Anh em cho lời giải có càng nhiều lời giải + phân tích càng tốt. Coi như là học tập kinh nghiệm.
|
|
|
|
|
[Question] Re: RE challenges |
27/06/2008 21:47:20 (+0700) | #2 | 138339 |
|
4hfoo
Elite Member
|
0 |
|
|
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
|
|
Bạn có thể up lại file lên trang khác không?
Trang rapidshare down oải lắm .... |
|
|
|
|
[Question] Re: RE challenges |
27/06/2008 23:44:41 (+0700) | #3 | 138369 |
doixanh
Member
|
0 |
|
|
Joined: 24/12/2004 14:04:16
Messages: 1
Offline
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 02:58:48 (+0700) | #4 | 138426 |
Reversing...
Member
|
0 |
|
|
Joined: 31/12/2007 06:28:04
Messages: 117
Location: -1.-1.-1.-1
Offline
|
|
hì, sorry các bạn.
pass là : netbks.com.
|
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 04:34:53 (+0700) | #5 | 138452 |
mfeng
Researcher
|
Joined: 29/10/2004 15:16:29
Messages: 243
Offline
|
|
Chương trình viết không bảo toàn Stack. Push mà không có Pop.
Fix:
Offset 0x09: inc cx (0x41) -> pop cx (0x59)
|
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 04:55:55 (+0700) | #6 | 138461 |
|
4hfoo
Elite Member
|
0 |
|
|
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
|
|
Bạn mfeng nhanh tay quá!
Mình xin gửi đoạn phân tích để mọi người xem chơi, xin đừng chê cười...
Dùng debug của DOS (hông có tool khác nên xài tạm debug) để xem mã chương trình:
Code:
Mã assembly:
Code:
1858:0100 B90300 MOV CX,0003
1858:0103 E81C00 CALL 0122 ; gọi đoạn mã tại 0122, đoạn mã này tăng AX lên 1 đơn vị
1858:0106 E2FB LOOP 0103 ; lặp lại, tổng cộng 3 lần (do CX=3), sau khi kết thúc AX=3
1858:0108 50 PUSH AX ; PUSH AX vào stack mà không có POP (như bạn mfeng đã nói ở trên)
1858:0109 41 INC CX ; -> CX=1
1858:010A 41 INC CX : -> CX=2
1858:010B 41 INC CX ; -> CX=3
1858:010C E81700 CALL 0126 ; gọi đoạn mã in chuỗi "Cool Hacker!" ra màn hình
1858:010F E2FB LOOP 010C ; lặp lại, tổng cộng 3 lần (do CX=3)
1858:0111 CD20 INT 20
1858:0113 43 INC BX
1858:0114 6F DB 6F
1858:0115 6F DB 6F
1858:0116 6C DB 6C
1858:0117 204861 AND [BX+SI+61],CL
1858:011A 63 DB 63
1858:011B 6B DB 6B
1858:011C 65 DB 65
1858:011D 7221 JB 0140
1858:011F 0D0A24 OR AX,240A
1858:0122 83C001 ADD AX,+01
1858:0125 C3 RET
1858:0126 B409 MOV AH,09
1858:0128 BA1301 MOV DX,0113
1858:012B CD21 INT 21
1858:012D C3 RET
Cách sửa để in ra 5 dòng:
Thay lệnh INC CX (mã lệnh là 0x41) tại địa chỉ 1858:0109 thành lệnh POP CX (mã lệnh là 0x59), lệnh này sẽ lấy giá trị trong stack (là 3) gán vào CX.
Sau đó 2 lệnh tiếp theo INC CX sẽ cho kết quả CX=5 -> vòng lặp in chữ sẽ chạy 5 lần.
Thực hiện:
Dùng 1 trình binary editor để thay đổi nội dung tập tin 3cool.com, mình dùng WinHex.
Tại offset 9, thay giá trị 41 thành 59.
Lưu file lại và chạy sẽ được kết quả 5 dòng "Cool Hacker!"
Thân.
|
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 08:41:56 (+0700) | #7 | 138512 |
|
VXer
Member
|
0 |
|
|
Joined: 20/12/2007 10:22:40
Messages: 44
Offline
|
|
Code:
Load target vô IDA:
seg000:0100 start proc near
seg000:0100 mov cx, 3
seg000:0103
seg000:0103 loc_10103: ; CODE XREF: start+6j
seg000:0103 call sub_10122 ; tăng ax lên 1
seg000:0106 loop loc_10103
seg000:0108 push ax
seg000:0109 inc cx
seg000:010A inc cx
seg000:010B inc cx
seg000:010C ; tới đây cx sẽ chứa số lần in ra string, tìm cách để tới đây cx = 5
seg000:010C @@LoopPrint:
seg000:010C call sub_10126
seg000:010F loop @@LoopPrint
seg000:0111 int 20h
seg000:0111 start endp
Ta sẽ thay lệnh call tại 0103 thành lệnh call tới 010A, tức là cx đang bằng 3 ta cộng nó 2 lần với 1 được 5 => sẽ in ra 5 lần như ý muốn!
Vậy cần thay lệnh call tại 0103 thành lệnh call tới 010A. Hãy tính offset của lệnh call:
010A - 0103 = 0007
0007 - 3 = 0004 (vì lệnh call chiếm 3 byte, 1 byte cho opcode E8 và 2 byte cho địa chỉ)
Vậy cần thay offset của lệnh call tại 0103. Mở target bằng 1 trình hex editor nào đó, thấy tại offset 03 là byte E8 (opcode lệnh call), 2 byte sau đó 001C là offset lệnh call, ta thay thành 0004 như đã phân tích ở trên.
Vậy chỉ cần thay byte 1C ở offset 04 thành byte 04 là thỏa yêu cầu |
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 11:30:50 (+0700) | #8 | 138559 |
Reversing...
Member
|
0 |
|
|
Joined: 31/12/2007 06:28:04
Messages: 117
Location: -1.-1.-1.-1
Offline
|
|
Đơn giản nhất là thay
Code:
bởi
Code:
còn sau đó bớt 3 rồi lại thêm 3 cũng như không. Thêm vào cái
Code:
cho cách giải thêm phong phú |
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 11:43:08 (+0700) | #9 | 138563 |
|
VXer
Member
|
0 |
|
|
Joined: 20/12/2007 10:22:40
Messages: 44
Offline
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 13:35:52 (+0700) | #10 | 138632 |
Reversing...
Member
|
0 |
|
|
Joined: 31/12/2007 06:28:04
Messages: 117
Location: -1.-1.-1.-1
Offline
|
|
Hì, tưởng vẫn còn một thằng cx=3 ở đâu đó.
Challenge thứ hai:
target:
Code:
http://rapidshare.com/files/125435312/hehehe.rar.html
2 nhiệm vụ:
1. Xác định pass
2. Bypass
|
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 21:42:07 (+0700) | #11 | 138667 |
|
4hfoo
Elite Member
|
0 |
|
|
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
|
|
Mình chạy thì bị lỗi này ... Phải chịu thua
Bạn kiểm tra lại xem sao ...
|
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 21:49:08 (+0700) | #12 | 138670 |
|
VXer
Member
|
0 |
|
|
Joined: 20/12/2007 10:22:40
Messages: 44
Offline
|
|
Bác nào có target up lên host khác cho anh em được ko ạ (ví dụ box.net ...)
Em dùng mạng chung cả cơ quan nên download rapidshare khổ lắm |
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 22:13:17 (+0700) | #13 | 138674 |
|
4hfoo
Elite Member
|
0 |
|
|
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
|
|
Mình up lên mediafire, bạn down về thử xem
http://www.mediafire.com/?w250mylsjd4
|
|
|
|
|
[Question] Re: RE challenges |
28/06/2008 23:27:18 (+0700) | #14 | 138690 |
|
VXer
Member
|
0 |
|
|
Joined: 20/12/2007 10:22:40
Messages: 44
Offline
|
|
login: reversing
pass: ~urzph
có phải ko ạ?
PS: tôi cũng ko run được target, hình như do tác giả build bằng VC 2005 bị lỗi sao đó (manifest thì phải), bạn reversing thử xem lại nhá! Load vô IDA chơi cho dễ
Edit: Đã thử dùng tool mt.exe (trong bộ Platform SDK) để fix lại manifest của target, chạy trong máy tôi ok
link download: http://www.box.net/shared/z1crkpbacc
(cần có runtime của VC 2005) |
|
|
|
|
[Question] Re: RE challenges |
29/06/2008 03:30:04 (+0700) | #15 | 138729 |
|
4hfoo
Elite Member
|
0 |
|
|
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
|
|
Cám ơn bạn VXer, mình đã chạy được rồi.
Username và password giống như bạn đã đưa ra ...
Bạn Reversing... có thể giải thích nhiệm vụ thứ 2 làm làm gì hông?
2. Bypass
Thân.
|
|
|
|
|
[Question] Re: RE challenges |
29/06/2008 04:08:48 (+0700) | #16 | 138732 |
Reversing...
Member
|
0 |
|
|
Joined: 31/12/2007 06:28:04
Messages: 117
Location: -1.-1.-1.-1
Offline
|
|
Cám ơn các bạn đã nhiệt tình tham gia. Mục đích của mình chỉ là học hỏi, cùng một lời giải, nhưng cách phân tích và con đường tìm ra lời giải có thể khác nhau. Vậy rất mong những người tham gia không chỉ cho đáp số, mà nên đưa thêm những phân tích và giải thích ( dù hơi mất công ) , cái này mới thật sự hữu ích.
Nhiệm vụ thứ hai là bằng một cách nào đó vượt qua password của chương trình để nó luôn hiển thị đúng.
Thân. |
|
|
|
|
[Question] Re: RE challenges |
29/06/2008 07:40:24 (+0700) | #17 | 138757 |
|
4hfoo
Elite Member
|
0 |
|
|
Joined: 29/01/2007 01:50:20
Messages: 115
Offline
|
|
Xin đưa cách làm để mọi người coi chơi đỡ buồn ...
- Load file từ Olly:
Code:
00401013 |. 68 D0204000 PUSH hehehe.004020D0 ; /format = "Enter login:"
00401018 |. FF15 98204000 CALL DWORD PTR DS:[<&MSVCR80.printf>] ; \printf
0040101E |. 83C4 04 ADD ESP,4
00401021 |. FF15 9C204000 CALL DWORD PTR DS:[<&MSVCR80.__iob_func>>; MSVCR80.__p__iob
00401027 |. 50 PUSH EAX ; /stream
00401028 |. 68 00010000 PUSH 100 ; |n = 100 (256.)
0040102D |. 8D85 F8FDFFFF LEA EAX,DWORD PTR SS:[EBP-208] ; |
00401033 |. 50 PUSH EAX ; |s
00401034 |. FF15 A0204000 CALL DWORD PTR DS:[<&MSVCR80.fgets>] ; \fgets
0040103A |. 83C4 0C ADD ESP,0C
0040103D |. 68 E0204000 PUSH hehehe.004020E0 ; /format = "Enter password:"
00401042 |. FF15 98204000 CALL DWORD PTR DS:[<&MSVCR80.printf>] ; \printf
00401048 |. 83C4 04 ADD ESP,4
0040104B |. FF15 9C204000 CALL DWORD PTR DS:[<&MSVCR80.__iob_func>>; MSVCR80.__p__iob
00401051 |. 50 PUSH EAX ; /stream
00401052 |. 68 00010000 PUSH 100 ; |n = 100 (256.)
00401057 |. 8D8D F8FEFFFF LEA ECX,DWORD PTR SS:[EBP-108] ; |
0040105D |. 51 PUSH ECX ; |s
0040105E |. FF15 A0204000 CALL DWORD PTR DS:[<&MSVCR80.fgets>] ; \fgets
00401064 |. 83C4 0C ADD ESP,0C
00401067 |. 8D95 F8FDFFFF LEA EDX,DWORD PTR SS:[EBP-208]
0040106D |. 52 PUSH EDX ; /s2
0040106E |. 68 00404000 PUSH hehehe.00404000 ; |s1 = "reversing
"
00401073 |. E8 B8000000 CALL <JMP.&MSVCR80.strcmp> ; \strcmp
00401078 |. 83C4 08 ADD ESP,8
0040107B |. 85C0 TEST EAX,EAX
0040107D |. 0F85 89000000 JNZ hehehe.0040110C
00401083 |. C745 FC 000000>MOV DWORD PTR SS:[EBP-4],0
0040108A |. EB 09 JMP SHORT hehehe.00401095
0040108C |> 8B45 FC /MOV EAX,DWORD PTR SS:[EBP-4]
0040108F |. 83C0 01 |ADD EAX,1
00401092 |. 8945 FC |MOV DWORD PTR SS:[EBP-4],EAX
00401095 |> 8D8D F8FEFFFF LEA ECX,DWORD PTR SS:[EBP-108]
0040109B |. 51 |PUSH ECX ; /s
0040109C |. E8 89000000 |CALL <JMP.&MSVCR80.strlen> ; \strlen
004010A1 |. 83C4 04 |ADD ESP,4
004010A4 |. 83E8 01 |SUB EAX,1
004010A7 |. 3945 FC |CMP DWORD PTR SS:[EBP-4],EAX
004010AA |. 73 1D |JNB SHORT hehehe.004010C9
004010AC |. 8B55 FC |MOV EDX,DWORD PTR SS:[EBP-4]
004010AF |. 0FBE8415 F8FEF>|MOVSX EAX,BYTE PTR SS:[EBP+EDX-108]
004010B7 |. 83F0 05 |XOR EAX,5
004010BA |. 83E8 08 |SUB EAX,8
004010BD |. 8B4D FC |MOV ECX,DWORD PTR SS:[EBP-4]
004010C0 |. 88840D F8FEFFF>|MOV BYTE PTR SS:[EBP+ECX-108],AL
004010C7 |.^EB C3 \JMP SHORT hehehe.0040108C
004010C9 |> 8D95 F8FEFFFF LEA EDX,DWORD PTR SS:[EBP-108]
004010CF |. 52 PUSH EDX ; /s2
004010D0 |. 68 00504000 PUSH hehehe.00405000 ; |s1 = "showme
"
004010D5 |. E8 56000000 CALL <JMP.&MSVCR80.strcmp> ; \strcmp
004010DA |. 83C4 08 ADD ESP,8
004010DD |. 85C0 TEST EAX,EAX
004010DF |. 75 2B JNZ SHORT hehehe.0040110C
004010E1 |. 68 00504000 PUSH hehehe.00405000 ; /s2 = "showme
"
004010E6 |. 68 00404000 PUSH hehehe.00404000 ; |s1 = "reversing
"
004010EB |. E8 40000000 CALL <JMP.&MSVCR80.strcmp> ; \strcmp
004010F0 |. 83C4 08 ADD ESP,8
004010F3 |. 85C0 TEST EAX,EAX
004010F5 |. 74 15 JE SHORT hehehe.0040110C
004010F7 |. 68 F0204000 PUSH hehehe.004020F0 ; /format = "
Yees... You are cOOl HaCker!!!
"
004010FC |. FF15 98204000 CALL DWORD PTR DS:[<&MSVCR80.printf>] ; \printf
00401102 |. 83C4 04 ADD ESP,4
00401105 |. B8 01000000 MOV EAX,1
0040110A |. EB 10 JMP SHORT hehehe.0040111C
0040110C |> 68 14214000 PUSH hehehe.00402114 ; /format = "
He he he. You are Lamer!
"
00401111 |. FF15 98204000 CALL DWORD PTR DS:[<&MSVCR80.printf>] ; \printf
00401117 |. 83C4 04 ADD ESP,4
0040111A |. 33C0 XOR EAX,EAX
0040111C |> 8B4D F8 MOV ECX,DWORD PTR SS:[EBP-8]
0040111F |. 33CD XOR ECX,EBP
00401121 |. E8 10000000 CALL hehehe.00401136
00401126 |. 8BE5 MOV ESP,EBP
00401128 |. 5D POP EBP
00401129 \. C3 RETN
1/ Tại địa chỉ 00401073, giá trị username được so sánh với chuỗi "reversing", nếu giống nhau mới tiếp tục làm tiếp
-> username: reversing
2/ Đoạn vòng lặp từ địa chỉ 0040108C đến địa chỉ 004010C7 dùng để biến đổi giá trị password thành một chuỗi khác.
- Tại địa chỉ 004010D5, chuỗi biến đổi sẽ được so sánh với chuỗi "showme", nếu giống nhau thì thỏa mãn.
- Như vậy, ta cần tìm hiểu chuỗi được biến đổi như thế nào. Từ đó, lần ngược lại từ chuỗi "showme" để tìm password.
3/ Tìm password:
- Chuỗi password sẽ được biến đổi như sau: mỗi ký tự sẽ được XOR với 5, và trừ đi 8 để được một ký tự khác. Cứ như thế sẽ được chuỗi cuối cùng.
Code:
004010AF |. 0FBE8415 F8FEF>|MOVSX EAX,BYTE PTR SS:[EBP+EDX-108]
004010B7 |. 83F0 05 |XOR EAX,5
004010BA |. 83E8 08 |SUB EAX,8
- Như vậy để tìm password, ta làm ngược lại. Từ chuỗi "showme", ta lấy từng ký tự. Mỗi ký tự sẽ được cộng với 8 rồi XOR với 5.
's' -> mã ASCII là 0x73, trừ 8 rồi XOR với 5 sẽ được giá trị 7E -> ký tự '~'
(lẫy mã ASCII từ http://www.asciitable.com/)
Tương tự:
h -> u, o->r, w>z, m->p, e->h
Vậy password cần tìm là ~urzph
4/ Như vậy là xong
login: reversing
pass: ~urzph
Còn cách bypass nếu được sửa code thì có nhiều cách ...
Thân
|
|
|
|
|
[Question] Re: RE challenges |
02/07/2008 23:39:36 (+0700) | #18 | 139533 |
THE LAST LEAF
Member
|
0 |
|
|
Joined: 30/06/2006 16:22:20
Messages: 9
Offline
|
|
Theo như screenshot thì chỉ hiển thị 3 dòng CoolHacker. Vì vậy sửa 1 byte đó là byte offset 08 giá trị 0x50 thành 0x58 là xong
Quên chưa đọc kỹ đề, vậy như mrfeng là ok |
|
|
Users currently in here |
1 Anonymous
|
|
Powered by JForum - Extended by HVAOnline
hvaonline.net | hvaforum.net | hvazone.net | hvanews.net | vnhacker.org
1999 - 2013 ©
v2012|0504|218|
|
|