2013-02-09 100 views
1

我发现乔恩·埃里克森的书,Hacking: The Art of Exploitation这个来源,C,写系统调用,写INT

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 

我试图编译这段代码,并发现,我写的文件,用户ID(这是什么我在上面的代码中写)是不正确的;他们只是写了奇怪的字符(我认为写在这里并不重要)。所以问题是我想通过一个int函数需要char *,因为我想写的文件的结果是false。

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

+3

'write(fd,&userid,4)'将二进制表示写入文件。你的文本编辑器不会理解它。 – 2013-02-09 16:00:10

+0

使用'人写'(或谷歌它)。 'write'系统调用需要一个'const void *',而不是'char *'。这是二进制表示的问题(即您的整数不是编码为char的)而不是整数。 – RageD 2013-02-09 16:00:37

回答

5

write()函数期望其缓冲区为void *;它写入任意的二进制数据。如果您需要转换为字符串,请使用printf()

你没有表现的userid声明,但write()线应写为:

if (write(fd, &userid, sizeof(userid)) != sizeof(userid)) 

这将检测短写(不太可能是一个问题一个整数型)和其它问题,并且无论userid的类型如何都能正常工作。因此,这条线的原始版本可能是错误的。否则,该错误似乎符合您的期望,而不是代码本身。

2

不,这不是一个错误,而是你的错误理解。调用write将只写内存中的内容,即二进制表示。你需要像fprintf这样的东西来获得可读的版本。

例如,7的二进制表示可以是四个字节0​​,0,0和7,它们不可能看起来像文本表示,单个字节55(假设为ASCII)。

硬编码类型长度像4是一个整数,因为这不是可移植的也是一个坏主意。最好是使用类似sizeof(userid)的东西。

+0

谢谢,我明白了。 这些源代码没有错误,只是写出内存中的内容。这是4位(正常大小的integer 2013-02-10 00:04:30