arrow_backกลับไปที่บันทึกภาคสนาม
WEB SECURITY เผยแพร่แล้ว 9 Aug 2026

Buffer Overflow คืออะไร การสาธิตแบบมือจับ

เรียนรู้วิธีการทำงานของ buffer overflow ด้วยตัวอย่าง C จริง ๆ แผนภาพสแต็ก และเครื่องมือเพื่อดูว่ามันเกิดขึ้นได้อย่างไร

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

รูปแบบที่มีช่องโหว่

นี่คือตัวอย่างคลาสสิกใน C:

#include <string.h>

void greet(char *name) {
    char buffer[64];
    strcpy(buffer, name);
}

int main(int argc, char **argv) {
    greet(argv[1]);
    return 0;
}

strcpy คัดลอกสตริงที่คุณส่งผ่านไปยัง buffer โดยไม่มีการตรวจสอบขอบเขต หาก argv[1] ยาวกว่า 64 ไบต์ การคัดลอกจะดำเนินการผ่านจุดสิ้นสุดของอาร์เรย์ต่อไป บนสแต็ก buffer นั่งอยู่ใต้ตัวแปรท้องถิ่นอื่น ๆ เรจิสเตอร์ที่บันทึก และในที่สุดที่อยู่ส่งคืนที่บอกให้ CPU รู้ว่าจะกระโดดไปที่ใดหลังจากที่ greet() เสร็จสิ้น เขียนทับที่อยู่ส่งคืนนั้นด้วยที่อยู่ที่คุณควบคุม และคุณควบคุมสิ่งที่ทำงานต่อไป

เหตุใดจึงยังคงคอมไพล์และทำงานได้

C และ C++ ไม่ทำการตรวจสอบขอบเขตอัตโนมัติบนอาร์เรย์ดิบ ฟังก์ชันเช่น strcpy gets sprintf และ strcat จะเขียนผ่านจุดสิ้นสุดของบัฟเฟอร์ได้อย่างอิสระ เพราะพวกมันสนใจเฉพาะตัวสิ้นสุด null หรือความยาวของแหล่งที่มา ไม่ใช่ขนาดจริงของปลายทาง เปรียบเทียบกับ strncpy หรือ snprintf ซึ่งใช้อาร์กิวเมนต์ขนาดที่ชัดแจ้งและหยุดที่นั่น ช่องโหว่จริง ๆ แล้วไม่ได้

เขียนด้วยความช่วยเหลือของ AI ตรวจสอบและเผยแพร่โดย Michal Pilch (CISSP), Korra Studio

พร้อมที่จะไปต่อหรือไม่

นี่คือบันทึกหนึ่งจากฐานความรู้ของ Korra Studio — แพลตฟอร์มจับคู่หัวข้อแต่ละหัวข้อกับการฝึกสอนแบบ 1-to-1

เริ่มใช้งานฟรีarrow_forward