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