Сегментация 11 в выпуске Linux

Я делаю проблему переполнения буфера, и я пытаюсь напечатать привет мир. Ниже мой код
но я получаю проблему сегментации 11, когда я запускаю этот файл с другим. »./executable < input.cpp (это файл ниже). Я делаю что-то не так, чтобы решить проблему переполнения буфера?

#include<stdio.h>

using namespace std;main()
{
printf("A");
//00000b00
for (int i = 0; i < 4; i++)

printf("%c%c%c%c",0x00,0x0b,0x00,0x00);}

Ниже приведен фактический код, который я пытаюсь напечатать привет. Выше моя входная строка.

#include <iostream>

using namespace std;
int i;
unsigned int* p;

void f1() {

int a=10;
char str[4];

cout << "Please enter a string:";
while (!cin.eof()) {
cin.get(str[i]);
i++;
}

printf("address of str is:%x\n",str);

cout << "The string you entered is:";
printf("address of a is:%x\n",&a);
cout << str << endl;
}

void f2()
{
cout << "Hello World!\n";
}

main()
{
printf("The address of function f2:%08x\n",f2);
f1();
}

-1

Решение

Я получаю проблему сегментации 11 при запуске этого файла с другим.

  ./executable < input.cpp

Я делаю что-то не так, чтобы решить проблему переполнения буфера?

Да. Атаки с переполнением буфера не работают так — выгрузка части исходного кода на C в память магическим образом не приводит к компиляции и запуску машины. Для обобщения, данные, которые вы сбрасываете в память, должны содержать:

  1. Заполнение, чтобы заставить следующие данные лежать в нужном месте в стеке
  2. Адрес замены в расположении старого обратного адреса, указывающий на следующий исполняемый код
  3. Еще немного отступов, обычно «слайд NOP»
  4. Некоторый исполняемый код

Пожалуйста, прочитайте классикуРазбивая стек для удовольствия и прибыли«и имейте в виду, что вам, возможно, придется отключить некоторые средства защиты (неисполняемый стек, ASLR, стек канареек), чтобы эти эксплойты работали в современной системе.

1

Другие решения

  • Использовать %x модификатор для печати шестнадцатеричных значений

Если это C программа, тогда использование namespace std не имеет смысла

#include<stdio.h>
int main(void)
{
puts("A");
for (int i = 0x0; i < 4; i++)
printf("%x\n", i);

return 0;
}

Сообщение Op было обновлено:

#include<stdio.h>
#include <iostream>

using std::cout;
using std::cin;
using std::endl;

int i = 0; //Initialise i

void f1() {
int a=10;
char str[4];

cout << "Please enter a string: ";
while (!cin.eof() && i < 4 ) { //Have a condition on length of string
cin.get(str[i]);
i++;
}
str[i] = '\0'; //Set the eof character at end of the string
printf("address of str is: %p\n", str);
printf("address of a is: %p\n", &a);
cout << "The string you entered is: " << str << endl;
}

void f2() {
cout << "Hello World!\n";
}

int main()
{
printf("The address of function f2: %p\n", f2); //To print address use the %p option
f1();
return 0;
}
-1

По вопросам рекламы [email protected]