From ced18e8eac298708e3b452714b3d55a0bf982cd9 Mon Sep 17 00:00:00 2001 From: Benedict Date: Sat, 28 Jan 2017 15:35:04 +0100 Subject: set7: task51: completed --- set7/task51.c | 190 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 190 insertions(+) create mode 100644 set7/task51.c (limited to 'set7/task51.c') diff --git a/set7/task51.c b/set7/task51.c new file mode 100644 index 0000000..b380a0b --- /dev/null +++ b/set7/task51.c @@ -0,0 +1,190 @@ +#include "../lib/lib.h" +#include "../lib/lib2.h" +#include "../lib/lib3.h" +#include "../lib/lib4.h" +#include "../lib/lib5.h" +#include "../lib/lib7.h" +#include + + +void generate_random_printable_bytes(char *s, unsigned int length) +{ + int i; + + for(i=0;i max) { + max = numbers[i]; + index = i; + } + } + + return index; +} + +int main() +{ + srand(time(NULL)); + char *known_text = "Cookie: sessionid="; + char *secret = "TmV2ZXIgcmV2ZWFsIHRoZSBXdS1UYW5nIFNlY3JldCE="; + // generate password between 33, 127 + // assume here that the session id is printable (HTTP is text protocol) + char *t = malloc(strlen(known_text)+50); + memset(t, 0, strlen(known_text)+50); + memcpy(t, known_text, strlen(known_text)); + int max, res, i, k; + + // assume that the string we wanne find is less than 100 bytes + for(k=0;k<100;k++) { + t[strlen(known_text)+k] = 0x09; + max = compression_oracle(t, secret, 1); + for(i=33;i<128;i++) { + t[strlen(known_text)+k] = (char) i; + res = compression_oracle(t, secret, 1); + if(res < max) + break; + } + if(max == res) + break; + } + + printf("found string : %s\n", t); + printf("should string: Cookie: sessionid=%s\n", secret); + // doing binary search above would reduce the calls to the orcale + // significant + printf("calls to the oracle: %i\n", oracle_count); + + + // with cbc + // length will always be a multiple of the block size + oracle_count = 0; + printf("with CBC mode\n"); + // because we only get multiple of 16 as result we have to take + // care that a complete block gets compressed + // we than need control over the size of the request so that + // is is a multiple of 16 BEFORE padding + // otherwise we compress 15 bytes and use one block less + char *kt = malloc(strlen(known_text)+strlen(secret)); + memcpy(kt, known_text, strlen(known_text)); + memcpy(&kt[strlen(known_text)], secret, strlen(secret)); + // one block which should be compressed away + // 6 is the alignment to get a full block + char rand[17+6]; + char ttt[18+8]; + int j,l; + generate_random_printable_bytes(rand, 16+8); + rand[17] = '\0'; + char *raw_request; + char *compressed; + int compressed_length; + int pad; + int counts[127-33]; + int times = 8; + char found_sec_cbc[100]; + + format_request(&raw_request, "AAAAAAAAAAAAAAAA", secret); + my_compress(raw_request, &compressed, &compressed_length); + __pkcs7_padding(compressed, compressed_length, 16, &pad); + int max_ = compression_oracle(rand, secret, 0); + + memcpy(&ttt[pad], &known_text[strlen(known_text)-16], 16); + for(l=0;l