نگاهی به بهره برداری از آسیب پذیری ها

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

قبل از شروع

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

این یک سناریوی واقعی نخواهد بود

من توانایی پرداختن به آنها را ندارم كه هر برنامه ای را كه می بینند قطع كنند ... اول اینكه برای رایانه های آنها خطرناك است ، دوم اینكه بیش از حد معمول كلمه های من طول می كشد.

ما به سفری به دهه 80 می رویم

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

ممکن است روی پردازنده شما کار نکند

اگرچه من می خواهم از یک مثال بسیار ساده استفاده کنم ، اما می خواهم از ابتدا کاملاً واضح باشد که جزئیات این مورد بسیار زیاد و متنوع است ، همانطور که می تواند همانند من ظاهر شود ، اگر می خواهید آن را امتحان کنید ، ممکن است اثر مورد نظر نیز حاصل نشود 🙂 اما می توانید تصور کنید که من نمی توانم توضیح دهم که در این فضا ، خصوصاً اینکه با این مقدمه بیش از 300 کلمه را بیان کرده ام ، بنابراین ما مستقیماً به اصل خود پی می بریم.

چیست سرریز بافر

برای پاسخ به این مسئله ابتدا باید نیمه اول این ترکیب را درک کنیم.

بافر ها

از آنجا که همه چیز مربوط به حافظه در رایانه است ، منطقی است که باید نوعی ظرف اطلاعات وجود داشته باشد. وقتی ما در مورد ورودی خروجی، ما مستقیماً به مفهوم بافر. برای کوتاه نگه داشتن آن ، a بافر این یک فضای حافظه با اندازه تعریف شده است که در آن قصد داریم مقداری اطلاعات ، ساده را در آن ذخیره کنیم

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

پشته

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

اکنون که این دو مفهوم را شناختید ، باید آنها را مرتب کنیم. پشته ها مهم هستند زیرا هر برنامه ای که اجرا می کنیم مختص به خود است پشته اعدام. اما این پشته دارای ویژگی خاصرشد می کند. تنها چیزی که باید در این باره بدانید این است که هنگام اجرای برنامه ، هنگام فراخوانی یک تابع ، پشته از یک عدد X در حافظه به یک عدد (Xn) تبدیل می شود. اما برای ادامه کار باید یک مفهوم دیگر را درک کنیم.

اشاره گرها

این مفهومی است که بسیاری از برنامه نویسان را هنگام شروع به کار در دنیای C دیوانه می کند ، در واقع قدرت بالای برنامه نویسی C تا حدودی به دلیل استفاده از اشاره گرها است. برای ساده نگه داشتن آن ، یک اشاره گر به آدرس حافظه اشاره می کند. این پیچیده به نظر می رسد ، اما پیچیده نیست ، همه ما در دستگاه های خود رم داریم ، درست است؟ خوب ، این را می توان تعریف کرد آرایش متوالی بلوک ها، این مکانها به طور معمول با اعداد هگزادسیمال (از 0 تا 9 و سپس از A تا F ، مانند 0x0 ، 0x1 ، 0x6 ، 0xA ، 0xF ، 0x10) بیان می شوند. در اینجا به عنوان یادداشت کنجکاو ، 0x10 نه برابر است با 10 decimal اگر آن را به ترتیب اعشاری تبدیل کنیم ، همان گفته 15 خواهد بود. این چیزی است که در ابتدا بیش از یک را اشتباه می گیرد ، اما اجازه دهید به آن بپردازیم.

سوابق

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

حالا تمرین کنید

