OS Internals – Telegram
OS Internals
3.65K subscribers
6 photos
29 videos
12 files
91 links
مقاله و فیلم آموزش مدیریت و برنامه‌نویسی سیستم‌های عامل، شبکه و امنیت اطلاعات.

مقالات من در ویرگول:
https://virgool.io/@akazemi

ویدئوهای کانال در آپارات:
https://www.aparat.com/oxaa55

ارتباط با مدیر کانال از طریق:
@akazemi67
Download Telegram
OS Internals pinned «📴 ‼️ تخفیف برای دوره 📴 ‼️ تخفیف برای دوره 🗓️ مهلت ثبت‌نام ۲۰ مهر ۲۵ مهر شروع دوره ۲۶ مهر ⚠️ برگزاری به صورت آفلاین دوره‌ی Windows Internals and Memory Analysis سرفصل کلی دوره: Chapter 01 – Windows Architecture Chapter 02 – WinDbg Basics and Windows…»
بررسی قرارداد فراخوانی توابع در برنامه‌های ۳۲بیتی

در این ویدئو که بخشی از یکی از کلاس‌هایم است، در مورد قراردادهای مختلف فراخوانی توابع در برنامه‌های ۳۲بیتی صحبت کرده و در یک برنامه‌ی ساده شیوه‌ی انجام آن‌ها را نمایش می‌دهم.
این فراخوانی‌ها عبارتند از: STDCALL، CDECL و FASTCALL

مدل STDCALL از stack برای انتقال پارامترهای تابع استفاده کرده و در آن تابعی که فراخوانی شده است(Callee) پس از اتمام، پارامترها را از روی stack حذف می‌کند. این مدل در اکثر توابع WinAPI‌ مورد استفاده قرار می‌گیرد.

مدل CDECL مشابه STDCALL‌ است ولی در آن تابعی که فراخوانی را انجام می‌دهد(Caller) پاک‌سازی stack را بر عهده دارد. این مدل در توابع C/C++ پیش‌فرض بوده و در لینوکس نیز از آن استفاده می‌شود.

مدل FASTCALL همانطور که از نامش پیداست، با استفاده از رجیسترها برای انتقال آرگومان‌های تابع «البته فقط دو پارامتر اول با رجیستر ارسال شده و مابقی از طریق stack‌ارسال می‌شوند» سعی در سرعت بخشیدن به اجرا دارد. پاکسازی stack در صورت نیاز، مشابه STDCALL توسط تابع فراخوانی شده(Callee) انجام می‌شود.

درک جزئیات اجرای توابع در وظایف مختلفی از برنامه نویسی تا تحلیل‌های امنیتی می‌تواند مفید باشد که امیدوارم پس از مشاهده‌ی این ویدئو بخشی از این امر حاصل شود.

لینک ویدئو در یوتیوب:
https://youtu.be/DnsXPahdI4c
لینک ویدئو در آپارات:
https://aparat.com/v/D5hB8

#ShortWinInternals #windows #internals #CallingConventions #x86 #stdcall #cdecl #fastcall #programming #cpp
11👍1
اجرای تابع به کمک اندیس منفی در آرایه‌های زبان سی در لینوکس

بازه‌ی معتبر اندیس‌ آرایه‌ها در اکثر زبان‌های برنامه‌نویسی چک شده و با ارسال اندیس نامتعبر استثنایی تولید شده و از تغییر حافظه جلوگیری می‌شود. (مثلArrayIndexOutOfBoundException در جاوا یا IndexError‌ در پایتون)

این موضوع در زبان‌های C/Cpp صادق نبوده و دست برنامه‌نویس برای اینکه گلوله‌ای در پای خودش شلیک کند بازبوده و برای آرایه‌ها می‌توان اندیس‌های منفی یا مثبت بیشتر از مرز آرایه ارسال کرده و به بخش‌های دیگر حافظه دسترسی پیدا کرد. (از این موضوع می‌توان به کمک AddressSanitizer و با تحمل کمی افت Performance جلوگیری کرد)

اهمیت این موضوع این است که اگر آرایه بر روی Heap تعریف شده باشد امکان دستکاری Heap-Metadata (و یا داده‌ی مربوط به شی دیگر) وجود داشته و اگر آرایه بر روی Stack تعریف شده باشد به دلیل ذخیره‌ی ReturnAdress بر روی Stack امکان دستکاری آن و اجرای کد وجود دارد.

در این ویدئو که بخشی از یکی از کلاس‌هایم است این موارد توضیح داده شده و در یک مثال ساده PoCای از تغییر آدرس بازگشت تابع با ارسال اندیس منفی برای آرایه و اجرای تابعی دلخواه و سپس تاثیر فعال کردن AddressSanitizer نمایش داده می‌شود.

لینک ویدئو در یوتیوب:
https://youtu.be/4LBiyGrcO3E
لینک ویدئو در آپارات:
https://aparat.com/v/jR38x

#ShortLinuxInternals #linux #internals #gdb #x86 #exploitation #gcc #AddressSanitizer
15👍8
مروری بر روی ساختار فایل‌های PE‌ ویندوز

فایل‌های (PE) Portable Executable فرمت استاندارد اجرایی در سیستم‌عامل ویندوز هستند. این فایل‌ها نقش اساسی در اجرای برنامه‌ها و اپلیکیشن‌ها در پلتفرم ویندوز ایفا کرده و در فایل‌های اجرایی، Obejct Files، فایل‌های DLL، فایل‌های sys درایورها و حتی در فایل‌های EFI مورد استفاده قرار می‌گیرند.

