Tags: ascii stego 

Rating:

# Dimension 0
```
We found this super official and super scholarly mathematical article describing different dimensions. The title is "Dimension 0", but it doesn't talk about what that is...

Download the file below.
```
[dimension_0.html](dimension_0.html)

Just a HTML file, look in a browser:

![image1](image1.png)

Nothing interesting, look through the source found something interesting:

![image2](image2.png)

Notice the title is filled with [zero width spaces](https://en.wikipedia.org/wiki/Zero-width_space)

Then I use Python to grab all the characters:
```py
import re
text = open("dimension_0.html",'r').read()
# Grab the characters between title tag
text = re.findall("<title>(.*)</title>",text)[0]
# Remove the "Dimension 0" text
print repr(text.replace("Dimension",'').replace(" ",'').replace("0",''))
```
Result:
```
'\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\xac\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8c\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xef\xbb\xbf\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8d\xef\xbb\xbf\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\xac\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xef\xbb\xbf\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xef\xbb\xbf\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8d\xef\xbb\xbf\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\xac\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8d\xef\xbb\xbf\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\xac\xe2\x80\xac\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\xac\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xef\xbb\xbf\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8d\xef\xbb\xbf\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\xac\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\xac\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\x8d\xef\xbb\xbf\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\xac\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xef\xbb\xbf\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\x8d\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xef\xbb\xbf\xe2\x80\xac\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf\xe2\x80\x8c\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xe2\x80\xac\xe2\x80\x8d\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xef\xbb\xbf\xef\xbb\xbf\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xe2\x80\xac\xef\xbb\xbf\xe2\x80\xac\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8c\xe2\x80\x8d\xef\xbb\xbf'
[Finished in 0.1s]
```

Notice there are 4 types of characters:
- `\xe2\x80\x8c`
- `\xe2\x80\x8d`
- `\xe2\x80\xac`
- `\xef\xbb\xbf`

The title **Dimension 0** given a hint that should be related to binary (because 0,1)

Therefore I replace the characters to `0,1,2,3`, then see the pattern
```py
import re
text = open("dimension_0.html",'r').read()
text = re.findall("<title>(.*)</title>",text)[0]
text = text.replace("Dimension",'').replace(" ",'').replace("0",'')
print text.replace("\xe2\x80\x8c",'0').replace("\xe2\x80\x8d",'1').replace("\xe2\x80\xac",'2').replace("\xef\xbb\xbf",'3')
```
Result:
```
00001212000012300000120100001213000013230000130300001310000012110000121300001233000011330000121200001302000012330000123100001133000013100000122000001211000011330000132200001211000013020000123300001133000013130000122100001210000013100000122000001133000012100000122100001231000012110000123200001303000012210000123300001232000013
```
Notice the 4 zero pattern, I guess it should be Base 4 number

Then I tried to decode it in python, I know guessed correctly:
```py
>>> chr(int("1212",4))
'f'
>>> chr(int("1230",4))
'l'
>>> chr(int("1201",4))
'a'
>>> chr(int("1213",4))
'g'
```
I simply use the `long_to_bytes` function in Crypto module to convert the numbers to bytes:
```py
import re
from Crypto.Util.number import long_to_bytes
text = open("dimension_0.html",'r').read()
text = re.findall("<title>(.*)</title>",text)[0]
text = text.replace("Dimension",'').replace(" ",'').replace("0",'')
text = text.replace("\xe2\x80\x8c",'0').replace("\xe2\x80\x8d",'1').replace("\xe2\x80\xac",'2').replace("\xef\xbb\xbf",'3')
print long_to_bytes(int(text,4))
```
Result:
```
?`?�???p?�?0?@?P?p?�?�?`? ?�?�?�?@?�?P?�?�?P? ?�?�?p?�?@?@?�?�?@?�?�?P?�?0?�?�?�?
[Finished in 0.1s]
```
Something was wrong..

Notice the last character only got 2 number:
```
...0000123300001232000013
```
Then I tried to add 2 zero then i works!
```
'f\x00l\x00a\x00g\x00{\x00s\x00t\x00e\x00g\x00o\x00_\x00f\x00r\x00o\x00m\x00_\x00t\x00h\x00e\x00_\x00z\x00e\x00r\x00o\x00_\x00w\x00i\x00d\x00t\x00h\x00_\x00d\x00i\x00m\x00e\x00n\x00s\x00i\x00o\x00n\x00p'
```
Lastly cut the string 2 by 2 characters:
```py
print long_to_bytes(int(text+"00",4))[::2]
# flag{stego_from_the_zero_width_dimensionp
```
The last character should be `}`, thats the flag!

## Flag
```
flag{stego_from_the_zero_width_dimension}
```

Original writeup (https://github.com/Hong5489/BsidesBOSCTF2020/blob/master/dimension0/README.md).