من می دانم که تاکنون اطلاعات زیادی برای پردازش وجود داشته است ، اما در واقع آنها تا حدودی مسائل پیچیده ای هستند که سعی می کنم آنها را به روشی کاملاً ساده توضیح دهم ، ما می خواهیم یک برنامه کوچک را ببینیم که از بافرها استفاده می کند و ما قصد داریم آن را بشکنیم تا این موضوع را در مورد سرریزها درک کنیم ، بدیهی است که این یکی نیست این یک برنامه واقعی است و ما قصد داریم بسیاری از اقدامات متقابل "امروزه" را "فرار" کنیم ، فقط برای این که نشان دهیم قبلاً کارها چگونه انجام شده است ... و چون برخی از این اصول برای یادگیری موارد پیچیده تر لازم است ...

GDB

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

retinput.c

مال خود کریستوفر دیاز ریوروس

این یک برنامه کاملاً ساده است ، ما قصد داریم از کتابخانه استفاده کنیم stdio.h تا بتوانید اطلاعات را بدست آورید و در یک ترمینال نمایش دهید. ما می توانیم تابعی بنام return_input که تولید a بافر نام صف، که طول آن 30 است بایت (نوع داده char 1 بایت است).

تابع gets(array); درخواست اطلاعات توسط کنسول و عملکرد printf() محتوای آرایه را برمی گرداند و آن را بر روی صفحه نمایش می دهد.

هر برنامه ای که با زبان C نوشته می شود با عملکرد شروع می شود main()، این فقط وظیفه تماس با Return_input را بر عهده خواهد داشت ، اکنون ما قصد داریم برنامه را کامپایل کنیم.

مال خود کریستوفر دیاز ریوروس

بیایید کمی از کارهایی که من الان کردم انجام دهم. گزینه -ggdb به gcc می گوید که باید برنامه را با اطلاعات gdb کامپایل کند تا بتواند به درستی اشکال زدایی کند. -fno-stack-protector این گزینه ای است که بدیهی است ما نباید از آن استفاده کنیم ، اما ما قصد استفاده از آن را داریم زیرا در غیر این صورت تولید سرریز بافر در پشته امکان پذیر است. در پایان من نتیجه را آزمایش کردم. ./a.out این فقط آنچه را که من تازه وارد کردم اجرا می کند ، از من اطلاعات می خواهد و آنها را برمی گرداند. در حال اجرا

هشدارها

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

اشکال زدایی از برنامه

مال خود کریستوفر دیاز ریوروس

اکنون ، این قسمت می تواند کمی گیج کننده باشد ، اما از آنجا که من قبلاً هم کاملاً نوشتم ، توانایی توضیح همه چیز را ندارم ، بنابراین اگر می بینید که من خیلی سریع می روم متاسفم ...

خلع سلاح کد

بیایید با بررسی برنامه زبان ماشین کامپایل شده خود شروع کنیم.

مال خود کریستوفر دیاز ریوروس

این کد عملکرد اصلی ما در است مجلس، این همان چیزی است که پردازنده ما می فهمد ، خط سمت چپ آدرس فیزیکی حافظه است <+ n> معروف است به چاپ افست، اساساً فاصله از ابتدای تابع (اصلی) تا آن عبارت (معروف به شناسنده) سپس نوع دستورالعمل (push / mov / callq…) و یک یا چند رجیستر را مشاهده می کنیم. به طور خلاصه می توان گفت که این نشانه ای است که منبع / مبدا و مقصد آن را دنبال می کند. <return_input> به عملکرد دوم ما اشاره دارد ، بیایید نگاهی بیندازیم.

ورودی_ برگشتی

مال خود کریستوفر دیاز ریوروس

این کمی پیچیده تر است ، اما من فقط می خواهم شما چند مورد را بررسی کنید ، برچسبی به نام وجود دارد <gets@plt> و آخرین کد کد فراخوانی شده است retq پایان کار را نشان می دهد. ما قصد داریم چند نقطه انفصال ، یکی در تابع قرار دهیم gets و دیگری در retq.

مال خود کریستوفر دیاز ریوروس

دویدن

حالا ما قصد داریم برنامه را اجرا کنیم تا ببینیم عملکرد چگونه شروع می شود.