در حالت کلی این فایل‌ها شامل یکسری Header‌ و یکسری بخش هستند که هدرها حاوی Meta-Data‌ و بخش‌ها حاوی خود داده هستند.
اطلاعاتی که در هدرها هستند برای مشخص کردن معماری که فایل بر روی آن قابل اجرا بوده، تعداد بخش‌های موجود در فایل، نوع بخش، آدرس بخش بر روی فایل و درون حافظه، جنس داده‌، مجوزهای دسترسی به داده و موارد مختلف دیگر است.

از دیگر مواردی که در فایل‌های PE ‌مشخص می‌شود توابعی هستند که برنامه به آن‌ها نیاز داشته و از طریق DLLها و با انجام شدن Dynamic Linking به آن‌ها دسترسی پیدا می‌کنند. در صورتیکه فایل PE بجای فایل exe یک فایل DLL باشد توابعی که Export ‌کرده و برنامه‌ها با استفاده از DLL به آن‌ها دسترسی خواهند داشت نیز در این ساختار مشخص می‌شوند.

درک فرمت و ساختار فایل‌های PE برای وظایف مختلفی از جمله Debug برنامه‌ها، مهندسی معکوس و تحلیل بدافزار در ویندوز لازم است.
در این ویدئو مروری بر روی ساختار فایل‌های PE، هدرها و بخش‌های آن و اطلاعاتی که در بر دارند انجام داده و با ساختار آن‌ها آشنا می‌شویم.

لینک ویدئو در یوتیوب:
https://youtu.be/Ueu-5XEDwqA
لینک ویدئو در آپارات:
https://www.aparat.com/v/Y5c7n

#ShortWinInternals #windows #internals #PE #PortableExecutable #101HexEditor
👍172
Windows Internals and Memory Analysis - SLIDES.pdf
6.7 MB
📚 انتشار اسلایدهای دوره Windows Internals and Memory Analysis

‼️ از هفته‌ی آخر مهرماه دوره شروع شده و هر چهارشنبه یک فصل برای شرکت‌کنندگان ارسال میشه و تا الان مباحث مختلفی از درک ساختار ویندوز و کار با WinDbg تا جزئیات پروسه و نخ، مدیریت حافظه و نوشتن درایور ارسال شده و این هفته هم نوبت به جزئیات فایل‌های PE رسید.

🎯 تصمیم گرفتم اسلایدهای دوره که برای آماده کردن آن‌ها از اسلایدهای دوره‌هایی که خریده بودم تا مقاله‌های مختلف و بعضا درک خودم استفاده کرده بودم را به صورت عمومی منتشر کنم که هم بقیه بتونند مفاهیم مختلف رو مرور کنند و هم اگر مدرس هستند در دوره‌های خودشون بهره ببرند.

ℹ️ یک عادتی که من دارم اینه که اگر از عکس یا مطلبی در اسلاید کلاس‌هام استفاده می‌کنم لینک مقاله رو هم به عنوان Source پایین صفحه می‌گذارم که بقیه بتونند برای عمیق شدن در موضوع به مطالعه‌ی مقاله بپردازند و حق کپی‌رایت هم رعایت بشه، حتما مقاله‌ها رو هم چک کنید.

📌 امیدوارم براتون مفید باشه و بهره ببرید 📌
34👍12
Linux Internals and Forensics.pdf
14.9 MB
📚 انتشار اسلایدهای دوره Linux Internals and Forensics

‼️ اخیرا دوره‌ای در زمینه‌ی Internal لینوکس و استفاده از آن برای Forensics داشتم و تصمیم گرفتم اسلایدهای دوره و بخش‌هایی از آن را که به توضیح طرز کار قسمتی از لینوکس می‌باشد، به صورت ویدئوهای کوتاه منتشر کنم.

ℹ️ این دوره موارد کلی زیر را پوشش داده و برای اطلاع از جزئیات مطالب می‌توانید به مرور اسلایدها بپردازید. همچنین در تمامی بخش‌ها لینک‌هایی برای ارجاع به مقالات و کسب اطلاعات بیشتر وجود دارد که می‌توانید از ‌آن‌ها برای مطالعه‌ی بیشتر استفاده کنید.
* Programming Review
* Building and Debugging Linux Kernel
* System Calls Internals
* Writing Kernel Modules
* Process and Thread Internals
* Ftrace and Hooking Kernel Functions
* IPC Mechanisms
* Linux Memory Forensics
* ELF Structure
* MBR and GPT Overview
* VFS Internals
* EXT4 File System Internals
* Disk Forensics
* Linux Malware Techniques

📌برای دسترسی به نمونه کدهای استفاده شده در دوره از مخزن زیر استفاده کنید:
https://github.com/akazemi67/Teaching/tree/main/Linux%20Internals%20Course
23👏4👍1
شیوه‌ي دریافت اطلاعات فایل‌ها از سیستم‌عامل توسط دستور ls

