我在Jon Erickson的书Hacking: The Art of Exploitation,
中找到了这个来源userid = getuid(); // get the real user ID
// Writing data
if(write(fd, &userid, 4) == -1) // write user ID before note data
fatal("in main() while writing userid to file");
write(fd, "\n", 1); // terminate line
我试着编译这段代码,发现在我写的文件中,userid(我在上面的代码中编写的内容)不对;他们只是写了一些奇怪的角色(我认为在这里写它并不重要)。所以问题是我试图将int
传递给需要char *
的函数,因为我要写的文件结果是假的。
所以这是一个错误,对吧?
答案 0 :(得分:5)
write()
函数需要void *
的缓冲区;它写入任意二进制数据。如果您需要转换为字符串,请使用printf()
。
您没有显示userid
的声明,但write()
行应写为:
if (write(fd, &userid, sizeof(userid)) != sizeof(userid))
这将检测短写入(不太可能是整数类型的问题)和其他问题,并且无论userid
的类型如何都能正常工作。因此,该系列的原始版本可能是错误的。否则,错误似乎在你的期望而不是代码本身。
答案 1 :(得分:2)
不,这不是一个错误,而是你自己的误解。 write
调用只会写出内存中的内容,即二进制表示。你需要像fprintf
这样的东西来获得一个可读的版本。
例如,7的二进制表示可以是四个字节0,0,0和7,它们不太可能看起来像文本表示,单个字节55(假设是ASCII)。
将整数类型的长度硬编码为4也是一个坏主意,因为它不是可移植的。更好的方法是使用sizeof(userid)
。