
กลยุทธ์ลับ: ซ่อนโค้ดร้ายในส่วนข้อมูลของโปรแกรม เพื่อหลบเลี่ยงการตรวจจับ
ในโลกไซเบอร์ที่เต็มไปด้วยภัยคุกคาม การโจมตีมักจะพัฒนาไปอย่างไม่หยุดยั้ง เพื่อหาวิธีใหม่ๆ ในการหลีกเลี่ยงระบบป้องกัน หนึ่งในเทคนิคที่น่าสนใจและท้าทายต่อการตรวจจับคือ การซ่อน Payload หรือโค้ดอันตราย เอาไว้ในส่วนที่ไม่คาดคิดของโปรแกรม โดยเฉพาะอย่างยิ่งใน ส่วนข้อมูล (Data Section) แทนที่จะเป็นส่วนโค้ดที่ถูกจับตาเป็นพิเศษ
การทำความเข้าใจว่าโปรแกรมทำงานอย่างไรในระดับลึก จะช่วยให้มองเห็นช่องทางเหล่านี้ได้ชัดเจนยิ่งขึ้น และนำไปสู่การพัฒนากลยุทธ์ป้องกันที่มีประสิทธิภาพ
ทำความเข้าใจโครงสร้างไฟล์ PE (Portable Executable)
เมื่อโปรแกรมถูกสร้างขึ้นบนระบบปฏิบัติการ Windows ไฟล์ที่ได้จะมีโครงสร้างเฉพาะที่เรียกว่า Portable Executable (PE) format โครงสร้างนี้จะแบ่งโปรแกรมออกเป็นส่วนต่างๆ ที่มีหน้าที่และคุณสมบัติแตกต่างกันไป
ส่วนที่สำคัญที่เราควรรู้จัก ได้แก่:
.textSection: ส่วนนี้คือที่เก็บ โค้ดคำสั่ง หลักของโปรแกรม เป็นที่ที่ CPU เข้าไปอ่านและประมวลผลคำสั่งต่างๆ ส่วนนี้มักจะถูกตั้งค่าเป็น อ่านและรันได้ (Readable and Executable).rdataSection: ส่วนนี้เก็บ ข้อมูลแบบอ่านอย่างเดียว (Read-Only Data) เช่น ข้อความสตริง ลิงก์ฟังก์ชัน หรือข้อมูลคงที่อื่นๆ ที่ไม่เปลี่ยนแปลงขณะโปรแกรมทำงาน ส่วนนี้จะถูกตั้งค่าเป็น อ่านได้อย่างเดียว (Readable).dataSection: ส่วนนี้สำคัญมาก เพราะเป็นที่เก็บ ข้อมูลที่เปลี่ยนแปลงได้ (Writable Data) เช่น ตัวแปรทั่วโลก (Global Variables) หรือตัวแปรที่ถูกกำหนดค่าเริ่มต้นให้ ส่วนนี้มักจะถูกตั้งค่าเป็น อ่านและเขียนได้ (Readable and Writable)
โดยทั่วไปแล้ว Payload หรือโค้ดอันตราย จะพยายามเข้าไปอยู่ในส่วนที่สามารถรันได้ ซึ่งส่วนใหญ่แล้วก็คือ .text แต่ถ้ามันถูกซ่อนใน .data ล่ะ? นั่นคือจุดที่น่าสนใจ
เจาะลึก: .data Section กับการซ่อน Payload
แนวคิดเบื้องหลังการซ่อน Payload ใน .data section คือการใช้ประโยชน์จากคุณสมบัติที่สำคัญของส่วนนี้ นั่นคือ ความสามารถในการเขียน (Writable)
ตามปกติแล้ว โค้ดของโปรแกรมจะไม่ถูกเขียนลงใน .data แต่ถ้าผู้โจมตีสามารถวาง Shellcode (โค้ดขนาดเล็กที่ถูกออกแบบมาเพื่อทำภารกิจเฉพาะเจาะจง) ลงใน .data ในรูปของข้อมูลเริ่มต้น (เช่น อาร์เรย์ของไบต์) มันจะถูกมองว่าเป็นแค่ “ข้อมูล” ทั่วไป
ความชาญฉลาดคือ การทำให้ส่วน .data ซึ่งเดิมมีเพียงสิทธิ์อ่านและเขียน สามารถรันได้ (Executable) ในภายหลังขณะโปรแกรมทำงาน
จากนั้น โปรแกรมก็จะสามารถกระโดดไปที่ตำแหน่งของ Shellcode ใน .data และสั่งให้มันทำงานได้ ซึ่งถือเป็นการรันโค้ดจากตำแหน่งที่ผิดปกติ
กลไกการซ่อนและรันโค้ด
ขั้นตอนโดยรวมของเทคนิคนี้จะประมาณนี้:
- การวาง Payload: Shellcode จะถูกฝังเข้าไปในไฟล์โปรแกรม โดยถูกประกาศให้เป็น ตัวแปรข้อมูลทั่วโลก (Global Data Variable) ซึ่งจะถูกจัดเก็บใน
.datasection โดยอัตโนมัติ ทำให้มันดูเหมือนเป็นเพียงชุดข้อมูลธรรมดาๆ - การเปลี่ยนแปลงสิทธิ์การเข้าถึง: เมื่อโปรแกรมเริ่มทำงาน มีการใช้ฟังก์ชันพิเศษ (เช่น
VirtualProtectบน Windows) เพื่อ ปรับเปลี่ยนสิทธิ์การเข้าถึง ของหน่วยความจำในส่วน.dataให้กลายเป็น อ่าน, เขียน และรันได้ (Readable, Writable, and Executable) - การรัน Payload: เมื่อสิทธิ์ถูกปรับเปลี่ยนแล้ว โปรแกรมจะสามารถ ชี้ไปยังตำแหน่งหน่วยความจำ ที่ Shellcode ถูกเก็บไว้ใน
.dataจากนั้นจึงสั่งให้ CPU เริ่มประมวลผลคำสั่งจากจุดนั้น
เทคนิคนี้หลอกล่อให้ระบบป้องกันเชื่อว่ากำลังประมวลผล “ข้อมูล” ทั่วไป จนกระทั่งถึงเวลาที่สิทธิ์ถูกเปลี่ยนแปลงและโค้ดถูกเรียกใช้
ความท้าทายในการตรวจจับ
การซ่อน Payload ใน .data สร้างความท้าทายอย่างมากต่อ ระบบป้องกัน (Security Tools) แบบดั้งเดิม
เครื่องมือเหล่านี้มักจะเน้นการตรวจสอบ .text section เป็นหลัก เพื่อค้นหารูปแบบของโค้ดอันตราย หรือพฤติกรรมการรันโค้ดที่น่าสงสัย แต่เมื่อ Payload ถูกซ่อนเป็นข้อมูลใน .data มันก็อาจจะ ผ่านการสแกนเริ่มต้นไปได้ง่ายๆ
การตรวจจับจึงต้องอาศัยการวิเคราะห์ที่ซับซ้อนขึ้น เช่น การตรวจสอบ การเปลี่ยนแปลงสิทธิ์หน่วยความจำแบบไดนามิก ในขณะที่โปรแกรมทำงาน หรือการตรวจจับพฤติกรรมการรันโค้ดจากส่วนของหน่วยความจำที่ไม่ใช่ .text
ความเข้าใจในเทคนิคเชิงลึกเช่นนี้ จึงเป็นสิ่งจำเป็นสำหรับผู้ที่ต้องการเสริมสร้างความแข็งแกร่งด้านความปลอดภัยทางไซเบอร์ เพื่อให้สามารถรับมือกับภัยคุกคามที่พัฒนาไปอย่างต่อเนื่องได้อย่างมีประสิทธิภาพ