struct变量溢出读取文本文件?

时间:2014-01-25 07:28:38

标签: c struct buffer-overflow

我试图解析Linux ar文件的标头。我使用ar.h文件中的ar_hdr结构来保存标题数据。通过使用一个简单的文本文件解析存档并将头数据分配给struct char数组,我开始变得很小。

void conciseTable(char *path)
{

    int fd, r, pos;
    struct ar_hdr header[20]; 

    //Open the file
    fd = open(path, O_RDONLY);
    if (fd == -1){
        perror("Error opening file");
        exit(-1);
    }

    // seek to end of ARMAG
    pos = lseek(fd, SARMAG, SEEK_SET);

    r = read(fd, header[1].ar_name, 16);
    r = read(fd, header[1].ar_date, 12);
    r = read(fd, header[1].ar_uid, 6);
    r = read(fd, header[1].ar_gid, 6);
    r = read(fd, header[1].ar_mode, 8);
    r = read(fd, header[1].ar_size, 10);

    printf("%s\n", header[1].ar_name);
    printf("%s\n", header[1].ar_date);
    printf("%s\n", header[1].ar_uid);
    printf("%s\n", header[1].ar_gid);       
    printf("%s\n", header[1].ar_mode);
    printf("%s\n", header[1].ar_size);

    close(fd);
}

ar文件如下所示:

!<arch>
1-s.txt/        1390594295  50389 13361 100640  41        `
1111111111111111111111111111111111111111

当我运行它时,我得到以下输出:

1-s.txt/        1390594295  50389 13361 100640  41
1390594295  50389 13361 100640  41
50389 13361 100640  41
13361 100640  41
100640  41
41

看起来阵列互相溢出,我无法弄清楚如何阻止这种情况发生。

如果它有帮助,这里是ar.h手册页的link

2 个答案:

答案 0 :(得分:3)

在使用printf("%s\n", ...)打印字符串之前,您需要指定终止0字符,或者需要明确指定最大打印长度。即。

printf("%16.16s\n", header[1].ar_name);
printf("%12.12s\n", header[1].ar_date);
printf("%6.6s\n", header[1].ar_uid);
...

在您的情况下发生的事情是第一个printf打印了名称,因为没有0终止字符,它继续打印日期,uid等。然后第二个printf打印日期和继续打印uid,... < / p>

答案 1 :(得分:0)

只需读取数据并解析即可。您需要检查然后再次检查。我甚至可以成为这个HTML页面。当你确定适合结构

相关问题