У меня очень рудиментарное понимание C (хотя я вообще понимаю понятия программирования). У меня есть задание создать переполнение буфера, которое дает что-то (например, доступ к несанкционированной области, бесплатные деньги и т. Д.), А не просто сбой программы.Как запустить код с разбитым стеклом?
Я пробовал буферы различного размера и всегда могу «свернуть» программу, но я не могу заставить ее запускать какой-либо код (т. Е./Bin/su). Подхожу ли я к этому неправильно?
Вот код:
#include <stdio.h>
#include <stdlib.h>
#include <float.h>
#include <limits.h>
#include <string.h>
#define BUFSIZE 20
int main() {
int month=12;
int day=31;
int year=2016;
int confirm = 0;
double dollars = 5.00;
char *sitenum="97871";
char acctnum[BUFSIZE];
printf("Welcome to the Acme AP-AR System. This is the Accounts Receivable module. \n");
/* Gathering date information */
printf("Please enter the month of transaction as an integer value (2 digits). \n");
printf("For example, July would be 07, December would be 12. Please input the month: ");
for (;;) { /* Start of month input validation loop */
scanf("%d", &month);
if(month>=1 && month<=12) {
printf("Validated. \n");
break;
}
else {
printf("Please enter a value between 1 and 12! \n");
continue;
}
} /* End of month input validation loop */
printf("\nPlease enter the day of transaction as an integer value (2 digits). \n");
printf("For example, the 3rd would be 03, the 25th would be 25. Please input the day: ");
for (;;) { /* Start of day input validation loop */
scanf("%d", &day);
if(day>=1 && day<=31) {
printf("Validated. \n");
break;
}
else {
printf("Please enter a value between 1 and 31! \n");
continue;
}
} /* End of day input validation loop */
/* Gathering sender account number */
printf("\nPlease enter the sender Account Number: ");
scanf("%s", acctnum);
/* Gathering transaction amount */
printf("\nPlease enter the USD amount (including cents) received: $ ");
scanf("%lf", &dollars);
/* Confirming data entry */
printf("\nTransaction information.\n Date: %d-%d-%d \n", month,day,year);
printf("Account: %s-%s \n", sitenum, acctnum);
printf(" Amount: $ %.2lf \n", dollars);
printf("\nProcess transaction information? (Yes=1/No=0) ");
for (;;) { /* Start of confirmation validation loop */
scanf("%d", &confirm);
if(confirm==1) {
printf("Transaction processed. \n");
break;
}
else {
printf("Transaction voided! \n");
break;
}
} /* End of confirmation validation loop */
return (EXIT_SUCCESS);
}
При выполнении, если ввести 25 символов в день месяца, программа будет продолжаться до конца. Только после того, как последний вход завершится с ошибкой разбиения стека. Боюсь, я пытаюсь сделать что-то, что не может быть сделано, но день (буквально, за последние 8 часов) поисковых запросов Google не привел пример, который я смог использовать.
Может кто-то подтолкнет меня в другом направлении, которое приблизит меня к тому, чего я пытаюсь достичь? Благодарю.
я добавил еще немного примечания в моем ответе, чтобы решить, что я считаю фактическим намерением задания. Надеюсь, это поможет. – Aenimated1