یکی از دانشجویان دوره توسعه کدهای اکسپلویت و کشف آسیب‏پذیری پرسیدند که کدهای نوع PIC چه هستند و چرا ما باید از این نوع کدها استفاده کنیم (در حقیقت مسئله‏ای که می‏خواست سوال بپرسد، این بود.)؟


در حالت کلی ما در سامانه‏ های کامپیوتری با آدرس ‏های مجازی خیلی کار می‏ کنیم، اصلا هر برنامه ‏ای که نوشته می‏ شود، هنگامی که بخواهد اجرا شود، باید آدرس ‏های درون آن ریزالو شوند و هر قسمت از کد | ماژول باید در جایگاه خودش قرار بگیرد تا دینامیک لودر بتواند برنامه را اجرا کند. 


به عنوان مثال وقتی شما یک تابع را از یک کتابخانه فراخوانی می ‏کنید، آن تابع برای اینکه اجرا شود باید آدرس آن مبتنی بر بیس آدرس ماژولی که در آن قرار دارد، درون حافظه محاسبه شود. این عمل محاسبه آدرس هم زمانی صورت می‏گیرد که ماژول به درون فضای آدرس برنامه شما مپ شود و در نهایت آدرس تابع مبتنی بر مکانی که ماژول بارگزاری شده است، محاسبه گردد.

در لینوکس برخلاف ویندوز به صورت پیش‏فرض فراخوانی توابع به صورت Delay Loaded صورت می‏گیرد، یعنی قبل از فراخوانی یک تابع در یک فایل اجرایی ELF یک Stub Code اجرا می‏شود که آن کد با رجوع به GOT-PLT آدرس تابع را به دست می ‏آورد و به آن جامپ و اجرایش می‏ کند اما در ویندوز دینامیک لودر به صورت پیش‏فرض از جدول IAT استفاده می‏ کند و به آدرس تابع درون حافظه رجوع می‏کند.


حال وقتی شما یک پروسه‏ای را اکسپلویت می ‏کنید و شلکدی را می‏ خواهید به آن تزریق و اجرا کنید، شلکد شما نباید وابستگی به تابعی یا مورد دیگری داشته باشد (کلا نباید نیاز به محاسبه آدرس داشته باشد)، چون وقتی برنامه اجرا شده است، شلکد شما در ساختار برنامه وجود خارجی نداشته بود که دینامیک لودر آدرس‏ ها و ثابت‏های درون آن را ریزالو کند. در تصویر زیر شلکد استخراج شده از یک فایل اجرایی را مشاهده می کنید.:

لذا شلکد به صورت Position Independet Code برخلاف Load Time Locatable پیاده‏ سازی می ‏شود که دینامیک لودر توانایی اجرای آن شلکد را داشته باشد.  کدهای PIC هم کدهایی هستند که هرجایی در حافظه بارگزاری شوند، سیستم ‏عامل توانایی اجرای آنها را دارد، چون کد Self-Contained و مستقل از موقعیت بارگزاری است. فقط نکته ای را باید رعایت کنید و آن این است که کد PIC شما نباید نال بایت داشته باشد.

اگر شلکد شما وابستگی به تابع یا چیز دیگری داشته باشد که آدرس آن تابع باید محاسبه گردد، شلکد شما اجرا نخواهد شد و برنامه کرش می‏کند چون لودر آدرس ‏های درون آن را ریزالو نکرده است و به عبارت دیگر معنایی ندارد. این توضیح ساده (اما غیر دقیق فقط با هدف مفهوم‏سازی) بود که می‏توانستم برای شما ارائه کنم.


به کانال بنده جوین شوید: @miladkahsarialhadi