在多次XOR运算中用作一个输入后,变量int键莫名其妙地发生变化

时间:2017-12-09 21:54:05

标签: c

我尝试使用输入的密钥加密file_1.txt并将结果输出到file_2.txt。教授指定必须一次以100个字节读取文件。

int main(int argc, char *argv[]){
int key;
key = atoi(argv[1]);

FILE *file_pointer;
file_pointer = fopen(argv[2], "rb");

char buffer[100];
char output[sizeof(int)][100];
int output_counter = 0;
int read_counter;
int read_elements;
int buffer_reset_counter;
for(buffer_reset_counter = 0; buffer_reset_counter < 100; buffer_reset_counter++){
    buffer[buffer_reset_counter] = 0;
    }
while(read_elements = fread(buffer, 1, 100, file_pointer) > 0){
    read_counter = 0;
    while(read_counter < 100){
        printf("xor'ing %d and %d\n", key, buffer[read_counter]);
        output[output_counter][read_counter] = buffer[read_counter] ^ key;
        read_counter = read_counter + 1;
        }
    output_counter = output_counter + 1;
    for(buffer_reset_counter = 0; buffer_reset_counter < 100; buffer_reset_counter++){
        buffer[buffer_reset_counter] = 0;
        }
}

fclose(file_pointer);

file_pointer = fopen(argv[3], "wb");
int write_counter = 0;
while(write_counter < output_counter){
    fwrite(output[write_counter], 1, 100, file_pointer);
    write_counter = write_counter + 1;
    }
}

file_1.txt是重复100次的字符串"test file for testing\n"

打印的输出与前几百张打印的预期一致,但随后键变了:

xor'ing 111 and 115
xor'ing 111 and 116
xor'ing 111 and 105
xor'ing 111 and 110
xor'ing 111 and 103
xor'ing 111 and 10
xor'ing 111 and 116
xor'ing 111 and 101
xor'ing 111 and 115
xor'ing 111 and 116
xor'ing 111 and 32
xor'ing 111 and 102
xor'ing 111 and 105
xor'ing 111 and 108
xor'ing 111 and 101
xor'ing 111 and 32
xor'ing 111 and 102
xor'ing 111 and 111
xor'ing 111 and 114
xor'ing 111 and 32
xor'ing 111 and 116
xor'ing 111 and 101
xor'ing 111 and 115
xor'ing 111 and 116
xor'ing 111 and 105
xor'ing 6 and 110
xor'ing 26630 and 103
xor'ing 6383622 and 10
xor'ing 207710214 and 116
xor'ing 207710214 and 101
xor'ing 207710214 and 115
xor'ing 207710214 and 116
xor'ing 207710214 and 32
xor'ing 207710214 and 102
xor'ing 207710214 and 105
xor'ing 207710214 and 108
xor'ing 207710214 and 101
Segmentation fault (core dumped)

我不知道密钥是如何变化的。如果相关,则printf("%d", sizeof(int));输出4。

之前我提交了一个关于垃圾进入缓冲区数组的问题(stackoverflow.com/q/47732691/905902),因为它在使用fread()之前没有初始化。这次的问题是密钥意外地发生了变化。

1 个答案:

答案 0 :(得分:1)

声明中:

output[output_counter][read_counter] = buffer[read_counter] ^ key;

output_counter如果它所处的循环运行超过四次,则可以大于sizeof(int),即文件中有超过400个字节(我认为)。发生这种情况时,xor的操作会覆盖堆栈,堆栈会写入key的存储空间。

更高级别,您真的想学习使用像valgrind或clang的地址清理工具这样的工具,因为他们会很快发现这样的问题。