خبرهای مهم:

تاریخ امروز برابر است با [ سه شنبه ۳۰ آبان ۱۳۹۶ ]

اگر کمی با اکسپلویت نویسی و نحوه اکسپلویت کردن برنامه آشنایی داشته باشید بدون شک با مفهوم Bad Char آشنا هستید. Bad Char در اکسپلویت کاراکترهایی را می گویند که از وارد شدن کامل اکسپلویت به درون حافظه جلوگیری می کنند. بعنوان مثال در ورودی برنامه های C/C++ اگر دربین رشته ورودی ۰x00 وجود داشته باشد به عنوان انتهای ورودی محسوب می شود و بعد از کاراکتر ۰x00 نادیده گرفته می شود، بنابراین Bad Char ها یکی از ضروریات است که بایستی متناسب با هدف، آنها را بدانیم.

 

سوال : چگونه متناسب با هدف Bad Char ها را بدست آوریم؟؟

جواب : بایستی تمامی کاراکتر های که ممکن است بعنوان Bad Char محسوب گردند را لیست نموده تا بتوانیم توسط سعی و خطا تک،تک آنهارا بدست آوریم. این لیست در واقع از ۰x00 تا ۰xFF می باشد.

 

لیست ایجاد شده را بایستی در اکسپلویت مان بعد از Return Address قرار می دهیم بدین دلیل که Bad Char از بازنویسی Return Address جلوگیری نکند تا بتوانیم درون حافظه چک کنیم که لیست مان تا چه مکانی کپی شده اند و Bad Char چه بوده که باعث جلوگیری از کپی کامل اکسپلویت درون حافظه شده است.

در این مقاله برروی vulnserver که توسط Stephen Bradshaw نوشته شده و یک برنامه آسیب پذیر جهت تست و مثال آموزشی مورد استفاده قرار می گیرد، تست خود را انجام می دهیم.

بعد از اضافه نمودن لیست Bad Char به کدهایمان و ارسال آن به پورت vulnserver اولین راهکار این خواهد بود که بصورت دستی حافظه را چک کنیم تا کاراکتر را بدست آوریم ولی اینکار کمی زمانبر و کسل کننده است. راهکار بعدی استفاده از mona خواهد بود که بهتر از حالت قبل است، پس روند کارمان با استفاده از ابزار mona خواهد بود.

 

با اجرا این کامند دو فایل در working folder ایجاد می شود:

  1. فایل متنی (txt) شامل کدهای، لیست ایجاد شده است که در سورس مان اضافه نماییم.
  2. فایل باینری (bin) این فایل در ادامه جهت چک نمودن حافظه مورد استفاده قرار می گیرد.

حال با استفاده از فایل متنی ایجاد شده سورس برنامه خود را تغییر می دهیم و بدین صورت خواهد شد:

 

 

بعد از ارسال کدها به سرور با استفاده از کامند زیر عمل مقایسه را انجام می دهیم که خروجی مانند تصویر خواهد بود:

 

در خروجی بخش Bad Char خالی خواهد بود ولی به status نیز دقت کنید، حال بایستی حافظه را خودمان چک کنیم و می فهمیم که اولین Bad Char نیز ۰x00 خواهد بود و به دلیل وضیعت حافظه نتوانسته تشخیص بدهد:

اولین Bad Char را بصورت دستی پیدا نمودیم حال بایستی لیست جدیدی ایجاد نماییم که این کاراکتر در آن نباشد و دوباره تست را انجام دهیم. با استفاده از کامند زیر می توانیم لیستی بدون کاراکترهای مشخص شده ایجاد نماییم:

 

مراحل قبل را با لیست جدید ادامه می دهیم، می بینیم که خروجی کاراکتری را مشخص ننموده است و همچنین لیست کاراکترها بطورکامل درون حافظه وارد شده اند، بنابراین تنها Bad Char برای این تارگت ۰x00 خواهد بود.

بعنوان مثال دیگر war ftp را مورد بررسی قرار می دهیم. سورس برنامه مان بدین صورت خواهد بود:

 

حال برنامه را اجرا نموده و با استفاده از دستور زیر حافظه را با فایل باینری مقایسه می کنیم:

 

خروجی مانند تصویر زیر خواهد بود که اولین کاراکتر ۰x00 که پیدا نموده است:

لیست جدید بدون ۰x00 ایجاد نموده و دوباره تست را انجام میدهیم. در این مرحله کاراکتر بعدی که شناسایی می شود ۰x0A می باشد.

 

!Mona در مسیری که فایل باینری را ایجاد می کند، بعد از انجام عمل مقایسه نتایج کاملتر را در فایلی به نام compare.txt جهت اطلاعات بیشتر ذخیره می کند. در بخشی از این فایل ساختار مانند زیر مشاهده می شود در واقع !Mona فایل باینری و مکان حافظه که قرار است باهم مقایسه شوند را بصورت یک جدول درنظر می گیرد. در این جدول دوسطر File و Memory وجود دارد. هر بایتی که در مقایسه بین آن دو یکسان باشد در سطر Memory خالی خواهد بود، بدین صورت می توان اولین بایتی که در دوسطر یکسان نمی باشد را بعنوان Bad Char درنظر گرفت. در انتهای جدول تمامی مقایسه ها و مکان های از حافظه که یکسان بوده اند یا نبوده اند را بصورت خلاصه ذکر نموده است:

در مرحله بعد ۰x0D شناسایی می شود و با تکرار دوباره این مراحل به صورت زیر خروجی بدست می آید، در واقع Bad Char در این تارگت چهار کاراکتر است.

حال این چهار کاراکتر را از لیست حذف می کنیم:

بعد از اینکه این چهار کاراکتر را از لیست حذف نمودیم دیگر مشکلی نیست و لیست کاراکتر ها بدرستی درون حافظه وارد می شود.

حال اگر نیاز باشد تا بصورت مجموعه ای از کاراکتر را حذف کنید بدین صورت عمل می کنیم:

 

استفاده از کامند بالا باعث حذف کاراکتر های عددی از لیست خواهد شد. کامند زیر کمی این قواعد را پیچیده تر استفاده نموده است:

کامند بالا لیستی را ایجاد می کند که حروف انگلیسی بزرگ و کوچک را شامل می شود.

نویسنده: حمید رضایی

:: نظرات

پاسخ دهید

نشانی ایمیل شما منتشر نخواهد شد.

*