我正在处理一个任务,需要对使用较差加密算法加密的PDF进行密码破解分析。
教授提供的代码使用
在我的解密代码中,我使用
问题是,当我尝试从文件中读取内容时,出现了“坏的文件描述符”错误。我使用stat尝试获取更多关于已打开文件的文件描述符的信息,它显示该文件长度为0,实际上它有几百KB。
我正在使用以下调试代码:
与打开文件相关的代码:
教授提供的代码使用
fd=open(filename, O_CREAT|O_WRONLY, S_IRUSR|S_IWUSR)
创建了加密文件。在我的解密代码中,我使用
fd_in=open(file, O_RDONLY)
打开该文件。问题是,当我尝试从文件中读取内容时,出现了“坏的文件描述符”错误。我使用stat尝试获取更多关于已打开文件的文件描述符的信息,它显示该文件长度为0,实际上它有几百KB。
我正在使用以下调试代码:
if (0 > (len = read(fd_in, (char*)&read_buff, BITE))) { // BITE is defined as 8
printf("Error occured grabbing first bite of %s.\n", file);
printf("%s.\n", strerror(errno));
struct stat fileStat;
int stat = fstat(fd_in, &fileStat);
printf("fstat returned: %d.\n", stat); // Consistently printing 0
printf("Information for %s\n",file);
printf("---------------------------\n");
printf("File Size: \t\t%d bytes\n",fileStat.st_size);
printf("Number of Links: \t%d\n",fileStat.st_nlink);
printf("File inode: \t\t%d\n",fileStat.st_ino);
printf("File Permissions: \t");
printf( (S_ISDIR(fileStat.st_mode)) ? "d" : "-");
printf( (fileStat.st_mode & S_IRUSR) ? "r" : "-");
printf( (fileStat.st_mode & S_IWUSR) ? "w" : "-");
printf( (fileStat.st_mode & S_IXUSR) ? "x" : "-");
printf( (fileStat.st_mode & S_IRGRP) ? "r" : "-");
printf( (fileStat.st_mode & S_IWGRP) ? "w" : "-");
printf( (fileStat.st_mode & S_IXGRP) ? "x" : "-");
printf( (fileStat.st_mode & S_IROTH) ? "r" : "-");
printf( (fileStat.st_mode & S_IWOTH) ? "w" : "-");
printf( (fileStat.st_mode & S_IXOTH) ? "x" : "-");
printf("\n\n");
return 1;
我得到的结果是:
Error occured grabbing first bite of enc.pdf.
Bad file descriptor.
Information for enc.pdf
---------------------------
File Size: 0 bytes
Number of Links: 1
File inode: 16441996
File Permissions: -rw-------
ls命令报告文件为
-rw------- 1 matt matt 157887 Oct 29 03:01 enc.pdf
与打开文件相关的代码:
int fd_in=open(file, O_RDONLY);
if(fd_in<0) {
printf("Failed to open the input file %s.\n", file);
return 1;
} else {
printf("File open, descriptor is: %d.\n", fd_in);
}
这一行代码一直打印出文件描述符的值为3。
关于read_buff有一些疑问。加密/解密过程涉及对读取的值进行异或运算。因此,缓冲区被声明为unsigned long long
,为了读入它,我需要取地址并将其强制转换为(char*)类型。这种策略直接来自教授用于创建加密文件的代码。
我甚至添加了一个else语句和printf语句来验证文件描述符是否有效。目前,它似乎始终是3
,而不是-1
。
errno
设置为几个随机值,以验证错误消息是否发生变化。相当有信心它是由read(..)
设置的。 - Mattread_buff
是如何声明的? - alkopen()
和read(11,...)
之间的代码以某种方式破坏了栈,并改变了fd_in
的值,将其从3
更改为11
。 - alk