#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