Warning: Can't synchronize with the repository (Unsupported version control system "svn": "/usr/lib64/libsvn_ra_neon-1.so.0: undefined symbol: svn_compat_wrap_file_rev_handler" ). Look in the Trac log for more information.

Message 0x5C

Cipher table verification

These packets are sent just after connecting to the server as responses to similar packets from the server. All data from server appears to be discarded except for the subtype which defines what response should be sent back.

Exactly eleven of these packets are sent by the client. Their structure is as follows:

TypeName Description Offset
uint32_t type 0
uint16_t subtype determines which submessage is sent 4
uint16_t sum_1 only used for subtype 1 which is random data (rand() call) 6
uint32_t sum_2 used for the majority of all subtypes, generated data is placed here 8

- The data generated by subtypes 0, 2, 4, 6, 8 and 9 are based on the cipher table used for password hashing combined with a seed (F00DBAAD, 0DBAADF0). In all likeliness this is just done to verify the cipher table has not been tampered with. It does not appear that these values are stored anywhere else in memory, they are directly written into the packetbuffer.

- Subtypes 1, 3, 5, 7 and 10 are generated by calls to rand() and then slightly modified each in their own way. These rand() calls occur somewhere during the authentication process. It is unlikely but possible that they are used later on for other purposes, we currently have no indication what for.

The following (optimized) code is present in libventrilo3, but is kept here for archival purposes.

#include <stdio.h>
#include <stdint.h>
#include <stdlib.h>
#include <string.h>

typedef unsigned int u32;
typedef unsigned char u8;

u32 table[] = 
{
	0x00000000, 0x77073096, 0xee0e612c, 0x990951ba,
	0x076dc419, 0x706af48f, 0xe963a535, 0x9e6495a3,
	0x0edb8832, 0x79dcb8a4, 0xe0d5e91e, 0x97d2d988,
	0x09b64c2b, 0x7eb17cbd, 0xe7b82d07, 0x90bf1d91,
	0x1db71064, 0x6ab020f2, 0xf3b97148, 0x84be41de,
	0x1adad47d, 0x6ddde4eb, 0xf4d4b551, 0x83d385c7,
	0x136c9856, 0x646ba8c0, 0xfd62f97a, 0x8a65c9ec,
	0x14015c4f, 0x63066cd9, 0xfa0f3d63, 0x8d080df5,
	0x3b6e20c8, 0x4c69105e, 0xd56041e4, 0xa2677172,
	0x3c03e4d1, 0x4b04d447, 0xd20d85fd, 0xa50ab56b,
	0x35b5a8fa, 0x42b2986c, 0xdbbbc9d6, 0xacbcf940,
	0x32d86ce3, 0x45df5c75, 0xdcd60dcf, 0xabd13d59,
	0x26d930ac, 0x51de003a, 0xc8d75180, 0xbfd06116,
	0x21b4f4b5, 0x56b3c423, 0xcfba9599, 0xb8bda50f,
	0x2802b89e, 0x5f058808, 0xc60cd9b2, 0xb10be924,
	0x2f6f7c87, 0x58684c11, 0xc1611dab, 0xb6662d3d,
	0x76dc4190, 0x01db7106, 0x98d220bc, 0xefd5102a,
	0x71b18589, 0x06b6b51f, 0x9fbfe4a5, 0xe8b8d433,
	0x7807c9a2, 0x0f00f934, 0x9609a88e, 0xe10e9818,
	0x7f6a0dbb, 0x086d3d2d, 0x91646c97, 0xe6635c01,
	0x6b6b51f4, 0x1c6c6162, 0x856530d8, 0xf262004e,
	0x6c0695ed, 0x1b01a57b, 0x8208f4c1, 0xf50fc457,
	0x65b0d9c6, 0x12b7e950, 0x8bbeb8ea, 0xfcb9887c,
	0x62dd1ddf, 0x15da2d49, 0x8cd37cf3, 0xfbd44c65,
	0x4db26158, 0x3ab551ce, 0xa3bc0074, 0xd4bb30e2,
	0x4adfa541, 0x3dd895d7, 0xa4d1c46d, 0xd3d6f4fb,
	0x4369e96a, 0x346ed9fc, 0xad678846, 0xda60b8d0,
	0x44042d73, 0x33031de5, 0xaa0a4c5f, 0xdd0d7cc9,
	0x5005713c, 0x270241aa, 0xbe0b1010, 0xc90c2086,
	0x5768b525, 0x206f85b3, 0xb966d409, 0xce61e49f,
	0x5edef90e, 0x29d9c998, 0xb0d09822, 0xc7d7a8b4,
	0x59b33d17, 0x2eb40d81, 0xb7bd5c3b, 0xc0ba6cad,
	0xedb88320, 0x9abfb3b6, 0x03b6e20c, 0x74b1d29a,
	0xead54739, 0x9dd277af, 0x04db2615, 0x73dc1683,
	0xe3630b12, 0x94643b84, 0x0d6d6a3e, 0x7a6a5aa8,
	0xe40ecf0b, 0x9309ff9d, 0x0a00ae27, 0x7d079eb1,
	0xf00f9344, 0x8708a3d2, 0x1e01f268, 0x6906c2fe,
	0xf762575d, 0x806567cb, 0x196c3671, 0x6e6b06e7,
	0xfed41b76, 0x89d32be0, 0x10da7a5a, 0x67dd4acc,
	0xf9b9df6f, 0x8ebeeff9, 0x17b7be43, 0x60b08ed5,
	0xd6d6a3e8, 0xa1d1937e, 0x38d8c2c4, 0x4fdff252,
	0xd1bb67f1, 0xa6bc5767, 0x3fb506dd, 0x48b2364b,
	0xd80d2bda, 0xaf0a1b4c, 0x36034af6, 0x41047a60,
	0xdf60efc3, 0xa867df55, 0x316e8eef, 0x4669be79,
	0xcb61b38c, 0xbc66831a, 0x256fd2a0, 0x5268e236,
	0xcc0c7795, 0xbb0b4703, 0x220216b9, 0x5505262f,
	0xc5ba3bbe, 0xb2bd0b28, 0x2bb45a92, 0x5cb36a04,
	0xc2d7ffa7, 0xb5d0cf31, 0x2cd99e8b, 0x5bdeae1d,
	0x9b64c2b0, 0xec63f226, 0x756aa39c, 0x026d930a,
	0x9c0906a9, 0xeb0e363f, 0x72076785, 0x05005713,
	0x95bf4a82, 0xe2b87a14, 0x7bb12bae, 0x0cb61b38,
	0x92d28e9b, 0xe5d5be0d, 0x7cdcefb7, 0x0bdbdf21,
	0x86d3d2d4, 0xf1d4e242, 0x68ddb3f8, 0x1fda836e,
	0x81be16cd, 0xf6b9265b, 0x6fb077e1, 0x18b74777,
	0x88085ae6, 0xff0f6a70, 0x66063bca, 0x11010b5c,
	0x8f659eff, 0xf862ae69, 0x616bffd3, 0x166ccf45,
	0xa00ae278, 0xd70dd2ee, 0x4e048354, 0x3903b3c2,
	0xa7672661, 0xd06016f7, 0x4969474d, 0x3e6e77db,
	0xaed16a4a, 0xd9d65adc, 0x40df0b66, 0x37d83bf0,
	0xa9bcae53, 0xdebb9ec5, 0x47b2cf7f, 0x30b5ffe9,
	0xbdbdf21c, 0xcabac28a, 0x53b39330, 0x24b4a3a6,
	0xbad03605, 0xcdd70693, 0x54de5729, 0x23d967bf,
	0xb3667a2e, 0xc4614ab8, 0x5d681b02, 0x2a6f2b94,
	0xb40bbe37, 0xc30c8ea1, 0x5a05df1b, 0x2d02ef8d 
};

