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

ブログの名前なんて適当で良いのでは

説明を求めるな、記事を読め

AlexCTFのwriteupと感想

開始時間が早まっていたらしいが,私自身はその早まった時間しか見て無くてスタートダッシュを決めて始めてしまった.
チームとしては21位の2450ptsの全完で,うち640ptsを入れた.

Gifted(Rev:50pts)

stringsするとフラグが見える.

AlexCTF{Y0u_h4v3_45t0n15h1ng_futur3_1n_r3v3r5ing}

C++ is awesome(Rev:100pts)

C++バイナリで,L3t_ME_T3ll_Y0u_S0m3th1ng_1mp0rtant_A{FL4G}W0nt_b3_3X4ctly_th4t_345y_t0_c4ptur3_H0wev3r_1T_w1ll_b3_C00l_1F_Y0u_g0t_1tという文字列に対して,特定のメモリに格納された添字でアクセスしている処理が見えたので,それをまんま真似てみたらフラグが出た.

ALEXCTF{W3_L0v3_C_W1th_CL45535}

Catalyst system(Rev:150pts)

loading処理として乱数値でのsleepがあり邪魔なのでパッチをあてて潰す.その後バイナリを解析していくとUsernameとPasswordに対しての処理があることがわかる.Usernameは方程式を解く,Passwordは乱数値を引いた値が特定の値になるというチェックだった. UsernameとPasswordのチェックに関してz3使ってソルバを書いた.(この時は気づかなかったけどPasswordの方に関してはz3使う必要ないよなってことでusernameだけ示す.)

from z3 import *
from struct import pack

x = Int("x")
y = Int("y")
z = Int("z")

s = Solver()

s.add(x - y + z == 1550207830)
s.add(3 * x + y + 3 * z == 12465522610)
s.add(y * z == 3651346623716053780)

r = s.check()
if r == sat:
    m = s.model()
else:
    print r

username = ''
username += pack('L', m[x].as_long())
username += pack('L', m[y].as_long())
username += pack('L', m[z].as_long())

print username

正しいUsernameとPasswordでログインするとフラグが表示された.
ALEXCTF{1_t41d_y0u_y0u_ar3gr34treverser__s33}

Ultracoded(Crypto:50pts)

CTFお決まりのものがいろいろ混ざった問題.
ZEROとONEという単語が大量にあるファイルが配布されるので,まず数値の0,1に直す.その後,8bitずつに区切ってASCIIに戻す.その後Base64デコードすると,モールス信号がでてくるので,それを読み解くとフラグになる.(ただしOを_に変換する必要あり)

require 'base64'
# http://morsecode.scphillips.com/translator.html
p Base64.decode64(File.read("zero_one").scan(/......../).map{|x| x.to_i(2).chr}.join(""))

ALEXCTF{TH15_1S_5UP3R_5ECR3T_TXT}

Mathbot(PPC:100pts)

ncでつなぐと0xdeadbeef + 0xdeadbeef =的なのが送られてくるので,オペランドとオペレータを引っこ抜いて計算するだけ.数回やるとフラグが降ってきた.

#!/usr/bin/env ruby
# coding: ascii-8bit
require 'pwnlib'

host = '195.154.53.62'
port = 1337

PwnTube.open(host, port) do |t|

  i = 0
  t.debug = true
  while true
    puts "phase %d" % i
    t.recv_until(":\n")
    a = t.recv_until(" ").to_i
    op = t.recv_until(" ").chop
    b = t.recv_until(" ").to_i

    t.sendline((a + b).to_s)  if(op == '+')
    t.sendline((a - b).to_s)  if(op == '-')
    t.sendline((a * b).to_s)  if(op == '*')
    t.sendline((a / b).to_s)  if(op == '/')
    t.sendline((a % b).to_s)  if(op == '%')
    i += 1

  end
end

ALEXCTF{1_4M_l33t_b0t}

Cutie cat(PPC:150pts)

クソ問

$ steganography -d cat_with_secrets.png                                                                             ASLR: ON
ALEXCTF{CATS_HIDE_SECRETS_DONT_THEY}

SSL_0day(Trivia:20pts)

英語を読む能力
HeartBleed

CA(Trivia:20pts)

英語を読む能力
letsencrypt

感想

Rev350pts解きたかったなぁ