Reza.Black 405 گزارش دادن ارسال شده در شهریور 99 به نام خدا با سلام این آسیب پذیری یکی از آسیب پذیری های معروف و بسیار مورد توجه Black Hackers هست. و در واقع یک تکنیک خاص برای نفوذ به برنامه محسوب میشه. ما توابع فرمت متنوعی داریم که اساس کار اون ها دریافت رشته ی فرمت به صورت اولین آگومان ورودی هست. یکی از این توابع تابع مهم ;()printf هست و وقتی که رشته ای رو در داخل اون قرار میدم اون رو برای من چاپ می کنه. مثل ;("printf ("Reza این تابع با برخورد به یه کاراکتر موسوم به null متوجه ی انتهای رشته میشه. به علاوه ما یکسری پارامترهای فرمت داریم که عملیات مهمی رو انجام میدن و معمولا جهت چاپ آرگومان بعدی تابع با مقدار متناظر به کار میرن مثل d% که برای مبنای ده یا دسیمال x% که برای مبنای شانزده یا هگزا دسیمال s% که برای رشته n% که تعداد بایت های نوشته شده هست پارامتری مثل d% داده های خودش رو به صورت فقط داده دریافت می کنه ولی پارامتری مثل s% داده های خودش رو به صورت اشاره گری به داده دریافت می کنه. رفتار پارامتر s% به نوعی هست که همیشه انتظار دریافت یک آدرس از حافظه رو داره از دیدگاه افرادی که کار اکسپلویت نویسی انجام میدن هر نوع شکل دستوری که باعث دسترسی ما به حافظه بشه حالا چه به صورت مستقیم و یا غیر مستقیم می تونه باعث ایجاد رخنه در برنامه بشه و دونستن این نکته بسیار مهم هست. تابع فرمت با برخورد به هر پارامتری رفتار خاص خودش رو انجام میده و هر پارامتر فرمت منتظر انتقال به یک متغیر متناظر هست. خوب حالا داستان اصلی چیه؟ اگه به برنامه های بعضی از برنامه نویس ها دقت کرده باشید زمان به کار گیری تابع فرمت از شکل های مختلف اون استفاده می کنن. مثل : ;("printf ("%s, string و یا ;(printf (string هر دو دارای عملکرد یکسانی هستن ولی نه در واقعیت روش اول که آدرس رشته ی فرمت رو دریافت می کنه و روش دوم فقط آدرس رشته رو به تابع فرمت منتقل می کنه. ما یه برنامه ی ساده داریم که میتونیم کمی تست انجام بدیم. در مورد ساختارش توضیح اضافه نمی دم چون که ساده هستش. برنامه رو کامپایل و مجوزهای مالکیت و اجرایی برای اون تعیین می کنیم و اجراش می کنیم. هر دو شکل به خوبی کار میکنن حالا با اضافه کردن پارامتر فرمت به رشته ببینیم چه اتفاقی می افته؟ همونطور هم که قبلا گفتم هر پارامتر فرمت منتظر انتقال به یک متغیر متناظر هست. ولی اینجا متغیر متناظری وجود نداره پس این اضاف کردن بی مورد باعث انتقال اشاره گر قاب به یک قطعه ی حافظه در قاب پشته ی قبلی میشه. اگه با ساختار ماشین آشنا باشید می تونید ببینید که که ما با یک کلمه ی 4 بایتی که به صورت هگزا دسیمال هست سر و کار داریم. کاری به پارامتر فرمت x% ندارم ولی یادتون باشه که هر چیزی در حافظه به صورت هگز ذخیره میشه. ok قصد ما این هست که پشته رو بیشتر بررسی کنیم و برای این کار از پرل کمک می گیریم هر دستور پرل رو میشه پاس داد به خط فرمان و در این مورد از تکنیک جانشینی فرامین استفاده می کنیم که اشاره به محتوای دستور داره شاید خروجی نامفهوم باشه ولی همین خروجی نامفهوم می تونه اطلاعات خوبی به ما بده. فقط به بایت هایی که مکررا تکرار شدن دقت کنید. زمانی که تو هر برنامه ایی بایت هایی به صورت مدام تکرار میشن نشون دهنده ی یک عمل خاص و مهم هستن. بایت های 0x2e, 0x78, 0x38, 0x30, 0x25 خیلی تابلو هستن. پس تستش می کنیم. خوب تعجبی نداره این بایت ها مربوط به حافظه ی خود رشته فرمت هستن به خاطر اینکه تابع فرمت در بالاترین مکان از قاب پشته قرار می گیره. ترتیب بایت ها هم به صورت معکوس بود که این هم به خاطر معماری Little Endian در ساختار ماشین هست. خوب تا همینجا کافیه قصد من فقط آشنایی شما بود. این آسیب پذیری با سایر آسیب پذیری ها کمی متفاوت هست و روش نفوذ با استفاده از اون منحصر به فرد. از منبع مهمی برای این آموزش استفاده کردم که ذکر می کنم. البته در خلال توضیحاتی که دادم به نکات مهمی اشاره کردم که تجربی بود. و می تونه مورد توجه دوستانی که به این علم و هنر علاقه مند هستن قرار بگیره. موفق باشید. منبع : کتاب هنر اکسپلویت نویسی ویرایش دوم fomrat_string.rar fomrat_string.rar 5 2 واکنش ها : R3DN4X314 ، newhacker3 ، mr.hacker-7 و 4 نفر دیگر به اشتراک گذاری این ارسال لینک به ارسال به اشتراک گذاری در سایت های دیگر