file 5.36 এটি পরিষ্কারভাবে বলেছে
fileএক্সিকিউটেবল PIE হয় বা না হলে 5.36 আসলে এটি পরিষ্কারভাবে প্রিন্ট করে। উদাহরণস্বরূপ, একটি পিআইই এক্সিকিউটেবল শো হিসাবে:
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পিআইইয়ের জন্য মুদ্রিত হয়েছিল।
৫.৩৪-তে এটি আরও বিশেষায়িত DF_1_PIEইএলএফ মেটাডেটা পরীক্ষা করা শুরু করা হয়েছিল , তবে বাস্তবায়নের ত্রুটির কারণে এটি আসলে জিনিসগুলি ভেঙে দিয়েছে এবং জিসিসি পিআইই এক্সিকিউটেবল হিসাবে দেখিয়েছে shared objects।
আমি fileবাগের সহ উত্স কোডটি ব্যাখ্যা করেছি এবং ঠিক কীভাবে ELF ফর্ম্যাটটির বাইটগুলি এটি উদ্দীপক বিশদটি যাচাই করে: 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 এর কারণে রান জুড়ে পাল্টে যায় কিনা।
কীভাবে এটি করবেন তা আমি এখানে বিশদে বর্ণনা করেছি: https://stackoverflow.com/questions/2463150/ কি-is-the-fpie-option-for-position-ind dependent-executables-in-gcc-and-ld/ 51308031 # 51308031
যদিও এটি কার্যকরভাবে কার্যকর সমাধান নয় এবং যদি আপনি নির্বাহযোগ্যকে বিশ্বাস না করেন তবে এটি সম্ভব নয়, এটি মজাদার এবং এটি চূড়ান্তভাবে যাচাই করে যা আমরা সত্যই যত্নশীল, এটি লিনাক্স কার্নেল / ডায়নামিক লোডার যদি এক্সিকিউটেবল লোকেশন পরিবর্তন করে বা না.