diff --git a/endianness/flag.c b/endianness/flag.c new file mode 100755 index 0000000..e91c383 --- /dev/null +++ b/endianness/flag.c @@ -0,0 +1,134 @@ +#include +#include +#include +#include +#include +#include + +char *find_little_endian(const char *word) +{ + size_t word_len = strlen(word); + char *little_endian = (char *)malloc((2 * word_len + 1) * sizeof(char)); + + for (size_t i = word_len; i-- > 0;) + { + snprintf(&little_endian[(word_len - 1 - i) * 2], 3, "%02X", (unsigned char)word[i]); + } + + little_endian[2 * word_len] = '\0'; + return little_endian; +} + +char *find_big_endian(const char *word) +{ + size_t length = strlen(word); + char *big_endian = (char *)malloc((2 * length + 1) * sizeof(char)); + + for (size_t i = 0; i < length; i++) + { + snprintf(&big_endian[i * 2], 3, "%02X", (unsigned char)word[i]); + } + + big_endian[2 * length] = '\0'; + return big_endian; +} + +char *generate_random_word() +{ + printf("Welcome to the Endian CTF!\n"); + printf("You need to find both the little endian and big endian representations of a word.\n"); + printf("If you get both correct, you will receive the flag.\n"); + srand(time(NULL)); + + int word_length = 5; + char *word = (char *)malloc((word_length + 1) * sizeof(char)); + + for (int i = 0; i < word_length; i++) + { + word[i] = (rand() % 26) + 'a'; + } + + word[word_length] = '\0'; + return word; +} + +int main() +{ + char *challenge_word = generate_random_word(); + printf("Word: %s\n", challenge_word); + fflush(stdout); + + char *little_endian = find_little_endian(challenge_word); + size_t user_little_endian_size = strlen(little_endian); + char user_little_endian[user_little_endian_size + 1]; + bool correct_flag = false; + + while (!correct_flag) + { + printf("Enter the Little Endian representation: "); + fflush(stdout); + scanf("%10s", user_little_endian); + for (size_t i = 0; i < strlen(user_little_endian); i++) + { + user_little_endian[i] = toupper(user_little_endian[i]); + } + + if (strncmp(user_little_endian, little_endian, user_little_endian_size) == 0) + { + printf("Correct Little Endian representation!\n"); + fflush(stdout); + correct_flag = true; + } + else + { + printf("Incorrect Little Endian representation. Try again!\n"); + fflush(stdout); + } + } + + char *big_endian = find_big_endian(challenge_word); + size_t user_big_endian_size = strlen(big_endian); + char user_big_endian[user_big_endian_size + 1]; + + bool final_flag = false; + while (!final_flag) + { + printf("Enter the Big Endian representation: "); + fflush(stdout); + scanf("%10s", user_big_endian); + for (size_t i = 0; i < strlen(user_big_endian); i++) + { + user_big_endian[i] = toupper(user_big_endian[i]); + } + + if (strncmp(user_big_endian, big_endian, user_big_endian_size) == 0) + { + printf("Correct Big Endian representation!\n"); + fflush(stdout); + final_flag = true; + } + else + { + printf("Incorrect Big Endian representation. Try again!\n"); + fflush(stdout); + } + } + + FILE *flag = fopen("flag.txt", "r"); + if (flag == NULL) + { + printf("Flag not found. Please run this on the server\n"); + fflush(stdout); + exit(0); + } + + char flag_content[100]; + fgets(flag_content, sizeof(flag_content), flag); + printf("Congratulations! You found both endian representations correctly!\n"); + fflush(stdout); + printf("Your Flag is: %s\n", flag_content); + fflush(stdout); + exit(0); + + return 0; +} \ No newline at end of file diff --git a/endianness/sol b/endianness/sol new file mode 100755 index 0000000..ea28db5 Binary files /dev/null and b/endianness/sol differ diff --git a/endianness/sol.c b/endianness/sol.c new file mode 100755 index 0000000..67983a3 --- /dev/null +++ b/endianness/sol.c @@ -0,0 +1,43 @@ +#include +#include +#include +#include +#include +#include + +char *find_little_endian(const char *word) +{ + size_t word_len = strlen(word); + char *little_endian = (char *)malloc((2 * word_len + 1) * sizeof(char)); + + for (size_t i = word_len; i-- > 0;) + { + snprintf(&little_endian[(word_len - 1 - i) * 2], 3, "%02X", (unsigned char)word[i]); + } + + little_endian[2 * word_len] = '\0'; + return little_endian; +} + +char *find_big_endian(const char *word) +{ + size_t length = strlen(word); + char *big_endian = (char *)malloc((2 * length + 1) * sizeof(char)); + + for (size_t i = 0; i < length; i++) + { + snprintf(&big_endian[i * 2], 3, "%02X", (unsigned char)word[i]); + } + + big_endian[2 * length] = '\0'; + return big_endian; +} + +int main(int argc, char *argv[]) { + if (argc != 2) { + return 1; + } + + puts(find_little_endian(argv[1]));; + puts(find_big_endian(argv[1])); +}