یک سیستم‌عامل به دو بخش UserMode و KernelMode‌ تقسیم می‌شود که از نظر حافظه و سطح دسترسی کاملا از هم جدا می‌باشند. داده‌ساختارهای اصلی سیستم‌عامل مثل اطلاعات مربوط به پروسه‌ها/نخ‌ها، شیوه‌ی زمانبندی آن‌ها، درایورها و سیستم‌فایل در فضای آدردهی کرنل بوده و در این سطح اجرا می‌شوند.

برای ارتباط با سطح کرنل از UserMode از System Call استفاده می‌شود که API درخواست از سیستم‌عامل بوده و امکان اجرای درخواستی از طریق آنرا فراهم می‌کنند. حتی اجرای یک دستور بسیار ساده مثل echo hi نیز باید از SystemCallها کمک گرفته و از طریق آن‌ها متنی را در FileDenoscriptor شماره‌ی ۱ که همان StandardOutput می‌باشد بنویسد.

در این ویدئو ابتدا توابعی که از طریق آن‌ها می‌توان خصیصه‌های فایل‌ها را بدست آورد معرفی شده و کدی برای دریافت نوع و اندازه‌ی فایل می‌نویسیم، سپس مروری بر روی طریقه‌ی کار دستور ls به صورت اجمال انجام داده و SystemCallای که این دستور از آن برای نمایش جزئیات فایل‌ها در لینوکس استفاده می‌کند را معرفی می‌کنیم.

لینک ویدئو در یوتیوب:
https://youtu.be/118PLXAheJ8
لینک ویدئو در آپارات:
https://www.aparat.com/v/8k9zh

#ShortLinuxInternals #linux #internals #syscalls #systemcalls #ls #commands
19👍1
بررسی شیوه‌ی نگهداری اطلاعات پروسه‌ها در کرنل ویندوز

از دید کرنل ویندوز، هر پروسه دارای یک شی از ساختار EPROCESS بوده و اطلاعات پروسه‌ها در یک لیست پیوندی حلقوی دو طرفه نگهداری می‌شود. متغیر سراسری PsActiveProcessHead اشاره‌گری به اولین و آخرین پروسه داشته «به خاطر دوطرفه بودن لیست پیوندی دارای دو اشاره‌گر Flink/Blink می‌باشد» و به کمک آن می‌توان لیست را پیمایش کرد.

برای ایجاد لیست پیوندی، هر شی EPROCESS به کمک آیتمی به اسم ActiveProcessLinks که آن هم دو بخش Flink/Blink دارد پروسه‌ها را به یکدیگر متصل کرده و به Offsetای از ساختار EPROCESS که مربوط به ActiveProcessLinks می‌باشد اشاره می‌کند. در این روند Flink به Offset پروسه‌ی بعدی و Blink به Offset پروسه‌ی قبلی اشاره می‌کند.

در این ویدئوی کوتاه که بخشی از کلاس‌هایم است به کمک WinDbg این لیست بررسی شده و اطلاعات پروسه‌ها از آن استخراج می‌شود.

لینک ویدئو در یوتیوب:
https://youtu.be/zLxAtROZJWo
لینک ویدئو در آپارات:
https://aparat.com/v/iq3Xy

#ShortWinInternals #windows #internals #EPROCESS #WinDbg #ActiveProcessLinks
14👍8👏1
دعوت از جامعه‌ی IT مخصوصا متخصصان و مدرسان حوزه‌ی امنیت و لینوکس برای داوری و بیان مشکلات کارم

امسال تجربه‌ی جالبی در زمینه‌ی تدریس یک دوره‌ با شرکت SITS «زیرساخت امن خدمات تراکنشی بانک ملت» داشتم که سوالات و ابهامات زیادی برایم ایجاد کرد که باعث شد تصمیم بگیرم روند کار، تجربه‌‌ام و حتی ویدئوهای دوره رو اینجا به اشتراک بگذارم و امیدوارم دوستان همراهی کنند و با بررسی مطالب دوره، اشتراک‌گذاری، نظر دادن و ذکر اشکالاتی که می‌بینند به من کمک کنند که هم کارم رو بهبود بدم و هم اینکه مجدد کلاسی نداشته باشم که در نهایت پولم رو دریافت نکنم!

تابستان امسال از طرف SITS با من تماس گرفتند برای یک دوره که Internal و Forensic‌ لینوکس رو تدریس کنم. من یک سرفصلی آماده و ارسال کردم که مورد تایید قرار گرفت و چون قرارداد شخصی نمی‌بستند من با آکادمی هماهنگ کردم و توافق شد که دوره از طرف آکادمی برگزار بشه. مدت زمان دوره ۴۰ ساعت در نظر گرفته شده و قیمت دوره بر اساس ۴۰ساعت بسته شده و پیش‌فاکتور برای SITS‌ ارسال شد. چون قرار بود دو روز در هفته و هر روز ۳ساعت کلاس داشته باشیم من گفتم که ۱۴جلسه‌ی ۳ ساعته و در مجموع ۴۲ساعت کلاس برگزار می‌کنیم و در فاکتور همین مدت زمان قید شد. با واریز ۵۰درصد مبلغ قرارداد، دوره اوایل مهر به صورت آنلاین آغاز شد.