u32 scramble(u8* in)
{
	u32 i, out = 0;
	for(i = 0; i < 8; i++) {
		out = (out >> 8) ^ table[in[i] ^ out];
	}
	
	return out;
}

/* 
 * - Message 0 -> Seed: 0xBAADF00D - Iterations: 16
 * - Message 2 -> Seed: 0x0DBAADF0 - Iterations: 16
 * - Message 4 -> Seed: 0xBAADF00D - Iterations: 32
 * - Message 6 -> Seed: 0xBAADF00D - Iterations: 16
 * - Message 8 -> Seed: 0xBAADFOOD - Iterations: 32
 * - Message 9 -> Seed: 0xBAADFOOD - Iterations: 16
*/
u32 message5c_0_2_4_6_8_9(u32 seed, u32 iterations) 
{
	u32 i, j, out = 0;
	u32* ecx = (u32*)malloc(sizeof(u32) * iterations);
	
	for(i = 0; i < iterations; i++) {
		ecx[i] = seed;
	}

	for(i = 0; i < iterations; i++) {
		for(j = 0; j < 4; j++) {	
			u8 offset = ((ecx[i] >> (j * 8)) ^ out) & 0xff;
			out = (out >> 8) ^ table[offset];
		}
	}
	
	u8 formatted[8] = { 0 };
	sprintf(formatted, "%08x", out);

	free(ecx);
	
	return scramble(formatted);
}

u8 message5c_1()
{
	return (u8)rand();
}

u32 message5c_3()
{
	u8 out[8];
	sprintf(out, "%08X", rand());
	return scramble(out);
}

u32 message5c_5()
{
	u8 out[8];
	sprintf(out, "%08x", rand());
	return scramble(out);
}

u32 message5c_7()
{
	u8 out[8];
	sprintf(out, "%08X", rand());
	return scramble(out);
}

u32 message5c_10()
{
	u32 out = rand();
	return !out;
}

Important note: the difference in case usage to the sprintf() calls are not typos.