Я делаю проблему переполнения буфера, и я пытаюсь напечатать привет мир. Ниже мой код
но я получаю проблему сегментации 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();
}
Я получаю проблему сегментации 11 при запуске этого файла с другим.
./executable < input.cpp
Я делаю что-то не так, чтобы решить проблему переполнения буфера?
Да. Атаки с переполнением буфера не работают так — выгрузка части исходного кода на C в память магическим образом не приводит к компиляции и запуску машины. Для обобщения, данные, которые вы сбрасываете в память, должны содержать:
Пожалуйста, прочитайте классикуРазбивая стек для удовольствия и прибыли«и имейте в виду, что вам, возможно, придется отключить некоторые средства защиты (неисполняемый стек, ASLR, стек канареек), чтобы эти эксплойты работали в современной системе.
%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;
}