- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我在 if.c 中找到了这一行unix 版本 6。
ncom = "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
为什么有这么多x?你为什么要设置这个?
最佳答案
您所说的代码如下所示:
ncom = "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";
while(c=nargv[0][i]) {
ncom[9+i++] = c;
}
ncom[9+i] = '\0';
所有这些 x 都充当缓冲区,它们被以下循环覆盖。因此,代码有效地将“/usr/bin/”添加到 nargv[0]
中的命令。
有了更多的上下文,代码是这样做的:
execv(nargv[0], nargv, np);
execv(ncom+4, nargv, np);
execv(ncom, nargv, np);
如果 nargv[0]
中的给定命令是 "foo"
它将首先尝试运行 "foo"
然后 “/bin/foo”
最后是 “/usr/bin/foo”
。
请注意,上面是如何不做这样的事情的一个很好的例子:
如果nargv[0]
中的字符串恰好比x的个数长,代码会愉快地继续复制数据。这将覆盖堆栈的其他部分。结果是缓冲区溢出的一个很好的例子。 (您分配了一定大小的缓冲区并写入了比分配的更多的数据。)
这个例子将演示问题:
#include <stdio.h>
int main(){
char s[]="abcde";
int i;
for(i=0;i<100;i++){
printf("position %2d contains value %3d\n",i,s[i]);
s[i]=0;
}
puts(s);
return 0;
}
如果你运行它,它(很可能)会输出这个:
position 0 contains value 97
position 1 contains value 98
position 2 contains value 99
position 3 contains value 100
position 4 contains value 101
position 5 contains value 0
position 6 contains value 0
position 7 contains value 0
position 8 contains value 0
position 9 contains value 0
position 10 contains value 0
position 11 contains value 0
position 12 contains value 12
position 1 contains value 0
position 2 contains value 0
position 3 contains value 0
position 4 contains value 0
position 5 contains value 0
position 6 contains value 0
position 7 contains value 0
[...]
它将用零填充字符串(包含 ASCII 值 97 到 101)并继续写入内存,它会在其中找到变量 i
的位置,并将其设置为零。现在 i
为零,因此循环再次开始,一次又一次地覆盖已经被覆盖的字符串。
不仅局部变量可以被覆盖,函数的返回地址也可能被覆盖,导致“段错误”或任意代码的执行,这经常被恶意软件使用。
关于command - "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx";?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27705708/
我在 if.c 中找到了这一行unix 版本 6。 ncom = "/usr/bin/xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"; 为什么有这么多x?你为什么要设置这个?
我是一名优秀的程序员,十分优秀!