ch
Feedback
OS Internals

OS Internals

前往频道在 Telegram

مقاله و فیلم آموزش مدیریت و برنامه‌نویسی سیستم‌های عامل، شبکه و امنیت اطلاعات. مقالات من در ویرگول: https://virgool.io/@akazemi ویدئوهای کانال در آپارات: https://www.aparat.com/oxaa55 ارتباط با مدیر کانال از طریق: @akazemi67

显示更多
3 618
订阅者
无数据24 小时
-107 天
-1530 天
帖子存档
ساعتی با حافظه‌ی مجازی در لینوکس یکی از کارهایی که سیستم‌های عامل از جمله لینوکس انجام می‌دهند مدیریت حافظه و ایجاد یک لایه‌ی 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

#Article #Rootkits ⚜️The Art of Linux Kernel Rootkits An advanced and deep introduction about Linux kernel mode rookits, how
#Article #Rootkits ⚜️The Art of Linux Kernel Rootkits An advanced and deep introduction about Linux kernel mode rookits, how to detect, what are hooks and how it works. مقدمه ای پیشرفته و عمیق در مورد روکیت های هسته لینوکس، نحوه شناسایی، هوک ها و نحوه عملکرد آن ها 🦅 کانال بایت امن | گروه بایت امن _

مروری بر پروسه‌های کرنلی لینوکس در لینوکس برخی از پروسه‌ها بخش 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

مقدمه‌ای بر 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

نمایش شیوه‌ی ایجاد پروسه‌های اولیه‌ی لینوکس و طرز کار آن‌ها از روی کد کرنل پروسه‌ها در لینوکس یک ساختار درختی دارند و همه چیز از پروسه‌ با 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

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

مروری بر روش‌های 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

📚 تخفیف ۷۰درصدی دوره‌ی Windows Internals and Memory Analysis برای ۲۰ نفر 🎯 چند نفری بهم پیام داده بودند و سراغ تخفیف دوره‌ی Internal رو گرفته بودند. با صحبتی که با تیم خوب مکتب‌خونه داشتم قرار شد که یک تخفیف ۷۰درصدی برای ۲۰ نفر داشته باشیم. ✅ می‌تونید دوره رو از طریق لینک زیر مشاهده و ثبت‌نام کنید: yun.ir/rx6jy2 📴 برای دریافت ۷۰ درصد تخفیف، در زمان خرید کد z03y2Lzs را وارد کنید. #WindowsInternals #Course #Training #Maktabkhooneh

#Course #DWORD 🖥ویدیو معرفی دوره برنامه نویسی تهاجمی مختص به تیم های قرمز 📊بررسی کامل دوره، سرفصل ها و موضوعاتی که در هر فصل بیان خواهند شد. ⏰آخرین بروزرسانی سرفصل ها : 18 September 2024 🖥شهریه دوره ۱۵,۰۰۰,۰۰۰ تومان است که با ۲۰٪ تخفیف به ۱۰ نفر اول ارائه می‌شود. 📑همچنین، امکان پرداخت به صورت اقساط نیز فراهم است. 🖥نحوه شرکت در دوره : به دلیل ظرفیت محدود کلاس، اولویت ثبت‌نام با دانشجویانی است که آزمون تعیین سطح را گذرانده باشند. چنانچه پیش‌نیازهای لازم برای شرکت در دوره را ندارید، همچنان می‌توانید در دوره شرکت کنید، اما ابتدا باید این پیش‌نیازها را بگذرانید. جهت دریافت اطلاعات بیشتر به آیدی @YMahmoudnia پیغام بدین. 🦅 کانال بایت امن | گروه بایت امن _

سیگنال و وضعیت پروسه‌ها در لینوکس در لینوکس برای ارسال یک رویداد یا اطلاع دادن یک رخداد به پروسه‌ها می‌توان از سیگنال استفاده نمود. شیوه‌ی کار به این صورت است که پروسه در صورت دریافت سیگنال، اجرای کد اصلی خود را متوقف کرده و به سراغ پردازش 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

محدود کردن اجرای پروسه‌ها به کمک 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

