-1

我正在做一个缓冲区溢出问题,我试图打印你好世界。下面是我的代码,但是当我与另一个文件一起运行此文件时,我遇到了分段 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);



}

下面是我试图打印 hello world 的实际代码。以上是我的输入字符串。

#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();
}
4

2 回答 2

1

当我与另一个文件一起运行此文件时,我遇到了分段 11 问题。

  ./executable < input.cpp

我在解决缓冲区溢出问题时做错了什么?

是的。缓冲区溢出攻击不是这样工作的——将一堆 C 源代码转储到内存中不会神奇地使机器编译并运行它。概括地说,您转储到内存中的数据必须包含:

  1. 填充以强制以下数据位于堆栈中的正确位置
  2. 在旧返回地址位置的一个替换地址,指向下面的可执行代码
  3. 更多填充,通常是“NOP幻灯片”
  4. 一些可执行代码

请阅读经典的“ Smashing the stack for fun and profit ”,并记住您可能必须禁用一些保护(不可执行堆栈、ASLR、堆栈金丝雀)才能使这些漏洞在现代系统上运行。

于 2013-09-03T03:17:04.167 回答
0
  • 使用%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;
}
于 2013-09-03T03:12:16.890 回答