CPBR9 - 1 day 1 chall - Matroshka (PPC)

  • CTF: CPBR9 - 1 day 1 chall
  • Challenge: Day 1 - Mathroshka
  • Category: PPC / Coding
  • Author: gnx
  • Solved by: RTFM[ChOkO]

Description: D1v1r74-53 c0m 4 Matroshka! (use wget se tiver dificuldades para baixar o arquivo).
Link: http://game.ctf-br.org/challenges/Day1-Matroshka.zip

**

Utilizamos o comando “file” para saber realmente qual o tipo de arquivo apresentado neste desafio:

[root:...BR/CPBR2016/DAY_01/write-up]# file Day1-Matroshka.zip
Day1-Matroshka.zip: Zip archive data, at least v1.0 to extract

Rodamos o comando “unzip” para descompacta-lo e (para nossa surpresa) nos deparamos com um mais um zip…

[root:...BR/CPBR2016/DAY_01/write-up]# unzip Day1-Matroshka.zip  
Archive:  Day1-Matroshka.zip  
extracting: zip.zip  

[root:...BR/CPBR2016/DAY_01/write-up]# file zip.zip  
zip.zip: Zip archive data, at least v1.0 to extract

Conforme o nome do challenge estamos realmente lidando com uma Mathroshka que no final nos recompensará com a primeira flag do 1day_1chall! \o/ Pensamos em deixar nosso estagiário rodando o comando “unzip” na mão, porém a idéia de perder o primeiro dia da #CPBR9 não lhe agradou muito e ele resolveu este desafio com uma elegante gambiarra: um shellscript (solve.sh) para descompactar sucessivamente todas as camadas da mathroshka e ao final chamando um script em python (bin2ascii.py) para conversão da flag.

  • bin2ascii.py:
#!/usr/bin/env python

import binascii
import sys 

binario_in = str(sys.argv[1]) 
x = "0b%s" % binario_in
n = int(x,2)
result = binascii.unhexlify('%x' % n)

print '[*] Binario --> %s \n[*] Flag    --> %s ' % (binario_in, result)
#!/usr/bin/env python
 
import binascii
import sys 
 
binario_in = str(sys.argv[1]) 
x = "0b%s" % binario_in
n = int(x,2)
result = binascii.unhexlify('%x' % n)
 
print '[*] Binario --> %s \n[*] Flag    --> %s ' % (binario_in, result)
  • solve.sh:
#!/bin/bash

i=0

# Descompacta a Matroshka até encontrar um 
# tipo de arquivo que não seja compactado.
while true; do

  ARQ=$(ls -1 | grep -vE "solve.sh|bin2ascii.py")
  TYP=$(file $ARQ | cut -d" " -f2)

  if [ $TYP != "Zip" ]; then
    echo -ne "\e[33;5m[*] FOUND   --> $ARQ \n"
    break
  fi

  echo "[ $i ] $ARQ "
  WORK="work.zip"
  mv $ARQ $WORK
  7z x $WORK
  rm $WORK
  let i++
done

# Lê e converte a flag codificada...
FLAGBIN=$(cat flag.bin)

Executando o solve.sh temos o seguinte resultado
./solve.sh

  • FLAG: m4tr0shk4fr4ct4l