C:缓冲区溢出,更改传递的变量

时间:2017-05-09 20:38:12

标签: c linux buffer-overflow strcat

我正在做一些关于缓冲区溢出的练习,目前我很难理解如何继续进行其中一个缓冲区溢出。这是程序代码:

#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的位置(有点简单,只是填充了0x41的区域,因为我用它发送垃圾邮件甲&#39; S)。 length的位置有点棘手,但问题在于 - 它位于缓冲区之前,这意味着如果我愿意,我甚至无法覆盖它。但是,我认为,我仍然需要覆盖它以进入else分支。而且我已经陷入困境,没有找到正确的方法。

1 个答案:

答案 0 :(得分:0)

如果字符串很长 - 比如256个字符,则Length变量将是错误的。使用评论中的建议来捕获它。

崩溃:字符串拷贝然后将所有256个字符复制到缓冲区中字符串的末尾,该字符串只能容纳250个字节。

将strcpy()移动到else。

附加说明:

我在调试器(VS2015)

中运行了这个

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