مال خود کریستوفر دیاز ریوروس

می توانیم ببینیم که یک پیکان کوچک ظاهر می شود که کدگذاری را در کجای ما نشان می دهد ، من می خواهم جهت آنها را در نظر بگیرند 0x000055555555469b، این آدرس پس از تماس با است return_input در عمل main ، این مهم است زیرا اینجاست که هنگام پایان دریافت برنامه باید برگردد ورودی، بیایید وارد عملکرد شویم. حال ما قصد داریم قبل از ورود به عملکرد ، حافظه را بررسی کنیم gets.

مال خود کریستوفر دیاز ریوروس

من عملکرد اصلی را برای شما برگردانده ام ، و کدی را که به آن اشاره کردم برجسته کردم ، همانطور که مشاهده می کنید ، به دلیل پایان یافتن به دو بخش تقسیم شده است ، من می خواهم آنها جهت را در نظر بگیرند 0x7fffffffdbf0 (اولین نفر از سمت چپ بعد از کماندو) x/20x $rsp) از آنجا که این مکانی است که ما باید برای بررسی نتیجه گرفتن استفاده کنیم ، اجازه دهید ادامه دهیم:

شکستن برنامه

مال خود کریستوفر دیاز ریوروس

آنها را برجسته کرده ام 0x44444444زیرا آنها نمایانگر Ds ما هستند ... اکنون ما شروع به افزودن کرده ایم ورودی به برنامه ، و همانطور که می بینید ، ما فقط دو خط از آدرس مورد نظرمان فاصله داریم ، می خواهیم آن را پر کنیم تا اینکه دقیقاً قبل از آدرس هایی باشیم که در مرحله قبل برجسته کردیم.

تغییر مسیر بازگشت

حالا که ما موفق به وارد کردن این بخش از کد شده ایم که نشان دهنده بازگشت عملکرد است ، بیایید ببینیم که اگر آدرس را تغییر دهیم چه اتفاقی می افتد 🙂 به جای رفتن به مکان کد کد بعدی که ما یک لحظه قبل داشتیم ، نظر شما چیست اگر برگردیم به return_input؟ اما برای این ، لازم است آدرس مورد نظر خود را به صورت باینری بنویسیم ، ما می خواهیم آن را با تابع انجام دهیم printf از bash

مال خود کریستوفر دیاز ریوروس

اکنون ما اطلاعات را دو بار دریافت کرده ایم ... مطمئناً برنامه برای آن ساخته نشده است ، اما ما موفق به شکستن کد شده و آن را تکرار کرده ایم که قرار نبوده باشد.

بازتاب ها

این تغییر ساده را می توان یک در نظر گرفت بهره برداری بسیار ابتدایی ... او موفق شده است برنامه را بشکند و کاری را که ما می خواهیم انجام دهد.

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


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

14 نظر ، نظر خود را بگذارید

نظر خود را بگذارید

نشانی ایمیل شما منتشر نخواهد شد. بخشهای موردنیاز علامتگذاری شدهاند با *

*

