چالش Hunting License از HackTheBox

سلام، من مجید هستم و توی این پست میخوام یکی از چالش های بخش Reversing از HackTheBox بنام Hunting License رو برای شما شرح بدم. پس بدون هیچ مقدمه بریم که شروع کنیم.اول از همه با ورود به پنل کاربری از بخش challenges و زیر بخش RETIRED CHALLENGES، این چالش قابل دسترسه که نیاز هست ابتدا فایل مربوطه رو دانلود کنیم(اسم فایل license هست). برای حل این چالش و گرفتن Flag یه سرور در اختیار ما قرار میگیره که باید به سوالات اون پاسخ بدیم و اگه همه سوالات به درستی پاسخ داده بشن، Flag رو دریافت میکنیم :)خوب برای شروع ابتدا به سروری که به ما داده متصل میشیم. برای اینکار من از Netcat استفاده کردم و این شد خروجی کار:$ nc [IP] [Port]اولین سوال نوع فرمت اجرایی فایل رو پرسید. کافیه از دستور file استفاده کنیم تا مشخصات فایل اجرایی رو بکشیم بیرون:$ file licenseبرگردیم به سوالات. مشخص شد که نوع فایل اجرایی ELF است. پس وارد میکنیم و سوال دوم هم نوع معماری پردازنده که بر اساس اون فایل کامپایل شده رو از ما میخواد که جواب اون هم میشه x86-64. ایزی ایزی بریم سوال بعد.حالا از ما نام یکی از کتابخانه هایی که برای خوندن ورودی کابر هست رو میخواد که با راهنمایی که خودش کرده فقط کافیه که از دستور ldd استفاده کنیم:$ ldd licenseخیلی ساده جواب این سوال هم بدست اومد:در ادامه از ما آدرس شروع تابع main رو پرسیده که برای اینکار نیاز که تحلیل ایستای کد فایل license رو شروع کنیم. واسه همین من از ابزار Ghidra استفاده کردم و برنامه رو توی حالت CodeBrowser اجرا کردم. مطابق شکل تابع main در آدرس 0x4011172 شروع میشه.توی سوال بعدی تعداد تکرار تابع put در تابع main رو از ما میخواد. اگه به بخش Decompile ابزار Ghidra بریم میبینیم که 5 بار از این تابع استفاده شده. ایزی ایزی بریم سوال بعدی :)خوب خوب ماجرا داره تازه شورع میشه. در ادامه اولین پسورد رو از ما میخواد. اما قضیه چیه؟ بیاییم و فایل license رو یکبار اجرا کنیم.همونطور که میبینیم این فایل اول یه سوال میپرسه که باید y بزنیم و یه پسورد از ما میخواد. قطعا ورودی ما یجایی تو کد با یک مقداری چک میشه پس برمیگردیم به Decompile و چرخ میزنیم توی کدها. توی main تابعی با نام exam فراخوانی میشه که اگه وارد اون بشیم میبینیم که بعد از اینکه خطوط شکل قبل نمایش داده شد، مقدار ورودی ما توی یه متغییر ذخیره شده و با یه مقداری توسط تابع strcmp مقایسه میشه. درست حدس زدید و این مقدار همون پسورد اول است :)خوب کار ادامه داره و پسورد دوم رو باید پیدا کنیم. مثل قبل برمیگردیم و میگردیم ببینیم که کجا ورودی ما داره با یه مقداری چک میشه. اگه به شکل زیر نگاه کنید میبینیم که مقدار t که توی بخش .data قرار داره ابتدا توسط تابع reverse معکوس میشه و بعد از اون با ورودی ما مقایسه شده.حالا مقدار t چی هست؟ با کلیک روی t و مشاهده بخش Display bytes مقدار اون مشخص میشه. بله دیگه اگه این مقدار رو خودمون معکوس کنیم (با دستور rev) پس عملا پسورد دوم رو هم بدست آوردیم :)این چغر و بد بدن هنوز تموم نشده و پسورد سوم رو هم از ما میخواد. با همین تکنیک میریم جلو و میبینیم که این دفعه مقدار t2 با ورودی های 0x11 و 0x13 به تابع xor رفته و با ورودی کاربر مقایسه میشه. پس اگه بفهمیم که سر t2 چه بلایی اومده عملا پسورد سوم رو هم یافتیم :)اگه وارد تابع xor بشیم میبینیم که یه حلقه for وجود داره که به اندازه 17 مرتبه اجرا میشه. چی شد؟ 17 از کجا اومد؟ توی شکل بالا مقدار 0x11 که معادل 17 هست و به عنوان ورودی سوم به تابع ارسال شده و با یکم دقت توی شکل زیر مشخصه که این تابع به اندازه param_3 تا اجرا میشه یعنی 17 بار!قبول دارین که param_1 هم یه آرایه هست و هر بار اجرای حلقه Index ای از اون پر میشه؟ و قبول دارین این حاصل ها از xor یکی از Index های param_2 (که t2 باشه) با مقدار 19 (معادل 0x13) هست؟ و قبول دارین param_1 که به صورت اشاره گر وارد تابع شده بود بعدا با وردی کاربر مقایسه میشه؟شک نکن و قبول کن. مقدار t2 توی شکل زیر مشخصه و همون طور که انتظار میره طول اون برابر 17 تا عدد هگز است. پس به زبان خیلی ساده هر عضو t2 با مقدار 19 عملیات xor رو انجام میدن و خروجی میشه پسورد سوم. برای راحتی کار میشه از کد پایتون زیر استفاده کرد تا این عملیات رو انجام بده و پسورد سوم رو بدست بیاریم :)خروجی هم شد این و پسورد سوم هم بدست اومد.خوب دیگه وقتشه که سوالات روی سرور رو هم پاسخ بدیم و Flag رو بدست بیاریم:امیدورام این پست مفید بوده باشه براتون.راه ارتباطی با من در توییتر.