با اینکه من ابتدای هر کلاسی کل کلاس رو مرور می‌کنم و میگم که چه ترتیبی پیش گرفته میشه و چه مطالبی بیان میشه، در ۴جلسه‌ی اول تقریبا هر جلسه یک بحثی در مورد سرفصل داشتیم و من باید توضیح می‌دادم که چه روندی داریم طی می‌کنیم و چرا مطالب به این صورت بیان میشه. مثل این بود که سرفصل و مطالب دوره برای افرادی که در دوره شرکت کرده‌اند مبهمه و نمی‌دونند دوره در چه زمینه‌ایه و چه چیزی رو می‌خواد پوشش بده. این بود که من پس از جلسه‌ی چهارم کلاس رو کنسل کردم و ذکر کردم که بررسی کنید آیا این دوره رو نیاز دارید و آیا سرفصلی که خودتون تایید کرده‌اید درسته یا خیر! از آکادمی با من تماس گرفتند که دوره رو ادامه بدید و مشکل با رابط سازمانی بررسی و حل شده‌ است. این بود که دوره ادامه پیدا کرد ولی تعداد شرکت کنندگان همچنان ثابت نبوده و خیلی متغیر بود!

چند جلسه‌ی دیگر پیش رفت و در یک جلسه من بودم تنهای تنها!!! کسی از SITS آنلاین نشد و پس از پیگیری مشخص شد درگیر جابجایی بوده‌اند و فرصت اطلاع رسانی برای کنسل کردن کلاس نداشته‌اند و من فقط بیکار بودم که از کار زدم و آنلاین شدم و منتظر تدریس! این بود که به پشتیبانی آکادمی اطلاع دادم به خاطر این موضوع باید یک جلسه از کلاس کم کنیم و کلاس بجای ۱۴ جلسه بشه ۱۳ جلسه چون من آنلاین و آماده‌ی تدریس بودم ولی از نظر دوستان وقت من ارزش اطلاع رسانی برای کنسل کردن نداشته! پشتیبان آکادمی هم این موضوع رو به رابط سازمانی اطلاع رسانی کردند.

دوره ادامه داشت تا اواخر دوره هم مجدد این حرکت تکرار شده و ۲ نفر پس از ۱۰ دقیقه که من منتظر بودم حاضر شدند و هرچقدر هم من ازشون تلاش کردم بپرسم که آیا شروع کنیم و بقیه می‌آیند یا خیر پاسخی دریافت نکردم و یک جلسه‌ی دیگر نیز به خاطر دوستان کنسل شد. اینبار هم می‌خواستم یک جلسه‌ی دیگر کسر کنم ولی فقط به پشتیبانی آکادمی اطلاع دادم که کلاس ۱۳ جلسه بیشتر نبوده و علی‌رغم اینکه من مطلب دارم برای بیان کردن در ۱۳ جلسه مطالب دوره جمع شده و کلاس پایان می‌پذیرد. این بود که اواخر آذرماه دوره با برگزاری ۱۳ جلسه به اتمام رسید.

الان حدود ۲ماه از اتمام دوره می‌گذرد و پس از کلی پیگیری توسط دوستان آکادمی «که واقعا از همشون کمال قدردانی و تشکر رو دارم» پیگیری‌های خودم، بیان مفصل روندی که طی شده توسط خودم به صورت voice در گروه دوره که ۳۰ نفر از کارشناسان تا افراد رده‌بالای SITS هم در آن بودند، نه تنها ۵۰درصد مابقی دوره تسویه نشده، حتی پاسخی دریافت نکرده‌ام که اشکال دوره چی بوده و چرا پرداخت انجام نشده. آیا مطالب طبق سرفصل پیش نرفته؟ آیا من بی اخلاقی در برخورد و تدریس داشته‌ام؟ آیا مدت زمان دوره کم بوده؟ خلاصه اینکه من به خطایم آگاه نشدم!

در لینک زیر تمامی مطالب دوره از سرفصل تا اسلاید و ویدئو و کد وجود دارد. لطفا دوستان بررسی کنند و بازخورد دهند. اگر مطالب براتون مفید است استفاده کرده و منتشر کنید تا به دست افراد بیشتری برسه ولی حتما نگاه نقادانه داشته و اشکالات کارم رو بیان کنید که منم کارم رو بهبود بدم.

https://1drv.ms/f/s!Ai-nCVsaY1b5tzTMfCBo4c6MeIi_?e=eE1rpU

تشکر و سپاس فراوان.
45👍27🤔1
📚 انتشار دوره Windows Internals and Memory Analysis در مکتب‌خونه و یک تخفیف ۵۰درصدی برای ثبت‌نام

🗓️ سال ۹۷ اولین همکاری من با مکتب‌خونه با انتشار دوره‌ای در زمینه‌ی شبکه شکل گرفت که تجربه‌ی خوبی بود.
از آن زمان تا کنون چندبار تلاش شد که مجدد همکاری شکل گرفته و دوره‌ی دیگری از طریق مکتب‌خونه منتشر کنم ولی متاسفانه به دلیل مشغله‌ی کاری و سختی آماده کردن دوره‌ی آفلاین این امر میسر نشد.

ℹ️ امسال دوره‌ی Windows Internals and Memory Analysis را به صورت آفلاین آماده کردم که زحمت زیادی داشته و انرژی زیادی نیز ازم گرفت.

🎯 با صحبتی که با تیم خوب مکتب‌خونه داشتم بنا بر این شد که این دوره روی سایت مکتب‌خونه منتشر شده و از این به بعد از این طریق ارائه بشه، به این امید که افراد بیشتری ازش استقبال کرده و مخاطب بیشتری داشته باشه.

