เหตุใดตำแหน่งของตัวแปรสภาพแวดล้อมจึงแตกต่างกันมาก


9

อ่านหนังสือแฮ็ค: ศิลปะแห่งการเอารัดเอาเปรียบโดย Jon Erickson ฉันพยายามประมาณที่อยู่ของตัวแปรสภาพแวดล้อมSHELLCODEเพื่อใช้ประโยชน์จากโปรแกรม

ทุกครั้งที่ฉันวิ่งgetenv("SHELLCODE");ไปหาที่ตั้งผลลัพธ์จะแตกต่างกันโดยสิ้นเชิง

แยกจากเปลือกของฉัน:

> for i in $(seq 10); do ./a.out SHELLCODE; done
SHELLCODE is at 0xff9ab3a3
SHELLCODE is at 0xffcdb3a3
SHELLCODE is at 0xffb9a3a3
SHELLCODE is at 0xffa743a3
SHELLCODE is at 0xffdb43a3
SHELLCODE is at 0xfff683a3
SHELLCODE is at 0xffef03a3
SHELLCODE is at 0xffc1c3a3
SHELLCODE is at 0xff85a3a3
SHELLCODE is at 0xff8e03a3

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


getenvคู่มือบอกว่ามันกลับชี้ไปสตริงที่มีค่าของตัวแปร ทุกอย่างอื่นนั้นไม่ได้ระบุไว้ดังนั้นเคอร์เนลและ / หรือคอมไพเลอร์ของคุณสามารถติดค่าได้ทุกที่ที่ต้องการตราบใดที่สัญญาชี้ยังคงเป็นจริง ฉันคาดเดาคำตอบที่แน่ชัดสำหรับเรื่องนี้อาจเป็นเวทย์มนตร์ที่หนักหน่วงและขึ้นอยู่กับรายละเอียดการใช้งานการแมปหน่วยความจำและระยะของดวงจันทร์ (ฉันไม่ได้เป็นพ่อมดที่เพียงพอที่จะให้คำตอบที่แน่นอนแก่คุณ)
Anko

"ฉันเข้าใจว่าหากมีการแก้ไขชื่อโปรแกรมหรือเพิ่มตัวแปรสภาพแวดล้อมใหม่ตำแหน่งจะแตกต่างกันเล็กน้อย แต่เหตุใดตำแหน่งจึงแตกต่างกันมาก" นั่นเป็นความจริงในการใช้งานที่ง่ายที่สุดที่เป็นไปได้ทั้งหมด แต่ก็ไม่จำเป็นต้องใช้อย่างแน่นอน
dmckee --- ผู้ดูแลอดีตลูกแมว

คำตอบ:


13

สิ่งที่คุณอธิบายคือคุณสมบัติต่อต้านการเอารัดเอาเปรียบที่เรียกว่าAddress Space Layout Randomization (ASLR) โดยทั่วไปเคอร์เนลจะวางที่อยู่บนสุดของการเรียกฟังก์ชันสแต็กของโปรแกรมที่ที่อยู่แตกต่างกันเล็กน้อย ("สุ่ม") ทุกครั้งที่เคอร์เนลโหลดไฟล์ ELF ของโปรแกรมจากดิสก์ ที่อยู่ในargvและตัวแปรสภาพแวดล้อมซึ่ง shellcode ของคุณเป็นหนึ่งนั้นลงท้ายด้วยที่อยู่ที่แตกต่างกันกับการเรียกใช้โปรแกรมแต่ละรายการ

ASLR ควรจะทำให้การใช้ประโยชน์จากบัฟเฟอร์ล้นมากขึ้นและช่องโหว่ที่เกี่ยวข้องกับกองซ้อนได้ยากขึ้น ผู้โจมตีต้องเขียนโค้ดหรือทำอะไรบางอย่างเพื่ออธิบายที่อยู่ที่แตกต่างกันของตัวแปรและค่าในสแต็กการเรียกใช้ฟังก์ชัน

ดูเหมือนว่าคุณสามารถปิดการใช้งาน ASLR โดยทำสิ่งที่ชอบ:

echo 0 > /proc/sys/kernel/randomize_va_space

ในฐานะผู้ใช้รูท เนื่องจากคุณอ้างถึงอูบุนตูอย่างชัดเจนคำสั่งด้านบนจึงแตกต่าง:

echo 0 | sudo tee /proc/sys/kernel/randomize_va_space

ใช่นั่นเป็นกลอุบาย ฉันสังเกตเห็นว่าผู้แต่งหนังสือใช้ Ubuntu 10.04 ซึ่งยังไม่มี ASLR
Janman
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.