c-stat.h文件访问文件描述符open()破解利用的艺术



我正在编写Jon Erickson的《黑客:利用的艺术》第二版,使用虚拟机(virutalbox(运行它附带的LiveCD(Ubuntu 7.04(。在0x281"文件访问"部分,作者使用第82-84页上的一个示例解释了通过文件描述符以及open((close((read((和write((函数访问文件。

simplenote.c的代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
void usage(char *prog_name,char *filename){
        printf("Usage: %s < data to add to %s>n",prog_name,filename);
        exit(0);
}
void fatal(char *);
void *ec_malloc(unsigned int );
int main(int argc,char *argv[]){
        int fd; //file descriptor
        char *buffer,*datafile;
        buffer = (char *)ec_malloc(100);
        datafile = (char *)ec_malloc(20);
        strcpy(datafile,"/tmp/notes");
        if(argc < 2)
                usage(argv[0],datafile);
        strcpy(buffer,argv[1]);
        printf("[DEBUG] buffer   @ %p:'%s'n",buffer,buffer);
        printf("[DEBUG] datafile @ %p:'%s'n",datafile,datafile);
        strncat(buffer,"n",1);//Add a newline on the end.
        fd = open(datafile,O_WRONLY|O_CREAT|O_APPEND,S_IRUSR|S_IWUSR);
        if(fd == -1)
                fatal("in main() while opening file");
        printf("[DEBUG] file descriptor is %dn",fd);
        //Writing data
        if(write(fd,buffer,strlen(buffer)) == -1)
                fatal("in main() while writing buffer to file");
        //Closing file
        if(close(fd) == -1)
                fatal("in main() while closing file");
        printf("Note has been saved.n");
        free(buffer);
        free(datafile);
}
//A function to display an error message and then exit
void fatal(char *message){
        char error_message[100];
        strcpy(error_message,"[!!]Fatal Error");
        strncat(error_message,message,83);
        perror(error_message);
        exit(-1);
}
//An error-checked malloc() wrapper function 
void *ec_malloc(unsigned int size){
        void *ptr;
        ptr = malloc(size);
        if(ptr == NULL)
                fatal("in ec_malloc() on memory allocation");
        return ptr;
}

然而,当我在终端窗口中键入书中所述的以下说明时,它会返回以下错误消息:

reader@hacking:~/booksrc $ gcc -o simplenote simplenote.c
In file included from /usr/include/sys/stat.h:105, from simplenote.c:6:
/usr/include/bits/stat.h:70: error: field 'st_atim' has incomplete type
/usr/include/bits/stat.h:71: error: field 'st_mtim' has incomplete type
/usr/include/bits/stat.h:72: error: field 'st_ctim' has incomplete type
simplenote.c: In function 'main':
simplenote.c:35: error: 'O-WRONLY' undeclared (first use in this function)
simplenote.c:35: error: (Each undeclared identifier is reported only once
simplenote.c:35: error: for each function it appears in.)
simplenote.c:35: error: 'O_CREAT' undeclared (first use in this function)
simplenote.c:35: error: 'O_APPEND' undeclared (first use in this function)

这里是sys/stat.h105行:

#include <bits/stat.h>

这里是bits/stat.h63-83:行

#ifdef __USE_MISC
    /* Nanosecond resolution timestamps are stored in a format 
       equivalent to 'struct timespec'. This is the type used 
       whenever possible but the Unix namespace rules do not allow the 
       identifier 'timespec' to appear in the <sys/stat.h> header. 
       Therefore we have to handle the use of this header in strictly 
       standard-compliant sources special. */
    struct timespec st_atim;    /* Time of last access. */
    struct timespec st_mtim;    /* Time of last modification. */
    struct timespec st_ctim;    /* Time of last status change. */
# define st_atime st_atim.tv_sec    /* Backward compatibility */
# define st_mtime st_mtim.tv_sec
# define st_ctime st_ctim.tv_sec
#else
    __time_t st_atime;                 /* Time of last access. */
    unsigned long int st_atimensec;    /* Nscecs of last access. */
    __time_t st_mtime;                 /* Time of last modification. */
    unsigned long int st_mtimensec;    /* Nsecs of last modification. */
    __time_t st_ctime;                 /* Time of last status change. */
    unsigned long int st_ctimensec;    /* Nsecs of last status change. */
#endif

我想这可能对第一组问题有用:

C++系统文件bits/stat.h突然中断;错误:字段"st_atim"具有不完整的类型">

/usr/include/time.h

cat time.h

没有在我的终端窗口做任何事情。

这里是simplenote.c的主函数行1-6,34-35:

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>
#include <fcntl.h>
#include <sys/stat.h>
// Opening the file
    fd = open(datafile, O_WRONLY|O_CREAT|O_APPEND, S_IRUSR|S_IWUSR);

我猜开放函数的问题源于fcntl.h?

由于作者提供的错误代码,我似乎一直遇到问题。我不想一直依赖stackoverflow社区的帮助,那么对于新手来说,你对未来检查和解决这些问题有什么建议呢?

谢谢。

将选择的注释转换为半连贯的答案

您可能应该显式地启用POSIX定义。在命令行中添加-D_XOPEN_SOURCE=700,或者在第一个#include之前添加#define _XOPEN_SOURCE 700,看看这是否解决了任何问题。不过,你不应该遇到这个问题;标头应该是自包含的。

哦,但是Ubuntu 7.04太过时了…你可能需要用600而不是700。这本书什么时候出版的?如果是2009年或之前,您可能需要旧版本(600(。你看到这个错误仍然令人惊讶。指定的命令行不包含通常会引起故障的选项(例如,-ansi -pedantic-std=c99 -pedantic(。您也可以尝试使用-std=gnu99;它可能会更好用。

您最近也遇到了类似的问题(gcc-o stdlib.h语法错误c破解剥削艺术(。你解决了吗?听起来Live CD上的编译系统不是自洽的,或者你使用它的方式意味着它的行为不自洽。你确定编译系统有效吗?它似乎是半废弃的。不知怎么的,它使用了错误的标题吗?

我能够通过在#include <stdlib.h> 之前插入#include <stdint.h>来解决之前的问题

我会试试-D_XOPEN_SOURCE=600然后回复你。编译系统一定出了问题。

好吧,您可能需要在<sys/stat.h>之前包含<time.h>(或者可能是<sys/time.h>(,但如果这样做有效,<sys/stat.h>标头就会被破坏。如果你必须在包含<stdint.h>之前包含它,那么<stdlib.h>标头就坏了。我想Ubuntu 7.04可能太旧了,你应该在这些标头之前包含#include <sys/types.h>,但这仍然不是<stdlib.h>的借口;应该是独立的。POSIX 1997在<sys/stat.h>之前要求#include <sys/types.h>;POSIX 2004没有。我认为Ubuntu 7.04并没有那么老。

不过,请注意,st_atim成员是新成员;它被添加到POSIX 2008中(因此在POSIX 2013中也是如此(。它以前只是st_atime(而st_atime现在是st_atim.tv_sec的宏(。

包括CCD_ 24处理的位统计问题。Ubuntu 7.04于2007年发布,我正在使用的这本书的第二版于2008年发布。此外,不确定这是否有用,但在之前的另一个包含<stdio.h><string.h>(而不是仅包含<stdio.h>(的示例中,代码将在没有任何干预的情况下正常运行。

有趣……它会让你的生活变得有趣,在某种程度上,生活不应该是有趣的。(脑海中浮现出"愿你生活在有趣的时代"这样的中文诅咒。(在所有汇编中使用-DXOPEN_SOURCE=600选项,并祈祷;这很可能会解决你的大部分问题。也可以考虑使用-std=gnu99,或者改为使用。如果运气好的话,这两种方法中的一种或两种都会让你解决大多数问题。

如果其他人对这本书有同样的问题,我从hacking-live-1.0.iso下载了iso文件。创建了一个可引导的usb,一切都很好,没有损坏的头或任何东西。

相关内容

  • 没有找到相关文章

最新更新