## Hackover CTF: Racer
----------## Challenge details| Contest        | Challenge     | Category  | Points ||:---------------|:--------------|:----------|-------:|| Hackover CTF | Racer | Crypto | 300  |
*Description*> Join the race and make a round. Don't forget to view the winner animation!
----------## Write-up
For this challenge we need to choose Red/Blue correct about 40 times in a row to win a race, if we get it wrong at any time we are moved back to the beginning. So we need to figure out something to base our choice on.
We can download a 'pills' file, in which there are 2048 files of appearantly random data.
In the source code we find:
>```go>	var fn func([]byte)>	if s.GetColor() == "red" {>		fn = fillRc4>	} else {>		fn = fillRandom>	}>	w.Header().Set("Content-Type", "application/x-gtar")>	buildArchive(w, fn)>}>>func buildArchive(w io.Writer, fillRandom func([]byte)) {>	size := 16>	randombytes := make([]byte, size)>	z := gzip.NewWriter(w)>	tw := tar.NewWriter(z)>	createTime := time.Now()>	for i := 0; i < NUM_CHEMICALS; i++ {>		tw.WriteHeader(&tar.Header{Name: CHEMICALS[i],>			Mode:     0666,>			Uid:      1000,>			Gid:      1000,>			Size:     int64(size),>			ModTime:  createTime,>			Typeflag: tar.TypeReg,>		})>		if i == 42 {>			tw.Write(HINT)>		} else {>			fillRandom(randombytes)>			tw.Write(randombytes)>		}>	}>	tw.Close()>	z.Close()>}>```
This reveals that if the we need to choose "Red" the data is actully RC4 encrypted. 
>```>the second output byte of the cipher was biased toward zero with probability 1/128 (instead of 1/256)>```
Thus we can distinguish the pills file:
>```python>#!/usr/bin/python>>import os>import tarfile>import shutil>>tfile = tarfile.open("pills.tar.gz", 'r:gz')>tfile.extractall('./pills')>>count = 0>for filename in os.listdir("./pills"):>    with open("pills/" + filename, 'rb') as f:>        f.read(1)>        byte = f.read(1)>        if byte == "\x00":>            count += 1>print count>if count < 8:>    print "Seems random? -> blue">if count > 16:>    print "Seems RC4? -> red">>shutil.rmtree("./pills")>```
Thankfully we can redownload the file and we get a different one.
The flag was something like (I didn't write it down):
>```>hackover15{juprc4istotallybroken}>```