برنامه نویسی

PicoCTF “Breadth” Walkthrough – انجمن DEV

Summarize this content to 400 words in Persian Lang
خیلی وقته که ندیدم! از آخرین باری که اساساً چیزی در وبلاگم پست کردم مدتی می گذرد، lol. در حدود 3 ماه گذشته، من به طور کلی به شدت درگیر زندگی بودم و ممکن است بهانه ای به نظر برسد، اما در نتیجه، برای انجام هیچ یک از چالش ها وقت ندیدم. با این حال، برای اولین بار پس از مدتی، بالاخره زندگی به من فرصت آزاد داد تا از گذراندن مدتی برای انجام کاری که دوست دارم لذت ببرم، و در اینجا با مروری دیگر از یکی از چالش های picoCTF برگشتم. برخلاف آخرین باری که ماتریکس چالش را تکمیل کردم، آنها دیگر برای تکمیل یک چالش امتیازی به کاربر اعطا نمی کنند و در عوض، تصمیم گرفتند که هر چالش را با سطح دشواری خود علامت گذاری کنند. چالشی که این بار انجام دادم “Breadth” نام دارد و از اینکه چقدر این چالش ساده بود شگفت زده شدم، حتی اگر به عنوان علامت گذاری شده بود سخت. درست با هر چالش دیگر RE، این شامل دیکامپایل باینری ها با استفاده از Ghidra، مقایسه و مرور کدها برای یافتن پرچم مورد نیاز برای تکمیل چالش است. بدون مقدمه بیشتر، بیایید این چالش را حل کنیم!

1. بررسی باینری ها

برخلاف چالش‌های قبلی که تا کنون تکمیل کرده‌ایم، این چالش دارای دو باینری است که کاربر وظیفه دارد آن‌ها را تحلیل کند. بیایید این دو باینری را با استفاده از Ghidra دیکامپایل کنیم.

یکی از اولین گام‌هایی که من همیشه در مورد RE برمی‌دارم این است که فهرستی از فراخوانی‌های تابع را به صورت اسمی مرور کنم، مثلاً سعی کنم ببینم آیا توابع جالبی از جمله تابع “main” وجود دارد یا خیر.

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