می‌تونید دوره رو از طریق لینک زیر مشاهده و ثبت‌نام کنید:
yun.ir/rx6jy2

📴 برای دریافت ۵۰ درصد تخفیف، در زمان خرید کد tahlil-kazemi را وارد کنید.

#WindowsInternals #Course #Training #Maktabkhooneh
35👍2🤔1
سلام خدمت همه‌ی همراهان
🌹 سال نو مبارک 🌹

🪴امیدوارم در 403 به جای خطا خوردن‌ها و ممنوع شدن‌ها، گشایش‌هایی برای همه‌ی شما در راه باشد و به بهترین‌ها برسید.

🎯 برای امسال برنامه‌ی تهیه یکسری آموزش جدید و خاص رو دارم که به مرور اعلام می‌کنم.

🧩 برنامه انتشار ویدئو از InTERnAL ویندور و لینوکس هم مثل قبل ادامه خواهد داشت.

🌺 به امید بهترین‌ها برای همه
47👏4👍1👎1
مروری بر حافظه‌ی مجازی در ویندوز

وقتی یک برنامه اجرا می‌شود، برای آن پروسه‌ای ایجاد شده که امکانات مختلفی از جمله دسترسی به حافظه را فراهم می‌کند. پروسه‌ها مستقیم به حافظه‌ی فیزیکی (همان RAM) دسترسی نداشته و یک لایه‌ی Abstraction توسط سیستم‌عامل ایجاد می‌شود که به آن حافظه‌ی مجازی می‌گویند.

این لایه وظایفی دارد که بخشی از آن به صورت خلاصه عبارتند از:
• مدیریت اینکه داده دقیقا در کدام آدرس RAM قرار دارد و Map کردن آن در فضای مجازی پروسه
• استفاده از Hard Disk در صورت کم بودن RAM بدون اینکه پروسه از آن اطلاع داشته باشد
• جلوگیری از تکرار داده در حافظه‌ی فیزیکی و Map کردن بخشی که بین چند پروسه مشترک است برای آن‌ها
• کنترل دسترسی به اطلاعات خاص و تعیین permission برای داده
• دسترسی به داده‌ها به صورت یکسری Chunk بجای دسترسی بایت به بایت (تعریف Page)

از طرف دیگر از دید پروسه کل فضای آدرس‌دهی ممکن (در مدل ۳۲بیتی ۲گیگابایت و در مدل ۶۴بیتی ۱۲۸ترابایت) قابل تخصیص بوده و می‌توان از آن استفاده نمود ولی اینکه واقعا چقدر از آن قابل استفاده است بسته به میزان RAM موجود و میزان Hardای دارد که برای استفاده به عنوان حافظه در سیستم‌عامل تعیین شده است.

ویندوز امکان رزرو کردن کل فضای آدرس‌دهی ممکن را به پروسه‌ها می‌دهد ولی برای استفاده‌ی واقعی و قراردادن داده در آن باید آن فضا commit شده و در این مرحله است که امکان‌پذیر بودن آن با توجه به میزان کل فضای موجود، توسط سیستم‌عامل چک شده و اگر امکان‌پذیر بود به پروسه امکان دسترسی داده می‌شود.

در ابزارهای مختلفی که در ویندوز وجود دارند (مثل Task Manager, Process Explorer) یکسری Counter برای اطلاع پیدا کردن از وضعیت حافظه در سیستم و میزان فضای رزرو یا استفاده شده توسط پروسه‌ها وجود دارد که می‌توان به کمک آن‌ها از اتفاقاتی که برای حافظه رخ می‌دهد اطلاع پیدا کرد.

در این ویدئو مروری بر وظایف حافظه‌ی مجازی در ویندوز انجام گرفته و Counterهای موجود، برای بررسی آن در ابزارهای مختلف شرح داده می‌شوند.

لینک ویدئو در یوتیوب:
https://youtu.be/x5AnJpGBdW4
لینک ویدئو در آپارات:
https://aparat.com/v/NIsUi

#ShortWinInternals #windows #memory #internals #VirtualMemory #MemoryCounters
12👍6👏1
شیوه‌ی دریافت حافظه توسط برنامه‌ها و درایورها در ویندوز

در پست قبلی در مورد حافظه‌ی مجازی در ویندوز صحبت کردیم و وظایف این لایه و پارامترهایی که در ابزارهای مختلف برای بررسی میزان حافظه‌ی تخصیص داده شده به پروسه‌ها وجود دارند را مرور کردیم. در این پست جزئیات دریافت حافظه از ویندوز توسط برنامه‌ها و درایورها را شرح داده و این فرآیند را در سمت کرنل عمیق‌تر بررسی می‌کنیم.

در user mode چند لایه API برای دریافت حافظه از سیستم‌عامل ویندوز وجود دارد. در پایین‌ترین سطح، APIهای VirtualAlloc وجود دارند که هیچ‌گونه مدیریتی بر روی حافظه‌ی دریافت شده انجام نداده و حافظه را در واحد‌هایی به اندازه‌ی Page (پیش‌فرض 4KB) تخصیص می‌دهند. این APIها امکان reserve/commit کردن حافظه را فراهم کرده و برای کار با حافظه‌های بزرگ مناسب هستند.

