読者です 読者をやめる 読者になる 読者になる

WhiteHat Challenge 01 Writeup

CTF writeup

この大会は2017/2/25 11:00(JST)~2017/2/25 19:00(JST)に開催されました。
今回もチームで参戦。結果は135点で70チーム中7位でした。
自分で解けた問題をWriteupとして書いておきます。

For001 (For 20)

LSB.pngが与えられている。ファイル名から考えてもLSBにフラグが隠されているに違いない。
Stegsolveで開き、[Analyse]-[Data Extract]からExtract Preview画面を表示し、
Red, Green, Blueの0を選択して、Previewを見ると、ZIPフォーマットが見える。

Save Binでout.binとして保存。

$ file out.bin 
out.bin: Microsoft Word 2007+

Wordで開いてみると、モールス信号が書いてある。

. .- ... -.-- ..-. --- .-. . -. ... .. -.-.

デコードすると、easyforensic

$ echo -n easyforensic | sha1sum
1f0aa393d3e5369f391c35a793bcf1178b8299a0  -
WhiteHat{1f0aa393d3e5369f391c35a793bcf1178b8299a0}

Crypto002 (Crypto 20)

暗号化スクリプトと暗号化した画像ファいるが与えられている。スクリプトから8バイトの鍵でXORをとっていることがわかる。
そこでXOR鍵を求め、それから元の画像を復元する。

with open('out.png', 'rb') as f:
    data = f.read()

PNG_HEAD = [0x89, 0x50, 0x4e, 0x47, 0x0d, 0x0a, 0x1a, 0x0a]

key = []
for i in range(len(PNG_HEAD)):
    key.append(ord(data[i]) ^ PNG_HEAD[i])

flag = ''
for i in range(len(data)):
    code = ord(data[i]) ^ key[i%len(key)]
    flag += chr(code)

with open('images.png', 'wb') as f:
    f.write(flag)

復号した画像にflagが書いてある。
f:id:satou-y:20170228194758p:plain
Too_easy_right?

$ echo -n "Too_easy_right?" | sha1sum
5356be1427d77ea27062cb5417c887b01a019e11  -
WhiteHat{5356be1427d77ea27062cb5417c887b01a019e11}

Re001 (Re 15)

jarファイルが与えられている。このファイルをJD-UGIで開くと、以下のコード部分がフラグに関係していそう。

         :
  Character[] ListChar = { Character.valueOf('a'), Character.valueOf('_'), Character.valueOf('y'), Character.valueOf('l'), Character.valueOf('_'), Character.valueOf('l'), Character.valueOf('a'), Character.valueOf('T'), Character.valueOf('_'), Character.valueOf('T'), Character.valueOf('_'), Character.valueOf('T'), Character.valueOf('e'), Character.valueOf('_'), Character.valueOf('y'), Character.valueOf('e'), Character.valueOf('r'), Character.valueOf('_'), Character.valueOf('S'), Character.valueOf('_'), Character.valueOf('_'), Character.valueOf('l'), Character.valueOf('r'), Character.valueOf('T'), Character.valueOf('F'), Character.valueOf('_'), Character.valueOf('Y'), Character.valueOf('_'), Character.valueOf('l'), Character.valueOf('e'), Character.valueOf('T'), Character.valueOf('T'), Character.valueOf('T'), Character.valueOf('a'), Character.valueOf('r'), Character.valueOf('T'), Character.valueOf('u'), Character.valueOf('A'), Character.valueOf('o') };
  int[] ListPos = { 11, 7, 14, 13, 26, 22, 4, 34, 15, 37, 3, 31, 19, 27, 23, 6, 18, 25, 30, 24, 17, 12, 9, 38, 28, 8, 0, 16, 21, 10, 32, 36, 33, 20, 5, 35, 2, 29, 1 };
         :
  public String generateFlag()
  {
    String flag = "";
    Character[] tmpListChar = { Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0'), Character.valueOf('\0') };
    int lenFlag = this.ListChar.length;
    for (int i = 0; i < lenFlag; ++i) {
      tmpListChar[this.ListPos[i]] = this.ListChar[i];
    }
    for (i = 0; i < lenFlag; ++i) {
      flag = flag + tmpListChar[i];
    }
    return flag;
  }
         :

プログラムでフラグを構成してみる。

list_c = ['a', '_', 'y', 'l', '_', 'l', 'a', 'T', '_', 'T', '_', 'T', 'e', '_', 'y', 'e', 'r', '_', 'S', '_', '_', 'l', 'r', 'T', 'F', '_', 'Y', '_', 'l', 'e', 'T', 'T', 'T', 'a', 'r', 'T', 'u', 'A', 'o']

list_pos = [11, 7, 14, 13, 26, 22, 4, 34, 15, 37, 3, 31, 19, 27, 23, 6, 18, 25, 30, 24, 17, 12, 9, 38, 28, 8, 0, 16, 21, 10, 32, 36, 33, 20, 5, 35, 2, 29, 1]

flag = ['\0'] * 39
for i in range(len(list_c)):
    flag[list_pos[i]] = list_c[i]

print ''.join(flag)

flagは You_are__really___really____FASTTTTTTTT

$ echo -n You_are__really___really____FASTTTTTTTT | sha1sum
1e69c12b7b2bb6b895d39c4776ef8b34489149ab  -
WhiteHat{1e69c12b7b2bb6b895d39c4776ef8b34489149ab}