*

  1. مسئول داده ها: میگل آنخل گاتون
  2. هدف از داده ها: کنترل هرزنامه ، مدیریت نظرات.
  3. مشروعیت: رضایت شما
  4. ارتباط داده ها: داده ها به اشخاص ثالث منتقل نمی شوند مگر با تعهد قانونی.
  5. ذخیره سازی داده ها: پایگاه داده به میزبانی شبکه های Occentus (EU)
  6. حقوق: در هر زمان می توانید اطلاعات خود را محدود ، بازیابی و حذف کنید.

  1.   2p2 dijo

    مستقیم تر باشید. کمتر بنویسید و روی موارد مهم تمرکز کنید

    1.    ChrisADR dijo

      سلام ، ممنون از نظر شما

      راستش من قسمت خوبی از ایده ها را برش داده ام ، اما حتی به نظر می رسید که حداقل آن را گذاشته است تا کسی که دانش برنامه نویسی ندارد بتواند ایده بگیرد.

      توجه

      1.    بی نام dijo

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

        من فکر می کنم شما نمی توانید به همه برسید ، شما باید انتخاب کنید ، و در این مورد شما گناه کرده اید که می خواهید بسیاری را بپوشانید.

        ضمناً ، من به شما به عنوان یک انتقاد سازنده می گویم ، من عاشق این مباحث هستم و دوست دارم شما به نوشتن مقاله ادامه دهید ، تبریک می گویم!

    2.    بی نام dijo

      من همینطور فکر می کنم

      1.    ChrisADR dijo

        خیلی ممنون از هر دو !! درک حقیقت چگونگی دستیابی به مخاطب دشوار است وقتی که حقیقت این است که تعداد افرادی با سطح برنامه نویسی پیشرفته که این مقالات را می خوانند اندک است (حداقل این است که براساس نظرات استنباط می شود)

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

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

        توجه

  2.   ماریو dijo

    از کجا می توانید در مورد موضوع بیشتر بدانید؟ کتاب توصیه شده ای دارید؟

    1.    ChrisADR dijo

      مثالی که من از کتاب راهنمای Shellcoder's توسط کریس آنلی ، جان هیزمن ، فلیکس لیندر و جراردو ریچارته گرفتم ، اما برای انجام ترجمه 64 بیتی باید در مورد معماری خود یاد می گرفتم ، کتابچه راهنمای توسعه دهنده اینتل ، جلد 2 و 3 منبع بسیار قابل اعتماد برای آن. همچنین خواندن مستندات GDB که همراه با دستور "info gdb" است خوب است ، برای یادگیری Assembly و C کتاب های بسیار خوبی وجود دارد ، با این تفاوت که کتاب های Assembly کمی قدیمی هستند بنابراین یک جای دیگر برای پر کردن وجود دارد مستندات.

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

      امیدوارم کمی کمک کند ... سلام

  3.   فرانتس dijo

    مقاله خوب ، وبلاگ قدیمی desdelinux دوباره متولد شده است =)
    وقتی می گویید پوسته از راه دور چندان مثر نیست ، منظور شما اقدامات متقابل است که برای کاهش حملات طراحی شده است ، آنها آن را امنیت توهین آمیز می نامند.
    با سلام و ادامه آن

    1.    ChrisADR dijo

      بسیار متشکرم Franz ... سخنان بسیار مهربانانه ، در واقع منظور من این بود که Shellcoding امروز بسیار پیچیده تر از آنچه در اینجا می بینیم است. ما دارای ASLR (مولد مکان حافظه تصادفی) محافظ پشته ، اقدامات و اقدامات متفاوتی هستیم که تعداد کدهای قابل تزریق به یک برنامه را محدود می کند و این فقط آغاز کار است.

      Saludos،

  4.   نرم افزار رایگان dijo

    سلام ، آیا شما بخش دیگری را برای گسترش موضوع انجام می دهید؟ جالب است

    1.    ChrisADR dijo

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

      با سلام و تشکر از به اشتراک گذاری

  5.   کاکتوس dijo

    خیلی خوب! شما به پست های عالی کمک می کنید! یک سوال ، من این موضوع IT Security را با خواندن کتابی تحت عنوان "اطمینان از امنیت با آزمایش قلم" شروع می کنم. آیا این کتاب توصیه می شود؟ چگونه پیشنهاد می کنید که شروع به تحقیق در مورد این مسائل کنم؟

    1.    ChrisADR dijo

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

  6.   ایزن dijo

    سلام.
    از اینکه در مورد این موضوع توضیح دادید ، و همچنین توضیح دادید که برای اطلاعات بیشتر "کتاب راهنمای Shellcoder's" را بسیار متشکریم. من قبلاً در حال خواندن هستم reading