در دنیای آموزش برنامه نویسی تیم کوئرا به دنبال برگزاری دورههای مدرن آموزشی و با کیفیت بالا در قالب بوتکمپ است که اعضای با استعداد و دلسوز تیم همه تلاش خود را در جهت برگزاری هر چه بهتر این دوره میکنند.
برگزارکنندگان بوتکمپ نیازمند ذخیره اطلاعات شرکت کنندگان بوتکمپ در یک فایل به نام `bootcamp_data` هستند. اما با یک چالش مواجه شده اند آنها میخواهند این فایل را به گونه ای تنظیم کنند که تنها اعضای گروه `quera-bootcamp`(دو عضو `user1`, `user2`) قابلیت خواندن، نوشتن آن را داشته باشند. دیگر افراد خارج از این گروه نباید به هیچ وجه به این فایل دسترسی داشته باشند. کاربر صاحب فایل و دایرکتوری `user1` است.
یک دایرکتوری با اسم `bootcamp` در روت (`/`) بسازد بعد از ایجاد دایرکتوری فایل گفته شده را در این دایرکتوری بسازید و سپس به تیم بوتکمپهای کوئرا کمک کنید تنظیمات مورد نظر را اعمال کند.
کاربران باید پوشه خانه مخصوص به خود را داشته باشند و پس از اجرای برنامه کاربران گروه و همه فایل ها را پاک کنید.
## توجه کنید
+ شما میتوانید هر تعداد دستوری که نیاز دارید را برای داوری ارسال کنید و محدودیتی در تعداد دستورات ندارید.
+ شما حق استفاده از هر دستوری به غیر از `usermod` و `cd` را دارید ولی توصیه میکنیم **هیچ** پایپلاینی تشکیل ندهید.
+ نیازی به استفاده از `sudo` نیست.
+ نیازی به استفاده از آپشن `--remove-all-files` برای حذف یوزر نیست.
## نحوه ارسال
برای ارسال جواب میتوانید دستورات خواسته شده را درون فایلی با نام `solution.sh` وارد کنید و آن را انتخاب و سپس ارسال کنید.
دسترسی مجاز - Linux
در روزی از روزها، تیم بوتکمپ یک اینستنس لینوکسی دریافت کرد که مشکوک بود.
اعضای تیم بعد از بررسی متوجه شدند که این فایل دستکاری شده است. اما از آنجایی که مشغول طراحی سوالات کانتست هستند از شما خواستهاند تا پیگیر ماجرا باشید.
[میتوانید فایل را از اینجا دانلود کنید](https://drive.usercontent.google.com/download?id=1xDLrER8Lnz4s_Qq6rpXYCC0ZGezAdwv5)
در این فایل فلگی قرار دارد و از شما میخواهیم که فلگ را پیدا کنید.
دقت کنید که فرمت فلگ به شکل زیر است.
```
queraCTF{XXX}
```
# نکات مهم
- **داوری سوالات بدون نمره منفی است.**
- **توجه کنید که ارسال شما در این سوال بعد از اتمام مسابقه داوری میشوند.**
## نحوه ارسال
شما باید فلگ پیدا شده را در باکس قرار داده شده سابمیت کنید.
پرچم - Linux
پوریا که در تیم امنیت مشغول به کار است لیستی از آیپیهای مختلف جهت تنظیم دسترسی کاربران تهیه کرده است. او اکنون از شما میخواهد اسکریپتی برای او بنویسید که با استفاده از آن بتواند عملیات مسدود یا آزاد سازی آیپیهای مختلف را به راحتی انجام دهد.
### جزئیات پروژه
اسکریپت `Ip_manager.sh` را مطابق توضیحات زیر پیادهسازی کنید:
+ نحوهی اجرای اسکریپت بهصورت `./Ip_manager.sh command ip_list_filepath` یا `Ip_manager.sh command IP` است. مثال:
```
./Ip_manager.sh block ./ip_lists/sample.txt
```
و یا :
```
./Ip_manager.sh block 104.28.193.140
```
+ اگر تعداد آرگومانهای ورودی اسکریپت کمتر از ۲ تا بود، اسکریپت باید عبارت `not enough arguments` را چاپ کند و متوقف شود.
+ اگر مقدار `command` برابر با `block` یا `unblock` نبود، اسکریپت باید عبارت `invalid command` را چاپ کند و متوقف شود.
+ اگر فایلی که مسیر آن بهعنوان آرگومان دوم وارد میشود وجود نداشت و یا آیپی وارد شده معتبر نبود، اسکریپت باید عبارت `File does not exist or invalid IP` را چاپ کند و متوقف شود.
+ اگر مقدار `command` برابر با `block` باشد و آدرس یک فایل وارد شود، اسکریپت باید لیست بازههای آیپی موجود در فایل را دریافت کند و درخواستهای ورودی مربوط به این آیپیها را بهازای همهی پروتکلها و پورتها `DROP` کند. اگر _rule_ مربوط به `ACCEPT` کردن این درخواستها از قبل موجود بود، اسکریپت باید آنها را حذف کند.
+ اگر مقدار `command` برابر با `block` باشد و یک آیپی وارد شود، اسکریپت باید درخواستهای ورودی مربوط به این آیپی را بهازای همهی پروتکلها و پورتها `DROP` کند. اگر _rule_ مربوط به `ACCEPT` کردن این درخواستها از قبل موجود بود، اسکریپت باید آنها را حذف کند.
+ اگر مقدار `command` برابر با `unblock` باشد و آدرس یک فایل وارد شود، اسکریپت باید لیست بازههای آیپی موجود در فایل را دریافت کند و درخواستهای ورودی مربوط به این آیپیها را بهازای همهی پروتکلها و پورتها `ACCEPT` کند. اگر _rule_ مربوط به `DROP` کردن این درخواستها از قبل موجود بود، اسکریپت باید آنها را حذف کند.
+ اگر مقدار `command` برابر با `unblock` باشد و و یک آیپی وارد شود، اسکریپت باید درخواستهای ورودی مربوط به این آیپی را بهازای همهی پروتکلها و پورتها `ACCEPT` کند. اگر _rule_ مربوط به `DROP` کردن این درخواستها از قبل موجود بود، اسکریپت باید آنها را حذف کند.
+ آیپی ورودی میتواند به صورت `104.28.193.140` یا یک بازه مانند `95.170.192.0/19` باشد.
### نکات
+ عملیات مسدودسازی و آزادسازی درخواستها باید با استفاده از `iptables` انجام شود.
+ داوری این سؤال کمی بیشتر از سایر سؤالات طول میکشد.
+ تضمین میشود که هیچ _rule_ ای خارج از اسکریپت اضافه نمیشود.
### نحوه ارسال
پس از پیادهسازی موارد خواستهشده، فایل `Ip_manager.sh` را آپلود کنید.
بلاکش کن! - Linux
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
باب و آلیس که از دوستان صمیمی و قدیمی دنیای امنیت هستند به تازگی کارآگاه پروندههای جنایی در سیسیل شدهاند، جایی که مافیای مخوف کل جزیره را با قتلهای پی در پی احاطه کرده است.
در این جزیره جرم و جنایت حرف اول را میزند و قانون حاکم ناعدالتیست. باب و آلیس در این جزیره استخدام شدهاند تا شرایط کنونی را سامان دهند، آنها میدانند که تمامی این ناامنیها زیر سر خانواده *لوچانو* میباشد و قصد دارند تا به طور مخفیانه لیست سران این تشکیلات را بدست آورده و تحویل مقامات امنیتی ایتالیا بدهند.
باب و آلیس در این جزیره مأموریت سختی را بر عهده دارند و کوچکترین اشتباه از سمت آنها میتواند به قیمت جانشان تمام شود.
به باب و آلیس در حل این پرونده کمک کنید، قبل از اینکه خورشید `8` بار غروب کند!
![توضیح تصویر](https://upload.wikimedia.org/wikipedia/commons/1/1b/LuckyLucianoSmaller.jpeg)
باب و آلیس با آدرس `192.168.100.106` توانستهاند به کمک ابزار `nmap` سرور مافیا با آدرس `192.168.100.103` را `scan` کرده و `port`های باز آنها را شناسایی کنند.
ترافیک `scan` سرور را میتوانید از این [لینک](https://drive.google.com/file/d/1QIvW36ZtxABzPilzYLPJB09SWb1MVEiu/view?usp=drive_link) دانلود کنید.
شما باید با تجزیه و تحلیل ترافیک موجود در فایل `traffic.pcap` شماره `port`های باز این سرور را بدست آورده و `port`های کوچکتر از `49410` را به صورت صعودی `concat` کنید تا به رشته هدف صعودی برسید. به طور مثال اگر شماره `port`های باز کوچکتر از `49410` سرور مورد نظر بر اساس فایل `traffic.pcap` اعداد `80`، `400`، `33`، `2234` و `123` باشد، رشته هدف صعودی به صورت دنباله صعودی این اعداد است:
33801234002234
همچنین طبق تعریف بالا میتوان رشته هدف نزولی را نیز تعریف کرد که دنباله نزولی این اعداد است. به طور مثال رشته هدف نزولی اعداد فوق به صورت زیر میباشد:
22344001238033
بعد از به دست آوردن رشته هدف صعودی و نزولی باید از این [لینک](https://drive.google.com/file/d/1h8J_Uhxt94yIhRJoZF41jk10Br7_r-Wl/view?usp=drive_link) `dump` پایگاه داده آنها را دانلود کنید. تمامی فایلهای این پایگاه داده رمز شده است و شما باید فایلی که هم نام رشته هدف صعودی است را پیدا کرده و محتوای آن را رمزگشایی کنید تا به لیست مأموریتهای سران این تشکیلات دست یابید!
بعد از رمزگشایی و بدست آوردن لیست مأموریتهای سران تشکیلات، شما باید به کمک دستور `awk` محتویات بدست آمده را طوری مرتب کنید تا خروجی آن به صورت مجموعه دادگانی با سه ستون زیر باشد که بر اساس ستون `Total Income` به طور نزولی `sort` شده و در آخرین خط خروجی، رشته هدف نزولی بدست آمده از `port`های باز سرور چاپ شده باشد:
[Mafia Name] [Number Of Kills] [Total Income]
...
[Mafia Name] [Number Of Kills] [Total Income]
[Descending Target String]
+ دقت کنید که هر سطر خروجی شما باید مربوط به یکی از سران تشکیلات باشد و هیچ دو سطری نباید `Mafia Name` مشابه داشته باشند.
به طور مثال پایگاه داده زیر یک نمونه خروجی معتبر است:
Mateo 10 21
Dante 12 18
22344001238033
<details class="blue">
<summary>راهنمایی نمونه خروجی</summary>
+ خروجی فوق به این معناست که `Mateo` در مجموع تمامی مأموریتهای خود تعداد `10` نفر را کشته و به ازای همه آن قتلها `21` قطعه طلا بدست آورده است همچنین `Dante` نیز در مجموع تمامی مأموریتهای خود تعداد `12` نفر را کشته و به ازای همه آن قتلها `18` قطعه طلا بدست آورده است.
+ سطرهای موجود در خروجی بر اساس ستون `Mafia Name` تکراری نیستند.
+ سطرهای خروجی بر اساس ستون `Total Income` به صورت نزولی `sort` شدهاند.
+ آخرین خط خروجی، رشته هدف نزولی بدست آمده از `port`های باز سرور چاپ شده است.
</details>
### نحوه ارسال
در نهایت نتیجه نهایی را به صورت متن در `form` زیر ارسال کنید تا مافیای سیسیل هر چه زودتر دستگیر شود.
# نکات مهم
- **داوری سوالات بدون نمره منفی است.**
- **توجه کنید که ارسالهای شما در این سوال بعد از اتمام مسابقه داوری میشوند.**
مافیای سیسیل - Linux
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۱۰۰ مگابایت
----------
در شهر کانتیننتال، هتلی وجود دارد که به ریاست پیکلوویچ، همه خلافکارها و آدمهای خطرناک در آن ساکن هستند به طوری که اگر کسی بخواهد به آن وارد شود، اسم خود را به نگهبان داده و نگهبان با بررسی فراوان در لیست خود، به او اجازه ورود میدهد.
هیچکس جرئت نزدیک شدن به این هتل را نداشت تا اینکه یک گروه به سرکردگی الکس تصمیم گرفتند به این هتل نفوذ کنند. افراد الکس تصمیم گرفتند که اسمهای خود را رمز کنند به صورتی که بین آن حروف اضافهتری قرار بدهند اما از شانس بد الکس، خلافکارها این موضوع را متوجه شدهاند و در تلاشاند که اسم رمزنگاری نشده این گروه را پیدا کنند.
آنها این کار را به این صورت در نظر میگیرند که از اسم رمزگذاری شده، زیررشتههایی به اندازه اسم واقعی میسازند و ارزش آن را محاسبه میکنند. ارزش هر زیر رشته برابر است با مجموع تکرار حروف آن. هرکدام که ارزش بالاتری داشت به احتمال بیشتری اسم واقعی است و آنها به دنبال آن هستند. **توجه کنید که به طرز عجیبی اسم واقعی افراد الکس حروف تکراری ندارد!**
برنامهای بنویسید که به خلافکارها کمک کند تا اسم نفوذی را پیدا کنند =)))))
# ورودی
ورودی شامل دو خط است که در خط اول اسم رمزنگاری شده به حروف کوچک انگلیسی (s) و در خط دوم طول اسم واقعی (n) می آید.
$$1 \le s.length \le 2 * 10^5$$
$$1 \le n \le s.length $$
# خروجی
خروجی برنامه شامل یک خط است که در آن تعداد زیررشتهها با بیشترین ارزش را برمیگرداند.
**از آنجایی که جواب ممکن است خیلی بزرگ باشد باقیمانده آن را به $10^9 + 7$ محاسبه کنید.**
# مثال
## ورودی نمونه ۱
```
seas
2
```
## خروجی نمونه ۱
```
4
```
در این نمونه ارزش هر زیر رشته به صورت زیر محاسبه میشود:
+ f('s') = 2, f('e') = 1, f('a') = 1
+ **se**as => f('s') + f('e') = 3
+ **s**e**a**s => f('s') + f('a') = 3
+ s**ea**s=> f('e') + f('a') = 2
+ s**e**a**s** => f('e') + f('s') = 3
+ se**as** => f('a') + f('s') = 3
که در این نمونه بزرگترین ارزش برابر با ۳ است و تعداد زیررشتهها با این اندازه ۴ میباشد.
## ورودی نمونه ۲
```
leech
4
```
## خروجی نمونه ۲
```
2
```
در این نمونه ارزش هر زیر رشته به صورت زیر محاسبه میشود:
+ f('l') = 1, f('e') = 2, f('c') = 1, f('h') = 1
+ **le**e**ch** => f('l') + f('e') + f('c') + f('h') = 5
+ **l**e**ech** => f('l') + f('e') + f('c') + f('h') = 5
که در این نمونه بزرگترین ارزش برابر با ۵ است و تعداد زیررشتهها با این اندازه ۲ میباشد.
هتل کانتینِنتال - Python
+ محدودیت زمان: ۱ ثانیه
+ محدودیت حافظه: ۲۵۶ مگابایت
----------
دستمان خورد و همهچیز پاک شد. از شما میخواهیم با اسکریپت پایتونی نوع فایلهای پاک شده را بازیابی کنید.
```python answer.py
def data_recovery(data):
pass
```
خروجی تابع پایتونی شما باید یک لیست از فایلتایپهای پیدا شده باشد.
تنها فایلهای زیر برای ما اهمیت دارند. آنها را پیدا کنید.
```
header1 = b'\x89PNG\r\n\x1a\n' # PNG header
header2 = b'\xff\xd8\xff' # JPEG header
header3 = b'\x42\x4d' # BMP header
header4 = b'\x49\x49\x2a\x00' # TIFF header
header5 = b'\x47\x49\x46\x38' # GIF header
header6 = b'\x50\x4b\x03\x04' # ZIP header
header7 = b'\x7fELF' # ELF header
header8 = b'\x25\x50\x44\x46' # PDF header
header9 = b'\x49\x44\x33' # MP3 header
header10 = b'\xff\xfb' # MPEG header
header11 = b'\x00\x00\x01\x00' # PDDF header
header12 = b'\x00\x01\x00\x00' # ICO header
```
# مثال
## ورودی
```
b'\x89PNG\r\n\x1a\nBMII*\x00\xff\xd8\xff\xff\xd8\xff\x00\x00\x01\x00\x00'
```
## خروجی
```
['PNG', 'JPEG', 'BMP', 'TIFF', 'PDDF', 'ICO']
```