0Pricing
Ethical Hacking Academy · บทเรียน

การควบคุม EIP

เขียนทับที่อยู่ส่งคืน

การควบคุม EIP เป็นบทเรียน Ethical Hacking Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน Ethical Hacking Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส Ethical Hacking Academy มีบทเรียนทั้งหมด 4 บทเรียน

เป้าหมาย

เมื่อมีออฟเซ็ตแล้ว คุณจึงสามารถใส่ไบต์สี่ไบต์ใด ๆ ลงใน EIP ได้ คำถามตอนนี้คือ คุณควรใส่แอดเดรสใดลงไป

คุณต้องการให้ EIP ชี้ไปยังเชลล์โค้ด แต่ไม่สามารถกำหนดแอดเดรสของสแตกแบบตายตัวได้ คุณต้องการการกระโดดที่เชื่อถือได้

เหตุใดจึงไม่กำหนดแอดเดรสของสแตกแบบตายตัว

แอดเดรสของสแตกที่เชลล์โค้ดของคุณอยู่สามารถเปลี่ยนไปในแต่ละครั้งและในแต่ละระบบ แม้การเปลี่ยนแปลงสภาพแวดล้อมเพียงเล็กน้อยก็ทำให้แอดเดรสเคลื่อนที่ได้

ดังนั้น ให้ใช้คำสั่งที่เสถียรซึ่งมีอยู่ในหน่วยความจำและเปลี่ยนเส้นทางการทำงานไปยังตำแหน่งที่ ESP ชี้อยู่ในขณะนั้น

เทคนิค JMP ESP

หาก ESP ชี้ไปยังเชลล์โค้ดในขณะที่เกิดการหยุดทำงาน คุณสามารถตั้ง EIP ให้เป็นแอดเดรสของคำสั่ง JMP ESP ได้ เมื่อ EIP โหลดแอดเดรสนั้น CPU จะทำงานตาม jmp esp และกระโดดเข้าสู่เชลล์โค้ดของคุณ

การอ้อมผ่านคำสั่งนี้ทำให้การโจมตีเชื่อถือได้โดยไม่ขึ้นกับแอดเดรสของสแตกที่แน่นอน

jmp esp   ; opcode FF E4

การค้นหา JMP ESP

ให้ค้นหาไบต์รหัสคำสั่ง FF E4 ในโมดูลที่โหลดอยู่ (ควรเลือกโมดูลที่ไม่มี ASLR) แอดเดรสฐานของโมดูลจะคงที่ ทำให้แก็ดเจ็ตนี้เชื่อถือได้

เครื่องมืออย่าง mona.py สามารถค้นหาคำสั่งที่เหมาะสมได้โดยอัตโนมัติ

!mona jmp -r esp -cpb "\x00"

การหลีกเลี่ยงอักขระต้องห้าม

ค่าบางไบต์ทำให้ข้อมูลนำเข้าเสียหายก่อนจะไปถึงบัฟเฟอร์อย่างครบถ้วน ค่าที่พบได้บ่อยคือไบต์ว่าง 0x00 ซึ่งใช้ยุติสตริงภาษา C ส่วนค่าอื่น ๆ ได้แก่ 0x0a (ขึ้นบรรทัดใหม่) และ 0x0d (คืนแคร่)

แอดเดรส JMP ESP ต้องไม่มีอักขระต้องห้ามเหล่านี้

การระบุอักขระต้องห้าม

หากต้องการค้นหาว่าไบต์ใดเป็นอักขระต้องห้าม ให้ส่งค่าไบต์ทั้งหมดตั้งแต่ 0x00 ถึง 0xff ในบัฟเฟอร์ แล้วตรวจสอบหน่วยความจำในตัวดีบัก ไบต์ที่ถูกดัดแปลงหรือหายไปคืออักขระต้องห้าม

คุณจะตัดไบต์เหล่านี้ออกจากทั้งแอดเดรสย้อนกลับและเชลล์โค้ด

!mona bytearray -cpb "\x00"

การสร้างการเขียนทับ EIP

ตอนนี้ให้ประกอบข้อมูลนำเข้า: ข้อมูลเติมจนถึงออฟเซ็ต จากนั้นตามด้วยแอดเดรส JMP ESP โดยเรียงตามลำดับลิตเทิลเอนเดียน

