@@ -21,30 +21,34 @@ cd fuzzing_tutorial/
21
21
22
22
โปรแกรมตัวอย่างของเรา จะทำงานโดยการรับ file ที่เป็น input เข้ามา จากนั้นจะมีการอ่าน content ข้างในทีละบรรทัด โดยบรรทัดแรกต้องเป็นคำว่า ** SAFEFILEHEADER** เท่านั้น ส่วนบรรทัดที่สอง เป็นการเลือก mode ในการทำงาน โดยต้องเป็นตัวอักษร ** A** หรือ ** Z** เท่านั้น
23
23
24
- ![ ] ( images/fuzzing_afl_snippet.png )
24
+ < div style = " text-align : center " >< img src = " images/fuzzing_afl_snippet.png " /></ div >
25
25
26
26
โดยใน mode A จะทำการแสดง content ของแต่ละบรรทัดที่เหลือออกมา
27
- ![ ] ( images/fuzzing_afl_normalrun.png )
27
+
28
+ <div style =" text-align :center " ><img src =" images/fuzzing_afl_normalrun.png " /></div >
28
29
29
30
ส่วนใน mode Z จะทำการ copy ข้อความด้วยฟังก์ชัน strcpy() ไปยังตัวแปรที่กำหนดขนาดไว้ 20 bytes จากนั้นทำการกลับข้อความจากหน้าไปหลัง ก่อนที่จะแสดงข้อความออกมา เมื่อเราลองแก้ไฟล์ input/init_input ให้บรรทัดที่ 2 เป็น Z ดู จะได้ผลลัพธ์แบบนี้
30
- ![ ] ( images/fuzzing_afl_normalrun_z.png )
31
+
32
+ <div style =" text-align :center " ><img src =" images/fuzzing_afl_normalrun_z.png " /></div >
31
33
32
34
หลายคนอาจทราบดีว่าฟังก์ชัน strcpy() เป็นฟังก์ชันอันตรายที่สามารถทำให้เกิด buffer overflow ได้ง่าย ทำให้ mode Z เป็นจุดอันตรายในโปรแกรมนี้
33
35
34
36
ปัญหาคือ ด้วยการทำ Black Box Fuzzing ธรรมดา แทบจะเป็นไปไม่ได้เลยที่จะสุ่มให้ input บรรทัดแรกเป็นคำว่า SAFEFILEHEADER และบรรทัดที่สองเป็นตัวอักษร Z พร้อม ๆ กัน ทำให้ไม่สามารถ fuzzing ส่วนของ code ใน mode Z ได้ การทำ Grey Box Fuzzing เลยกลายมาเป็นตัวเลือกที่ดีสำหรับโปรแกรมแบบนี้
35
37
36
38
เมื่อแก้ input บรรทัดที่ 1 ให้ผิด
37
- ![ ] ( images/fuzzing_afl_invalidhead.png )
39
+
40
+ <div style =" text-align :center " ><img src =" images/fuzzing_afl_invalidhead.png " /></div >
38
41
39
42
เมื่อแก้ input บรรทัดที่ 2 ให้ผิด
40
- ![ ] ( images/fuzzing_afl_invalidmode.png )
43
+
44
+ <div style =" text-align :center " ><img src =" images/fuzzing_afl_invalidmode.png " /></div >
41
45
42
46
## Let's Fuzz!
43
47
44
48
เริ่มด้วยการ compile C source file ด้วย afl-gcc เพื่อทำ instrumentation
45
49
` afl-gcc supersafeprogram.c -o supersafeprogram `
46
50
47
- ![ ] ( images/fuzzing_afl_instrumentation.png )
51
+ < div style = " text-align : center " >< img src = " images/fuzzing_afl_instrumentation.png " /></ div >
48
52
49
53
จะเห็นว่ามีการทำ instrument ไว้ทั้งหมด 36 ตำแหน่งใน code ของเรา เพื่อให้ตัว AFL สามารถรู้ได้ว่า code ส่วนไหนที่ทำงานบ้างในระหว่างการทำ fuzzing
50
54
@@ -55,24 +59,24 @@ cd fuzzing_tutorial/
55
59
56
60
เมื่อปล่อยให้ AFL ทำงานไปเรื่อย ๆ จนเจอว่าพบการ crash ก็สามารถกด Ctrl+C เพื่อหยุดการทำงานได้
57
61
58
- ![ ] ( images/fuzzing_afl_found.png )
62
+ < div style = " text-align : center " >< img src = " images/fuzzing_afl_found.png " /></ div >
59
63
60
64
ไฟล์ input ที่ทำให้โปรแกรมนั้น crash จะถูกเก็บไว้ใน * output/crashes* สามารถเข้าไปดูได้ด้วยคำสั่ง
61
65
` ls output/crashes/ `
62
66
63
- ![ ] ( images/fuzzing_afl_crashes.png )
67
+ < div style = " text-align : center " >< img src = " images/fuzzing_afl_crashes.png " /></ div >
64
68
65
69
จะพบไฟล์อยู่ สามารถอ่านไฟล์ได้ด้วยคำสั่ง
66
70
` cat output/crashes/<ชื่อไฟล์> `
67
71
68
- ![ ] ( images/fuzzing_afl_result.png )
72
+ < div style = " text-align : center " >< img src = " images/fuzzing_afl_result.png " /></ div >
69
73
70
74
จะเห็นได้ว่าตัว AFL สามารถเจอว่าเมื่อกำหนดให้บรรทัดที่ 1 อยู่เหมือนเดิม แต่เปลี่ยนบรรทัดที่ 2 เป็น Z จะสามารถทำให้โปรแกรม crash ได้ ทั้งที่ input ต้นแบบของเราไม่มีการใช้ mode Z เลย
71
75
72
76
เมื่อลองรันไฟล์ของเรา ด้วย input ที่ afl สร้างขึ้นมา จะพบว่ามีการ crash เกิดขึ้นจริง
73
77
` ./supersafeprogram output/crashes/<ชื่อไฟล์> `
74
78
75
- ![ ] ( images/fuzzing_afl_replicate.png )
79
+ < div style = " text-align : center " >< img src = " images/fuzzing_afl_replicate.png " /></ div >
76
80
77
81
จากจุดนี้ เราสามารถใช้ debugger เพื่อวิเคราะห์การทำงานของโปรแกรมเพื่อวิเคราะห์ว่าช่องโหว่เกิดจากอะไร และอาจโดนโจมตีได้อย่างไรต่อไป
78
82
0 commit comments