در چهارمین دوره مسابقات دانشگاه شریف بخش reverse دومین challenge یک فایل PE قرار داده شد که اگر با RDG چک کنیم می بینیم فایل ۳۲بیت است و هیچ لایه محافظتی برروی آن وجود ندارد و همچنین از crypto خاصی استفاده نمی کند.
این چلنج Green نام دارد که در ادامه به مربوط بودن نام با نحوه حل آن مشخص خواهد شد.هرفردی ممکن است برای بدست آوردن فلگ روند خاصی برای خودش داشته باشد ولی ما به روش خود حل خواهیم نمود.
این فایل یک برنامه CLI است پس ابتدا بصورت عادی اجرا میکنیم متوجه می شویم که دو پارامتر ورودی نیاز دارد، حال برنامه را پارامتر های HamiD 123456 اجرا میکنیم:
اولین سرنخ بدست آمد. حال برنامه را با همین پارامترها در Olly اجرا میکنیم و به تریس میپردازیم. ابتدا به جستجوی اولین سرنخ میپردازیم :
میبینیم که توسط LoadImageA عکسی را لود می کند که براساس پیغام در عکس قبلی بایستی Bitmap بصورت سیاه و سفید باشد.
حالا برروی تابع LoadImageA هم یک BP میگزاریم و برنامه را اجرا میکنیم بعد از توقف در استک اطلاعاتی تکمیل تر در مورد نحوه فراخوانی تابع مشاهده خواهیم نمود:
پارمتر اول برای فایل عکس است و میبینیم که بصورت LoadFromFile است و بایستی آدرس عکس را بدهیم. حال با Paint یک عکس ذخیره میکنیم و پارامتر اول آدرس عکس می شود. حال بایستی برنامه را با این پارمترها اجرا کنیم C:\1.bmp 123456
بعد از اجرا می توان دید که براحتی عکس لود می شود و همچنین توسط تابع SetConsoleScreenBufferSize ابعاد صفحه کنسول به اندازه عکس تغییر می کند.
در ادمه تریس به این پیغام میرسیم :
در ادامه تریس یک حلقه میبینیم خوب ببینیم چکاری انجام میدهد؟
شبه کد این حلقه بدین صورت است:
char Decypted_String [8]; int Counter = 0; do { Decypted_String [Counter] = *(&Encypted_String + Counter) ^ 0xC; ++ Counter; } while (Counter < 9 );
بعد از پایاین حلقه تغییراتی که در حافظه ایجاد میکند را در عکس مشاهده میکنیم که ۹کاراکتر می شود G00dJ0b! به همراه یک کاراکتر null در انتهای رشته. در ادامه تریس یعنی بعد از وارد کردن phrase در کنسول به عکس زیر خواهیم رسید :
خوب در 40118F میبینیم G00dJ0b! اشاره دارد و در ۴۰۱۱۹۶ به phrase که وارد نمودیم. خوب phrase هم بدست آمد. حال در ادامه تریس به یک حلقه نسبتا درهم وبرهم برمیخوریم که در ابتدا هم میفهیمیم کار با پیکسل است:
به انتهای حلقه می رویم ببینیم مقدار تکرار حلقه چقدر است :
خوب ابتدا EAX و EBX مقایسه می شوند و بایستی مقدار EBX که صفر است به EAX برسد. حال مقدار EAX چیست؟ 0x3B2 که در واقع می شود ۹۴۶ که همان ابعاد عکس است:
کاری به این حلقه نداریم چون بسیار پیچ در پیچ است و خود را به دردسر نمیندازیم:دی
بعد از اتمام حلقه باز به یک حلقه دیگر برخورد میکنیم:
اطلاعاتی که از این بدست می آید مانند قبلی است ولی این بار مقدار EAX=0x1FE که همان ۵۱۰ است، پس در واقع دو حلقه که طول و عرض عکس را پیمایش می کند. بعد از اتمام حلقه دو تابع Delete داریم.
نیاز داریم تا تمامی کارهای انجام شده و مستندات باقی بماند پس نمیگذاریم که این دو تابع اجرا شود.
حالا کنسول را بالاوپایین میکنیم تا ببینیم که کاری انجام انجام شده:
بله فلگ رو بدست آوریم!!! پس کلید سبز رنگ است بهیمن خاطر نام چلنج Green است، ولی مشکل وجود دارد که وقتی کلید را وارد میکنیم ثبت نمی شود!! پس این فلگ نیس!؟ در ضمن همیشه در CTF باید flag مشاهده بشه نه Key یا همون کلید!
ادامه تریس را میرویم. در ادامه میبینیم که کاراکترهای ASCII printable در حافظه رایت می شود :
در انتها مشاهده میکنیم ببینیم که چیزی در حافظه نوشته شده است که اینگونه است :
بله یک هینت نوشته که که کلید که در کنسول دیدیم را باید shift +2 که همان Shift right است بدهیم. شیفت بصورت باینری کاراکترهای قابل فهمی را ایجاد نمی کند که باید فهمید از روی جدول اسکی بایستی کارکترها را شیفت داد. خوب کاراکترها را براساس جداول شیفت میدهیم و بعنوان پارامتر دوم به فایل میفرستیم. Green Key مان برابراست با K|hr/1Jdp_P!|B8{( که بعد از +۲ شیفت بدین صورت خواهد بود M~jt13LfraR#~D:}* که بعنوان پارامتر دوم قرار میدهیم.
بعد از اجرا فلگ درست را بدست خواهیم آورد :
دانلود فایل Pdf این پست : Writeup for reverse200 ctf sharif
دیدگاهتان را بنویسید لغو پاسخ