Commit e563c163 authored by w3challs's avatar w3challs
Browse files

init repo

parents
## Crypto challs source
This repository contains the source code of some (not all!) of the crypto challenges.
For other challenges the source (or partial source) may be provided within the challenge itself.
#!/usr/bin/env python2
#-*- coding:utf-8 -*-
import threading
from socket import socket, AF_INET, SOCK_STREAM, gethostbyname, gethostname
PORT = 7777
HOST = ""
KEY = ""
BLOCK_SIZE = 2
ROUNDS = 4
M = 4
L = 4
S_BOX = [0xe, 0x4, 0xd, 0x1, 0x2, 0xf, 0xb, 0x8, 0x3, 0xa, 0x6, 0xc, 0x5, 0x9, 0x0, 0x7]
P_BOX = [1, 5, 9, 13, 2, 6, 10, 14, 3, 7, 11, 15, 4, 8, 12, 16]
# ----------------------------------------------------------------
# SERVICE
# ----------------------------------------------------------------
def main():
global KEY
f = open("/path/to/flag","r")
KEY = f.read()
f.close()
serve()
def serve():
s = socket(AF_INET, SOCK_STREAM)
s.bind((HOST, PORT))
s.listen(10)
print "[*] Server started on %d" % PORT
while True:
conn, addr = s.accept()
thread = threading.Thread(None, serve_client, None, (conn,))
thread.start()
def serve_client(conn):
cont = True
while cont:
data = conn.recv(1024)
if data == "":
conn.close()
cont = False
else:
cont = client(data, conn)
def client(data, conn):
print "[*] Received message %s" % data
if len(data) != BLOCK_SIZE:
print "[*] Malformated message, dropping connection"
conn.close()
return False
ciphertext = encrypt(data)
conn.sendall(ciphertext)
return True
# ----------------------------------------------------------------
# CRYPTO
# ----------------------------------------------------------------
def encode(var):
return int(var.encode("hex"), 16)
def decode(var, l):
return ''.join([chr((var >> (8 * i)) & 0xff) for i in range(0, l)][::-1])
def init_key():
return [encode(KEY[i * BLOCK_SIZE:(i + 1) * BLOCK_SIZE]) for i in range(0, ROUNDS + 1)]
def permute_s(input):
res = 0
for i in range(0, L):
res <<= M
res += S_BOX[(input >> (M * (L - 1) - M * i)) & (2 ** M - 1)]
return res
def permute_p(input):
res = 0
for i in range(0, L * M):
res <<= 1
res += (input >> (L * M - P_BOX[i])) & 1
return res
def encrypt(plaintext):
w = [0] * (ROUNDS + 1)
v = [0] * (ROUNDS + 1)
u = [0] * (ROUNDS + 1)
k = init_key()
w[0] = encode(plaintext)
for r in range(1, ROUNDS):
u[r] = w[r - 1] ^ k[r - 1]
v[r] = permute_s(u[r])
w[r] = permute_p(v[r])
u[ROUNDS] = w[ROUNDS - 1] ^ k[ROUNDS - 1]
v[ROUNDS] = permute_s(u[ROUNDS])
y = v[ROUNDS] ^ k[ROUNDS]
return decode(y, BLOCK_SIZE)
if __name__ == "__main__":
main()
Bitmaison is an online storage and sharing service proposed by te Bitmaison Corporation.
The CEO of that company, Trevor Glover, claims that they use an efficient method to ensure the data deduplication of files sent to their server, while ensuring the confidentiality of the user data.
We provide you some mails exchanged between Trevor Glover and his partner Peter James, a dump of their BitMaison storage space, as well as the sources of the BitMaison client.
Find out what you can get out of it 🙂
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os, getpass, ctypes, hashlib
import BMServer
from Crypto.Cipher import AES
CHECK_CONFIG = '> Checking configuration...'
DONE = '> Done\n'
ENTER_MK = '[~] Master key : '
ENTER_SERVER = '> Hostname/IP : '
ENTER_PORT = '> Port : '
ENTER_LOGIN = '> Login : '
ENTER_PASSWD = '> Password : '
ENTER_SHARED = '> Path to shared folder : '
class BMClient :
def __init__( self, config ) :
self.config = config
self.check_config()
self.server = BMServer.BMServer( self.config['server'], self.config['port'], self.config['login'], self.config['passwd'] )
def get_config( self, key=None ) :
if key is not None and key in self.config.keys() :
return self.config[ key ]
else :
return self.config
def check_config( self ) :
print CHECK_CONFIG
values = ['server', 'port', 'login', 'passwd', 'shared']
for val in values :
if val not in self.config :
self.config[val] = raw_input( globals()[ 'ENTER_' + val.upper() ] ).strip()
print DONE
def list_directory( self ) :
return self.server.send( {'cmd' : 'lst'} )
def send_file( self, filename ) :
ret, value = self.cipher_file( filename )
if ret is True :
ret, value = self.server.send( {'cmd' : 'snd',
'name': os.path.basename(filename),
'data': value[0],
'key' : value[1] } )
return [ret, value]
def retreive_file( self, filename ) :
ret, value = self.server.send( {'cmd' : 'get',
'name': filename } )
if ret is True :
ret, value = self.uncipher_file( value[0], filename, value[1] )
if ret is True :
return [True, filename]
return [ret, value]
def cipher_file( self, file ) :
if os.path.isfile(file) :
f = open(file, 'rb')
plain = f.read()
f.close()
key = hashlib.sha256( plain ).digest()
cipher = self.cipher( plain, key )
ciphered_key = self.master_key_cipher( key )
# print "cipher : key=%s" % key.encode('hex')
# print "cipher : enc=%s" % ciphered_key.encode('hex')
return [True, [cipher, ciphered_key]]
else :
return [False, FILE_NOT_FOUND]
def uncipher_file( self, cipher, filename, key ) :
realkey = self.master_key_uncipher( key )
# print "uncipher : key=%s" % realkey.encode('hex')
# print "uncipher : enc=%s" % key.encode('hex')
plain = self.uncipher( cipher, realkey )
f = open( self.config['shared'] + '/' + filename, 'wb' )
f.write(plain)
f.close()
return [True, filename]
def master_key_cipher( self, data ) :
if getattr(self, 'hashmk', None) is None :
self.ask_master_key()
cipher = self.cipher( data, self.hashmk )
return cipher
def master_key_uncipher( self, data ) :
if getattr(self, 'hashmk', None) is None :
self.ask_master_key()
plain = self.uncipher( data, self.hashmk )
return plain
def ask_master_key( self ) :
mk = getpass.getpass(ENTER_MK)
self.hashmk = hashlib.sha256(mk).digest()
self.erase( mk )
del mk
def cipher( self, data, key ) :
mod = 16 - len(data) % 16
if mod != 16 :
data += chr(mod) * mod
encryptor = AES.new(key, AES.MODE_CBC)
return encryptor.encrypt(data)
def uncipher( self, data, key ) :
decryptor = AES.new(key, AES.MODE_CBC)
plain = decryptor.decrypt(data)
last = ord(plain[-1])
if last < 16 and plain[-last:] == last*chr(last) :
plain = plain[:-last]
return plain
def erase( self, str ) :
location = id( str ) + 20
size = sys.getsizeof( str ) - 20
ctypes.memset( location, 0, size )
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# Lazy, lazy, lazy :-
class BMServer :
def __init__( self, server, port, login, passwd ) :
raise NotImplementedError
def send( self ) :
raise NotImplementedError
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys, os
import lxml.etree
import BMClient
USAGE = 'Usage : %s <xml_config_file>'
CANT_LOAD_XML = 'Cannot load file "%s"'
CANT_WRITE_XML = 'Cannot write to file "%s"'
CANT_START_BM_CLIENT = 'Cannot start BitMaison client'
UNKNOWN_CMD = 'Unknown command "%s"'
COMMANDS = 'Commands are : %s'
QUIT = 'Bye Bye mofos !'
MISSING_ARGUMENT = 'Missing argument "%s"'
MENU = '> Command : '
SUCCESS = '[+] %s'
ERROR = '[-] %s '
LIST = 'Directory listing of %s : %s'
MOTD = '/-----------------------------------\\\n| BitMaison Storage System Client |\n\\-----------------------------------/\n\n'
START_SHELL = '> Starting BitMaison shell'
LOCAL_DIR = 'local directory "%s"'
REMOTE_DIR = 'BitMaison remote directory'
FILE_SENT = 'File "%s" correctly sent to BitMaison'
FILE_RETREIVED = 'File "%s" correctly retreived from BitMaison'
FILE_NOT_FOUND = 'Unknown file "%s"'
class BMUserInterface :
def __init__( self, argc, argv ) :
if argc < 2 :
self.die( USAGE % argv[0] )
self.xmlconfig = argv[1]
config = self.load_config_from_xml()
try :
print MOTD
self.bm = BMClient.BMClient( config )
except :
self.die( CANT_START_BM_CLIENT )
print START_SHELL
self.runloop()
def runloop( self ) :
cmds = ['lls', 'rls', 'snd', 'get', 'quit']
while True :
cmd = raw_input( MENU ).strip()
args = cmd.split(' ', 1)
if args[0] not in cmds :
print ERROR % (UNKNOWN_CMD % args[0])
print ERROR % (COMMANDS % ', '.join( cmds ))
else :
getattr( self, args[0] )( args[1] if len(args) is 2 else None ) # <-- disgusting
print
def lls( self, osef=None ) : # Local ls
shared = self.bm.get_config( 'shared' )
if os.path.isdir( shared ) :
list = os.listdir(shared)
print SUCCESS % (LIST % ( (LOCAL_DIR % shared), ', '.join(list) if len(list) > 0 else 'empty' ) ) # <-- /me pukes
else :
print ERROR % (NOT_A_VALID_DIR % shared)
def rls( self, osef=None ) : # Remote ls
[ret, value] = self.bm.list_directory()
if ret is True :
print SUCCESS % (LIST % (REMOTE_DIR, ', '.join(value) if len(value) > 0 else 'empty' ) ) # <-- http://i.qkme.me/3oh5lx.jpg
else :
print ERROR % value
def snd( self, file=None ) : # Send file
if file is not None :
path = self.bm.get_config( 'shared' ) + '/' + file
if os.path.isfile( path ) :
[ret, value] = self.bm.send_file( path )
if ret is True :
print SUCCESS % (FILE_SENT % value)
else :
print ERROR % value
else :
print ERROR % (FILE_NOT_FOUND % file)
else :
print ERROR % (MISSING_ARGUMENT % 'file')
def get( self, file=None ) : # Get file
if file is not None :
[ret, value] = self.bm.retreive_file( file )
if ret is True :
print SUCCESS % (FILE_RETREIVED % value)
else :
print ERROR % value
else :
print ERROR % (MISSING_ARGUMENT % 'file')
def quit( self, osef=None ) : # Quit
self.save_config_to_xml()
self.die( SUCCESS % QUIT )
def load_config_from_xml( self ) :
config = {}
try :
tree = lxml.etree.parse(self.xmlconfig)
for child in tree.getroot() :
if child.text is not None :
config[ child.tag ] = child.text
return config
except :
self.die( ERROR % (CANT_LOAD_XML % self.xmlconfig) )
def save_config_to_xml( self ) :
values = ['server', 'port', 'login', 'passwd', 'shared']
config = self.bm.get_config()
root = lxml.etree.Element('root')
for element in values :
if element in config :
child = lxml.etree.Element( element )
child.text = config[element]
root.append( child )
try :
f = open( self.xmlconfig, 'w' )
f.write( lxml.etree.tostring( root, pretty_print=True ) )
f.close()
except :
self.die( ERROR % (CANT_WRITE_XML % self.xmlconfig) )
def die( self, txt ) :
print txt
sys.exit()
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import sys
from BitMaison.BMUserInterface import BMUserInterface
if __name__ == '__main__' :
sys.exit( BMUserInterface( len( sys.argv ), sys.argv ) )
<root>
<server>storage.bitmaison.net</server>
<port>12345</port>
<login>potato</login>
<passwd>potato</passwd>
<shared>shared_folder</shared>
</root>
Message-ID: <kglfsmifgsgfs121212.6543388hjs@mail.bitmaison.com>
Date: Thu, 06 Aug 2011 14:23:48 +0200
From: "Peter James" <peter.james@bitmaison.com>
To: "Trevor Glover" <trevor.glover@bitmaison.com>
Subject: About the last interview
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="=_c9deec5e-3fe3-4778-a5c9-e45759fe598d"
Content-Transfer-Encoding: 7bit
User-Agent: Dynamic Internet Messaging Program (DIMP) H3 (1.1.2)
This message is in MIME format.
--=_c9deec5e-3fe3-4778-a5c9-e45759fe598d
Content-Type: text/plain; charset=ISO-8859-1
Hey buddy,
As we discussed previously, I just wanted to inform you that I've successfully set up the database, following the my.cnf template attached (basically I changed the password to a 6-digit numeric one, as usual ;).
If you have some question about it let me know.
Bye !
--
Peter James
CIO of Bitmaison.com
--=_c9deec5e-3fe3-4778-a5c9-e45759fe598d
Content-Type: application/pdf;
name="my.cnf_template"
Content-Disposition: attachment;
filename="my.cnf_template"
Content-Transfer-Encoding: base64
Iy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLQojIEV4YW1wbGUgTXlTUUwgY29uZmlnIGZpbGUgZm9yIGxhcmdl
IHN5c3RlbXMuCiMKIyBUaGlzIGlzIGZvciBhIGxhcmdlIHN5c3RlbSB3aXRoIG1lbW9yeSA9IDUx
Mk0gd2hlcmUgdGhlIHN5c3RlbSBydW5zIG1haW5seQojIE15U1FMLgojCiMgWW91IGNhbiBjb3B5
IHRoaXMgZmlsZSB0bwojIC9ldGMvbXkuY25mIHRvIHNldCBnbG9iYWwgb3B0aW9ucywKIyBteXNx
bC1kYXRhLWRpci9teS5jbmYgdG8gc2V0IHNlcnZlci1zcGVjaWZpYyBvcHRpb25zIChpbiB0aGlz
CiMgaW5zdGFsbGF0aW9uIHRoaXMgZGlyZWN0b3J5IGlzIEBsb2NhbHN0YXRlZGlyQCkgb3IKIyB+
Ly5teS5jbmYgdG8gc2V0IHVzZXItc3BlY2lmaWMgb3B0aW9ucy4KIwojIEluIHRoaXMgZmlsZSwg
eW91IGNhbiB1c2UgYWxsIGxvbmcgb3B0aW9ucyB0aGF0IGEgcHJvZ3JhbSBzdXBwb3J0cy4KIyBJ
ZiB5b3Ugd2FudCB0byBrbm93IHdoaWNoIG9wdGlvbnMgYSBwcm9ncmFtIHN1cHBvcnRzLCBydW4g
dGhlIHByb2dyYW0KIyB3aXRoIHRoZSBcIi0taGVscFwiIG9wdGlvbi4KCiMgVGhlIGZvbGxvd2lu
ZyBvcHRpb25zIHdpbGwgYmUgcGFzc2VkIHRvIGFsbCBNeVNRTCBjbGllbnRzCgojcGFzc3dvcmQg
PSB5b3VyX3Bhc3N3b3JkCnBvcnQgID0gODAwOApzb2NrZXQgID0gL3Zhci9saWIvbXlzcWwvbXlz
cWwuc29jawoKIyBIZXJlIGZvbGxvd3MgZW50cmllcyBmb3Igc29tZSBzcGVjaWZpYyBwcm9ncmFt
cwoKIyBUaGUgTXlTUUwgc2VydmVyCgpwb3J0ICA9IDgwMDgKc29ja2V0ICA9IC92YXIvbGliL215
c3FsL215c3FsLnNvY2sKc2tpcC1sb2NraW5nCgojIENhY2hlcyBhbmQgQnVmZmVyIFNpemVzCmtl
eV9idWZmZXIgPSAyNTZNCm1heF9hbGxvd2VkX3BhY2tldD0xNk0KdGFibGVfY2FjaGUgPSAyNTYK
c29ydF9idWZmZXJfc2l6ZSA9IDJNCnJlYWRfYnVmZmVyX3NpemUgPSAyTQpyZWFkX3JuZF9idWZm
ZXJfc2l6ZSA9IDRNCnJlY29yZF9idWZmZXIgPSAxTQpteWlzYW1fc29ydF9idWZmZXJfc2l6ZSA9
IDEyOE0KdGhyZWFkX2NhY2hlID0gMTI4CnF1ZXJ5X2NhY2hlX2xpbWl0ID0gMk0KcXVlcnlfY2Fj
aGVfdHlwZSA9IDEKcXVlcnlfY2FjaGVfc2l6ZSA9IDMyTQprZXlfYnVmZmVyID0gMTZNCmpvaW5f
YnVmZmVyID0gMk0KdGFibGVfY2FjaGUgPSAxMDI0CgojVGltZSBPdXRzCmludGVyYWN0aXZlX3Rp
bWVvdXQgPSAxMDAKd2FpdF90aW1lb3V0ID0gMTAwCmNvbm5lY3RfdGltZW91dCA9IDEwCgojIFRy
eSBudW1iZXIgb2YgQ1BVJ3MqMiBmb3IgdGhyZWFkX2NvbmN1cnJlbmN5CnRocmVhZF9jb25jdXJy
ZW5jeSA9IDIKCiMgTWF4aW11bSBjb25uZWN0aW9ucyBhbGxvd2VkCm1heF9jb25uZWN0aW9ucyA9
IDUwMAptYXhfdXNlcl9jb25uZWN0aW9ucyA9IDUwCm1heF9jb25uZWN0X2Vycm9ycyA9IDEwCgoj
IERvbid0IGxpc3RlbiBvbiBhIFRDUC9JUCBwb3J0IGF0IGFsbC4gVGhpcyBjYW4gYmUgYSBzZWN1
cml0eSBlbmhhbmNlbWVudCwKIyBpZiBhbGwgcHJvY2Vzc2VzIHRoYXQgbmVlZCB0byBjb25uZWN0
IHRvIG15c3FsZCBydW4gb24gdGhlIHNhbWUgaG9zdC4KIyBBbGwgaW50ZXJhY3Rpb24gd2l0aCBt
eXNxbGQgbXVzdCBiZSBtYWRlIHZpYSBVbml4IHNvY2tldHMgb3IgbmFtZWQgcGlwZXMuCiMgTm90
ZSB0aGF0IHVzaW5nIHRoaXMgb3B0aW9uIHdpdGhvdXQgZW5hYmxpbmcgbmFtZWQgcGlwZXMgb24g
V2luZG93cwojICh2aWEgdGhlIFwiZW5hYmxlLW5hbWVkLXBpcGVcIiBvcHRpb24pIHdpbGwgcmVu
ZGVyIG15c3FsZCB1c2VsZXNzIQojCiNza2lwLW5ldHdvcmtpbmcKCiMgUmVwbGljYXRpb24gTWFz
dGVyIFNlcnZlciAoZGVmYXVsdCkKIyBiaW5hcnkgbG9nZ2luZyBpcyByZXF1aXJlZCBmb3IgcmVw
bGljYXRpb24KbG9nLWJpbgoKIyByZXF1aXJlZCB1bmlxdWUgaWQgYmV0d2VlbiAxIGFuZCAyXjMy
IC0gMQojIGRlZmF1bHRzIHRvIDEgaWYgbWFzdGVyLWhvc3QgaXMgbm90IHNldAojIGJ1dCB3aWxs
IG5vdCBmdW5jdGlvbiBhcyBhIG1hc3RlciBpZiBvbWl0dGVkCnNlcnZlci1pZCA9IDEKCiMgUmVw
bGljYXRpb24gU2xhdmUgKGNvbW1lbnQgb3V0IG1hc3RlciBzZWN0aW9uIHRvIHVzZSB0aGlzKQoj
CiMgVG8gY29uZmlndXJlIHRoaXMgaG9zdCBhcyBhIHJlcGxpY2F0aW9uIHNsYXZlLCB5b3UgY2Fu
IGNob29zZSBiZXR3ZWVuCiMgdHdvIG1ldGhvZHMgOgojCiMgMSkgVXNlIHRoZSBDSEFOR0UgTUFT
VEVSIFRPIGNvbW1hbmQgKGZ1bGx5IGRlc2NyaWJlZCBpbiBvdXIgbWFudWFsKSAtCiMgICAgdGhl
IHN5bnRheCBpczoKIwojICAgIENIQU5HRSBNQVNURVIgVE8gTUFTVEVSX0hPU1Q9PGhvc3Q+LCBN
QVNURVJfUE9SVD08cG9ydD4sCiMgICAgTUFTVEVSX1VTRVI9PHVzZXI+LCBNQVNURVJfUEFTU1dP
UkQ9PHBhc3N3b3JkPiA7CiMKIyAgICB3aGVyZSB5b3UgcmVwbGFjZSA8aG9zdD4sIDx1c2VyPiwg
PHBhc3N3b3JkPiBieSBxdW90ZWQgc3RyaW5ncyBhbmQKIyAgICA8cG9ydD4gYnkgdGhlIG1hc3Rl
cidzIHBvcnQgbnVtYmVyICgzMzA2IGJ5IGRlZmF1bHQpLgojCiMgICAgRXhhbXBsZToKIwojICAg
IENIQU5HRSBNQVNURVIgVE8gTUFTVEVSX0hPU1Q9JzEyNS41NjQuMTIuMScsIE1BU1RFUl9QT1JU
PTMzMDYsCiMgICAgTUFTVEVSX1VTRVI9J2pvZScsIE1BU1RFUl9QQVNTV09SRD0nc2VjcmV0JzsK
IwojIE9SCiMKIyAyKSBTZXQgdGhlIHZhcmlhYmxlcyBiZWxvdy4gSG93ZXZlciwgaW4gY2FzZSB5
b3UgY2hvb3NlIHRoaXMgbWV0aG9kLCB0aGVuCiMgICAgc3RhcnQgcmVwbGljYXRpb24gZm9yIHRo
ZSBmaXJzdCB0aW1lIChldmVuIHVuc3VjY2Vzc2Z1bGx5LCBmb3IgZXhhbXBsZQojICAgIGlmIHlv
dSBtaXN0eXBlZCB0aGUgcGFzc3dvcmQgaW4gbWFzdGVyLXBhc3N3b3JkIGFuZCB0aGUgc2xhdmUg
ZmFpbHMgdG8KIyAgICBjb25uZWN0KSwgdGhlIHNsYXZlIHdpbGwgY3JlYXRlIGEgbWFzdGVyLmlu
Zm8gZmlsZSwgYW5kIGFueSBsYXRlcgojICAgIGNoYW5nZSBpbiB0aGlzIGZpbGUgdG8gdGhlIHZh
cmlhYmxlcycgdmFsdWVzIGJlbG93IHdpbGwgYmUgaWdub3JlZCBhbmQKIyAgICBvdmVycmlkZGVu
IGJ5IHRoZSBjb250ZW50IG9mIHRoZSBtYXN0ZXIuaW5mbyBmaWxlLCB1bmxlc3MgeW91IHNodXRk
b3duCiMgICAgdGhlIHNsYXZlIHNlcnZlciwgZGVsZXRlIG1hc3Rlci5pbmZvIGFuZCByZXN0YXJ0
IHRoZSBzbGF2ZXIgc2VydmVyLgojICAgIEZvciB0aGF0IHJlYXNvbiwgeW91IG1heSB3YW50IHRv
IGxlYXZlIHRoZSBsaW5lcyBiZWxvdyB1bnRvdWNoZWQKIyAgICAoY29tbWVudGVkKSBhbmQgaW5z
dGVhZCB1c2UgQ0hBTkdFIE1BU1RFUiBUTyAoc2VlIGFib3ZlKQojCiMgcmVxdWlyZWQgdW5pcXVl
IGlkIGJldHdlZW4gMiBhbmQgMl4zMiAtIDEKIyAoYW5kIGRpZmZlcmVudCBmcm9tIHRoZSBtYXN0
ZXIpCiMgZGVmYXVsdHMgdG8gMiBpZiBtYXN0ZXItaG9zdCBpcyBzZXQKIyBidXQgd2lsbCBub3Qg
ZnVuY3Rpb24gYXMgYSBzbGF2ZSBpZiBvbWl0dGVkCiNzZXJ2ZXItaWQgICAgICA9IDIKIwojIFRo
ZSByZXBsaWNhdGlvbiBtYXN0ZXIgZm9yIHRoaXMgc2xhdmUgLSByZXF1aXJlZAojbWFzdGVyLWhv
c3QgICAgPSAgPGhvc3RuYW1lPgojCiMgVGhlIHVzZXJuYW1lIHRoZSBzbGF2ZSB3aWxsIHVzZSBm
b3IgYXV0aGVudGljYXRpb24gd2hlbiBjb25uZWN0aW5nCiMgdG8gdGhlIG1hc3RlciAtIHJlcXVp
cmVkCiNtYXN0ZXItdXNlciAgICA9ICA8dXNlcm5hbWU+CiMKIyBUaGUgcGFzc3dvcmQgdGhlIHNs
YXZlIHdpbGwgYXV0aGVudGljYXRlIHdpdGggd2hlbiBjb25uZWN0aW5nIHRvCiMgdGhlIG1hc3Rl
ciAtIHJlcXVpcmVkCiNtYXN0ZXItcGFzc3dvcmQgPSAgPHBhc3N3b3JkPgojCiMgVGhlIHBvcnQg
dGhlIG1hc3RlciBpcyBsaXN0ZW5pbmcgb24uCiMgb3B0aW9uYWwgLSBkZWZhdWx0cyB0byAzMzA2
CiNtYXN0ZXItcG9ydCAgICA9ICA8cG9ydD4KIwojIGJpbmFyeSBsb2dnaW5nIC0gbm90IHJlcXVp
cmVkIGZvciBzbGF2ZXMsIGJ1dCByZWNvbW1lbmRlZAojbG9nLWJpbgoKIyBQb2ludCB0aGUgZm9s
bG93aW5nIHBhdGhzIHRvIGRpZmZlcmVudCBkZWRpY2F0ZWQgZGlza3MKI3RtcGRpciAgPSAvdG1w
LyAKI2xvZy11cGRhdGUgID0gL3BhdGgtdG8tZGVkaWNhdGVkLWRpcmVjdG9yeS9ob3N0bmFtZQoK
IyBVbmNvbW1lbnQgdGhlIGZvbGxvd2luZyBpZiB5b3UgYXJlIHVzaW5nIEJEQiB0YWJsZXMKI2Jk
Yl9jYWNoZV9zaXplID0gNjRNCiNiZGJfbWF4X2xvY2sgPSAxMDAwMDAKCiMgVW5jb21tZW50IHRo
ZSBmb2xsb3dpbmcgaWYgeW91IGFyZSB1c2luZyBJbm5vREIgdGFibGVzCmlubm9kYl9kYXRhX2hv
bWVfZGlyID0gL3Zhci9saWIvbXlzcWwvCmlubm9kYl9kYXRhX2ZpbGVfcGF0aCA9IGliZGF0YTE6
MTBNOmF1dG9leHRlbmQKaW5ub2RiX2xvZ19ncm91cF9ob21lX2RpciA9IC92YXIvbG9nL2lubm9k
YmxvZ3MvCmlubm9kYl9sb2dfYXJjaF9kaXIgPSAvdmFyL2xvZy9pbm5vZGJsb2dzYXJjaGl2ZS8K
IyBZb3UgY2FuIHNldCAuLl9idWZmZXJfcG9vbF9zaXplIHVwIHRvIDUwIC0gODAgJQojIG9mIFJB
TSBidXQgYmV3YXJlIG9mIHNldHRpbmcgbWVtb3J5IHVzYWdlIHRvbyBoaWdoCmlubm9kYl9idWZm
ZXJfcG9vbF9zaXplID0gMTYwTQppbm5vZGJfYWRkaXRpb25hbF9tZW1fcG9vbF9zaXplID0gMjBN
CiMgU2V0IC4uX2xvZ19maWxlX3NpemUgdG8gMjUgJSBvZiBidWZmZXIgcG9vbCBzaXplCmlubm9k
Yl9sb2dfZmlsZV9zaXplID0gNDBNCmlubm9kYl9sb2dfYnVmZmVyX3NpemUgPSA4TQppbm5vZGJf
Zmx1c2hfbG9nX2F0X3RyeF9jb21taXQgPSAxCmlubm9kYl9sb2NrX3dhaXRfdGltZW91dCA9IDUw
CgoKcXVpY2sKbWF4X2FsbG93ZWRfcGFja2V0ID0gMTZNCgoKI2Vyci1sb2c9L3Zhci9sb2cvbXlz
cWxkLmxvZwojcGlkLWZpbGU9L3Zhci9saWIvbXlzcWwvbXlzcWwucGlkIDwtLSBOb3QgbmVjZXNz
YXJ5Cm9wZW5fZmlsZXNfbGltaXQ9ODE5MgoKCgpuby1hdXRvLXJlaGFzaAojIFJlbW92ZSB0aGUg
bmV4dCBjb21tZW50IGNoYXJhY3RlciBpZiB5b3UgYXJlIG5vdCBmYW1pbGlhciB3aXRoIFNRTAoj
c2FmZS11cGRhdGVzCgoKa2V5X2J1ZmZlciA9IDEyOE0Kc29ydF9idWZmZXJfc2l6ZSA9IDEyOE0K
cmVhZF9idWZmZXIgPSAyTQp3cml0ZV9idWZmZXIgPSAyTQoKCmtleV9idWZmZXIgPSAxMjhNCnNv
cnRfYnVmZmVyX3NpemUgPSAxMjhNCnJlYWRfYnVmZmVyID0gMk0Kd3JpdGVfYnVmZmVyID0gMk0K
CgppbnRlcmFjdGl2ZS10aW1lb3V0L2xvZwojLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t
LS0tIAo=
--=_c9deec5e-3fe3-4778-a5c9-e45759fe598d
Message-ID: <20110804123543.161953fbwv1gn3ks@mail.bitmaison.com>
Date: Thu, 04 Aug 2011 12:35:43 +0200
From: "Trevor Glover" <trevor.glover@bitmaison.com>
To: "Peter James" <peter.james@bitmaison.com>
Subject: About the last interview
MIME-Version: 1.0
Content-Type: multipart/mixed;
boundary="=_51bfnkq3ay4o"
Content-Transfer-Encoding: 7bit
User-Agent: Dynamic Internet Messaging Program (DIMP) H3 (1.1.2)
This message is in MIME format.
--=_51bfnkq3ay4o
Content-Type: text/plain; charset=ISO-8859-1
Hey dude !
For you information, here's attached an extract of the last interview by Henri Plow and Paul Ka.
Bye !
--
Trevor Glover
CEO of Bitmaison.com
--=_51bfnkq3ay4o
Content-Type: application/pdf;
name="Extract_of_the_last_interview.pdf"