Rating:

# ASIS Cyber Security Contest Finals 2014: Mask

**Category:** Crypto, Stego
**Points:** 150
**Description:**

> Flag is hidden in [file](mask_e50b38fc9ba38378c444bd93518e886f), find it!
>
> **Hint:** Numerical representation can be useful.

## Write-up

Let’s see what [the provided file](mask_e50b38fc9ba38378c444bd93518e886f) could be:

```bash
$ file mask_e50b38fc9ba38378c444bd93518e886f
mask_e50b38fc9ba38378c444bd93518e886f: xz compressed data
```

So, we extract the file using the built-in `xz` or `unxz` commands:

* `xz -dc < mask_e50b38fc9ba38378c444bd93518e886f > mask`
* `unxz < mask_e50b38fc9ba38378c444bd93518e886f > mask`

Alternatively, extract the provided file using [p7zip](http://p7zip.sourceforge.net/):

```bash
7z x mask_e50b38fc9ba38378c444bd93518e886f
```

Let’s find out what the extracted file is:

```bash
$ file mask
mask: data
```

Okay, it’s just a bunch of seemingly random, binary data. Let’s use the hint to try to make sense of it, and convert the byte stream into a number. First we use `hexdump` and `xxd` to view the hexadecimal representation of the file, but nothing really stands out. Let’s represent the file as a decimal number. Since the file is quite big, we write a Python script for this:

```py
import binascii
f = open('mask', 'rb')
byte_stream = f.read()
number = int(binascii.hexlify(byte_stream), 16)

with open('big-ass-int.txt', 'w') as number_file:
number_file.write(str(number))
```

After running this script, `big-ass-int.txt` contains the number, which consists of 674,209 digits:

```bash
$ wc -c big-ass-int.txt
674209 big-ass-int.txt
```

The number starts with the following digits:

```bash
$ head -c 40 big-ass-int.txt
1415926535890932384626433832095028841971
```

Those look like [the fractional-part digits of `π`](http://www.wolframalpha.com/input/?i=π)! Let’s get the fractional-part digits of `π` and compare them to this number to see if there’s a difference.

[This page](http://www.exploratorium.edu/pi/pi_archive/Pi10-6.html) lists the first million digits of `π`, which is more than enough for our experiment (we only need 674,209 fractional-part digits). After removing the leading `3.` and whitespace we end up with [this file named `pi.txt`](https://gist.githubusercontent.com/anonymous/c2f71add67dd9a7943ad/raw/f1afa4da5012e93921a0c681419427466494a37e/pi-1000000.txt).

Let’s write a Python script `diff.py` to get the digits from the real `π` that are different in the `big-ass-int.txt` file, and format the resulting number in hex.

```python
#!/usr/bin/env python
# coding=utf-8

real_pi = open('pi.txt', 'r').read()
big_ass_int = open('big-ass-int.txt', 'r').read()

result = ''
for i in range(0, len(big_ass_int)):
if big_ass_int[i] != real_pi[i]:
result += real_pi[i]

print '%x' % int(result)
```

Let’s treat the hexadecimal output of the script as a byte stream and save the result as a file named `diff.bin`.

```bash
$ python diff.py > diff

$ xxd -r -p diff > diff.bin

$ file diff.bin
diff.bin: xz compressed data
```

Aha, apparently this is another `xz` archive! Let’s extract it using any of the abovementioned techniques:

```bash
$ unxz < diff.bin > extracted

$ file extracted
extracted: PDF document, version 1.5
```

Opening the extracted file in a PDF viewer reveals the flag: `ASIS_d45491d1ad0b63ae05b0f0238d0c48e8`.

## Other write-ups and resources

* none yet

Original writeup (https://github.com/ctfs/write-ups/tree/master/asis-ctf-finals-2014/mask#readme).