这个题目是要求运行时输入4个参数,就是四个key,先把key1,key2输对,会打出一段话,提示下一步的工作要点,把key3,key4输对了,会看到成功的提示,key1,key4编译器相关,说出key2,key3就行了.源码就在下面了,大家来试试吧.
代码如下:
-
#include <stdio.h>
-
#include <stdlib.h>
-
-
int prologue [] = {
-
0x5920453A, 0x54756F0A, 0x6F6F470A, 0x21643A6F,
-
0x6E617920, 0x680A6474, 0x6F697661, 0x20646E69,
-
0x63636363, 0x63636363, 0x72464663, 0x6F6D6F72,
-
0x63636363, 0x63636363, 0x72464663, 0x6F6D6F72,
-
0x2C336573, 0x7420346E, 0x20216F74, 0x726F5966,
-
0x7565636F, 0x20206120, 0x6C616763, 0x74206C6F,
-
0x20206F74, 0x74786565, 0x65617276, 0x32727463,
-
0x594E2020, 0x206F776F, 0x79727574, 0x4563200A
-
};
-
-
int data [] = {
-
0x63636363, 0x63636363, 0x72464663, 0x6F6D6F72,
-
0x466D203A, 0x65693A72, 0x43646E20, 0x6F54540A,
-
0x5920453A, 0x54756F0A, 0x6F6F470A, 0x21643A6F,
-
0x594E2020, 0x206F776F, 0x79727574, 0x4563200A,
-
0x6F786F68, 0x6E696373, 0x6C206765, 0x796C656B,
-
0x2C336573, 0x7420346E, 0x20216F74, 0x726F5966,
-
0x7565636F, 0x20206120, 0x6C616763, 0x74206C6F,
-
0x20206F74, 0x74786565, 0x65617276, 0x32727463,
-
0x6E617920, 0x680A6474, 0x6F697661, 0x20646E69,
-
0x21687467, 0x63002065, 0x6C6C7861, 0x78742078,
-
0x6578206F, 0x72747878, 0x78636178, 0x00783174
-
};
-
-
int epilogue [] = {
-
0x594E2020, 0x206F776F, 0x79727574, 0x4563200A,
-
0x6E617920, 0x680A6474, 0x6F697661, 0x20646E69,
-
0x7565636F, 0x20206120, 0x6C616763, 0x74206C6F,
-
0x2C336573, 0x7420346E, 0x20216F74, 0x726F5966,
-
0x20206F74, 0x74786565, 0x65617276, 0x32727463
-
};
-
-
char message[100];
-
-
void usage_and_exit(char * program_name) {
-
fprintf(stderr, "USAGE: %s key1 key2 key3 key4\n", program_name);
-
exit(1);
-
}
-
-
void process_keys12 (int * key1, int * key2) {
-
-
*((int *) (key1 + *key1)) = *key2;
-
}
-
-
void process_keys34 (int * key3, int * key4) {
-
-
*(((int *)&key3) + *key3) += *key4;
-
}
-
-
char * extract_message1(int start, int stride) {
-
int i, j, k;
-
int done = 0;
-
-
for (i = 0, j = start + 1; ! done; j++) {
-
for (k = 1; k < stride; k++, j++, i++) {
-
-
if (*(((char *) data) + j) == '\0') {
-
done = 1;
-
break;
-
}
-
-
message[i] = *(((char *) data) + j);
-
}
-
}
-
message[i] = '\0';
-
return message;
-
}
-
-
-
char * extract_message2(int start, int stride) {
-
int i, j;
-
-
for (i = 0, j = start;
-
*(((char *) data) + j) != '\0';
-
i++, j += stride)
-
{
-
message[i] = *(((char *) data) + j);
-
}
-
message[i] = '\0';
-
return message;
-
}
-
-
int main (int argc, char *argv[])
-
{
-
int dummy = 1;
-
int start, stride;
-
int key1, key2, key3, key4;
-
char * msg1, * msg2;
-
-
dummy = dummy;
-
key3 = key4 = 0;
-
-
if (argc < 3) {
-
usage_and_exit(argv[0]);
-
}
-
key1 = strtol(argv[1], NULL, 0);
-
key2 = strtol(argv[2], NULL, 0);
-
if (argc > 3) key3 = strtol(argv[3], NULL, 0);
-
if (argc > 4) key4 = strtol(argv[4], NULL, 0);
-
-
process_keys12(&key1, &key2);
-
-
start = (int)(*(((char *) &dummy)));
-
stride = (int)(*(((char *) &dummy) + 1));
-
-
if (key3 != 0 && key4 != 0) {
-
process_keys34(&key3, &key4);
-
}
-
-
msg1 = extract_message1(start, stride);
-
-
if (*msg1 == '\0') {
-
process_keys34(&key3, &key4);
-
msg2 = extract_message2(start, stride);
-
printf("%s\n", msg2);
-
}
-
else {
-
printf("%s\n", msg1);
-
}
-
-
return 0;
-
}
阅读(1698) | 评论(0) | 转发(0) |