اساساً آدرس رشته را با شروع بارگذاری می کند picoCTF{TjVxTcVux2adLBDDDFJ6FMs به ثبت EDI، که قرار است به عنوان اولین آرگومان برای تابع “puts” استفاده شود. هر پرچم مورد نیاز برای تکمیل یک چالش در picoCTF با شروع می شود picoCTF{ به دنبال آن یک سری کاراکتر تصادفی و یک براکت مجعد بسته. فقط این تابع نیست که دارای یک پرچم بالقوه است. اساساً ده ها هزار توابع با نام تصادفی وجود دارند که دارای رشته ای هستند که با آنها شروع می شود. picoCTF. این به این باور رسید که آنچه ما در تلاشیم انجام دهیم این است که به نوعی مقایسه و تعیین تفاوت بین این دو باینری، به منظور یافتن عملکردی که بین دو نسخه تغییر کرده است را پیدا کنیم. بنابراین، بیایید سعی کنیم آنها را با هم مقایسه کنیم و بفهمیم چه چیزی تغییر کرده است!

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

2. مقایسه باینری ها

برای مقایسه باینری ها، تصمیم گرفتم برنامه ای به نام را انتخاب کنم radiff2، که بخشی از ابزار RE مبتنی بر CLI است، رادارها 2. بعداً متوجه شدم که Ghidra عملکردی برای مقایسه دو باینری دارد، اما در زمان مقابله با این چالش، از وجود آن آگاه نبودم.

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

ما می توانیم تأیید کنیم که تغییرات در باینری ها در آدرس های زیر رخ داده است:

خطوط قرمز مقادیر هگزادسیمال را نشان می‌دهند که از نسخه 2 باینری حذف شده‌اند و خطوط سبز مقادیر هگزا را نشان می‌دهند که جایگزین مشابه‌های حذف شده خود شده‌اند. بیایید به Ghidra برگردیم و سری مقادیر هگزادسیمال را جستجو کنیم 43 52 e5 d7 4f 75 9f f9 9c 57 06 0c 2b c2 df 27 51 a7 dd a9 واقع در آدرس 0x000002d4 ببینم چیز جالبی هست یا نه

جستجوی سری مقادیر هگزادسیمال در بخش زیر از کد نتیجه می گیرد. ما اساساً در ابتدای باینری هستیم و به نظر می‌رسد بیننده ابرداده باینری را نشان می‌دهد و به نظر نمی‌رسد چیزی را که در حال حاضر نیاز داریم انجام دهد. بریم سراغ نامزد بعدی که آدرس هست 0x0009504e، با سری مقادیر هگزادسیمال از 48 3d 3e c7 1b 04 74 0a c3 66 0f 1f 84 00.

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

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

خیلی وقته که ندیدم! از آخرین باری که اساساً چیزی در وبلاگم پست کردم مدتی می گذرد، lol. در حدود 3 ماه گذشته، من به طور کلی به شدت درگیر زندگی بودم و ممکن است بهانه ای به نظر برسد، اما در نتیجه، برای انجام هیچ یک از چالش ها وقت ندیدم. با این حال، برای اولین بار پس از مدتی، بالاخره زندگی به من فرصت آزاد داد تا از گذراندن مدتی برای انجام کاری که دوست دارم لذت ببرم، و در اینجا با مروری دیگر از یکی از چالش های picoCTF برگشتم. برخلاف آخرین باری که ماتریکس چالش را تکمیل کردم، آنها دیگر برای تکمیل یک چالش امتیازی به کاربر اعطا نمی کنند و در عوض، تصمیم گرفتند که هر چالش را با سطح دشواری خود علامت گذاری کنند. چالشی که این بار انجام دادم “Breadth” نام دارد و از اینکه چقدر این چالش ساده بود شگفت زده شدم، حتی اگر به عنوان علامت گذاری شده بود سخت. درست با هر چالش دیگر RE، این شامل دیکامپایل باینری ها با استفاده از Ghidra، مقایسه و مرور کدها برای یافتن پرچم مورد نیاز برای تکمیل چالش است. بدون مقدمه بیشتر، بیایید این چالش را حل کنیم!

1. بررسی باینری ها

برخلاف چالش‌های قبلی که تا کنون تکمیل کرده‌ایم، این چالش دارای دو باینری است که کاربر وظیفه دارد آن‌ها را تحلیل کند. بیایید این دو باینری را با استفاده از Ghidra دیکامپایل کنیم.

وارد کردن باینری ها

باینری های وارداتی

توضیحات تصویر

یکی از اولین گام‌هایی که من همیشه در مورد RE برمی‌دارم این است که فهرستی از فراخوانی‌های تابع را به صورت اسمی مرور کنم، مثلاً سعی کنم ببینم آیا توابع جالبی از جمله تابع “main” وجود دارد یا خیر.

توضیحات تصویر

توضیحات تصویر

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

پرچم بالقوه

اساساً آدرس رشته را با شروع بارگذاری می کند picoCTF{TjVxTcVux2adLBDDDFJ6FMs به ثبت EDI، که قرار است به عنوان اولین آرگومان برای تابع “puts” استفاده شود. هر پرچم مورد نیاز برای تکمیل یک چالش در picoCTF با شروع می شود picoCTF{ به دنبال آن یک سری کاراکتر تصادفی و یک براکت مجعد بسته. فقط این تابع نیست که دارای یک پرچم بالقوه است. اساساً ده ها هزار توابع با نام تصادفی وجود دارند که دارای رشته ای هستند که با آنها شروع می شود. picoCTF. این به این باور رسید که آنچه ما در تلاشیم انجام دهیم این است که به نوعی مقایسه و تعیین تفاوت بین این دو باینری، به منظور یافتن عملکردی که بین دو نسخه تغییر کرده است را پیدا کنیم. بنابراین، بیایید سعی کنیم آنها را با هم مقایسه کنیم و بفهمیم چه چیزی تغییر کرده است!

عملکرد اصلی

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

2. مقایسه باینری ها

برای مقایسه باینری ها، تصمیم گرفتم برنامه ای به نام را انتخاب کنم radiff2، که بخشی از ابزار RE مبتنی بر CLI است، رادارها 2. بعداً متوجه شدم که Ghidra عملکردی برای مقایسه دو باینری دارد، اما در زمان مقابله با این چالش، از وجود آن آگاه نبودم.

تفاوت بین باینری ها

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

خروجی تفاوت

ما می توانیم تأیید کنیم که تغییرات در باینری ها در آدرس های زیر رخ داده است:

خطوط قرمز مقادیر هگزادسیمال را نشان می‌دهند که از نسخه 2 باینری حذف شده‌اند و خطوط سبز مقادیر هگزا را نشان می‌دهند که جایگزین مشابه‌های حذف شده خود شده‌اند. بیایید به Ghidra برگردیم و سری مقادیر هگزادسیمال را جستجو کنیم 43 52 e5 d7 4f 75 9f f9 9c 57 06 0c 2b c2 df 27 51 a7 dd a9 واقع در آدرس 0x000002d4 ببینم چیز جالبی هست یا نه

جستجو برای مقادیر هگز

رشته هگز 1 تغییر کرد

جستجوی سری مقادیر هگزادسیمال در بخش زیر از کد نتیجه می گیرد. ما اساساً در ابتدای باینری هستیم و به نظر می‌رسد بیننده ابرداده باینری را نشان می‌دهد و به نظر نمی‌رسد چیزی را که در حال حاضر نیاز داریم انجام دهد. بریم سراغ نامزد بعدی که آدرس هست 0x0009504e، با سری مقادیر هگزادسیمال از 48 3d 3e c7 1b 04 74 0a c3 66 0f 1f 84 00.

جستجوی حافظه

پاسخ بالقوه

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

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

نوشته های مشابه

دیدگاهتان را بنویسید

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

دکمه بازگشت به بالا