/* Fuzzes PrbResp by testing all 256 IEs on overflow in four ways */ #include #include #include #include #include #include "../frameDefinitions.h" //Creates Probe response frame u_char *Prballies(u_char *dstAddress, int *packetSize, u_char * radioTapHeader, u_char *myMAC, int step) { #define PRBalliesIES (1) //number of information elements //definition of all info elements infoElem fuzzie; switch (step) { case 0: { fuzzie.id = 0; fuzzie.len = 0; fuzzie.len_data = 255*2; fuzzie.data = "\x01\x00\x02\x00\x03\x00\x04\x00\x05\x00\x06\x00\x07\x00" "\x08\x00\x09\x00\x0A\x00\x0B\x00\x0C\x00\x0D\x00\x0E\x00\x0F\x00" "\x10\x00\x11\x00\x12\x00\x13\x00\x14\x00\x15\x00\x16\x00\x17\x00" "\x18\x00\x19\x00\x1A\x00\x1B\x00\x1C\x00\x1D\x00\x1E\x00\x1F\x00" "\x20\x00\x21\x00\x22\x00\x23\x00\x24\x00\x25\x00\x26\x00\x27\x00" "\x28\x00\x29\x00\x2A\x00\x2B\x00\x2C\x00\x2D\x00\x2E\x00\x2F\x00" "\x30\x00\x31\x00\x32\x00\x33\x00\x34\x00\x35\x00\x36\x00\x37\x00" "\x38\x00\x39\x00\x3A\x00\x3B\x00\x3C\x00\x3D\x00\x3E\x00\x3F\x00" "\x40\x00\x41\x00\x42\x00\x43\x00\x44\x00\x45\x00\x46\x00\x47\x00" "\x48\x00\x49\x00\x4A\x00\x4B\x00\x4C\x00\x4D\x00\x4E\x00\x4F\x00" "\x50\x00\x51\x00\x52\x00\x53\x00\x54\x00\x55\x00\x56\x00\x57\x00" "\x58\x00\x59\x00\x5A\x00\x5B\x00\x5C\x00\x5D\x00\x5E\x00\x5F\x00" "\x60\x00\x61\x00\x62\x00\x63\x00\x64\x00\x65\x00\x66\x00\x67\x00" "\x68\x00\x69\x00\x6A\x00\x6B\x00\x6C\x00\x6D\x00\x6E\x00\x6F\x00" "\x70\x00\x71\x00\x72\x00\x73\x00\x74\x00\x75\x00\x76\x00\x77\x00" "\x78\x00\x79\x00\x7A\x00\x7B\x00\x7C\x00\x7D\x00\x7E\x00\x7F\x00" "\x80\x00\x81\x00\x82\x00\x83\x00\x84\x00\x85\x00\x86\x00\x87\x00" "\x88\x00\x89\x00\x8A\x00\x8B\x00\x8C\x00\x8D\x00\x8E\x00\x8F\x00" "\x90\x00\x91\x00\x92\x00\x93\x00\x94\x00\x95\x00\x96\x00\x97\x00" "\x98\x00\x99\x00\x9A\x00\x9B\x00\x9C\x00\x9D\x00\x9E\x00\x9F\x00" "\xA0\x00\xA1\x00\xA2\x00\xA3\x00\xA4\x00\xA5\x00\xA6\x00\xA7\x00" "\xA8\x00\xA9\x00\xAA\x00\xAB\x00\xAC\x00\xAD\x00\xAE\x00\xAF\x00" "\xB0\x00\xB1\x00\xB2\x00\xB3\x00\xB4\x00\xB5\x00\xB6\x00\xB7\x00" "\xB8\x00\xB9\x00\xBA\x00\xBB\x00\xBC\x00\xBD\x00\xBE\x00\xBF\x00" "\xC0\x00\xC1\x00\xC2\x00\xC3\x00\xC4\x00\xC5\x00\xC6\x00\xC7\x00" "\xC8\x00\xC9\x00\xCA\x00\xCB\x00\xCC\x00\xCD\x00\xCE\x00\xCF\x00" "\xD0\x00\xD1\x00\xD2\x00\xD3\x00\xD4\x00\xD5\x00\xD6\x00\xD7\x00" "\xD8\x00\xD9\x00\xDA\x00\xDB\x00\xDC\x00\xDD\x00\xDE\x00\xDF\x00" "\xE0\x00\xE1\x00\xE2\x00\xE3\x00\xE4\x00\xE5\x00\xE6\x00\xE7\x00" "\xE8\x00\xE9\x00\xEA\x00\xEB\x00\xEC\x00\xED\x00\xEE\x00\xEF\x00" "\xF0\x00\xF1\x00\xF2\x00\xF3\x00\xF4\x00\xF5\x00\xF6\x00\xF7\x00" "\xF8\x00\xF9\x00\xFA\x00\xFB\x00\xFC\x00\xFD\x00\xFE\x00\xFF\x00" ; break; } case 1: { fuzzie.id = 0; fuzzie.len = 1; fuzzie.len_data = 255*3 + 1; fuzzie.data = "\xff" "\x01\x01\xFF\x02\x01\xFF\x03\x01\xFF\x04\x01\xFF\x05\x01\xFF\x06\x01\xFF\x07\x01\xFF" "\x08\x01\xFF\x09\x01\xFF\x0A\x01\xFF\x0B\x01\xFF\x0C\x01\xFF\x0D\x01\xFF\x0E\x01\xFF\x0F\x01\xFF" "\x10\x01\xFF\x11\x01\xFF\x12\x01\xFF\x13\x01\xFF\x14\x01\xFF\x15\x01\xFF\x16\x01\xFF\x17\x01\xFF" "\x18\x01\xFF\x19\x01\xFF\x1A\x01\xFF\x1B\x01\xFF\x1C\x01\xFF\x1D\x01\xFF\x1E\x01\xFF\x1F\x01\xFF" "\x20\x01\xFF\x21\x01\xFF\x22\x01\xFF\x23\x01\xFF\x24\x01\xFF\x25\x01\xFF\x26\x01\xFF\x27\x01\xFF" "\x28\x01\xFF\x29\x01\xFF\x2A\x01\xFF\x2B\x01\xFF\x2C\x01\xFF\x2D\x01\xFF\x2E\x01\xFF\x2F\x01\xFF" "\x30\x01\xFF\x31\x01\xFF\x32\x01\xFF\x33\x01\xFF\x34\x01\xFF\x35\x01\xFF\x36\x01\xFF\x37\x01\xFF" "\x38\x01\xFF\x39\x01\xFF\x3A\x01\xFF\x3B\x01\xFF\x3C\x01\xFF\x3D\x01\xFF\x3E\x01\xFF\x3F\x01\xFF" "\x40\x01\xFF\x41\x01\xFF\x42\x01\xFF\x43\x01\xFF\x44\x01\xFF\x45\x01\xFF\x46\x01\xFF\x47\x01\xFF" "\x48\x01\xFF\x49\x01\xFF\x4A\x01\xFF\x4B\x01\xFF\x4C\x01\xFF\x4D\x01\xFF\x4E\x01\xFF\x4F\x01\xFF" "\x50\x01\xFF\x51\x01\xFF\x52\x01\xFF\x53\x01\xFF\x54\x01\xFF\x55\x01\xFF\x56\x01\xFF\x57\x01\xFF" "\x58\x01\xFF\x59\x01\xFF\x5A\x01\xFF\x5B\x01\xFF\x5C\x01\xFF\x5D\x01\xFF\x5E\x01\xFF\x5F\x01\xFF" "\x60\x01\xFF\x61\x01\xFF\x62\x01\xFF\x63\x01\xFF\x64\x01\xFF\x65\x01\xFF\x66\x01\xFF\x67\x01\xFF" "\x68\x01\xFF\x69\x01\xFF\x6A\x01\xFF\x6B\x01\xFF\x6C\x01\xFF\x6D\x01\xFF\x6E\x01\xFF\x6F\x01\xFF" "\x70\x01\xFF\x71\x01\xFF\x72\x01\xFF\x73\x01\xFF\x74\x01\xFF\x75\x01\xFF\x76\x01\xFF\x77\x01\xFF" "\x78\x01\xFF\x79\x01\xFF\x7A\x01\xFF\x7B\x01\xFF\x7C\x01\xFF\x7D\x01\xFF\x7E\x01\xFF\x7F\x01\xFF" "\x80\x01\xFF\x81\x01\xFF\x82\x01\xFF\x83\x01\xFF\x84\x01\xFF\x85\x01\xFF\x86\x01\xFF\x87\x01\xFF" "\x88\x01\xFF\x89\x01\xFF\x8A\x01\xFF\x8B\x01\xFF\x8C\x01\xFF\x8D\x01\xFF\x8E\x01\xFF\x8F\x01\xFF" "\x90\x01\xFF\x91\x01\xFF\x92\x01\xFF\x93\x01\xFF\x94\x01\xFF\x95\x01\xFF\x96\x01\xFF\x97\x01\xFF" "\x98\x01\xFF\x99\x01\xFF\x9A\x01\xFF\x9B\x01\xFF\x9C\x01\xFF\x9D\x01\xFF\x9E\x01\xFF\x9F\x01\xFF" "\xA0\x01\xFF\xA1\x01\xFF\xA2\x01\xFF\xA3\x01\xFF\xA4\x01\xFF\xA5\x01\xFF\xA6\x01\xFF\xA7\x01\xFF" "\xA8\x01\xFF\xA9\x01\xFF\xAA\x01\xFF\xAB\x01\xFF\xAC\x01\xFF\xAD\x01\xFF\xAE\x01\xFF\xAF\x01\xFF" "\xB0\x01\xFF\xB1\x01\xFF\xB2\x01\xFF\xB3\x01\xFF\xB4\x01\xFF\xB5\x01\xFF\xB6\x01\xFF\xB7\x01\xFF" "\xB8\x01\xFF\xB9\x01\xFF\xBA\x01\xFF\xBB\x01\xFF\xBC\x01\xFF\xBD\x01\xFF\xBE\x01\xFF\xBF\x01\xFF" "\xC0\x01\xFF\xC1\x01\xFF\xC2\x01\xFF\xC3\x01\xFF\xC4\x01\xFF\xC5\x01\xFF\xC6\x01\xFF\xC7\x01\xFF" "\xC8\x01\xFF\xC9\x01\xFF\xCA\x01\xFF\xCB\x01\xFF\xCC\x01\xFF\xCD\x01\xFF\xCE\x01\xFF\xCF\x01\xFF" "\xD0\x01\xFF\xD1\x01\xFF\xD2\x01\xFF\xD3\x01\xFF\xD4\x01\xFF\xD5\x01\xFF\xD6\x01\xFF\xD7\x01\xFF" "\xD8\x01\xFF\xD9\x01\xFF\xDA\x01\xFF\xDB\x01\xFF\xDC\x01\xFF\xDD\x01\xFF\xDE\x01\xFF\xDF\x01\xFF" "\xE0\x01\xFF\xE1\x01\xFF\xE2\x01\xFF\xE3\x01\xFF\xE4\x01\xFF\xE5\x01\xFF\xE6\x01\xFF\xE7\x01\xFF" "\xE8\x01\xFF\xE9\x01\xFF\xEA\x01\xFF\xEB\x01\xFF\xEC\x01\xFF\xED\x01\xFF\xEE\x01\xFF\xEF\x01\xFF" "\xF0\x01\xFF\xF1\x01\xFF\xF2\x01\xFF\xF3\x01\xFF\xF4\x01\xFF\xF5\x01\xFF\xF6\x01\xFF\xF7\x01\xFF" "\xF8\x01\xFF\xF9\x01\xFF\xFA\x01\xFF\xFB\x01\xFF\xFC\x01\xFF\xFD\x01\xFF\xFE\x01\xFF\xFF\x01\xFF" ; break; } case 2: { fuzzie.id = 0; fuzzie.len = 1; fuzzie.len_data = 255*3 + 1; fuzzie.data = "\x00" "\x01\x01\x00\x02\x01\x00\x03\x01\x00\x04\x01\x00\x05\x01\x00\x06\x01\x00\x07\x01\x00" "\x08\x01\x00\x09\x01\x00\x0A\x01\x00\x0B\x01\x00\x0C\x01\x00\x0D\x01\x00\x0E\x01\x00\x0F\x01\x00" "\x10\x01\x00\x11\x01\x00\x12\x01\x00\x13\x01\x00\x14\x01\x00\x15\x01\x00\x16\x01\x00\x17\x01\x00" "\x18\x01\x00\x19\x01\x00\x1A\x01\x00\x1B\x01\x00\x1C\x01\x00\x1D\x01\x00\x1E\x01\x00\x1F\x01\x00" "\x20\x01\x00\x21\x01\x00\x22\x01\x00\x23\x01\x00\x24\x01\x00\x25\x01\x00\x26\x01\x00\x27\x01\x00" "\x28\x01\x00\x29\x01\x00\x2A\x01\x00\x2B\x01\x00\x2C\x01\x00\x2D\x01\x00\x2E\x01\x00\x2F\x01\x00" "\x30\x01\x00\x31\x01\x00\x32\x01\x00\x33\x01\x00\x34\x01\x00\x35\x01\x00\x36\x01\x00\x37\x01\x00" "\x38\x01\x00\x39\x01\x00\x3A\x01\x00\x3B\x01\x00\x3C\x01\x00\x3D\x01\x00\x3E\x01\x00\x3F\x01\x00" "\x40\x01\x00\x41\x01\x00\x42\x01\x00\x43\x01\x00\x44\x01\x00\x45\x01\x00\x46\x01\x00\x47\x01\x00" "\x48\x01\x00\x49\x01\x00\x4A\x01\x00\x4B\x01\x00\x4C\x01\x00\x4D\x01\x00\x4E\x01\x00\x4F\x01\x00" "\x50\x01\x00\x51\x01\x00\x52\x01\x00\x53\x01\x00\x54\x01\x00\x55\x01\x00\x56\x01\x00\x57\x01\x00" "\x58\x01\x00\x59\x01\x00\x5A\x01\x00\x5B\x01\x00\x5C\x01\x00\x5D\x01\x00\x5E\x01\x00\x5F\x01\x00" "\x60\x01\x00\x61\x01\x00\x62\x01\x00\x63\x01\x00\x64\x01\x00\x65\x01\x00\x66\x01\x00\x67\x01\x00" "\x68\x01\x00\x69\x01\x00\x6A\x01\x00\x6B\x01\x00\x6C\x01\x00\x6D\x01\x00\x6E\x01\x00\x6F\x01\x00" "\x70\x01\x00\x71\x01\x00\x72\x01\x00\x73\x01\x00\x74\x01\x00\x75\x01\x00\x76\x01\x00\x77\x01\x00" "\x78\x01\x00\x79\x01\x00\x7A\x01\x00\x7B\x01\x00\x7C\x01\x00\x7D\x01\x00\x7E\x01\x00\x7F\x01\x00" "\x80\x01\x00\x81\x01\x00\x82\x01\x00\x83\x01\x00\x84\x01\x00\x85\x01\x00\x86\x01\x00\x87\x01\x00" "\x88\x01\x00\x89\x01\x00\x8A\x01\x00\x8B\x01\x00\x8C\x01\x00\x8D\x01\x00\x8E\x01\x00\x8F\x01\x00" "\x90\x01\x00\x91\x01\x00\x92\x01\x00\x93\x01\x00\x94\x01\x00\x95\x01\x00\x96\x01\x00\x97\x01\x00" "\x98\x01\x00\x99\x01\x00\x9A\x01\x00\x9B\x01\x00\x9C\x01\x00\x9D\x01\x00\x9E\x01\x00\x9F\x01\x00" "\xA0\x01\x00\xA1\x01\x00\xA2\x01\x00\xA3\x01\x00\xA4\x01\x00\xA5\x01\x00\xA6\x01\x00\xA7\x01\x00" "\xA8\x01\x00\xA9\x01\x00\xAA\x01\x00\xAB\x01\x00\xAC\x01\x00\xAD\x01\x00\xAE\x01\x00\xAF\x01\x00" "\xB0\x01\x00\xB1\x01\x00\xB2\x01\x00\xB3\x01\x00\xB4\x01\x00\xB5\x01\x00\xB6\x01\x00\xB7\x01\x00" "\xB8\x01\x00\xB9\x01\x00\xBA\x01\x00\xBB\x01\x00\xBC\x01\x00\xBD\x01\x00\xBE\x01\x00\xBF\x01\x00" "\xC0\x01\x00\xC1\x01\x00\xC2\x01\x00\xC3\x01\x00\xC4\x01\x00\xC5\x01\x00\xC6\x01\x00\xC7\x01\x00" "\xC8\x01\x00\xC9\x01\x00\xCA\x01\x00\xCB\x01\x00\xCC\x01\x00\xCD\x01\x00\xCE\x01\x00\xCF\x01\x00" "\xD0\x01\x00\xD1\x01\x00\xD2\x01\x00\xD3\x01\x00\xD4\x01\x00\xD5\x01\x00\xD6\x01\x00\xD7\x01\x00" "\xD8\x01\x00\xD9\x01\x00\xDA\x01\x00\xDB\x01\x00\xDC\x01\x00\xDD\x01\x00\xDE\x01\x00\xDF\x01\x00" "\xE0\x01\x00\xE1\x01\x00\xE2\x01\x00\xE3\x01\x00\xE4\x01\x00\xE5\x01\x00\xE6\x01\x00\xE7\x01\x00" "\xE8\x01\x00\xE9\x01\x00\xEA\x01\x00\xEB\x01\x00\xEC\x01\x00\xED\x01\x00\xEE\x01\x00\xEF\x01\x00" "\xF0\x01\x00\xF1\x01\x00\xF2\x01\x00\xF3\x01\x00\xF4\x01\x00\xF5\x01\x00\xF6\x01\x00\xF7\x01\x00" "\xF8\x01\x00\xF9\x01\x00\xFA\x01\x00\xFB\x01\x00\xFC\x01\x00\xFD\x01\x00\xFE\x01\x00\xFF\x01\x00" ; break; } case 3: { fuzzie.id = 0; fuzzie.len = 0; fuzzie.len_data = -1; fuzzie.data = ""; break; } } //create array of information elements infoElem taggedParams[PRBalliesIES] = { fuzzie }; //length of all info elements, including id and len field int len_taggedParams = 0; for(int i = 0; i < PRBalliesIES; i++) { if (taggedParams[i].len_data != -1) //do not include when len_data == -1 { //+2 to include id and len field size len_taggedParams = len_taggedParams + taggedParams[i].len_data+2; } } //fill in struct probeResponse probeResp = { 36, radioTapHeader, //RadioTap hdr 1, "\x50", //Type 1, "\x00", //Flags 2, "\x3a\x01", //Duration 6, dstAddress, //DST addr 6, myMAC, //Source addr 6, myMAC, //BSS addr 2, "\x00\x00", //Seq nr (overwritten by firmware) 8, "\x00\x00\x00\x00\x00\x00\x00\x00", //Timestamp (overwritten by firmware) 2, "\x64\x00", //Beacon interval 2, "\x01\x00", //Capab info len_taggedParams, taggedParams, //Information elements 4, "\x00\x00\x00\x00" //FSC (overwritten by firmware) }; //calculate size of final packet *packetSize = probeResp.len_radioTapHdr + probeResp.len_type + probeResp.len_flags + probeResp.len_duration + probeResp.len_destAddr + probeResp.len_sourceAddr + probeResp.len_bssAddr + probeResp.len_seqNr + probeResp.len_timeStamp + probeResp.len_beaconInterval + probeResp.len_capabInfo + probeResp.len_taggedParams + probeResp.len_fsc; //define packet u_char *probeRespPacket = malloc(*packetSize); if(!probeRespPacket) { printf("Memory allocation error!\n"); exit(-1); } //copy all struct fields into packet int copyOffset = 0; memcpy(probeRespPacket + copyOffset, probeResp.radioTapHdr, probeResp.len_radioTapHdr); copyOffset = copyOffset + probeResp.len_radioTapHdr; memcpy(probeRespPacket + copyOffset, probeResp.type, probeResp.len_type); copyOffset = copyOffset + probeResp.len_type; memcpy(probeRespPacket + copyOffset, probeResp.flags, probeResp.len_flags); copyOffset = copyOffset + probeResp.len_flags; memcpy(probeRespPacket + copyOffset, probeResp.duration, probeResp.len_duration); copyOffset = copyOffset + probeResp.len_duration; memcpy(probeRespPacket + copyOffset, probeResp.destAddr, probeResp.len_destAddr); copyOffset = copyOffset + probeResp.len_destAddr; memcpy(probeRespPacket + copyOffset, probeResp.sourceAddr, probeResp.len_sourceAddr); copyOffset = copyOffset + probeResp.len_sourceAddr; memcpy(probeRespPacket + copyOffset, probeResp.bssAddr, probeResp.len_bssAddr); copyOffset = copyOffset + probeResp.len_bssAddr; memcpy(probeRespPacket + copyOffset, probeResp.seqNr, probeResp.len_seqNr); copyOffset = copyOffset + probeResp.len_seqNr; memcpy(probeRespPacket + copyOffset, probeResp.timeStamp, probeResp.len_timeStamp); copyOffset = copyOffset + probeResp.len_timeStamp; memcpy(probeRespPacket + copyOffset, probeResp.beaconInterval, probeResp.len_beaconInterval); copyOffset = copyOffset + probeResp.len_beaconInterval; memcpy(probeRespPacket + copyOffset, probeResp.capabInfo, probeResp.len_capabInfo); copyOffset = copyOffset + probeResp.len_capabInfo; //copy all information elements for(int i = 0; i < PRBalliesIES; i++) { if (taggedParams[i].len_data != -1) //if id == -1, we do not want to include the information element { memcpy(probeRespPacket + copyOffset, &taggedParams[i].id, 1); copyOffset = copyOffset + 1; memcpy(probeRespPacket + copyOffset, &taggedParams[i].len, 1); copyOffset = copyOffset + 1; memcpy(probeRespPacket + copyOffset, taggedParams[i].data, taggedParams[i].len_data); copyOffset = copyOffset + taggedParams[i].len_data; } } memcpy(probeRespPacket + copyOffset, probeResp.fsc, probeResp.len_fsc); copyOffset = copyOffset + probeResp.len_fsc; //return packet return probeRespPacket; }