字符串中间的空终止符



如果程序接收argv[1]参数为中间有空终止符的字符串,会发生什么?例如:

./program test''example

argv[1]的值是多少?是测试吗?是testexample吗?我有这几行代码

max = sizeof(filename);
len = strlen(argv[1]);
if (len > max) goto error;
strcpy(filename, argv[1]);

我需要为这个程序构建一个漏洞,我想做的是使argv[1]值得测试''example所以strlen(argv[1])=strlen("test")=4和strcpy(filename, argv[1])=strcpy(filename, "test")所以我可以使用字符串的其余部分(示例部分)来放置我的漏洞。这可能吗?非常感谢。

argv[1]是类型为char*的指针对象。它的值是一个地址,而不是字符串。具体为char对象的地址,其值为't'

C标准(在第7.1.1节)有以下定义:

字符串是一个连续的字符序列,以并包括第一个null结束性格。
[…]
指向字符串的指针是指向其初始(最低寻址)字符的指针。字符串长度是空字符和之前的字节数字符串值是所包含字符的值的顺序。

由于argv[1]指向连续字符序列中的第一个字符,其中一个是空字符,因此它是指向字符串的指针。该字符串的值是"test"(包括结束符''),字符串长度为4。

通常会说,作为一种口头速记,argv[1]的值是"test",但这是不精确的——特别是在这种情况下,字符串的值和包含该字符串的数组的值之间的区别是显著的。

argv[1]还指向字符数组的第一个字符。该数组的前5个字节包含字符串"test"。整个数组包含字符值:

{ 't', 'e', 's', 't',
  '',
  'e', 'x', 'a', 'm', 'p', 'l', 'e',
  '' }

如果将argv[1]的值传递给字符串函数,该函数将只看到"test",并且不会访问超出终止''的任何内容。数组的其余内容仍然是完全有效的,并且可以使用不只是操作字符串的函数(如memcpy)访问。

是否有可能以这样的方式调用主程序,即argv[1]将指向具有这些特定内容的数组的第一个元素是另一回事,这取决于您的操作系统。

argv[1]的值将是"test",假设您实际上能够在终端上获得一个真正的NULL字符,而不仅仅是字面字符0

正如RedAlert的评论所提到的,strlenstrcpy都停在一个空字符上,所以得到一个空字符对大多数漏洞没有帮助。

您很可能需要找到一种不使用字符的方法来进行利用。

main()main()内部调用时,您的想法有效

#include <stdio.h>
int main(int argc, char **argv) {
  if (argc == 1) {
    char *data[] = {"", "5onetwo", "7threefour", "6fivesix"};
    main(4, data); // call main again, with exploitable data
  } else {
    if (!argv[0][0]) { // test for empty argv[0]
      for (int i = 1; i < 4; i++) {
        printf("%s ==> %sn", argv[i] + 1, argv[i] + argv[i][0] - '0');
      }
    }
  }
  return 0;
}

我不确定当main()从C库初始化代码调用时是否会起作用…或者即使你可以让你的shell接受一个NUL字符作为参数的一部分。

相关内容

  • 没有找到相关文章

最新更新