อ่านหนังสือแฮ็ค: ศิลปะแห่งการเอารัดเอาเปรียบโดย 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
คู่มือบอกว่ามันกลับชี้ไปสตริงที่มีค่าของตัวแปร ทุกอย่างอื่นนั้นไม่ได้ระบุไว้ดังนั้นเคอร์เนลและ / หรือคอมไพเลอร์ของคุณสามารถติดค่าได้ทุกที่ที่ต้องการตราบใดที่สัญญาชี้ยังคงเป็นจริง ฉันคาดเดาคำตอบที่แน่ชัดสำหรับเรื่องนี้อาจเป็นเวทย์มนตร์ที่หนักหน่วงและขึ้นอยู่กับรายละเอียดการใช้งานการแมปหน่วยความจำและระยะของดวงจันทร์ (ฉันไม่ได้เป็นพ่อมดที่เพียงพอที่จะให้คำตอบที่แน่นอนแก่คุณ)