لایه‌ی بعدی APIهای حافظه که برای کار با اندازهای کوچک حافظه مثل چندبایت نیز مناسب است Heap می‌باشد. این APIها به صورت داخلی از APIهای لایه‌ی قبلی استفاده کرده و نیازی به تخصیص حافظه در ابعاد Page را ندارند. بر روی این لایه است که زبان‌هایی مثل C/C++ پیاده‌سازی‌های malloc/new و free/delete را انجام می‌دهند (جزئیات پیاده‌سازی وابسته به کامپایلر است) که مربوط به پیاده‌سازی‌های Compilerها می‌باشد. در این لایه دیگر APIهای ویندوز مستقیم توسط برنامه‌نویس استفاده نشده و نیازی به کار با آن‌ها ندارد.

اما در سمت کرنل ماجرا از چه قرار است؟ در سمت کرنل چیزی با عنوان VirtualAlloc/Heap وجود ندارد و به درایورها حافظه از طریق دو نوع Pool اختصاص داده می‌شود. اولین نوع Non-Paged Pool است که حافظه‌ی تخصیص داده شده از آن تضمین می‌شود که همیشه در RAM باشد. این موضوع برای جلوگیری از Deadlock و Crash کردن درایور اهمیت دارد (جزئیات این موضوع بماند برای یک پست و ویدئوی دیگر!) نوع دوم Pool که حافظه‌ی آن ممکن است در RAM نبوده و به دیسک منتقل شود Paged Pool است.

در این ویدئو جزئیات تخصیص حافظه در سمت کرنل و APIهای ExAllocatePool بررسی شده، در یک درایور تخصیص و آزاد شدن حافظه نمایش داده شده و سپس به کمک WinDbg حافظه‌ی تخصیص داده شده به درایور بررسی می‌شود.

لینک ویدئو در یوتیوب:
https://youtu.be/pMPyT13jzwk
لینک ویدئو در آپارات:
https://aparat.com/v/VIvgR

#ShortWinInternals #windows #memory #internals #VirtualMemory #MemoryCounters #kernel #drivers #SystemPools #WinDbg
👍103
نحوه‌ی استفاده‌ی لینوکس از vDSO برای سرعت بخشیدن به فراخوانی‌های سیستمی

اگر ساختار حافظه‌ی پروسه‌های لینوکسی را مشاهده کنید (مثلا از طریق cat /proc/pid/maps) در کنار بخش‌های مربوط به کد، داده، پشته، هیپ و کتابخانه‌های استفاده شده در برنامه، دو بخش نیز مشاهده می‌شود که عناوین vsyscall/vdso دارند که آدرس‌های یکی مربوط به Kernel Mode بوده و دیگری آدرس‌های User Modeای دارد.

این دو، مکانیزم‌هایی هستند که برای سرعت بخشیدن به اجرای syscallهایی که نرخ فراخوانی بالایی دارند استفاده می‌شوند. یکی از این syscallها gettimeofday است که به صورت مستقیم و غیر مستقیم توسط تعداد زیادی از توابع کتابخانه‌ای فراخوانی می‌شود و به دلیل سنگین بودن فراخوانی syscall و رفتن به Kernel و پردازش درخواست و بازگشتن به User Mode در فضای آدرس‌دهی پروسه قرار می‌گیرند که کار فراخوانی سریع‌تر شده و نیاز به طی مسیر پیش‌فرض syscallها نباشد.

در لینوکس کل فضای در اختیار پروسه در دسترس بوده و امکان dump آن به کمک dd وجود دارد. در این ویدئو مروری بر روی کاربرد vDSO انجام گرفته، علت استفاده از آن به جای vsyscall شرح داده شده و به dump و بررسی vDSO‌ و مشاهده‌ی توابع تعریف شده در آن می‌پردازیم.

ℹ️پ.ن: اگر دوست دارید که جزئیات system callها را در لینوکس بدانید، لینک انتهای پست را در کانالم چک کنید. من قبلا در یک ارائه جزئیات system callهای لینوکس از شیوه‌ی تعریف آن‌ها، نحوه‌ی اضافه کردن یک syscall به کرنل لینوکس و جزئیاتی که در فراخوانی system callهای لینوکس وجود دارد را به صورت کامل شرح داده‌ام که می‌توانید ویدئوی آنرا مشاهده کنید.

لینک ویدئوی vDSO در یوتیوب:
https://youtu.be/UK6annv-t-s
لینک ویدئوی vDSO در آپارات:
https://aparat.com/v/7HRz1
لینک پست مربوط به جزئیات syscall در لینوکس:
https://news.1rj.ru/str/OxAA55/87

#ShortLinuxInternals #linux #internals #syscalls #systemcalls #ELF #dump #memory
12👏4
مقدار صفر برای argc در برنامه‌های لینوکسی. چرا و چگونه؟

همه چیز از بررسی CVE-2021-4034 و کامپایل مجدد PolKit بر روی Ubuntu 22.04 شروع شد! تصمیم داشتم یک نسخه‌ی آسیب‌پذیر PolKit رو با فعال کردن Debug Symbols کامپایل کرده و مراحل کامل این CVE رو در GDB بررسی کنم. به صورت خلاصه بگم که این آسیب‌پذیری در باینری pkexec وجود دارد و به کمک آن می‌توان LPE انجام داد. یکی از شرایط استفاده از این آسیب‌پذیری این است که در زمان اجرای pkexec شرط argc==0 برقرار باشد که از طریق آن متغیرهای محلی خوانده شده و بتوان یک library مخرب را بارگذاری نمود.

