EKOPARTY CTF 2017 Writeup

この大会は2017/9/16 9:00(JST)~2017/9/17 21:00(JST)に開催されました。
今回もチームで参戦。結果は5803点で184チーム中15位でした。
自分で解けた問題をWriteupとして書いておきます。

Shopping (PWNING)

$ nc shopping.ctf.site 21111
Enter a raw string (max. 32 bytes) that meets the following condition: hex(sha1(input))[0:6] == 3e9fdf

まずこの問題を解く必要がある。その後、買い物のメニューに変わる。

Welcome to Ekoparty shopping Center
Feel free to buy up to 5 items that you may like
Use wisely your coins, have fun!

You have 50 coins
What do you wanna buy today?
1. t-shirt              10
2. short                20
3. stickers             1
4. flag                 ?
2
How many?
2

50コインではflagは購入できず。数値がマイナスの限界を超えて、プラスになることを考え、調整しながらコードを書く。

import socket
import re
import string
import hashlib
import itertools

pattern = '\[0:6\] == (.+)'

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('shopping.ctf.site', 21111))

data = s.recv(256)
print data
m = re.search(pattern, data)
h_head = m.group(1)

for c in itertools.product(string.printable, repeat=4):
    text = ''.join(c)
    if hashlib.sha1(text).hexdigest()[0:6] == h_head:
        ans = text
        break

print ans
s.sendall(ans + '\n')

data = s.recv(2048)
print data
print '2'
s.sendall('2\n')
data = s.recv(2048)
print data
coin = (50 + 2**63) / 20 - 10000000
print coin
s.sendall(str(coin) + '\n')

data = s.recv(2048)
print data
print '4'
s.sendall('4\n')
data = s.recv(2048)
print data
print '1'
s.sendall('1\n')
data = s.recv(1024)
print data
data = s.recv(1024)
print data
EKO{d0_y0u_even_m4th?}

Shopwn (PWNING)

ncの接続先以外、Shoppingと同じコードで解けた。

EKO{dude_where_is_my_leak?}

EKOVM (VM)

$ ./ekovm
=[ Secure Flag Generator ]=
[+] Type your flag: 
[+] Securing your flag
[+] Flag secured:
052353120053246640010524440

毎回同じ値を入力しても出力結果は変わる。

■123の場合
044675504045476710046300114
007414450
  ↓
044675504
045476710
046300114
007414450

■111の場合
043705360043705360043705360
007245540
  ↓
043705360
043705360
043705360
007245540

■abcの場合
075203454075706730076412204
006241270
  ↓
075203454
075706730
076412204
006241270

■flagの場合
117354350124105520113442074
120173244007624530
  ↓
117354350
124105520
113442074
120173244
007624530

数字9桁が1文字に対応しているようだ。さらにASCIIコード順に大きさは並んでいるが、幅は一定ではない。あとは、末尾が4になっている場合は、ASCIIコードが奇数の文字に対応している。
以上の特徴を踏まえ、問題の数字をASCIIコード表と見比べながら、EKO{xxx}の形式になるよう割り当てていく。

064325164 E 
070762714 K
074006534 O
135340214 {
127270554 s
045162244 1
072374624 M
125051700 p
122026060 l
046574154 3
042135424 -
131507430 v
122633024 m
136752124 }
007461350
EKO{s1Mpl3-vm}

Malbolge (MISC)

$ nc malbolge.ctf.Send a malbolge code that print: 'Welcome to EKOPARTY!' (without single quotes)
Bye bye!!!

調べたら、malbolgeという難解プログラミング言語があるらしい。
http://zb3.me/malbolge-tools/#generator で Welcome to EKOPARTY! と表示するコード生成する。

D'`_M?![m}YFWVCBu@,+*/_L&8$kGF3}BAzRb}=_):[Zp6WVlqpih.ONjiha'H^]\[Z~^W\[ZYRvVOTSLp3INGFjJ,BAe?'=<;_?8=<;4X216543,P0p(-,+*#G'&f|{"y?}|ut:[qvutml2poQPlejc)gfedFb[!_X]V[ZSRvP8TSLpJ2NMLEDhU
$ nc malbolge.ctf.Send a malbolge code that print: 'Welcome to EKOPARTY!' (without single quotes)
D'`_M?![m}YFWVCBu@,+*/_L&8$kGF3}BAzRb}=_):[Zp6WVlqpih.ONjiha'H^]\[Z~^W\[ZYRvVOTSLp3INGFjJ,BAe?'=<;_?8=<;4X216543,P0p(-,+*#G'&f|{"y?}|ut:[qvutml2poQPlejc)gfedFb[!_X]V[ZSRvP8TSLpJ2NMLEDhU
Running code...
Welcome to EKOPARTY!
Your flag is: EKO{0nly4nother3soteric1anguage}
EKO{0nly4nother3soteric1anguage}