file
5.36 กล่าวอย่างชัดเจน
file
5.36 จริง ๆ แล้วพิมพ์ออกมาอย่างชัดเจนถ้าปฏิบัติการคือ PIE หรือไม่ ตัวอย่างเช่นไฟล์ PIE ที่แสดงได้จะแสดงเป็น:
main.out: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, not stripped
และไม่ใช่พาย - หนึ่ง:
main.out: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), statically linked, not stripped
ฟีเจอร์นี้เปิดตัวใน 5.33 แต่มันเป็นเพียงการchmod +x
ตรวจสอบง่าย ๆ ก่อนหน้านั้นเพิ่งพิมพ์shared object
สำหรับ PIE
ใน 5.34 มันก็หมายถึงการเริ่มต้นการตรวจสอบความเชี่ยวชาญมากขึ้นDF_1_PIE
เอลฟ์เมตาดาต้า แต่เนื่องจากข้อผิดพลาดในการดำเนินการก็สิ่งที่ยากจนจริงและแสดงให้เห็น executables GCC shared objects
พายเป็น
ฉันได้ตีความfile
ซอร์สโค้ดรวมถึงข้อผิดพลาดและจำนวนไบต์ของรูปแบบเอลฟ์ที่ตรวจสอบในรายละเอียดที่ระรัวทุกข์ทรมานที่: https://stackoverflow.com/questions/34519521/why-does-gcc-create-a-shared-object -instead ของใช้ปฏิบัติการไบนารี-ตามไป / 55704865 # 55704865
ข้อมูลสรุปอย่างย่อของไฟล์ 5.36 คือ:
- ถ้า
Elf32_Ehdr.e_type == ET_EXEC
- อื่นถ้า
Elf32_Ehdr.e_type == ET_DYN
- ถ้า
DT_FLAGS_1
รายการส่วนแบบไดนามิกมีอยู่
- ถ้า
DF_1_PIE
ตั้งอยู่ในDT_FLAGS_1
:
- อื่น
- อื่น
- หากไฟล์นั้นสามารถเรียกใช้งานได้โดยผู้ใช้กลุ่มหรืออื่น ๆ
- อื่น
GDB เรียกใช้ไฟล์ปฏิบัติการได้สองครั้งและดู ASLR
สิ่งหนึ่งที่ตรงมากที่คุณสามารถทำได้คือเรียกใช้ไฟล์ปฏิบัติการสองครั้งผ่าน GDB และดูว่าการเปลี่ยนแปลงที่อยู่ระหว่างการรันนั้นเกิดจาก ASLR หรือไม่
ฉันได้อธิบายวิธีการทำอย่างละเอียดใน: https://stackoverflow.com/questions/2463150/what-is-the-the-fpie-option-for-position-indrants-executables-in-gcc-and-ld/51308031 # 51308031
แม้ว่านี่จะไม่ใช่วิธีแก้ปัญหาที่ใช้งานได้จริงและเป็นไปไม่ได้ถ้าคุณไม่เชื่อใจในปฏิบัติการ แต่มันก็สนุกและมันก็เป็นการตรวจสอบขั้นสุดยอดที่เราใส่ใจจริงๆซึ่งถ้าเคอร์เนล Linux / ตัวโหลดแบบไดนามิกเปลี่ยนตำแหน่งปฏิบัติการหรือ ไม่.