از آنجایی که pkexec علاوه بر لینوکس بر روی Solaris, BSD هم قابل استفاده است، در مقاله‌ی اصلی این CVE که توسط Qualys Security منتشر شده است متن زیر مشاهده می‌شود که از الزام argc==0 برای امکان‌پذیر بودن این LPE خبر می‌دهد.
OpenBSD is not exploitable, because its kernel refuses to execve() a program if argc is 0

پس فرض من این بود که در نسخه‌های اخیر لینوکس هم با کامپایل PolKit باید بتوان این آسیب‌پذیری را تست کرد. این بود که بر روی Ubuntu 22.04 یک نسخه‌ی آسیب‌پذیر را کامپایل کرده و یک کد ساده به صورت زیر نوشتم که pkexec را اجرا کرده و argc==0 برقرار باشد.

void main() {
char *args[] = { NULL };
char *envs[] = {"SHELL=/bin/bash", 0};
execve("pkexec", args, envs);
}

با اجرای برنامه و زدن strace مشاهده شد که فراخوانی در سطح user طبق انتظار انجام شد.
execve("pkexec", [], 0x7ffe3883b200 /* 1 var */)

ولی دو تا مورد عجیب رخ داد. اول اینکه برنامه در gdb بر خلاف انتظار با argc==1‌ اجرا شده و argv[0] که اسم برنامه در آن قرار می‌گیرد و طبق مدل فراخوانی باید NULL می‌بود برابر “” شده بود. مورد دومی که عجیب بود پیام زیر در dmesg بود.
process 'exploit' launched 'pkexec' with NULL argv: empty string added

با رسیدن به این مرحله به سراغ Ubuntu 20.04 رفتم و همین کد را بر روی آن اجرا کردم که همه چیز طبق انتظار رخ داده و در gdb با رسیدن به main برنامه‌ی pkexec مقدار argc==0 برقرار بوده و امکان تست CVE وجود داشت. اینجا واضح بود که در کرنل‌های جدید لینوکس در فراخوانی سیستمی execve تغییراتی اعمال شده است که جلوی اجرای برنامه‌ها با argc==0 گرفته شود. اینجا دیگه لازم بود کد کرنل چک شود!

با رفتن به github‌ و بررسی فایل fs/exec.c کرنل لینوکس مشاهده شد که در تابع اجرای فراخوانی سیستمی execve کد زیر در March 2022 اضافه شده که جلوی اجرای برنامه‌ها با argc==0 را می‌گیرد.

/*
* When argv is empty, add an empty string ("") as argv[0] to
* ensure confused userspace programs that start processing
* from argv[1] won't end up walking envp. See also
* bprm_stack_limits().
*/
if (bprm->argc == 0) {
retval = copy_string_kernel("", bprm);
if (retval < 0)
goto out_free;
bprm->argc = 1;
}

پس از این به بعد علاوه بر OpenBSD بر روی لینوکس نیز امکان اجرای آسیب‌پذیری‌های این مدلی وجود نخواهد داشت! :-D
پ.ن: در آینده‌ یک ویدئو از شیوه‌ی کامل اجرای این CVE منتشر می‌کنم.

#linux #kernel #CVE #PolKit #pkexec #execve
👍275
جزئیات پروسه و نخ در لینوکس

به صورت خلاصه از دید ویندوز پروسه فقط یک container می‌باشد که اجرا نشده و فضایی برای اجرای Threadها فراهم می‌کند و در سطح کرنل نیز دو ساختار EPROCESS, ETHREAD برای این دو تعریف شده‌اند. اما در لینوکس ماجرا متفاوت است و Process, Thread هر دو قابلیت اجرا داشته و در سطح کرنل نیز یک ساختار task_struct برای آن‌ها تعریف شده است. در دنیای شی‌گرایی مثل این است که در لینوکس یک کلاس برای این دو وجود دارد و فقط در زمان ایجاد شی خصوصیات متفاوتی برای آن‌ها تنظیم می‌شود.

اگر به سراغ برنامه‌نویسی سیستمی در لینوکس برویم، تابع fork برای ایجاد پروسه استفاده شده و از تابع pthread_create نیز برای ایجاد نخ در لینوکس استفاده می‌شود. در سطحی کمی پایین‌تر، هر دوی این توابع syscallای به نام clone را فراخوانی می‌کنند و با ست‌کردن فلگ‌هایی مشخص می‌کنند که قصد ایجاد پروسه یا نخ را دارند. در زمان بررسی برنامه‌ها، در خروجی دستور ps برای یک برنامه‌ی چند پروسه‌ای pidهای مختلفی خواهیم دید ولی در یک برنامه‌ی چند نخی pidها یکسان بوده ولی عددهای متفاوتی در فیلد Light-Weight Process-LWP می‌بینیم.

نکته‌ی جالب دیگر این است که در سطح کرنل پروسه‌ها یک لیست پیوندی تشکیل می‌دهند. هم شیوه‌ی ایجاد لیست پیوندی Generic در سطح کرنل و در زبان C موضوع جالبی است و هم اینکه به کمک فیلدی به اسم tasks می‌توانیم یک لیست پیوندی از پروسه‌ها تشکیل دهیم که به پروسه‌های قبلی و بعدی اشاره می‌کند.

