【问题标题】:"Hacking: The Art of Exploitation": why does example program work with just gcc but not with -m32?“黑客:剥削的艺术”:为什么示例程序只能使用 gcc 而不能使用 -m32?
【发布时间】:2014-06-19 20:08:54
【问题描述】:

以下代码来自“黑客:剥削的艺术”第 2 版,名为 input.c

 int main() {
    char message[10];
    int count, i;
    strcpy(message, "Hello, world!");
    printf("Repeat how many times? ");
    scanf("%d", &count);
    for(i=0; i < count; i++)
        printf("%3d - %s\n", i, message);
    }

这对我来说似乎是一个内存错误(溢出),因为数组 message 仅适用于 10 个字节。 但是,当我只用 gcc 编译它并执行程序时,它运行良好。

当我在编译过程中添加标志 gcc -m32 时,我得到 Abort trap 6 或表示有问题的错误(我在我的个人 mac 和我大学的 linux 计算机集群上尝试过这个,看看是否有不同. 在后者上,内存映射和回溯的堆栈粉碎有更多的显式错误,而我的 mac 只有 Abort Trap 6)。

无论如何,这是我的问题:为什么代码只适用于 gcc 而不是 gcc -m32 ? 另外,为什么我用 gcc -m32 编译文件后,如果我尝试只用 gcc 再次编译文件,它仍然无法工作?

我有很多不明白的地方,因此请提供有关为什么会发生这种情况的任何其他信息。谢谢。

【问题讨论】:

  • gcc 是哪个版本的?尝试gcc --version至于第二个问题,尝试在编译之间删除所有.o文件。
  • strcpy 不是简单地写到缓冲区的末尾,而且碰巧不会覆盖任何重要的东西吗?
  • @Prof.Falken 如何列出目录中的所有 .o 文件?我通常有一个执行 rm -f $(programs) core *.o 的 make 文件,但是使用 gcc,你如何列出和删除 .o 文件?
  • 另外,对于版本,它们配置为: --prefix=/Applications/Xcode.app/Contents/Developer/usr --with-gxx-include-dir=/usr/include/c++ /4.2.1 Apple LLVM 版本 5.1 (clang-503.0.40)(基于 LLVM 3.4svn)目标:x86_64-apple-darwin13.2.0 线程模型:posix;对于 linux,gcc (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3
  • @vvayne,应该可以。

标签: c gcc


【解决方案1】:

写入数组之外(以及读取数组之外)是未定义的行为,因此它取决于编译器选项只是一个巧合。

【讨论】:

  • 啊,就是这样。我的猜测是未损坏的程序可以与 -m32 一起使用。
  • 在 32 位和 64 位架构上,局部变量存储在堆栈上的方式以及过程调用如何操作堆栈应该几乎相同。虽然这是未定义的行为,但我仍然觉得程序崩溃与 -m32 很有趣
  • @SeriousBusiness- 这是一种可能发生的方式。 message 需要 14 个字节来保存字符串,包括尾随的空字节。您分配了 10。在 32 位代码上,堆栈上的下一个内容,可能是帧头,需要 4 字节对齐,因此 message 被填充到 12 个字节,仍然不够。但是,在 64 位代码上,帧头(或其他)需要 8 字节对齐,因此 message 被填充为 16 字节,绰绰有余。我并不是说这正是正在发生的事情,但它表明了可能发生的事情。
猜你喜欢
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
  • 2017-04-12
  • 1970-01-01
  • 1970-01-01
  • 2011-01-26
  • 1970-01-01
相关资源
最近更新 更多