การเขียนโปรแกรมแบบ Return-Oriented (ROP)
เชื่อมต่อแก็ดเจ็ต ROP เพื่อหลบเลี่ยง NX/DEP และสร้างช่องโหว่ที่ไม่ต้องใช้เชลล์โค้ด
การเขียนโปรแกรมแบบ Return-Oriented (ROP) เป็นบทเรียน Cyber Security Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Cyber Security Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Cyber Security Academy มีบทเรียนทั้งหมด 4 บทเรียน
เหตุผลที่มี ROP
เมื่อใช้ NX/DEP โค้ดเชลล์ที่แทรกเข้าไปจะไม่สามารถเรียกใช้ได้ การเขียนโปรแกรมแบบอิงการคืนค่า (ROP) หลบเลี่ยงข้อจำกัดนี้ด้วยการเชื่อมลำดับโค้ดขนาดเล็กที่มีอยู่แล้ว (แกดเจ็ต) ซึ่งจบด้วยคำสั่ง ret ไม่มีการแทรกโค้ดใหม่ — ใช้เพียงสแตกและโค้ดที่มีอยู่แล้วเท่านั้น
แกดเจ็ต ROP คืออะไร
แกดเจ็ต คือลำดับคำสั่งสั้น ๆ ที่ลงท้ายด้วย ret ซึ่งพบได้ในไบนารีหรือไลบรารีที่โหลดอยู่ ตัวอย่างเช่น pop rdi; ret, pop rsi; ret, mov eax, 0; ret แกดเจ็ตเป็นองค์ประกอบพื้นฐานสำหรับสร้างเชน ROP
การค้นหาแกดเจ็ต
เครื่องมือสำหรับค้นหาแกดเจ็ต ROP ในไบนารี:
# ROPgadget:
ROPgadget --binary ./vuln --rop
# ropper:
ropper -f ./vuln --search "pop rdi"
# pwntools:
from pwn import *
elf = ELF("./vuln")
rop = ROP(elf)
rop.find_gadget(["pop rdi", "ret"])การสร้างเชน ROP
เชน ROP คือลำดับของแอดเดรสคืนค่าบนสแตก เมื่อโปรแกรมทำงานมาถึงแอดเดรสคืนค่าที่ถูกเขียนทับ โปรแกรมจะกระโดดไปยังแกดเจ็ตที่ 1 (ซึ่งทำงานที่มีประโยชน์แล้วคืนค่า) จากนั้นจึงดึงแอดเดรสถัดไปและกระโดดไปยังแกดเจ็ตที่ 2 ต่อไปเรื่อย ๆ
เร็ตทูพีแอลทีและการเขียนทับ GOT
เร็ตทูพีแอลที เรียกฟังก์ชันผ่าน PLT (ตารางเชื่อมโยงโพรซีเยอร์) ซึ่งมีประโยชน์สำหรับเรียก puts() เพื่อทำให้แอดเดรสของไลบ์ซีรั่วไหล แล้วใช้แอดเดรสเหล่านั้นเรียก system() โครงสร้าง PLT/GOT สามารถคาดเดาได้แม้ใช้ ASLR กับไบนารีหลัก (เมื่อไม่มี PIE)
การเอาชนะ ASLR ด้วย ROP
ROP สามารถทำให้แอดเดรสของฟังก์ชันไลบ์ซีรั่วไหลจาก GOT ได้ โดยใช้แกดเจ็ตที่เรียก puts(GOT_entry) แอดเดรสที่รั่วไหลจะเปิดเผยแอดเดรสเริ่มต้นของไลบ์ซี คำนวณออฟเซ็ตของ system() ได้ดังนี้: system_addr = leak - libc.symbols["puts"] + libc.symbols["system"]
SROP: การเขียนโปรแกรมแบบอิงการคืนค่าสัญญาณ
SROP ใช้ซิสคอล sigreturn เพื่อโหลดเฟรม sigcontext ปลอม และกำหนดรีจิสเตอร์ทั้งหมดเป็นค่าที่ผู้โจมตีควบคุมได้ด้วยแกดเจ็ตเดียว มีประโยชน์เมื่อมีแกดเจ็ตให้ใช้งานน้อย
รูปแบบ JOP และ COP
นอกเหนือจาก ROP:
- JOP (การเขียนโปรแกรมแบบอิงการกระโดด) — เชื่อมแกดเจ็ตที่ลงท้ายด้วย
jmpแทนret - COP (การเขียนโปรแกรมแบบอิงการเรียก) — เชื่อมแกดเจ็ตที่ลงท้ายด้วย
call
การป้องกันอย่าง CFI (ความถูกต้องสมบูรณ์ของโฟลว์ควบคุม) มีเป้าหมายเพื่อป้องกันทั้งหมดนี้
ความถูกต้องสมบูรณ์ของโฟลว์ควบคุม (CFI)
CFI บังคับให้สาขาทางอ้อม (การเรียกและการคืนค่า) กระโดดไปยังเป้าหมายที่ถูกต้องเท่านั้น โดยตรวจสอบเป้าหมายการคืนค่ากับสแตกเงาหรือรายการที่อนุญาต จึงขัดขวาง ROP ได้ Intel CET (เทคโนโลยีบังคับใช้โฟลว์ควบคุม) ใช้ CFI ในระดับฮาร์ดแวร์
ตัวอย่าง ROP ในทางปฏิบัติ
เร็ตทูไลบ์ซีบนระบบ 64 บิตผ่าน ROP:
# pwntools ROP chain example:
from pwn import *
p = process("./vuln")
libc = ELF("/lib/x86_64-linux-gnu/libc.so.6")
elf = ELF("./vuln")
rop = ROP(elf)
# Leak puts GOT to get libc base
rop.puts(elf.got["puts"])
rop.main()สรุปมาตรการลดความเสี่ยง
การป้องกัน ROP:
- CFI — ตรวจสอบเป้าหมายของสาขา
- สแตกเงา (CET) — สำเนาแอดเดรสคืนค่าที่ได้รับการป้องกันด้วยฮาร์ดแวร์
- RELRO (เต็มรูปแบบ) — ทำให้ GOT อ่านได้อย่างเดียวและป้องกันการเขียนทับ
- PIE — สุ่มแอดเดรสเริ่มต้นของไบนารี จึงต้องมีการรั่วไหลเพื่อค้นหาแกดเจ็ต
ตรวจสอบอย่างรวดเร็ว: ROP
แกดเจ็ต ROP คืออะไร
สรุปบทเรียน
ROP หลบเลี่ยง NX/DEP ด้วยการเชื่อมลำดับโค้ดที่มีอยู่แล้ว (แกดเจ็ตที่ลงท้ายด้วย ret) โดยไม่จำเป็นต้องแทรกโค้ดเชลล์ เครื่องมือค้นหาแกดเจ็ต ได้แก่ เครื่องมือค้นหาแกดเจ็ตแบบอาร์โอพีและรอปเปอร์ เทคนิคเร็ตทูพีแอลทีทำให้แอดเดรสของไลบ์ซีรั่วไหลเพื่อเอาชนะ ASLR การป้องกันได้แก่ CFI สแตกเงา (Intel CET) PIE และ RELRO แบบเต็มรูปแบบ ROP เป็นพื้นฐานของการโจมตีไบนารีสมัยใหม่
เรียนรู้ Cyber Security Academy ด้วย AI tutor — ฟรี
เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป
- คอร์ส
- 76
- บทเรียน
- 303
คำถามที่พบบ่อย
บทเรียน “การเขียนโปรแกรมแบบ Return-Oriented (ROP)” ฟรีหรือไม่
ใช่ — ข้อความเต็มของ “การเขียนโปรแกรมแบบ Return-Oriented (ROP)” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Cyber Security Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Cyber Security Academy มีบทเรียนทั้งหมด 4 บทเรียน
คุณจะเรียนรู้อะไรในบทเรียน “การเขียนโปรแกรมแบบ Return-Oriented (ROP)”
เชื่อมต่อแก็ดเจ็ต ROP เพื่อหลบเลี่ยง NX/DEP และสร้างช่องโหว่ที่ไม่ต้องใช้เชลล์โค้ด คุณปฏิบัติ Cyber Security Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน
คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Cyber Security Academy หรือไม่
ไม่จำเป็นต้องมีประสบการณ์มาก่อน Cyber Security Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 2 จากทั้งหมด 4 บทเรียน
บทเรียน “การเขียนโปรแกรมแบบ Return-Oriented (ROP)” ใช้เวลานานแค่ไหน
บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย
ฉันเขียนและรันโค้ดในบทเรียน Cyber Security Academy นี้ได้ไหม
ได้ บทเรียน Cyber Security Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- บัฟเฟอร์ล้นบนสแตก
- การเขียนโปรแกรมแบบ Return-Oriented (ROP)
- ช่องโหว่รูปแบบสตริง
- การใช้ประโยชน์จากฮีป: Use-After-Free และการโปรยฮีป