1. Trang chủ
  2. » Công Nghệ Thông Tin

Cracker Handbook 1.0 part 218 ppsx

5 92 1

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Nội dung

eax = dw_param1; Điều này có nghĩa là những gì chúng ta làm ở trên là đúng bởi vì thanh ghi EAX đã được thay đổi bằng cách được gán 1 giá trị mới. Phần tiếp theo : eax = dw_param1; eax = lstrlenA(eax); // lstrlenA returns its result in eax if( int_local1 >= eax) goto label_412348; Với đoạn code này chúng ta hoàn toàn có thể làm cho nó trở nên dễ dàng hơn, chúng ta có thể kết hợp những câu lệnh trên lại như sau : if( int_local1 >= lstrlenA(dw_param1) ) goto label_412348; Một lần nữa chúng ta phải quan sát xem thành ghi EAX có được sử dụng trong các đoạn code bên dưới không, để từ đó chúng ta không bỏ sót vị trí nơi mà giá trị của thanh ghi này đang được sử dụng. Trong các câu lệnh sau đó, giá trị của EAX bị thay đổi, do đó chúng ta không cần quan tâm về những thay đổi của chúng ta. Bởi vì chúng ta biết rằng hàm lstrlenA sẽ lấy đầu vào là một con trỏ trỏ tới một chuỗi, do đó chúng ta sẽ thay đổi tham số này thành pString , cuối cùng ta có được như sau : int_local1 = 0; goto label_41230B; int_local1++; label_41230B: if( int_local1 >= lstrlenA(pString)) goto label_412348; Quan sát toàn bộ đoạn code tiếp theo trong hàm này chúng ta thấy được dòng sau : .00412346: EBBA jmps .000412302  (3) Đây là một câu lệnh nhảy và nó nhảy trở về vị trí có câu lệnh int_local1++; , điều này chứng tỏ đây là một vòng lặp. Nếu như bạn đã quen thuộc với lập trình C, bạn có thể minh họa được cấu trúc này.Đây dường như là một vòng lặp for. Chúng ta sẽ cố gắng để biểu diễn lại nó, bằng cách thay đổi biến int_local1 thành i. Chúng ta sẽ viết lại dưới ngôn ngữ C như sau : for(i = 0; i < lstrlenA(pString); i++) { //…rest of code… } Mọi việc đang dần dần được rõ ràng . Giờ chúng ta đã biết hàm này có một vòng lặp, với số lần lặp bắt đầu từ 0 cho tới chiều dài của chuỗi có được thông qua tham số đầu tiên (lstrlenA(pString)). Tiếp theo chúng ta cần biết những gì đang diễn ra bên trong thân vòng lặp : .0041231A: mov eax, pString .0041231D: add eax,i .00412320: mov cl,[eax] .00412322: mov [ebp][-01],cl .00412325: movzx eax,b,[ebp][-01] .00412329: cmp eax,061 ;"a" .0041232C: jl .000412346  (1) .0041232E: movzx eax,b,[ebp][-01] .00412332: cmp eax,07A ;"z" .00412335: jg .000412346  (2) .00412337: movzx eax,b,[ebp][-01] .0041233B: sub eax,020 ;" " .0041233E: mov ecx, pString .00412341: add ecx, i .00412344: mov [ecx],al Trong đoạn code này chúng ta lại thấy có một biến cục bộ khác được sử dụng. Nó xuất hiện dưới kiểu unsigned char , bởi vì nó có kích thước là byte ( byte ptr) và được sử dụng nhưng là unsigned (bởi câu lệnh movzx). Trong đoạn mã giả C, ta có thể viết lại như sau : eax = pString; eax = eax + i; cl = *(eax); ch_local2 = cl; eax = (DWORD) ch_local2; if(eax < 0x61) // “a” goto label_412346; eax = (DWORD) ch_local2; if(eax > 0x7A) // “z” goto label_412346; eax = (DWORD) ch_local2; eax = eax – 0x20; ecx = pString; ecx = ecx + i; *(ecx) = al; Bây giờ tiếp tục, chúng ta sẽ làm cho đoạn code của chương trình rõ ràng hơn, tôi đổi tên kí tự thành c cho nó ngắn gọn : c = pString[i]; if((c < ‘a’) || (c > ‘z’)) goto label_412346; pString[i] = c-0x20; Để ý rằng địa chỉ tại 412346 chỉ đơn giản là vị trí kết thúc vòng lặp, vì vậy chúng ta có thể thay thế ‘goto label_412346’ bằng ‘continue;’, hoặc chúng ta có thể đảo conditional jumps. Chúng ta nhận thấy rằng chương trình kết thúc vòng lặp nếu (c<‘a’)||(c>‘z’), vậy thì nó sẽ không kết thúc vòng lặp nếu ta đổi thành (c>=’a’)&&(c<=’z’), điều này cho phép chúng ta thay đổi lại cấu trúc như sau : c = pString[i]; if((c >= ‘a’) && (c <= ‘z’)) pString[i] = c-0x20; //…end of loop Các bạn thấy đó , mọi thứ đã sáng tỏ và dễ hiểu hơn rất nhiều. Bây giờ chúng ta đã bắt đầu hiểu những gì đoạn code này đang làm. Chúng ta hãy sắp xếp lại chúng lại thành đoạn code cuối cùng như sau : void SomeFunction(char* pString) { int i; //Local variables have to be declared unsigned char c; //at the start of the function. for(i = 0; i < lstrlenA(pString); i++) { c = pString[i]; if((c >= ‘a’) && (c <= ‘z’)) pString[i] = c-0x20; } } Cuối cùng chúng ta đã có được một đoạn code ngắn gọn hơn nhiều so với những gì chúng ta đã đọc với ASM code.Nó đã được chuyển đổi hoàn toàn sang ngôn ngữ C, nhiệm vụ của nó là lấy từng kí tự từ String đầu vào, và nếu kí tự đó nằm trong khoảng ‘a’ và ‘z’ (tức là các kí tự chữ cái thường) nó sẽ được trừ đi cho 0x20h. Mà phép trừ này biểu diễn cho quá trình chúng ta chuyển đổi nó từ chữ cái thường thành chữ cái hoa. Do đó chúng ta sẽ đặt tên cho hàm này một cách gợi nhớ hơn là ToUpperCase . V. Lời kết Toàn bộ quá trình mà tôi và các bạn đã làm ở trên được gọi với cái tên : RE (Reverse Engineering). Chúng ta thấy rằng nó không phải là một việc làm quá khó, nhưng nó đòi hỏi một lòng kiên nhẫn và một kiến thức nền tảng vững chắc. Để chỉ khi ta chỉ nhìn lướt qua đoạn code ta có thể hiểu ngay được nó làm gì. Có một công cụ giúp chúng ta đơn giản hóa công việc đi rất nhiều, một trong số đó chính là IDA mà tôi đã giới thiệu với anh em.Hi vọng bài viết này của tôi sẽ phần nào giúp mọi người hiểu được quá trình phân tích một đoạn code như thế nào, chỉ có một lời khuyên duy nhất đó là các bạn hãy thực hành thật nhiều mới có thể đạt được những điều mình mong muốn. Qua đây tôi cũng xin cảm ơn tác giả Webbit đã cho chúng ta một bài viết rất hay và bổ ích. Thời gian trôi đi rất nhanh Vì sao ta cứ mãi đứng yên Ngoài kia bóng tối đang dần buông Lại một ngày nữa sắp qua mất rồi. PS : Hi vọng anh TQN, Thug và light.phoenix có thời gian viết vài bài cho anh em mở rộng tầm mắt  Best Regards _[Kienmanowar]_ ++ ==[ Greatz Thanks To ]== ++ My family, Computer_Angel, Moonbaby , Zombie_Deathman, Littleboy, Benina, QHQCrker, the_Lighthouse, Merc, Hoadongnoi, Nini all REA‘s members, TQN, HacNho, RongChauA, Deux, tlandn, light.phoenix, dqtln, ARTEAM all my friend, and YOU. ++ ==[ Special Thanks To ]== ++ - coruso_trac, pat, trm_tr. Thug4lif3, vn_blackrain, v v and all brothers in VSEC ++ ==[ Thanks To ]== ++ iamidiot, WhyNotBar, trickyboy, dzungltvn, takada, hurt_heart, haule_nth, hytkl v v các bạn đã đóng góp rất nhiều cho REA. Hi vọng các bạn sẽ tiếp tục phát huy  >>>> If you have any suggestions, comments or corrections email me: kienbigmummy[at]gmail.com Appendix A1 : . .00 412 31D: add eax,i .00 412 3 20: mov cl,[eax] .00 412 322: mov [ebp][- 01 ] ,cl .00 412 325: movzx eax,b,[ebp][- 01 ] .00 412 329: cmp eax ,0 61 ;"a" .00 412 32C: jl .00 0 412 346  (1) .00 412 32E:. eax,b,[ebp][- 01 ] .00 412 332: cmp eax ,07 A ;"z" .00 412 335: jg .00 0 412 346  (2) .00 412 337: movzx eax,b,[ebp][- 01 ] .00 412 33B: sub eax ,02 0 ;" " .00 412 33E: mov ecx, pString .00 412 3 41: . cuối cùng ta có được như sau : int_local1 = 0; goto label_ 412 30B; int_local1++; label_ 412 30B: if( int_local1 >= lstrlenA(pString)) goto label_ 412 348; Quan sát toàn bộ đoạn code tiếp

Ngày đăng: 03/07/2014, 17:21

TỪ KHÓA LIÊN QUAN