gpt4 book ai didi

python - 通过 argv 输入零字节到 C 程序

转载 作者:太空宇宙 更新时间:2023-11-04 01:08:10 25 4
gpt4 key购买 nike

这是简单的 C 程序

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

int main(int argc, char **argv)
{
int hex;
memcpy(&hex, argv[1], 4);
printf("hex %x\n", hex);
return 0;
}

我做了如下实验

./main `python -c 'print "\x01\x01\x02\x01"'`

输出是可预测的:hex 1020101

接下来我尝试在我的输入中放入一些零字节

./main `python -c 'print "\x01\x00\x02\x01"'`

结果让我大吃一惊

hex 10201

然后我检查了 python 究竟输出到主要输入的内容:

python -c 'print "\x01\x00\x02\x01"' > test
hexdump -C test

00000000 01 00 02 01 0a |.....|
00000005

而且 python 似乎老实说将\x01\x00\x02\x01 放入文件并打印行尾符号。我的理解是 argv[1] 应该是指向字节模式 01000201 所在内存的指针。在这种情况下,输出应该是 1020001 而不是 10201。

问题 - 零字节在哪里?

最佳答案

零字节是字符串终止符,因此在使用反引号时它永远不会被 shell 传递。我很确定内核也不会在第一个零之后传递任何字节,因为它应该如何知道要复制的参数的实际长度?

您可以通过以下方式轻松验证这一点

echo `python -c 'print "\x01\x00\x02\x01"'` | hd

在您的程序中,您访问未初始化的内存是因为所有定义的第一个参数在第一个 '\0' 之后结束。结果可能是确定性的,但本质上是未定义的。

关于python - 通过 argv 输入零字节到 C 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29180969/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com