PDA

View Full Version : เตรียมตัวปรับฐานก่อนแคร็ก



5h4d0wm4n
13-12-2007, 11:41 PM
หัวข้อ เตรียมตัวปรับฐานก่อนแคร็ก

Hexadecimal Binary Numbers W32DASM เบื้องต้น
โดย Greythorne the Technomancer
หาเครื่องมือจากที่นี่ http://citecclub.org/forum/-Dissemblers-t16062.html


โดยทั่วไปเลขที่เราใช้กันอยู่เป็นเลขฐาน 10 (base 10 arithmetic decimal) ขณะที่เลขที่ใช้ในการสื่อสารกับคอมพิวเตอร์จะเป็นเลขฐาน 2 (base 2 binary) โดยมีความหมายง่ายๆเป็น เปิดหรือ ปิด ทางอิเลคทรอนนิค ใช้สัญลักษณ์ 1's and 0's.

แน่นอนมันจะยาวมากในแต่ละคำสั่งบางคนคิดว่ามันเป็นความน่าเบื่อรำคาญจึงออกแบบเพื่อให้มันคล้ายกับ
เลขฐาน 10 ที่เราใช้อยู่และยังคงใช้งานได้เหมือนเลขฐาน 2 ตลอดทั้งให้ตัวเลขสั้นๆ และสามารถแปลงค่ากลับไปมาได้ด้วย นั้นก็คือ เลขฐาน 16 hexadecimal (base 16) ที่ใช้ใน pc ปัจจุบัน และเลขฐาน 8 octal (base 8) สำหรับ unix based platforms
มันมีความหมายสำหรับcracker และ programmer ? การไม่เข้าใจการทำงานของhex การแปลงไปมากับ binary จึงเป็นเรื่องที่เป็นไปไม่ได้เลยสำหรับการแก้ไขข้อบกพร่องของโปรแกรม

ในระบบเลขฐาน10 จะมีตัวเลข 10 ตัวจาก 0-9
ในระบบเลขฐาน 2 จะมีตัวเลข 2 ตัว 0 กับ 1
ในระบบเลขฐาน 8 จะมีตัวเลย 8 ตัว 0 1 2 3 4 5 6 7
ในระบบเลขฐาน 16 จะมีตัวเลข 16 ตัว 0 1 2 3 4 5 6 7 8 9 A B C D E F
(ถ้าแปลงเป็นเลขฐาน 10 จะมีค่าตั้งแต่ 0-15 ตามลำดับ)
ลองเรียงต่อเลขฐาน 16 ดู ... E F 10 11 12 ... 18 19 1A 1B 1C 1D 1E 1F 20 21 22 ...
ตีค่า จะได้ดังนี้ 10 ในระบบhex จะมีค่าในเลขฐาน 10 เท่ากับ 16
20(h)=32(dec.) 30(h)=48(dec.) และ 40(h)=64(dec.)

ซึ่งมันก็ไม่ยากเกินไปนักที่จะเข้าใจความจริงของเลขฐาน 2 ในกรณีคล้ายกัน ตัวอย่าง
0 1 10 11 100 101 110 111 1000...
ตัวเลข 10 ในแต่ละระบบเลขฐานจะมีความหมายตามฐานเลข เช่น

10(ในเลขฐาน2) มีค่าเท่ากับ 2 เมื่อเทียบกับเลขฐาน 10
10 (ในเลขฐาน8)มีค่าเท่ากับ 8 เมื่อเทียบกับเลขฐาน 10

สำหรับคำถามที่ว่า A9 มีค่าเท่าไรในระบบเลขฐาน 10 สำหรับคนทั่วไปมันเป็นการสูญเสียเวลาอย่างไร้ค่ากับตัวเลขสองสาม
ตัวดังกล่าว การใช้เครื่องช่วยคำนวณจะเป็นคำตอบที่รวดเร็วกว่า
อีกทางหนึ่ง เนื่องจากเรารู้ว่ามีความสัมพันธ์ระหว่างเลขฐานต่างๆ วิธีง่ายที่สุด ให้แปลงเลขที่ต้องการในรูปเลขฐาน 2 ก่อนเสมอ เพื่อไปยังฐานต่างๆที่เราต้องการต่อไป

