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
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