【问题标题】:problem initialization order in buffer overflow problem缓冲区溢出问题中的问题初始化顺序
【发布时间】:2019-04-06 22:43:06
【问题描述】:

首先,这是一道作业题。我不确定它是否可以,但不要发布任何关于如何更改 int 值的内容。

我的问题是我是否有订单

int set_me = 0;
char buf[15];

切换到

char buf[15];
int set_me = 0;

它仍然会通过溢出字符数组来改变整数。我使用gcc -m32 -o buffer -O0 -fno-stack-protector buffer.c 编译文件。我猜-O0 让 gcc 不要优化堆栈,所以 int 和 char[] 应该像它们在 c 代码中一样有序。原始代码在 if 条件下没有显示在那里做了一些事情。

#include <stdlib.h>

#include <stdio.h>

#include <string.h>

int main(int argc, char** argv)
{
        if(argc != 2)

        {

                printf("usage:\n%s string\n", argv[0]);
                return EXIT_FAILURE;
        }
        int set_me = 0;
        char buf[15];

        if(set_me == 1111222){}
        return EXIT_SUCCESS;
}

【问题讨论】:

  • 编译器可以随意分配变量。不保证代码中顺序的变化会对生成的二进制文件产生任何影响。
  • 缓冲区没有被任何东西触及。它应该如何被攻击?
  • 我不明白问题出在哪里。 (或者这段代码sn-p的目的是什么。)
  • 部分原始代码未在此处显示。 char buf[15] 将更改为 argv[]。并且在 if 条件中调用了启动 shell。

标签: c gcc stack buffer-overflow


【解决方案1】:

堆栈上变量的顺序取决于实现。

仅仅因为变量在代码中以特定顺序定义并不意味着它们在编译程序中的顺序相同。添加更多不同类型的变量可能会也可能不会改变排序,就像改变优化设置一样。

如果您正在测试缓冲区溢出,则需要尝试使用变量声明,直到获得所需的布局。

【讨论】:

    【解决方案2】:

    正如已经指出的那样,即使没有优化,声明的顺序也无法预测堆栈上的分配顺序。它完全依赖于实现。

    但是,如果您的“buf”确实溢出,您将写入越来越高的地址,但堆栈(通常)会向下增长。

    因此,虽然无法确定覆盖堆栈帧中的其他变量,但您可以确定,如果缓冲区溢出足够大,您将破坏 main() 上方的堆栈,其中包含任何调用的返回地址main(),这会以一种或另一种方式使你的程序崩溃。最好保持启用堆栈保护器,因为检测到堆栈粉碎是从损坏的程序中相对干净的退出。

    不受控制的溢出会导致各种奇怪的行为,尤其是当覆盖的返回地址指向某些可执行代码时。这是溢出攻击的典型设置。

    我的问题是如果我有订单

    int set_me = 0;
    char buf[15];
    

    切换到

    char buf[15];
    int set_me = 0;
    

    它仍然会通过溢出字符数组来改变整数。我使用 gcc -m32 -o buffer -O0 -fno-stack-protector buffer.c 来编译文件。我猜 -O0 让 gcc 不优化堆栈,所以 int an char[] 应该像它们在 c 代码中一样有序。原始代码在 if 条件下没有显示在那里做了一些事情。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-06-20
      • 2019-08-15
      • 2021-09-20
      • 2021-09-19
      • 2013-02-01
      • 2014-06-14
      • 2022-01-03
      • 2013-12-09
      相关资源
      最近更新 更多