این موارد و موارد دیگری از جزئیات پروسه‌ها و نخ‌های لینوکس مواردی هستند که در این ویدئو به آن می‌پردازیم.

لینک ویدئو در یوتیوب:
https://youtu.be/0fxYtyFn8Jc
لینک ویدئو در آپارات:
https://aparat.com/v/cnytp55

#ShortLinuxInternals #linux #internals #syscalls #kernel #process #thread #gdb #qemu #clone #LWP
👍135
استفاده از ftrace‌ برای بررسی توابع فراخوانی شده در کرنل لینوکس

به کمک دستور strace می‌توان system callهایی که در اجرای برنامه‌ها فراخوانی می‌شوند را بررسی نمود ولی امکان اطلاع پیدا کردن از توابعی که درون کرنل لینوکی فراخوانی می‌شوند وجود ندارد و به عنوان مثال نمی‌توان متوجه شد که در خواندن یک فایل، از چه توابعی در چه ماژولی و یا چه سیستم‌فایلی استفاده می‌شود.

لینوکس به کمک قرار دادن یکسری point در بخش‌هایی از کرنل، مکانیزمی به اسم ftrace فراهم می‌کند که مشابه procfs پس از mount شدن، با فراهم کردن یکسری فایل، امکان بررسی توابعی کرنلی که در رویدادهای مختلف فراخوانی می‌شوند را در اختیار قرار می‌دهد.

از ftrace در حالت‌های مختلفی می‌توان استفاده نمود. مثلا می‌توان فقط لیست توابعی که فراخوانی می‌شوند را مشاهده کرده و یا به صورت نمایش گرافی، کلیه‌ی توابعی که با شروع از یک تابع یکی پس از دیگری فراخوانی می‌شوند را دیده و به این صورت مثلا متوجه شد که پس از تابع vfs_read که یک تابع برای پردازش درخواست خواندن از فایل در VFS لینوکس است، به سراغ تابع خواندن از ext4 می‌رسیم یا xfs.

یکی از دیگر کاربردهای ftrace که هم در توسعه‌ی ابزارهای امنیتی کاربرد دارد و هم بدافزارها می‌توانند از آن استفاده کنند پیاده‌سازی hooking برای توابع کرنل لینوکس است. در این روش ftrace در ابتدای فراخوانی تابع کرنلی، به سراغ اجرای تابعی که شما مشخص کرده‌اید رفته و پس از اتمام کار تابع شما، می‌تواند به چرخه‌ی اصلی فراخوانی تابع کرنل بازگشته و آنرا تا انتها اجرا کند.

در این ویدئو کاربرد ftrace شرح داده شده و شیوه‌های مختلف استفاده از آن نمایش داده می‌شود.

لینک ویدئو در یوتیوب:
https://youtu.be/AhxxT7lal5c
لینک ویدئو در آپارات:
https://aparat.com/v/acmv35h

#ShortLinuxInternals #linux #internals #kernel #tracing #ftrace
👍154
سرقت توکن پروسه‌ها در ویندوز به کمک WinDbg

توکن یا به صورت کامل‌تر Access Token در ویندوز، یک شی است که شرایط امنیتی که یک پروسه یا نخ تحت آن می‌توانند کار کنند را مشخص می‌کند. توکن با احراز هویت موفق یک کاربر ایجاد شده و هر پروسه‌ای که توسط کاربر ایجاد شود، یک نسخه از آنرا خواهد داشت.

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

برخی از اطلاعاتی که توسط توکن مشخص می‌شوند عبارتند از: شناسه یا SID‌ کاربر. شناسه‌ی گروه‌هایی که کاربر عضوی از آن‌هاست. شناسه‌ی نشست جاری. لیستی از مجوزهایی که کاربر یا گروه‌های آن دارند.

یکی از کارهایی که با توکن‌ها قابل انجام بوده و در سرویس‌ها کاربرد زیادی دارد impersonation است. در این مدل، یک نخ با توکن متفاوتی از توکن اصلی خود اجرا شده و در نتیجه مجوزهای متفاوتی خواهد داشت. به عنوان مثال فرض کنید یک File Server دارید که فایل‌های آن محدودیت‌های دسترسی متفاوتی دارند. در این مثال، سرور با انجام impersonation درخواست هر کلاینت را با توکن همان کلاینت پاسخ داده و در نتیجه هر کاربر تنها به فایل‌های خود دسترسی خواهد داشت.

یکی از کارهایی که بدافزارها از آن بهره می‌برند همین بحث impersonation و دسترسی به منابع مختلف، مثل dump اطلاعات کاربران، است. در این حالت بدافزار توکن یک پروسه با دسترسی بالا را دزدیده و از آن برای مقاصد خود استفاده می‌کند.

در این ویدئو به کمک WinDbg مفهوم توکن و شیوه‌ی دزدیدن و قرار دادن آن بر روی پروسه‌ی دلخواهی شرح داده می‌شود که هم با موضوع توکن آشنا شده و هم به صورت عملی ببینیم که بدافزارها چطور می‌توانند از impersonation سواستفاده کنند.


لینک ویدئو در یوتیوب:
https://youtu.be/NTPVeauBDe4
لینک ویدئو در آپارات:
https://www.aparat.com/v/cvyprh5

#ShortWinInternals #windows #internals #token #WinDbg #impersonation #kernel
👍209👏2