【问题标题】:C: buffer overflow, changing passed variablesC:缓冲区溢出,改变传递的变量
【发布时间】:2017-05-09 20:38:11
【问题描述】:

我正在做一些关于缓冲区溢出的练习,目前我不知道如何进一步处理其中一个问题。这是程序代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/types.h>
#include <unistd.h>
#include <sys/syscall.h>


void reverb(char *msg, unsigned int len) {

  unsigned char length = (unsigned char) len;
  char buffer[250] = "Printed: ";

  strcat(buffer + 9, msg);

  if ((length > 75) || (length < 15)) {
    fprintf(stderr, "Error: invalid string length");
    exit(1);
  }
  else {
    fprintf(stdout, "%s\n", buffer);
  }
}


int main(int argc, char **argv) {

  //argument check
  if (argc != 2) {
    fprintf(stderr, "Invalid arguments!\n");
    return 1;
  }

  reverb(argv[1], strlen(argv[1]));

  return 0;
}

所以基本上很明显,这个程序应该只是重新打印你给它的参数。我显然必须利用其中一个使用的函数,我怀疑这里的罪魁祸首是 strcat。但是,当我想完成堆栈粉碎时,我遇到了length 变量的问题。

为了能够导致段错误并成功找到发生溢出的点,我需要传递一个长度约为 255+ 的参数(现在不确定当前数字,但它在某个附近),这对于我的 75 字符限制是不可行的。使用 gdb 并在 strcat 之后设置断点,我能够在内存中找到 buffer 的位置(有点简单,只是因为我用 A 向它发送了垃圾邮件,所以该区域填充了 0x41)。 length 的位置有点棘手,但问题出在 - 它位于缓冲区之前,这意味着如果我愿意,我什至无法覆盖它。但是,我认为我仍然需要以某种方式覆盖它才能进入 else 分支。而且我一直被困在这一点上,看不到正确进行的方法。

【问题讨论】:

  • 提示:如果len 超过char 的大小会怎样? ;)
  • 您希望len % 255 介于 15 到 75 之间。因此,将 255 的任意倍数添加到 15 到 75 之间的任意数字中。
  • "这个程序应该只是重新打印你给它的参数。" --> 如果参数的长度为 256,则不是。@MadPhysicist Off-by-one:它是“len % 256 在 15 到 75 之间”
  • @chux。你是绝对正确的。在我之前的评论中将 255 替换为 256。
  • @Siguza void reverb(char *msg, unsigned int len) ... reverb(argv[1], strlen(argv[1])); 是否给出编译器警告?是否启用所有警告? `

标签: c linux buffer-overflow strcat


【解决方案1】:

如果字符串很长——比如 256 个字符,长度变量将是错误的。使用 cmets 中的建议来捕捉它。

崩溃:字符串副本随后会将所有 256 个字符复制到缓冲区中字符串的末尾,缓冲区只能容纳 250 个字节。

将 strcpy() 移到 else 中。

补充说明:

我在调试器中运行了这个(VS2015)

当传入 256 字节的字符串并超出“缓冲区”时,变量“长度”被破坏,其值从 0 变为 69(我的字符串中的某个字符)。这导致 75 字符限制失败并打印缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-02-05
    • 1970-01-01
    • 1970-01-01
    • 2011-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多