misc/endianness
This commit is contained in:
		
							
								
								
									
										134
									
								
								misc/endianness/flag.c
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										134
									
								
								misc/endianness/flag.c
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,134 @@ | ||||
| #include <stdio.h> | ||||
| #include <stdlib.h> | ||||
| #include <string.h> | ||||
| #include <stdbool.h> | ||||
| #include <ctype.h> | ||||
| #include <time.h> | ||||
|  | ||||
| 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; | ||||
| } | ||||
							
								
								
									
										28
									
								
								misc/endianness/solve.py
									
									
									
									
									
										Executable file
									
								
							
							
						
						
									
										28
									
								
								misc/endianness/solve.py
									
									
									
									
									
										Executable file
									
								
							| @@ -0,0 +1,28 @@ | ||||
| #!/usr/bin/env nix-shell | ||||
| #!nix-shell -p python3 -i python3 python3Packages.pwntools | ||||
|  | ||||
| from pwn import * | ||||
|  | ||||
| ADDR, PORT, *_ = "titan.picoctf.net 62735".split() | ||||
|  | ||||
| def main(): | ||||
|   r = remote(ADDR, PORT) | ||||
|  | ||||
|   r.recvuntil(b'Word: ') | ||||
|   word = r.recvline().strip() | ||||
|  | ||||
|   r.recvuntil(b'Enter the Little Endian representation: ') | ||||
|   little_endian = ''.join(hex(b)[2:] for b in reversed(word)) | ||||
|   r.sendline(little_endian.encode()) | ||||
|  | ||||
|   r.recvuntil(b'Enter the Big Endian representation: ') | ||||
|   big_endian = ''.join(hex(b)[2:] for b in word) | ||||
|   r.sendline(big_endian.encode()) | ||||
|  | ||||
|   r.recvuntil(b'Your Flag is: ') | ||||
|   print(r.recvline().decode()) | ||||
|  | ||||
|   r.close() | ||||
|  | ||||
| if __name__ == "__main__": | ||||
|     main() | ||||
		Reference in New Issue
	
	Block a user