วิธีแปลงเลขฐานต่างโดยไม่ใช้เครืองมือ โดยการใช้ วิธี DIV and MOD

Basically, we repetitively divide our number by the base of 2,
and keep the mod value (remainder) as the next binary digit.

47 / 2 gives DIV=23 MOD=1, bin string = 1
23 / 2 gives DIV=11 MOD=1, bin string = 11
11/2 gives DIV=5 MOD=1, bin string = 111
5/2 gives DIV=2 MOD=1, bin string = 1111
2/2 gives DIV=1 MOD=0, bin string = 01111
1/2 gives DIV=0 MOD=1, bin string = 101111

หมายความว่า 47 ในเลขฐาน 10 มีค่าเท่ากับ 101111 ในเลขฐาน 2

มีค่าเท่าไร? ในเลขฐาน 16 ให้แบ่งเลขฐาน 2 เป็น 2 กลุ่ม 2+6 ตัวดังนี้

10 / 1111

สร้างตารางเทียบค่า

0000 = 0 ........ 1000 = 8
0001 = 1 ........ 1001 = 9
0010 = 2 ........ 1010 = A
0011 = 3 ........ 1011 = B
0100 = 4 ........ 1100 = C
0101 = 5 ........ 1101 = D
0110 = 6 ........ 1110 = E
0111 = 7 ........ 1111 = F

10 แรกมีค่าเท่ากับ 0010 หรือเท่ากับ 2 และ 1111 มีค่าเท่ากับ F

47 (dec) = 101111 (bin) = 2F (hex)

มีค่าเท่าไรเมือเป็นเลขฐาน 8 ให้แบ่งเลขฐาน 2 ออกเป็น 2 กลุ่มๆละ 3 ตัว
101 | 111
101 = 5
111 = 7 ค่าที่ได้เมื่อเป็นฐาน 8 คือ 57

สรุป 47 (dec) = 101111 (bin) = 2F (hex) = 57 (oct)

โอเค ถึงตอนนี้ก็ช่วยให้การอ่าน assembly code ง่ายขึ้นมาระดับหนึ่งแล้ว อย่าลืมว่าเลขฐานต่างๆมีความสัมพันธ์กันและแปลงกลับไปมาได้



แนะนำการใช้งาน W32DASM เบื้องต้น

สิ่งที่ต้องมีประกอบการเรียน

Hex Editor: Hex Worshop
Disassembler: W32Dasm
Download Test File: hollo.exe

บทนำ

[hide=25]บทเรียนแรก เป็น disassembled source code ที่ไม่ซับซ้อน ในความจริงอย่างหนึ่งการกระทำใดๆบน .exe file เป็นไปไม่ได้เลยที่จะไม่ไปเกี่ยวข้องกับ source code ของมัน เราไม่สะดวกที่จะเปิดมัน หรือถ้าทำ พวกเราก็ไม่ต้องมาเรียนรู้เรื่องการ reversing ดังที่เป็นอยู่ ดังนั้น เราจำเป็นจะต้องใช้ disassembler เพื่อสร้าง assembly language source code จาก.exe file ของเรา

ในครั้งแรก ภาษาแอสเซมบลี อาจดูเหมือนยากสักเล็กน้อย แต่ละแถวของโค็ทไม่มีตัวแปร ไม่มีวัตถุ ไม่เหมือนภาษาที่เราใช้กัน อย่างไรก็ตามมันมีสัญลักษณ์เฉพาะของมันเอง และไม่เหมือนกับภาษาอื่นๆ
แต่หลังจากที่ลองทำตัวอย่างไปสักจำนวนหนึ่ง มันไม่ได้ยากนักสำหรับการเริ่มต้นที่จะเป็นนักถอดรหัส และท่องให้ขึ้นใจว่า คุณไม่จำเป็นต้องตรวจสอบมันทุกบรรทัด แต่จำเป็นต้องเรียนรู้ที่จะโฟกัสส่วนสำคัญที่จะทำให้งานที่คุณต้องการสำเร็จได้