سرقت توکن پروسه‌ها در ویندوز به کمک WinDbg توکن یا به صورت کامل‌تر Access Token در ویندوز، یک شی است که شرایط امنیتی که یک پروسه یا نخ تحت آن می‌توانند کار کنند را مشخص می‌کند. توکن با احراز هویت موفق یک کاربر ایجاد شده و هر پروسه‌ای که توسط کاربر ایجاد شود، یک نسخه از آنرا خواهد داشت. ویندوز از توکن در زمانیکه یک نخ تلاشی برای دسترسی به یک شی می‌کند استفاده می‌کند که کاربر را تشخیص داده و بررسی کند که آیا کاربر مجوز دسترسی به شی مورد نظر را دارد یا خیر. به عنوان مثال فرض کنید که با notepad قصد باز کردن یک فایل را داشته باشید. در این مثال پروسه‌ی notepad‌ توسط کاربر شما ایجاد شده و در نتیجه توکن آنرا خواهد داشت. شی مورد دسترسی نیز فایلی است که برای آن دسترسی خاصی تعریف شده و باید بررسی شود که آیا توکن مورد نظر مجوز دسترسی به فایل را دارد یا باید جلوی این دسترسی توسط ویندوز گرفته شود. برخی از اطلاعاتی که توسط توکن مشخص می‌شوند عبارتند از: شناسه یا SID‌ کاربر. شناسه‌ی گروه‌هایی که کاربر عضوی از آن‌هاست. شناسه‌ی نشست جاری. لیستی از مجوزهایی که کاربر یا گروه‌های آن دارند. یکی از کارهایی که با توکن‌ها قابل انجام بوده و در سرویس‌ها کاربرد زیادی دارد impersonation است. در این مدل، یک نخ با توکن متفاوتی از توکن اصلی خود اجرا شده و در نتیجه مجوزهای متفاوتی خواهد داشت. به عنوان مثال فرض کنید یک File Server دارید که فایل‌های آن محدودیت‌های دسترسی متفاوتی دارند. در این مثال، سرور با انجام impersonation درخواست هر کلاینت را با توکن همان کلاینت پاسخ داده و در نتیجه هر کاربر تنها به فایل‌های خود دسترسی خواهد داشت. یکی از کارهایی که بدافزارها از آن بهره می‌برند همین بحث impersonation و دسترسی به منابع مختلف، مثل dump اطلاعات کاربران، است. در این حالت بدافزار توکن یک پروسه با دسترسی بالا را دزدیده و از آن برای مقاصد خود استفاده می‌کند. در این ویدئو به کمک WinDbg مفهوم توکن و شیوه‌ی دزدیدن و قرار دادن آن بر روی پروسه‌ی دلخواهی شرح داده می‌شود که هم با موضوع توکن آشنا شده و هم به صورت عملی ببینیم که بدافزارها چطور می‌توانند از impersonation سواستفاده کنند. پ.ن: از زمان بارگذاری ویدئو در آپارات بیش از ۳۰ ساعت می‌گذرد ولی هنوز در فاز «درحال پردازش» گیر کرده!!! لینک ویدئو در یوتیوب: https://youtu.be/NTPVeauBDe4 لینک ویدئو در آپارات: https://aparat.com/v/ahv18tt #ShortWinInternals #windows #internals #token #WinDbg #impersonation #kernel

استفاده از 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

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

مقدار صفر برای 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

نحوه‌ی استفاده‌ی لینوکس از 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

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

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

سلام خدمت همه‌ی همراهان 🌹 سال نو مبارک 🌹 🪴امیدوارم در 403 به جای خطا خوردن‌ها و ممنوع شدن‌ها، گشایش‌هایی برای همه‌ی شما در
سلام خدمت همه‌ی همراهان 🌹 سال نو مبارک 🌹 🪴امیدوارم در 403 به جای خطا خوردن‌ها و ممنوع شدن‌ها، گشایش‌هایی برای همه‌ی شما در راه باشد و به بهترین‌ها برسید. 🎯 برای امسال برنامه‌ی تهیه یکسری آموزش جدید و خاص رو دارم که به مرور اعلام می‌کنم. 🧩 برنامه انتشار ویدئو از InTERnAL ویندور و لینوکس هم مثل قبل ادامه خواهد داشت. 🌺 به امید بهترین‌ها برای همه

📚 انتشار دوره Windows Internals and Memory Analysis در مکتب‌خونه و یک تخفیف ۵۰درصدی برای ثبت‌نام 🗓️ سال ۹۷ اولین همکاری من با مکتب‌خونه با انتشار دوره‌ای در زمینه‌ی شبکه شکل گرفت که تجربه‌ی خوبی بود. از آن زمان تا کنون چندبار تلاش شد که مجدد همکاری شکل گرفته و دوره‌ی دیگری از طریق مکتب‌خونه منتشر کنم ولی متاسفانه به دلیل مشغله‌ی کاری و سختی آماده کردن دوره‌ی آفلاین این امر میسر نشد. ℹ️ امسال دوره‌ی Windows Internals and Memory Analysis را به صورت آفلاین آماده کردم که زحمت زیادی داشته و انرژی زیادی نیز ازم گرفت. 🎯 با صحبتی که با تیم خوب مکتب‌خونه داشتم بنا بر این شد که این دوره روی سایت مکتب‌خونه منتشر شده و از این به بعد از این طریق ارائه بشه، به این امید که افراد بیشتری ازش استقبال کرده و مخاطب بیشتری داشته باشه. ✅ می‌تونید دوره رو از طریق لینک زیر مشاهده و ثبت‌نام کنید: yun.ir/rx6jy2 📴 برای دریافت ۵۰ درصد تخفیف، در زمان خرید کد tahlil-kazemi را وارد کنید. #WindowsInternals #Course #Training #Maktabkhooneh