من می دانم چه کاری باید در این چالش انجام دهم ، اما من در مورد چگونگی انجام اولین قدم اساسی بسیار گم شده ام. آنچه باید اتفاق بیفتد این است که من باید متغیر ساختار جهانی pin_len را بازنویسی کنم ، که به من اجازه می دهد user_pin را در mask_with_pin () سرریز کنم و به get_shell () پرش کنم. من به هیچ وجه مطمئن نیستم که چگونه می توانم pin_len را بازنویسی کنم. از نظر من ، به نظر می رسد که نویسنده با استفاده از fget ورودی را محدود می کند. من فقط می خواهم گمنامی در جهت درست باشد. با تشکر از شما!
#includ
#includ
#includ
//
// گلوبال ها
//
# تعریف MAX_FIELD_LEN 32
# تعریف BUFFER_SIZE 64
ساختار scratch_space
char notepad [BUFFER_SIZE]؛
بدون امضا int pin_len؛
g_scratch_space؛
//
// کد
//
// TODO: با استفاده از هش ویژه پوسته ای به کاربران بدهید
void get_shell ()
{
سیستم ("/ بن / ش")؛
}
تقلا باطل ()
{
int i = 0؛
// نام اول را در دفترچه یادداشت جهانی بپیچید
برای (i = 0؛ g_scratch_space.notepad [i]؛ من ++)
g_scratch_space.notepad [i] ^ = ((0x7 << i) & 0xff)؛
// گذشته از null-delimiter تیک بزنید ...
من ++؛
// نام خانوادگی را در دفترچه یادداشت جهانی بپیچانید
در حالی که (g_scratch_space.notepad [i])
g_scratch_space.notepad [i++] | = 0x42؛
}
void mask_with_pin ()
{
char user_pin [MAX_FIELD_LEN]؛
// درخواست کاربر برای یک پین
printf ("پین مورد نظر خود را وارد کنید:")؛
fgets (user_pin، g_scratch_space.pin_len، stdin)؛
// با پین کاربر ، یادداشت جهانی را بچرخانید
برای (ثبت نام نشده i i = 0؛ من < BUFFER_SIZE; i++)
g_scratch_space.notepad[i] ^= user_pin[i % g_scratch_space.pin_len];
}
void initialize_scratch_space()
{
// Initialize the notepad to all zero bytes
memset(g_scratch_space.notepad, 0, BUFFER_SIZE);
if (!g_scratch_space.pin_len)
{
printf("Enter the size of the PIN you wish to use: ");
g_scratch_space.pin_len = get_uint();
}
if (g_scratch_space.pin_len > MAX_FIELD_LEN - 1)
{
printf ("[!!] اندازه PIN فراتر از حداکثر مقدار ، ترک ...")؛
خروج (1)؛
}
}
رابط باطل ()
{
char firstname [MAX_FIELD_LEN] = {}؛
نام خانوادگی char [MAX_FIELD_LEN] = {}؛
انتخاب انتخاب = 'y'؛
بدون امضا int firstname_len = 0؛
بدون امضا int lastname_len = 0؛
// برای اولین بار فضای خراش را شروع کنید
fillize_scratch_space ()؛
در حالی که (انتخاب == 'y')
{
// صفر کردن بافرهای محلی ما
ممتاز (نام اصلی ، 0 ، MAX_FIELD_LEN)؛
ممتاز (نام خانوادگی ، 0 ، MAX_FIELD_LEN)؛
// نام و نام خانوادگی کاربر را دریافت کنید.
printf ("نام خود را وارد کنید:")؛
fget (نام اصلی ، MAX_FIELD_LEN ، استدین)؛
printf ("نام خانوادگی خود را وارد کنید:")؛
fget (نام خانوادگی ، MAX_FIELD_LEN ، استدین)؛
// طول نامها را بدست آورید
firstname_len = strnlen (نام اصلی ، MAX_FIELD_LEN)؛
lastname_len = strnlen (نام خانوادگی ، MAX_FIELD_LEN)؛
// نام خود را در دفترچه یادداشت کپی کنید
memcpy (g_scratch_space.notepad، firstname، firstname_len)؛
// نام خانوادگی خود را در دفترچه یادداشت کپی کنید و آن را بعد از نام اول قرار دهید
memcpy (& g_scratch_space.notepad [++firstname_len] ، نام خانوادگی ، نام خانوادگی).
// ورودی را بچرخانید
تقلا ()؛
// بررسی کنید که کاربر می خواهد هش خود را بیشتر کند
printf ("درخواست PIN Scrambling؟ [y/n]")؛
انتخاب = get_char ()؛
// تقارن نهایی را اعمال کنید (در صورت وجود) و هش حاصل را چاپ کنید
اگر (انتخاب == 'y')
{
mask_with_pin ()؛
print_hash (BUFFER_SIZE ، g_scratch_space.notepad)؛
fillize_scratch_space ()؛
}
دیگر اگر (انتخاب == 'n')
{
print_hash (BUFFER_SIZE ، g_scratch_space.notepad)؛
fillize_scratch_space ()؛
}
// به کاربر اجازه دهید جلوی ایجاد هش را بگیرد
printf ("ادامه تولید هش ها؟ [y/n]")؛
انتخاب = get_char ()؛
}
}
اصلی خالی است ()
{
init_wargame ()؛
printf ("----------------------------------------------- ------------- n ")؛
printf ("- [Stack Smashing Level # 2 - SecureHash n")؛
printf ("----------------------------------------------- ------------- n ")؛
رابط()؛
// خروج از برنامه / بازگشت از اصلی
}