แล้วจะรออะไรเล่า มาเริ่มกันดีกว่า

เริ่มทำการ disassemble
ก่อนอื่นคุณต้องมี ไฟล์ตัวอย่างที่ใช้ในการศึกษาครังนี้ hello.exe ก่อน ถ้าคุณรันโปรแกรมจะเห็นว่ามันไม่น่าตื่นเต้นนัก ซึ่งก็ไม่ใช่วัตถุประสงค์ของเรา อย่าลืมว่าถ้าคุณใช้โปรแกรมวินโดว์น จะเห็นว่าการใช้ dialog box หรือการเรียกใช้ Message Box
เป็นเรื่องปรกติที่เราต้องพบอยู่เสมอ คุณค่ามันอยู่ที่การนำไปใช้งาน ไม่ใช่ความน่าตื่นเต้นรูปลักษณ์ของตัวโปรแกรม โดยพื้นฐานโปรแกรมที่เรามักพบเสมอในวินโดว์ มี
3ประเภท

[color=#FFCC00]1.Single Document Interface (SDI) จะเป็นกล่องที่มีแถบด้านบน มีปุ่มให้ย่อ ขยาย หรือ ปิด ตัวอย่างเช่นโน็ตแพค

Notepad จุดสำคัญ่ของโปรแกรมชนิดนี้คือ เปิดเอกสารได้ครั้งละ 1 ไฟล์ เท่านั้น

2.Multiple Document Interface (MDI) พวกนี้ได้แก่พวก Word

babuubabuu
27-12-2007, 11:13 PM
“Hello There!” ถูกแบ่งออกเป็น 2 ช่วง ระหว่างเชื่อมด้วย 0x0d and 0x0a[/b]

ดูยังไงครับว่าเป็น 0x0d and 0x0a


ซึ่งหมายความว่า ที่ต่ำแหน่ง 00403000 มีตัวหนังสืออยู่ทั้งหมดดังนี้ Hello There!Let’s see how this thing works![/b]

งงครับไม่เข้าใจอธิบายเพิ่มเติมให้หน่อยครับ


ส่วนคำว่า “Disassemble me!!!” กับเริ่มที่ตำแหน่งใหม่ 0x0040302e.[/b]

ไม่เห็นมีคำว่า Disassemble me!!! เลยครับ แล้วก้อทำไมถึงเริ่มที่ 0x0040302e อะครับ


สังเกตุว่ามันดูตะกุกตะกักชอบกล มีการpushถึง 4 คร้ง 0x0, 0x0040302e, 0x00403000, and 0x0

Code:
0x00000000 Last in / First out
0x00403000 |
0x0040302e |
0x00000000 First in / Last out
[/b]

ไม่เข้าใจอันนี้หมดเลยครับ อยู่ตรงไหนไม่รู้ครับ

5h4d0wm4n
28-12-2007, 02:10 AM
“Hello There!” ถูกแบ่งออกเป็น 2 ช่วง ระหว่างเชื่อมด้วย 0x0d and 0x0a
ดูยังไงครับว่าเป็น 0x0d and 0x0a
[/b]
ตอบ 1
ให้ดูภาพที่ 3 hex display สังเกตุที่ 0D กับ 0A บรรทัดที่ 2 กับ ตัวอักษรด้านขวา ere!..Le
!


ซึ่งหมายความว่า ที่ต่ำแหน่ง 00403000 มีตัวหนังสืออยู่ทั้งหมดดังนี้ Hello There!Let’s see how this thing works!

งงครับไม่เข้าใจอธิบายเพิ่มเติมให้หน่อยครับ
[/b]


ตอบ 2
carriage return(ในทางคอมพิวเตอร์ ถือเป็นตัวอักขระตัวหนึ่งที่มองไม่เห็น ใช้เมื่อสิ้นสุดการพิมพ์แต่ละ
บรรทัด) กับ ‘line feed’ ขึ้นบรรทัดใหม่ และเป็นการบอกว่ายังมีตัวหนังสืออยู่จนกว่าจะถึง null-terminating
character หรือ 0x00 นั้นเอง ซึ่งหมายความว่า ที่ต่ำแหน่ง 00403000 มีตัวหนังสืออยู่ทั้งหมดดังนี้ Hello
There!Let’s see how this thing works!

ความหมายคือ ข้อความด้งกล่าวถูกบัณทึกในตำแหน่ง 00403000 จนกว่าจะมีเครื่องหมายจบ 00 ลอง
สังเกตตามรูป 3 อ้างอิงวิธีดูตามคำตอบ 1 มันจะแสดงผล Hello There!Let’s see how this thing works!
ลองดับเบิลคลิก file Hello .exe ดูการแสดงผล มันจะมี 2 บรรทัด คือ 0D กับ 0A ตัวแรกให้สินสุดการพิมพ์
ตัวที่สองสั่งขึ้นบรรทัดใหม่



ส่วนคำว่า “Disassemble me!!!” กับเริ่มที่ตำแหน่งใหม่ 0x0040302e.

ไม่เห็นมีคำว่า Disassemble me!!! เลยครับ แล้วก้อทำไมถึงเริ่มที่ 0x0040302e อะครับ
[/b]
ตอบ 3
ดูตามรูปที่ 3 Disassemble me!!! มีอยู่เริ่มที่ 69 73 ....บรรทัดที่ 6
แสดงว่า Disassemble me!!! มีอยู่แต่ดูจากรูปที่ 2 ไม่พบซึ่งคำตอบมันจะอยู่ที่คำตอบข้อ 4



สังเกตุว่ามันดูตะกุกตะกักชอบกล มีการpushถึง 4 คร้ง 0x0, 0x0040302e, 0x00403000, and 0x0

Code:
0x00000000 Last in / First out
0x00403000 |
0x0040302e |
0x00000000 First in / Last out


ไม่เข้าใจอันนี้หมดเลยครับ อยู่ตรงไหนไม่รู้ครับ[/b]

ตอบ 4
อยุ่ด้านขวาตามรูปที่ 2 ด้านล่างบรรทัด program Entry point ตั้งแต่บรรทัดที่1-5
ส่วนที่ไม่เห็น Disassemble me!!!ต้องลองอ่านการทำงานมันดูดังนี้ ดูถัดลงมาอีก 4 บรรทัดหาคำตามข้างล่าง

* Reference To: USER32.MessageBoxA, Ord:0195h
:0040100E E807000000 Call 0040101A
* Reference To: KERNEL32.ExitProcess, Ord:006Bh
:00401015 E806000000 Call 00401020

Call เรียกคำสังทีอยู่ในตำแหน่ง0040101A มาทำงานที่ตำแห่ง 0040100E ซึ่งเดาว่าเป็น
USER32.MessageBoxA เจ้าตัวนี้จะบรรจุ Disassemble me!!! เพื่อมาแสดงภายหลัง

*** มันทำงานสมบรูณ์แล้ว ลองรัน hello.exe ส่วนบนสุดของกรอบแสดงข้อความ Disassemble me!!!

*** ที่จริงโปรแกรม hello.exe ทำไว้ฝึกการแคร็ก !!! ซึ่งต่อไปจะทำการ Disassemble me!!!*****
โดยการแก้ไข hex และ offset เพื่อเปลี่ยนแปลง text (ข้อความการแสดงผล)แต่มันอยู่นอกวัตถุประสงค์
ของ topic นี้

****วัตถุประสงค์หลักของ topic นี้คือการฝึกการใช้งาน w32Dasm และอ่านโค็ทเบื้องต้น***

***ถ้าสนใจการแก้ไข เพื่อให้ Disassemble me!!! ก็บอกนะครับจะมาโพสเพิ่มให้ เสียเวลาหน่อยเพราะ
ต้องแปลกับลองทำเอง ไม่งั้นเวลาถูกถามตอบไม่ได้ ***

babuubabuu
28-12-2007, 03:01 PM
ช่วยอธิบายตรงนี่หน่อยครับ
ตัว "0x......" คืออะไรครับจะใช้เมื่อไร ตอนแรกคิดว่าเป็นพวกแถวคูณหลักแต่รู้สึกว่าจะไม่ใช่ละ

ละก้อคำศัพท์นี่หน่อยครับ
Last in / First out กับ
First in / Last out ครับ

แล้วที่ตำแหน่ง 0040100E จะเป็น title bar เสมอเหรอครับ



ขอบคุณครับคุณมนุษย์เงา อิอิ

5h4d0wm4n
28-12-2007, 04:54 PM
ช่วยอธิบายตรงนี่หน่อยครับ
ตัว "0x......" คืออะไรครับจะใช้เมื่อไร ตอนแรกคิดว่าเป็นพวกแถวคูณหลักแต่รู้สึกว่าจะไม่ใช่ละ
[/b]
ตอบ 1
(the 0x means our number is hexadecimal) เป็นสัญลักษณ์แสดงหลักเลขฐานครับในที่นี้หมายถึง hexadecimal เลขฐาน 16 ครับ


ละก้อคำศัพท์นี่หน่อยครับ
Last in / First out กับ
First in / Last out ครับ[/b]

ตอบ2.
การแบ่งหน่วยความจำโดยหลักๆ จะเป็นชนิด stack กับ heap.

heap จะเป็นหน่วยความจำที่โปรแกรมในเครื่องคอมมาใช้งาน และหลังจากการดับเครื่องมันก็จะคืนพื้นที่ให้เหมือนเราใช้ ล็อกเกอร์ใส่ของเราเก็บของที่ใช้งานในขณะนั้น เมื่อเราเลิกใช้เอาของออกก็จะมีพื้นที่ว่าง คนอื่นก็จะมาใช้งานในส่วนนี้แทน ลักษณะมันใช้งานครอบครองพื้นที่แบบต่างเวลาใช้งานกัน

stack จะเป็นหน่วยความจำประเภทใช้งานรวมกันในเวลาเดียวกัน ให้นึกถึงถาดใส่เอกสารใครก็มาวาง
เอกสารทับๆกัน กรณีที่ของของเราต้องการใช้และสมมุติว่ามันอยู่ตรงกลางชั้น เวลาเราจะใช้ของๆเรา เราต้องเอาเอกสารที่อยู่บน(เข้ามาใส่ที่หลัง)ออกก่อน จึงเป็นที่มาของคำว่า First in กับ Last out ครับ
(มาก่อนเพื่อนแต่กลับหลังสุด ความหมาย ก็คือ สมมติเรามีคำสังโปรแกรมที่ใช้งานหน่วยคำจำชนิด stack
มันก็จะเรียงทับกัน เวลาที่ต้องการใช้มันก็จะเรียกตัวเข้ามาหลังสุดก่อนจนถึงที่เราต้องการใช้งานครับ)
called Last In—First Out (LIFO). In assembly language, putting something onto the top of the
stack is called pushing onto the stack. Removing something is called popping it off the stack.



แล้วที่ตำแหน่ง 0040100E จะเป็น title bar เสมอเหรอครับ[/b]

ตอบ 3.
ในโปรแกรม hello.exe ใช่ครับ แต่โปรแกรมอื่นๆไม่ ให้ดูอ้างอิงที่จะเรียกโปรแกรมข้างนอกมาใช้ (import )
ในที่นี้น่าจะเป็น USER32.dll เพื่อแสดง MessageBoxA และจบการทำงานโดยเรียก KERNEL32.dll มาทำ
งานครับ
Reference To: USER32.MessageBoxA, Ord:0195h
:0040100E E807000000 Call 0040101A