C,写系统调用,写int

时间:2013-02-09 15:58:10

标签: c low-level

我在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 *的函数,因为我要写的文件结果是假的。

所以这是一个错误,对吧?

2 个答案:

答案 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)

之类的东西