【问题标题】:stack smashing, cant find overflow error堆栈粉碎,找不到溢出错误
【发布时间】:2015-11-16 03:00:52
【问题描述】:

我正在尝试编写一个函数,如果字符串的长度小于分配给 char 缓冲区的最大大小,它将用某个字符填充字符串。我遇到了“* stack smashing detected *: ./test terminate”错误,它停止了我的测试程序,因为我假设某处有溢出覆盖了一些受保护的内存。这似乎是一个简单的功能,但我似乎无法找到错误的原因。

void pad_string2(char* buf, size_t buf_size, char* str, char* pad) {
      strncpy(buf, str, buf_size);
      size_t pad_size = buf_size - strlen(str);
      printf("pad size: %zu\n", pad_size);
      if (pad_size > 0) {
         unsigned int i = 0;
         while(i < (pad_size - 1)) {
            strncpy((buf + strlen(str) + i), pad, buf_size);
            i++;
         }
      }
      buf[buf_size - 1] = '\0';
} 

我认为这可能是一个问题,但是测试字符串的长度 似乎没有超过缓冲区的大小。

char buf[16];
printf("sizeof(buf): %zu\n", sizeof(buf));
pad_string2(buf, sizeof(buf), "testing", "A");
printf("strlen(testing): %zu\n", strlen("testing"));
printf("buf: %s\n", buf);

Output
------
sizeof(buf): 16
pad size: 9
strlen(testing): 7
buf: testingAAAAAAAA
*** stack smashing detected ***: ./test terminated
Aborted

任何人都可以提供帮助吗?

谢谢

【问题讨论】:

    标签: c buffer-overflow strncpy stack-smash


    【解决方案1】:

    行:

    strncpy((buf + strlen(str) + i), pad, buf_size);
    

    最终会写出你不应该写的内存。 buf_size 对于您想要做的事情来说太大了。使用:

    strncpy((buf + strlen(str) + i), pad, 1);
    

    【讨论】:

    • 弄清楚这一点!我应该更多地关注 strncpy 及其参数规范。但感谢您的帮助和迅速的回应!
    猜你喜欢
    • 2012-06-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-06-08
    • 1970-01-01
    相关资源
    最近更新 更多