Tags: re 

Rating:

### Kernel Crackme

![5_title](images/5_title.png)

We are given with **X-MAS_kernel_crackme.sys** driver and **challenge.exe** client.

Client code:

![5_client](images/5_client.png)

Let's look at the driver code:

​ ![5_initialize](images/5_initialize.png)

We are interested in read and write major functions. **write** copies usermode buffer into driver's buffer. **read** does input processing and returns buffer to user.

![5_read](images/5_read.png)

This switch has 130 cases. Every case function changes **choise** variable.

Here is example of some case functions:

![5_xor](images/5_xor.png)

![5_swap](images/5_swap.png)

![5_bigxor](images/5_bigxor.png)

IDA has very useful plugin called **findcrypt** that scans binary for known crypto signatures. This time findcrypt found **AES RijnDael** constants.

![5_findcrypt](images/5_findcrypt.png)

We also find that this constants are used in some functions in that giant switch case statement:

![5_dijn](images/5_dijn.png)

So we can assume that we are dealing with obfuscated AES implementation. Looking closely at **read** major function we can see **aes expand key** function and the key, that is passed to it.

![5_expand](images/5_expand.png)

Solution:

``` python
from Crypto.Cipher import AES
from binascii import unhexlify
key = '4B 61 50 64 53 67 56 6B 58 70 32 73 35 76 38 79'.replace(' ', '')
flag = 'F2 63 69 4F F5 CB FB F4 98 19 C2 FD 39 ED F9 CC 5D EC D9 EC 66 A5 30 D1 82 46 7D A9 FD 5B 3C BF 1C 3D BD 70 26 00 6A 43 C4 0A 47 4C B7 56 2D 50 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00'.replace(' ', '') # from client

aes = AES.new(unhexlify(key), AES.MODE_ECB)
flag = aes.decrypt(unhexlify(flag))
print flag
```

``` python
>>> 'X-MAS{060b192f0063cc9ab6361c2329687506f50321d8}\x00Nj\xfc;=TUj\x8c\xe7\x1bYZ+\xb1'
```

Original writeup (https://github.com/archercreat/CTF-Writeups/blob/master/X-MAS%20CTF/Kernel%20Crackme/README.md).