หาก JMP ESP อยู่ที่ 0x625011AF ไบต์ที่เขียนจะกลับลำดับกัน

buf = "A"*offset + "\xaf\x11\x50\x62"  # 0x625011AF, little-endian

การตรวจสอบการกระโดด

ตั้งจุดพักที่แอดเดรส JMP ESP ในตัวดีบัก แล้วเรียกใช้การโจมตี เมื่อ EIP มาถึงแอดเดรสนั้นและก้าวเข้าสู่ตำแหน่งที่ ESP ชี้อยู่ แสดงว่าคุณยืนยันการเปลี่ยนเส้นทางที่เชื่อถือได้แล้ว

ณ จุดนี้ EIP ชี้ไปยังตำแหน่งที่คุณจะวางเชลล์โค้ด

การจัดพื้นที่สำหรับเชลล์โค้ด

หลังแอดเดสย้อนกลับ บัฟเฟอร์ส่วนที่เหลือ (ซึ่ง ESP ชี้อยู่) จะเก็บเชลล์โค้ดของคุณ หากพื้นที่คับแคบ คุณอาจต้องใช้การกระโดดระยะสั้นหรือย้ายตำแหน่ง

ราง NOP (ชุดไบต์ที่ไม่ทำงาน 0x90) ก่อนเชลล์โค้ดจะเพิ่มความยืดหยุ่น ทำให้การกระโดดลงจุดใดก็ได้ในรางนั้น

buf = "A"*offset + ret + "\x90"*16 + shellcode

การประกอบทุกส่วนเข้าด้วยกัน

โครงสร้างการโจมตีทั้งหมดมีดังนี้:

  • ข้อมูลเติมจนถึงออฟเซ็ต
  • แอดเดรส JMP ESP (ไม่มีอักขระต้องห้าม เรียงแบบลิตเทิลเอนเดียน)
  • ราง NOP
  • เชลล์โค้ด

คุณอยู่ห่างจากการเปิดเชลล์เพียงขั้นตอนเดียว

ทางเลือกอื่นนอกเหนือจาก JMP ESP

JMP ESP เป็นวิธีเปลี่ยนเส้นทางแบบคลาสสิก แต่ไม่ใช่วิธีเดียว หากเรจิสเตอร์ตัวอื่นชี้ไปยังบัฟเฟอร์ของคุณ คุณสามารถใช้ jmp eax, call esp หรือแก็ดเจ็ต push esp; ret ได้

หลักการเหมือนเดิม: ค้นหาคำสั่งที่เสถียรซึ่งโอนการควบคุมไปยังตำแหน่งที่เชลล์โค้ดของคุณอยู่

ตรวจสอบอย่างรวดเร็ว

ลองทบทวนว่าเหตุใดจึงนิยมใช้ JMP ESP มากกว่าแอดเดรสของสแตกที่กำหนดแบบตายตัว

สรุปทบทวน

ขณะนี้คุณควบคุมลำดับการทำงานได้แล้ว:

  • เขียนทับ EIP ด้วยแอดเดรสของแก็ดเจ็ต JMP ESP แทนแอดเดรสสแตกที่เปราะบาง
  • ค้นหาแก็ดเจ็ตในโมดูลที่ไม่มี ASLR และหลีกเลี่ยงอักขระต้องห้าม เช่น 0x00
  • เขียนแอดเดรสแบบลิตเทิลเอนเดียน และเพิ่มราง NOP ก่อนเชลล์โค้ด

ถัดไปคุณจะสร้างเชลล์โค้ดและเปิดเชลล์

คำถามที่พบบ่อย

บทเรียน “การควบคุม EIP” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “การควบคุม EIP” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส Ethical Hacking Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส Ethical Hacking Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “การควบคุม EIP”

เขียนทับที่อยู่ส่งคืน คุณปฏิบัติ Ethical Hacking Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน Ethical Hacking Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน Ethical Hacking Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “การควบคุม EIP” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน Ethical Hacking Academy นี้ได้ไหม

ได้ บทเรียน Ethical Hacking Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

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

  1. หน่วยความจำและสแตก
  2. การทำ fuzz เพื่อค้นหาการล่ม
  3. การควบคุม EIP
  4. เชลล์โค้ดและการโจมตีด้วยช่องโหว่
← กลับไปที่ Ethical Hacking Academy