مسابقات فتح پرچم

فتح پرچم – شریف ۹۴- برنامه‌نویسی امن

چند سالی هست که در رقابت های شریف سوالاتی با عنوان برنامه نویسی امن (secure coding) مشاهده می‌شود. قالب کلی این سوالات به این شکل هست که کد یک برنامه‌ داده می‌شود و از شرکت کنندگان خواسته می‌شود که بدون اینکه عملکرد اصلی برنامه را تغییر بدهند کد را به گونه‌ای تغییر دهند که امن شود به عبارت دیگه آسیب پذیری‌های اون را رفع کنند. در رقابت‌های دور ششم هم دو سوال از این دست وجود داشت.

سوال اول: (۱۰۰ امتیاز)
کدی به شکل زیربه شرکت کنندگان داده شده بود

#include <vector>
#include <iostream>
#include <windows.h>

using namespace std;


int main()
{
    vector<char> str(MAX_PATH);

    cout << "Enter your name: ";
    cin >> str.data();

    cout << "Hello " << str.data() << " :)" << endl;

    return -14;
}

دو تا از تیم های شرکت کننده راه‌حل‌های (write-up) خودشون را نوشته‌اند.

لینک ۱

لینک ۲

این دو تا تیم ترجیح داده‌اند بدون پرداختن به آسیب‌پذیری احتمالی کد خودشون را به صورت امن بنویسند.

#include <vector>
#include <iostream>

using namespace std;


int main()
{
    string s;

    cout << "Enter your name: ";
    getline(cin, s);

    cout << "Hello " << s << " :)" << endl;

    return -14;
}

اما اگر قصد داشته باشیم کد را با اندک تغییری امن کنیم باید از کدی مشابه کد زیر استفاده کنیم:

#include <vector>
#include <iostream>
#include <windows.h>

using namespace std;


int main()
{
    vector<char> str(MAX_PATH);
    
    cout << "Enter your name: ";
    cin.get(str.data(), str.size());

    cout << "Hello " << str.data() << " :)" << endl;

    return -14;
}

در واقع مشکل اصلی این برنامه این هست که ممکنه بیشتر از اون چیزی که باید از ورودی بخونه – با تغییر خط ۱۳ این برنامه می‌توان مشکل را حل کرد.

پاسختان را بنویسید