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

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

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

ارتباط با مدیر کانال از طریق:
@akazemi67
Download Telegram
بررسی قرارداد فراخوانی توابع در برنامه‌های ۳۲بیتی

در این ویدئو که بخشی از یکی از کلاس‌هایم است، در مورد قراردادهای مختلف فراخوانی توابع در برنامه‌های ۳۲بیتی صحبت کرده و در یک برنامه‌ی ساده شیوه‌ی انجام آن‌ها را نمایش می‌دهم.
این فراخوانی‌ها عبارتند از: 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
شیوه‌ي دریافت اطلاعات فایل‌ها از سیستم‌عامل توسط دستور ls

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

برای ارتباط با سطح کرنل از UserMode از System Call استفاده می‌شود که API درخواست از سیستم‌عامل بوده و امکان اجرای درخواستی از طریق آنرا فراهم می‌کنند. حتی اجرای یک دستور بسیار ساده مثل echo hi نیز باید از SystemCallها کمک گرفته و از طریق آن‌ها متنی را در FileDescriptor شماره‌ی ۱ که همان 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
مروری بر حافظه‌ی مجازی در ویندوز

وقتی یک برنامه اجرا می‌شود، برای آن پروسه‌ای ایجاد شده که امکانات مختلفی از جمله دسترسی به حافظه را فراهم می‌کند. پروسه‌ها مستقیم به حافظه‌ی فیزیکی (همان 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://t.me/OxAA55/87

#ShortLinuxInternals #linux #internals #syscalls #systemcalls #ELF #dump #memory
11👏4
جزئیات پروسه و نخ در لینوکس

به صورت خلاصه از دید ویندوز پروسه فقط یک 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
محدود کردن اجرای پروسه‌ها به کمک Sandbox در لینوکس

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

روش‌ها و ابزارهای مختلفی برای انجام Sandboxing بر روی لینوکس وجود دارد و برخی از این روش‌ها مستقیم توسط کرنل نیز پشتیبانی می‌شوند. به عنوان مثال در لینوکس به کمک namespaces امکان جداسازی سیستم‌فایل، شبکه و پروسه‌های سیستم از یکدیگر فراهم بوده و به کمک cgroups می‌توانیم محدودیت دسترسی به RAM/CPU تعریف کنیم، که ایجاد Containerها و استفاده از docker به لطف این موارد در لینوکس امکان‌پذیر است.

یک روش جالب دیگر برای ایجاد محدودیت اجرا در لینوکس seccomp است که خود یک System Call بوده و قابلیت محدود کردن System Callهایی که یک پروسه امکان اجرای آن‌ها را دارد فراهم می‌کند. این System Call به شیوه‌های مختلفی مثل تعریف محدودیت درون برنامه، اعمال محدودیت به کمک systemd و استفاده به صورت library و با ست کردن LD_PRELOAD قابل استفاده است.

در این ویدئو کاربرد Sandboxing توضیح داده شده و پس از معرفی چند روش انجام آن، جزئیات و نحوه‌ی استفاده و کاربرد seccomp در لینوکس نمایش داده می‌شود.

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

#ShortLinuxInternals #linux #internals #kernel #programming #seccomp #sandbox #namespaces #syscalls #processes #systemd
👍1210
سیگنال و وضعیت پروسه‌ها در لینوکس

در لینوکس برای ارسال یک رویداد یا اطلاع دادن یک رخداد به پروسه‌ها می‌توان از سیگنال استفاده نمود. شیوه‌ی کار به این صورت است که پروسه در صورت دریافت سیگنال، اجرای کد اصلی خود را متوقف کرده و به سراغ پردازش Signal می‌رود. از همین روی در لینوکس به سیگنال Asynchronous Event و یا Soft Interrupt نیز گفته می‌شود.

تولید سیگنال و ارسال آن به یک پروسه می‌تواند از دل کرنل رخ داده، توسط یک پروسه‌ی دیگر بوده، از طریق Terminal و به کمک دستور kill بوده و یا حتی با فشردن کلید‌هایی مثل CTRL+Z یا CTRL+C توسط کاربر انجام شود.

پروسه با دریافت Signal در صورت وجود داشتن یک Handler درون کد برنامه‌ی خود، به سراغ اجرای آن رفته و در غیر این صورت رفتار پیش‌فرضی که سیستم‌عامل برای هر سیگنال تعریف کرده است را اجرا می‌کند که در اکثر مواقع باعث Terminate شدن اجرای پروسه می‌شود. همچنین ذکر این نکته ضروری است که امکان تعریف کردن Handler برای دو سیگنال‌ SIGKILL و SIGSTOP وجود نداشته و برای این دو همیشه رفتار تعریف شده توسط سیستم‌عامل اجرا می‌شود.

برخی از سیگنال‌ها باعث تغییر در وضعیت اجرای پروسه می‌شوند. به عنوان مثال زدن CTRL+Z در اکثر برنامه‌ها باعث می‌شود که برنامه در وضعیت Stopped قرار گرفته و به Background رود و یا زدن CTRL+C به پروسه یک Interrupt داده که ممکن است اجرای آنرا متوقف کند.

در پایان این نکته را اضافه کنم که ارسال SIGKILL با شماره ۹ برای برخی از برنامه‌ها ممکن است باعث از بین رفتن داده شود. به عنوان مثال فرض کنید که یک برنامه فایلی را باز کرده و در حال نوشتن در آن است. اگر منتظر اتمام کار برنامه نمانده و وسط کار آن SIGKILL‌ ارسال کنیم بلافاصله برنامه بسته شده و نوشتن در فایل تمام نشده و بخشی از داده از بین می‌رود ولی ارسال SIGTERM با شماره ۱۵ به برنامه در صورت Handle شدن آن توسط برنامه، این فرصت را به برنامه می‌دهد که نوشتن در فایل را به اتمام رسانده و سپس بسته شود.

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

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

#ShortLinuxInternals #linux #internals #kernel #programming #signals #processes
👍167
مروری بر روش‌های IPC در لینوکس و تست SharedMemory

بحث IPC یا Inter-Process Communication به روش‌هایی گفته می‌شود که از طریق آن دو پروسه می‌توانند با یکدیگر اطلاعاتی رد و بدل کرده یا یک رخ‌داد را به اطلاع هم برسانند. برای انجام اینکار متدهای متنوعی در لینوکس وجود دارد که قبلا نیز در مورد Signal پستی منتشر کرده بودم و جزئیات آنرا نمایش داده بودم.

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

برای استفاده از حافظه‌ی مشترک در لینوکس، با استفاده از shm_open درخواست ایجاد فضای مشترک را داده و پس از دریافت یک File Descriptor به کمک mmap حافظه‌ی مورد نیاز را از کرنل لینوکس دریافت می‌کنیم.

نکته‌ای که باید به آن توجه کنیم این است که نوشتن چند پروسه به صورت همزمان درفضای مشترک، می‌تواند ناسازگاری داده ایجاد کند که با استفاده از Semaphore یا روش‌های دیگر Synchronization بر اساس نیاز، باید بین پروسه‌ها هماهنگی ایجاد نمود.

در این ویدئو، پس از مرور کوتاهی بر روش‌های مختلف IPC به بررسی عمیق‌تر روش Shared Memory پرداخته و یک کد ساده برای تست آن می‌زنیم.


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

#ShortLinuxInternals #linux #internals #programming #processes #ipc #sharedmemory
12👍3
شیوه‌ی زمان‌بندی اجرای پروسه و نخ در لینوکس

قبل از توضیح این بخش لازمه مجدد اشاره کنم که thread/process در کرنل لینوکس با task_struct‌ پیاده‌سازی شده‌اند و در این پست بجای تکرار «اجرای پروسه و نخ» در لینوکس از عبارت اجرای وظیفه یا task استفاده می‌کنیم. با این مقدمه برسیم به اصل موضوع این پست:

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

لینوکس برای مشخص کردن اولویت اجرای taskها بر روی پردازنده و مدت زمانی که می‌توانند از پردازنده استفاده کنند الگوریتم‌های مختلفی دارد که به آن‌ها class یا policy زمان‌بندی می‌گوید. در هر کلاس نیز به کمک یک عدد، اولویت اجرای taskها را مشخص می‌کند. به عنوان مثال زمان‌بند پیش‌فرض لینوکس که در کلاس Normal قرار دارد با عنوان Completely Fair Scheduler شناخته می‌شود که در پیاده‌سازی آن از Red-Black Tree که یک درخت جستجوی دودویی Balance می‌باشد کمک گرفته شده است.

یک کلاس دیگری که در لینوکس وجود دارد کلاس RealTime می‌باشد. البته منظور از RealTime در این مورد این است که وظایف تحت یک Time Frame مشخص اجرا می‌شوند. در این کلاس امکان استفاده از روش‌های Round-Robin یا FIFO وجود دارد.

تنظیم کردن اولویت وظایف در کلاس نرمال توسط مقدار nice مشخص می‌شود که عددی در بازه‌ی منفی ۲۰ تا مثبت ۱۹ می‌باشد. در کرنل لینوکس مقدار نهایی اولویت برای الگوریتم‌های مختلف می‌تواند عددی بین صفر تا ۱۳۹ باشد و موارد مختلفی مثل Boost کردن اولویت برای پاسخ‌دهی سریع‌تر برنامه‌های گرافیکی یا وظایفی که وابستگی خاصی به آن‌ها وجود دارد نیز در اولویت نهایی تاثیر دارند. برای داشتن مقدار تنظیم شده برای اولویت و مقداری که کرنل تصمیم می‌گیرد اولویت وظیفه در زمان جاری باشد فیلد‌های متفاوتی در task_struct وجود دارند.

به عنوان نکته‌ی پایانی باید اشاره کنم که تنظیم کردن اولویت وظایف به کمک syscall ای به اسم setpriority انجام می‌شود که دستور renice نیز از آن استفاده می‌کند. به کمک دستور chrt نیز می‌توان تنظیمات مربوط به کلاس RealTime را تغییر داد.

شرح کامل موارد ذکر شده، نمایش دمو از شیوه‌ی استفاده از آن‌ها و نمایش کد کرنل مربوط به setpriotity مواردی هستند که در این ویدئو به آن‌ها می‌پردازیم. برای مشاهده‌ی ویدئو از لینک‌های زیر استفاده کنید:

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

پ.ن: اگر شیوه‌ی پیاده‌سازی پروسه/نخ در لینوکس و کاربرد task_struct برای شما شفاف نیست به پست زیر مراجعه کنید:
https://t.me/OxAA55/124

#ShortLinuxInternals #linux #internals #programming #processes #sheduling #tasks #task_struct #nice #priority
13👍5
نمایش شیوه‌ی ایجاد پروسه‌های اولیه‌ی لینوکس و طرز کار آن‌ها از روی کد کرنل

پروسه‌ها در لینوکس یک ساختار درختی دارند و همه چیز از پروسه‌ با PID‌ یک شروع میشه که در توزیع‌های جدید لینوکس systemd است ولی در نسخه‌های قدیمی‌تر init, upstart و چیزهای دیگری می‌توانست باشد. البته یک مورد جدید و جذاب دیگه unikernel می‌باشد که در آن برنامه‌های مختلف می‌توانند به عنوان PID 1 اجرا شده و در ایجاد containerهایی با وابستگی کم کاربرد دارد.

ایجاد این پروسه در تابع start_kernel از کد کرنل که در فایل init/main.c تعریف شده است انجام می‌شود. پروسه با PID 1‌ در لینوکس یک پروسه‌ی کامل می‌باشد که هم user space داشته و هم kernel space و پروسه‌هایی که این دو را داشته باشند در ساختار درختی زیر مجموعه‌ی این پروسه می‌باشند.

پروسه‌ی دومی که در تابع start_kernel ایجاد می‌شود دارای PID 2 می‌باشد و در ساختار درختی موازی این پروسه بوده و زیر مجموعه‌ی آن نمی‌باشد. اسم این پروسه kthreadd می‌باشد و بر خلاف پروسه‌ی PID 1 دارای user space نبوده و فقط kernel space دارد. این پروسه وظیفه‌ی مدیریت kernel threadها را در لینوکس دارد که برای مدیریت کارهای مختلف سیستمی و انجام وظایف مختلف مربوط به کرنل و درایورها استفاده می‌شوند.

با شروع به کار این دو پروسه سیستم‌عامل به صورت کامل بالا آمده و مابقی پروسه‌ها می‌توانند تحت آن‌ها شروع به کار کرده و سرویس‌دهی را انجام دهند. البته یک پروسه‌ی دیگر نیز با PID 0 در لینوکس وجود دارد که در خروجی ps نمی‌توانید آنرا مشاهده کنید ولی با استفاده از ابزارهایی مثل ftrace, ebpf امکان کسب اطلاعات از آن وجود دارد.

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

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

#ShortLinuxInternals #linux #internals #programming #processes #kernel #systemd #initd #kernelthreads
12👍3
مقدمه‌ای بر eBPF و کاربردهای آن

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

برای کسب اطلاعات از اتفاقات مختلفی که در سیستم‌عامل رخ می‌دهند و اعمال تغییرات در بخش‌های مختلف آن ابزارهای مختلفی توسعه داده شده‌اند که امکان کسب اطلاعات و یا اعمال تغییرات در نقاط مشخصی از کرنل را فراهم می‌کنند. قبلا در پستی یکی از این ابزارها به اسم ftrace را معرفی کرده‌ام و در این پست و ویدئو قصد معرفی ابزار دیگری به اسم eBPF را دارم که قابلیت‌هایی بسیار زیادی فراهم کرده و انعطاف پذیری بالایی در کسب اطلاعات و اعمال تغییرات در کرنل لینوکس را دارد.

در واقع می‌توان گفت که eBPF یک زبان تعامل با کرنل لینوکس است که به کمک آن می‌توان اطلاعاتی از کارکرد کرنل بدست آورده و یا در آن تغییراتی اعمال نمود. کد نوشته شده برای eBPF‌ پس از کامپایل به یک bytecode برای کرنل ارسال شده و اگر مشکلی نداشته باشد در کرنل اجرا می‌شود.

برای نمونه‌ای از کاربردهای eBPF‌ می‌توان به استفاده‌ی اندروید برای کسب اطلاعات از میزان استفاده از شبکه، استفاده‌ی Netflix ‌برای کسب اطلاعات آماری از شبکه در مقیاس بزرگ، استفاده‌ی گوگل برای پردازش بسته‌های شبکه و performance monitoring و یا استفاده‌ی Cloudflare‌ برای امنیت شبکه اشاره کرد.

در این ویدئو ابتدا eBPF‌ معرفی شده و سپس به کمک bpftrace استفاده از آن تست می‌شود.

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

#ShortLinuxInternals #linux #internals #programming #kernel #bpf #ebpf #tracing #bpftrace
👍1711
مروری بر پروسه‌های کرنلی لینوکس

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

اولین پروسه (نخ) کرنلی لینوکس kthreadd است که وظیفه‌ی ایجاد یک interface برای ایجاد و مدیریت پروسه‌های کرنلی در لینوکس را داشته و همیشه با PID‌ برابر ۲ اجرا می‌شود. در کد این نخ یک حلقه‌ی بی‌نهایت وجود دارد که از لیستی به اسم kthread_create_list اطلاعات پروسه‌ی کرنلی که قرار است ایجاد شود را برداشته و آنرا ایجاد می‌کند. تمامی پروسه‌های کرنلی لینوکس از اینجا به بعد فرزندان kthreadd خواهند بود.

پروسه‌ی بعدی که معرفی می‌کنیم migration است. از پروسه‌ی کرنلی migration به تعداد coreهای cpu خواهیم داشت و وظیفه‌ی آن مدیریت پروسه‌هایی است که بر روی یک core اجرا می‌شوند و در صورت زیاد بودن بار بر روی یک core یک پروسه را از روی run_queue یک core بر داشته و بر روی run_queue یک core دیگر قرار می‌دهد.

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

یک پروسه‌ی جالب دیگر oom_reaper است که در صورتیکه سیستم‌عامل با کمبود حافظه مواجه شود دست به کار شده و با kill کردن یک پروسه فضای لازم را برای کار مابقی پروسه‌ها فراهم می‌کند.

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

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

پ.ن ۱:‌ برای اطلاع از جزئیات پروسه‌های ابتدایی لینوکس پست زیر را مشاهده کنید:
https://t.me/OxAA55/133

پ.ن ۲: برای اطلاع از جزئیات پروسه و نخ در لینوکس پست زیر را مشاهده کنید:
https://t.me/OxAA55/124

#ShortLinuxInternals #linux #internals #programming #kernel #memory #threads #processes #kernel_threads
👍163👏3
ساعتی با حافظه‌ی مجازی در لینوکس

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

دریافت حافظه از سیستم‌عامل و نگاشت آن در فضای آدرس دهی پروسه‌ها نیز در واحدهایی به اسم Page و به کمک فراخوانی سیستمی mmap انجام می‌شود که پیش‌فرض مقدار 4KB داشته و از یک Page Table برای مشخص کردن اینکه چه فضایی از پروسه در کجای RAM/Disk قرار گرفته است استفاده می‌شود.

در این ویدئو مفاهیم مربوط به آدرس‌دهی مجازی Virtual Addressing در لینوکس و بخش‌هایی که در آن دخیل بوده شرح داده شده و به کمک چند نمونه کد مفاهیم تست می‌شوند.

برخی از مواردی که در مورد آن‌ها صحبت می‌کنم به شرح زیر است:
• مقدمه‌ای بر حافظه مجازی و دلیل استفاده از Virtual Addressing
• نحوه نگاشت Page و Frame
• مفهوم Page Table و نقش آن در نگاشت آدرس‌ها
• بررسی فایل proc/iomem/ و نحوه نگاشت حافظه در RAM
• تفاوت Page Fault‌های Major و Minor و نحوه مدیریت آن‌ها
• آشنایی با Zone‌های حافظه در لینوکس
• معرفی Slab Allocator و مفهوم کش‌های حافظه
• مقایسه روش‌های تخصیص حافظه در کرنل kmalloc vs vmalloc
• بررسی اطلاعات در حافظه‌ مجازی و RAM به کمک Qemu

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

#ShortLinuxInternals #linux #internals #VirtualMemory #MemoryManagement #KernelProgramming #PageTable #PageFault #SlabAllocator #kmalloc #vmalloc #SystemProgramming #EmbeddedLinux
26👍4
📢 انتشار فصل اول دوره توسعه اکسپلویت در لینوکس

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

✍️ لینک ویدئوهای فصل در یوتیوب:
00) Course Introduction
P01-01) Programming Review
P01-02) ELF Intro
P01-03) Process Execution
P01-04) Heap Investigation
P01-05) Process Address Space
P01-06) Virtual Memory
P01-07) Syscalls Intro

✍️ لینک ویدئوهای فصل در آپارات:
https://aparat.com/v/qxvin87
https://aparat.com/v/fwd0751
https://aparat.com/v/ljqz0v8
https://aparat.com/v/pdw1xkk
https://aparat.com/v/nct8m83
https://aparat.com/v/eak4pvp
https://aparat.com/v/lbuc0q0
https://aparat.com/v/sfb8398

#linux #exploitdev #internals #programming #security
85👍8👏8