Cyber Security Academy · บทเรียน

การเขียนโปรแกรมแบบ Return-Oriented (ROP)

เชื่อมต่อแก็ดเจ็ต ROP เพื่อหลบเลี่ยง NX/DEP และสร้างช่องโหว่ที่ไม่ต้องใช้เชลล์โค้ด

บทเรียน 2 จาก 413 ขั้นตอน

การเขียนโปรแกรมแบบ 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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. บัฟเฟอร์ล้นบนสแตก
  2. การเขียนโปรแกรมแบบ Return-Oriented (ROP)
  3. ช่องโหว่รูปแบบสตริง
  4. การใช้ประโยชน์จากฮีป: Use-After-Free และการโปรยฮีป
← กลับไปที่ Cyber Security Academy