Improve DCERPC big endian support when parsing BIND CTX Items (UUID). Make default byte packing order for the slow path little endian. Byte swapping on slow path will occur if big endian. This is a readability change, not a functional change.

remotes/origin/master-1.1.x
Kirby Kuehl 14 years ago committed by Victor Julien
parent 5ccd9a8347
commit acfc9a8ab0

@ -229,28 +229,53 @@ static uint32_t DCERPCParseBINDCTXItem(DCERPC *dcerpc, uint8_t *input, uint32_t
switch (dcerpc->dcerpcbindbindack.ctxbytesprocessed) { switch (dcerpc->dcerpcbindbindack.ctxbytesprocessed) {
case 0: case 0:
if (input_len >= 44) { if (input_len >= 44) {
dcerpc->dcerpcbindbindack.ctxid = *(p); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.ctxid |= *(p + 1) << 8; dcerpc->dcerpcbindbindack.ctxid = *(p);
dcerpc->dcerpcbindbindack.uuid[3] = *(p + 4); dcerpc->dcerpcbindbindack.ctxid |= *(p + 1) << 8;
dcerpc->dcerpcbindbindack.uuid[2] = *(p + 5); dcerpc->dcerpcbindbindack.uuid[3] = *(p + 4);
dcerpc->dcerpcbindbindack.uuid[1] = *(p + 6); dcerpc->dcerpcbindbindack.uuid[2] = *(p + 5);
dcerpc->dcerpcbindbindack.uuid[0] = *(p + 7); dcerpc->dcerpcbindbindack.uuid[1] = *(p + 6);
dcerpc->dcerpcbindbindack.uuid[5] = *(p + 8); dcerpc->dcerpcbindbindack.uuid[0] = *(p + 7);
dcerpc->dcerpcbindbindack.uuid[4] = *(p + 9); dcerpc->dcerpcbindbindack.uuid[5] = *(p + 8);
dcerpc->dcerpcbindbindack.uuid[7] = *(p + 10); dcerpc->dcerpcbindbindack.uuid[4] = *(p + 9);
dcerpc->dcerpcbindbindack.uuid[6] = *(p + 11); dcerpc->dcerpcbindbindack.uuid[7] = *(p + 10);
dcerpc->dcerpcbindbindack.uuid[8] = *(p + 12); dcerpc->dcerpcbindbindack.uuid[6] = *(p + 11);
dcerpc->dcerpcbindbindack.uuid[9] = *(p + 13); dcerpc->dcerpcbindbindack.uuid[8] = *(p + 12);
dcerpc->dcerpcbindbindack.uuid[10] = *(p + 14); dcerpc->dcerpcbindbindack.uuid[9] = *(p + 13);
dcerpc->dcerpcbindbindack.uuid[11] = *(p + 15); dcerpc->dcerpcbindbindack.uuid[10] = *(p + 14);
dcerpc->dcerpcbindbindack.uuid[12] = *(p + 16); dcerpc->dcerpcbindbindack.uuid[11] = *(p + 15);
dcerpc->dcerpcbindbindack.uuid[13] = *(p + 17); dcerpc->dcerpcbindbindack.uuid[12] = *(p + 16);
dcerpc->dcerpcbindbindack.uuid[14] = *(p + 18); dcerpc->dcerpcbindbindack.uuid[13] = *(p + 17);
dcerpc->dcerpcbindbindack.uuid[15] = *(p + 19); dcerpc->dcerpcbindbindack.uuid[14] = *(p + 18);
dcerpc->dcerpcbindbindack.version = *(p + 20); dcerpc->dcerpcbindbindack.uuid[15] = *(p + 19);
dcerpc->dcerpcbindbindack.version |= *(p + 21) << 8; dcerpc->dcerpcbindbindack.version = *(p + 20);
dcerpc->dcerpcbindbindack.versionminor = *(p + 22); dcerpc->dcerpcbindbindack.version |= *(p + 21) << 8;
dcerpc->dcerpcbindbindack.versionminor |= *(p + 23) << 8; dcerpc->dcerpcbindbindack.versionminor = *(p + 22);
dcerpc->dcerpcbindbindack.versionminor |= *(p + 23) << 8;
} else { /* Big Endian */
dcerpc->dcerpcbindbindack.ctxid = *(p) << 8;
dcerpc->dcerpcbindbindack.ctxid |= *(p + 1);
dcerpc->dcerpcbindbindack.uuid[0] = *(p + 4);
dcerpc->dcerpcbindbindack.uuid[1] = *(p + 5);
dcerpc->dcerpcbindbindack.uuid[2] = *(p + 6);
dcerpc->dcerpcbindbindack.uuid[3] = *(p + 7);
dcerpc->dcerpcbindbindack.uuid[4] = *(p + 8);
dcerpc->dcerpcbindbindack.uuid[5] = *(p + 9);
dcerpc->dcerpcbindbindack.uuid[6] = *(p + 10);
dcerpc->dcerpcbindbindack.uuid[7] = *(p + 11);
dcerpc->dcerpcbindbindack.uuid[8] = *(p + 12);
dcerpc->dcerpcbindbindack.uuid[9] = *(p + 13);
dcerpc->dcerpcbindbindack.uuid[10] = *(p + 14);
dcerpc->dcerpcbindbindack.uuid[11] = *(p + 15);
dcerpc->dcerpcbindbindack.uuid[12] = *(p + 16);
dcerpc->dcerpcbindbindack.uuid[13] = *(p + 17);
dcerpc->dcerpcbindbindack.uuid[14] = *(p + 18);
dcerpc->dcerpcbindbindack.uuid[15] = *(p + 19);
dcerpc->dcerpcbindbindack.version = *(p + 20) << 8;
dcerpc->dcerpcbindbindack.version |= *(p + 21);
dcerpc->dcerpcbindbindack.versionminor = *(p + 22) << 8;
dcerpc->dcerpcbindbindack.versionminor |= *(p + 23);
}
//if (dcerpc->dcerpcbindbindack.ctxid == dcerpc->dcerpcbindbindack.numctxitems //if (dcerpc->dcerpcbindbindack.ctxid == dcerpc->dcerpcbindbindack.numctxitems
// - dcerpc->dcerpcbindbindack.numctxitemsleft) { // - dcerpc->dcerpcbindbindack.numctxitemsleft) {
@ -279,6 +304,7 @@ static uint32_t DCERPCParseBINDCTXItem(DCERPC *dcerpc, uint8_t *input, uint32_t
TAILQ_INSERT_HEAD(&dcerpc->dcerpcbindbindack.uuid_list, TAILQ_INSERT_HEAD(&dcerpc->dcerpcbindbindack.uuid_list,
dcerpc->dcerpcbindbindack.uuid_entry, dcerpc->dcerpcbindbindack.uuid_entry,
next); next);
#ifdef UNITTESTS #ifdef UNITTESTS
if (RunmodeIsUnittests()) { if (RunmodeIsUnittests()) {
printUUID("BIND", dcerpc->dcerpcbindbindack.uuid_entry); printUUID("BIND", dcerpc->dcerpcbindbindack.uuid_entry);
@ -295,12 +321,20 @@ static uint32_t DCERPCParseBINDCTXItem(DCERPC *dcerpc, uint8_t *input, uint32_t
// SCReturnUInt(0); // SCReturnUInt(0);
//} //}
} else { } else {
dcerpc->dcerpcbindbindack.ctxid = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.ctxid = *(p++);
} else {
dcerpc->dcerpcbindbindack.ctxid = *(p++) << 8;
}
if (!(--input_len)) if (!(--input_len))
break; break;
} }
case 1: case 1:
dcerpc->dcerpcbindbindack.ctxid |= *(p++) << 8; if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.ctxid |= *(p++) << 8;
} else {
dcerpc->dcerpcbindbindack.ctxid |= *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 2: case 2:
@ -314,39 +348,72 @@ static uint32_t DCERPCParseBINDCTXItem(DCERPC *dcerpc, uint8_t *input, uint32_t
if (!(--input_len)) if (!(--input_len))
break; break;
case 4: case 4:
dcerpc->dcerpcbindbindack.uuid[3] = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.uuid[3] = *(p++);
} else {
dcerpc->dcerpcbindbindack.uuid[0] = *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 5: case 5:
dcerpc->dcerpcbindbindack.uuid[2] = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.uuid[2] = *(p++);
} else {
dcerpc->dcerpcbindbindack.uuid[1] = *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 6: case 6:
dcerpc->dcerpcbindbindack.uuid[1] = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.uuid[1] = *(p++);
} else {
dcerpc->dcerpcbindbindack.uuid[2] = *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 7: case 7:
dcerpc->dcerpcbindbindack.uuid[0] = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.uuid[0] = *(p++);
} else {
dcerpc->dcerpcbindbindack.uuid[3] = *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 8: case 8:
dcerpc->dcerpcbindbindack.uuid[5] = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.uuid[5] = *(p++);
} else {
dcerpc->dcerpcbindbindack.uuid[4] = *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 9: case 9:
dcerpc->dcerpcbindbindack.uuid[4] = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.uuid[4] = *(p++);
} else {
dcerpc->dcerpcbindbindack.uuid[5] = *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 10: case 10:
dcerpc->dcerpcbindbindack.uuid[7] = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.uuid[7] = *(p++);
} else {
dcerpc->dcerpcbindbindack.uuid[6] = *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 11: case 11:
dcerpc->dcerpcbindbindack.uuid[6] = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.uuid[6] = *(p++);
} else {
dcerpc->dcerpcbindbindack.uuid[7] = *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 12: case 12:
dcerpc->dcerpcbindbindack.uuid[8] = *(p++); /* The following bytes are in the same order for both big and little endian */
dcerpc->dcerpcbindbindack.uuid[8] = *(p++);
if (!(--input_len)) if (!(--input_len))
break; break;
case 13: case 13:
@ -378,19 +445,35 @@ static uint32_t DCERPCParseBINDCTXItem(DCERPC *dcerpc, uint8_t *input, uint32_t
if (!(--input_len)) if (!(--input_len))
break; break;
case 20: case 20:
dcerpc->dcerpcbindbindack.version = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.version = *(p++);
} else {
dcerpc->dcerpcbindbindack.version = *(p++) << 8;
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 21: case 21:
dcerpc->dcerpcbindbindack.version |= *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.version |= *(p++) << 8;
} else {
dcerpc->dcerpcbindbindack.version |= *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 22: case 22:
dcerpc->dcerpcbindbindack.versionminor = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.versionminor = *(p++);
} else {
dcerpc->dcerpcbindbindack.versionminor = *(p++) << 8;
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 23: case 23:
dcerpc->dcerpcbindbindack.versionminor |= *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.versionminor |= *(p++) << 8;
} else {
dcerpc->dcerpcbindbindack.versionminor |= *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 24: case 24:
@ -535,8 +618,13 @@ static uint32_t DCERPCParseBINDACKCTXItem(DCERPC *dcerpc, uint8_t *input, uint32
switch (dcerpc->dcerpcbindbindack.ctxbytesprocessed) { switch (dcerpc->dcerpcbindbindack.ctxbytesprocessed) {
case 0: case 0:
if (input_len >= 24) { if (input_len >= 24) {
dcerpc->dcerpcbindbindack.result = *p; if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.result |= *(p + 1) << 8; dcerpc->dcerpcbindbindack.result = *p;
dcerpc->dcerpcbindbindack.result |= *(p + 1) << 8;
} else {
dcerpc->dcerpcbindbindack.result = *p << 8;
dcerpc->dcerpcbindbindack.result |= *(p + 1);
}
TAILQ_FOREACH(uuid_entry, &dcerpc->dcerpcbindbindack.uuid_list, next) { TAILQ_FOREACH(uuid_entry, &dcerpc->dcerpcbindbindack.uuid_list, next) {
if (uuid_entry->internal_id == dcerpc->dcerpcbindbindack.uuid_internal_id) { if (uuid_entry->internal_id == dcerpc->dcerpcbindbindack.uuid_internal_id) {
uuid_entry->result = dcerpc->dcerpcbindbindack.result; uuid_entry->result = dcerpc->dcerpcbindbindack.result;
@ -570,12 +658,20 @@ static uint32_t DCERPCParseBINDACKCTXItem(DCERPC *dcerpc, uint8_t *input, uint32
dcerpc->dcerpcbindbindack.ctxbytesprocessed += (24); dcerpc->dcerpcbindbindack.ctxbytesprocessed += (24);
SCReturnUInt(24U); SCReturnUInt(24U);
} else { } else {
dcerpc->dcerpcbindbindack.result = *(p++); if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.result = *(p++);
} else {
dcerpc->dcerpcbindbindack.result = *(p++) << 8;
}
if (!(--input_len)) if (!(--input_len))
break; break;
} }
case 1: case 1:
dcerpc->dcerpcbindbindack.result |= *(p++) << 8; if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) {
dcerpc->dcerpcbindbindack.result |= *(p++) << 8;
} else {
dcerpc->dcerpcbindbindack.result |= *(p++);
}
if (!(--input_len)) if (!(--input_len))
break; break;
case 2: case 2:
@ -945,13 +1041,13 @@ static uint32_t DCERPCParseREQUEST(DCERPC *dcerpc, uint8_t *input, uint32_t inpu
break; break;
case 20: case 20:
/* context id 1 */ /* context id 1 */
dcerpc->dcerpcrequest.ctxid = *(p++) << 8; dcerpc->dcerpcrequest.ctxid = *(p++);
if (!(--input_len)) if (!(--input_len))
break; break;
case 21: case 21:
/* context id 2 */ /* context id 2 */
dcerpc->dcerpcrequest.ctxid |= *(p++); dcerpc->dcerpcrequest.ctxid |= *(p++) << 8;
if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) { if (dcerpc->dcerpchdr.packed_drep[0] == 0x00) {
dcerpc->dcerpcrequest.ctxid = SCByteSwap16(dcerpc->dcerpcrequest.ctxid); dcerpc->dcerpcrequest.ctxid = SCByteSwap16(dcerpc->dcerpcrequest.ctxid);
} }
dcerpc->dcerpcrequest.first_request_seen = 1; dcerpc->dcerpcrequest.first_request_seen = 1;
@ -959,7 +1055,7 @@ static uint32_t DCERPCParseREQUEST(DCERPC *dcerpc, uint8_t *input, uint32_t inpu
break; break;
case 22: case 22:
if (dcerpc->dcerpchdr.type == REQUEST) { if (dcerpc->dcerpchdr.type == REQUEST) {
dcerpc->dcerpcrequest.opnum = *(p++) << 8; dcerpc->dcerpcrequest.opnum = *(p++);
} else { } else {
p++; p++;
} }
@ -967,8 +1063,8 @@ static uint32_t DCERPCParseREQUEST(DCERPC *dcerpc, uint8_t *input, uint32_t inpu
break; break;
case 23: case 23:
if (dcerpc->dcerpchdr.type == REQUEST) { if (dcerpc->dcerpchdr.type == REQUEST) {
dcerpc->dcerpcrequest.opnum |= *(p++); dcerpc->dcerpcrequest.opnum |= *(p++) << 8;
if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) { if (dcerpc->dcerpchdr.packed_drep[0] == 0x00) {
dcerpc->dcerpcrequest.opnum = SCByteSwap16(dcerpc->dcerpcrequest.opnum); dcerpc->dcerpcrequest.opnum = SCByteSwap16(dcerpc->dcerpcrequest.opnum);
} }
} else { } else {
@ -1163,36 +1259,36 @@ static int DCERPCParseHeader(DCERPC *dcerpc, uint8_t *input, uint32_t input_len)
if (!(--input_len)) if (!(--input_len))
break; break;
case 8: case 8:
dcerpc->dcerpchdr.frag_length = *(p++) << 8; dcerpc->dcerpchdr.frag_length = *(p++);
if (!(--input_len)) if (!(--input_len))
break; break;
case 9: case 9:
dcerpc->dcerpchdr.frag_length |= *(p++); dcerpc->dcerpchdr.frag_length |= *(p++) << 8;
if (!(--input_len)) if (!(--input_len))
break; break;
case 10: case 10:
dcerpc->dcerpchdr.auth_length = *(p++) << 8; dcerpc->dcerpchdr.auth_length = *(p++);
if (!(--input_len)) if (!(--input_len))
break; break;
case 11: case 11:
dcerpc->dcerpchdr.auth_length |= *(p++); dcerpc->dcerpchdr.auth_length |= *(p++) << 8;
if (!(--input_len)) if (!(--input_len))
break; break;
case 12: case 12:
dcerpc->dcerpchdr.call_id = *(p++) << 24; dcerpc->dcerpchdr.call_id = *(p++);
if (!(--input_len)) if (!(--input_len))
break; break;
case 13: case 13:
dcerpc->dcerpchdr.call_id |= *(p++) << 16; dcerpc->dcerpchdr.call_id |= *(p++) << 8;
if (!(--input_len)) if (!(--input_len))
break; break;
case 14: case 14:
dcerpc->dcerpchdr.call_id |= *(p++) << 8; dcerpc->dcerpchdr.call_id |= *(p++) << 16;
if (!(--input_len)) if (!(--input_len))
break; break;
case 15: case 15:
dcerpc->dcerpchdr.call_id |= *(p++); dcerpc->dcerpchdr.call_id |= *(p++) << 24;
if (dcerpc->dcerpchdr.packed_drep[0] & 0x10) { if (dcerpc->dcerpchdr.packed_drep[0] == 0x00) {
dcerpc->dcerpchdr.frag_length = SCByteSwap16(dcerpc->dcerpchdr.frag_length); dcerpc->dcerpchdr.frag_length = SCByteSwap16(dcerpc->dcerpchdr.frag_length);
dcerpc->dcerpchdr.auth_length = SCByteSwap16(dcerpc->dcerpchdr.auth_length); dcerpc->dcerpchdr.auth_length = SCByteSwap16(dcerpc->dcerpchdr.auth_length);
dcerpc->dcerpchdr.call_id = SCByteSwap32(dcerpc->dcerpchdr.call_id); dcerpc->dcerpchdr.call_id = SCByteSwap32(dcerpc->dcerpchdr.call_id);
@ -1328,7 +1424,6 @@ int32_t DCERPCParser(DCERPC *dcerpc, uint8_t *input, uint32_t input_len) {
} }
SCReturnInt(parsed); SCReturnInt(parsed);
} }
switch (dcerpc->dcerpchdr.type) { switch (dcerpc->dcerpchdr.type) {
case BIND: case BIND:
case ALTER_CONTEXT: case ALTER_CONTEXT:

Loading…
Cancel
Save