【发布时间】:2015-03-21 17:57:44
【问题描述】:
这是简单的 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。所以零字节永远不会被传递,因为
\0是字符串终止符。所以你基本上是在访问未初始化的内存。
标签: python c security memory argv