SECCON for Beginners CTF 2019 writeup
SECCON for Beginners CTFに参加しました。
CpawCTFが大体解けるようになって、挑んだのにあまり解けずに落ち込んでます…
もう少し、頑張りたいと思います。備忘録のため、Writeupを書きます。
目次
Reversing
[warmup] Seccompare
https://score.beginners.seccon.jp/files/seccompare_44d43f6a4d247e65c712d7379157d6a9.tar.gz
とりあえずfileコマンド。
$ file seccompare
seccompare: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, for GNU/Linux 3.2.0, BuildID[sha1]=4a607c82ea263205071c80295afe633412cda6f7, not strippe
とりあえずobjdumpしました。mainあたりを色々見てくと、この辺が怪しそう。

movbの部分の$0x??の部分をasciiコードに対応させてみると、フラグをゲット。
ctf4b{5tr1ngs_1s_n0t_en0ugh}
Crypto
[warmup] So Tired
最強の暗号を作りました。 暗号よくわからないけどきっと大丈夫!
File: so_tired.tar.gz
encrypted.txtがあったので、とりあえず中を見てみる。
eJwUm7V25UAQBT9IgZjCJ2bmTMzM+vr1xj62R6Pue6t8nkvl9kcqMlfkFzcsIDMhrqEGmmCOg57g9k0wzCFzdg3JMLlq55tPR77GwSsTl4QjB81tYEFti219t7E/T1mGw2pTDEBg4gu23X1BqAiVGgn3G/imxurRCP39QCR9dMsSbAlvJ24nEQV3wrj0So+XxvCil0dzBl1xM4Ne+owDxM4BU+LuHV6w3GIZ0X3bHoWnSGFElxTUXYbL32xYcAxXFdojs+NK9soAbbGs1Br/FSgUQ6bGPrQ6OOIdJUE5CYykUay5+3Iy06UhWct7m1O06p23uDCvQsEy3l/uhD8YpmM9iRkHtXoqIBydIusdssgrF8gD9ABkyavNRzsCF5v2tcDRISB8B90Xq6ljXyilm1oi+ZHhOqnUyO773ALE1kUNs8+4011uG3+wxTpRlNFMZpt7hIrzTuvhOGKCs8iGUQz74Vn5UimptIrM/UTPlXZ4VUVUpXR9Kub8QJ8/AO59mugWibwJnRARtEXGDi648dp3/ZCpVJuD0xlv9gEl2ilxfpw
とりあえずbase64でデコードしてみる。
$ cat encrypted.txt | base64 -d > encrypted
その後、fileコマンド。
$ file encrypted
encrypted: zlib compressed data
zlib形式だとわかる。
調べるとPythonが楽っぽいので、Pythonで展開するコードを書く。
import base64
import zlib
s = '<encrypted.txtの中身>'
print s.decode("base64").decode("zlib")
実行して、無事終わりかなと思ったら、再度base64の内容が表示される。まさかね。というわけで無限ループ。
import base64
import zlib
s = '<encrypted.txtの中身>'
while True:
s = s.decode("base64").decode("zlib")
print s
無事、フラグをゲットできました。(他の人のwriteupを見ると、500回くらい繰り返されていたとか。。。
ctf4b{very_l0ng_l0ng_BASE64_3nc0ding}
Misc
[warmup] Welcome
SECCON Beginners CTFのIRCチャンネルで会いましょう。
IRC:freenode.net #seccon-beginners-ctf
IRCのチャンネルに参加して、ヘッダのあたりを見ればOK。
ctf4b{welcome_to_seccon_beginners_ctf}
containers
Let’s extract files from the container.
https://score.beginners.seccon.jp/files/e35860e49ca3fa367e456207ebc9ff2f_containers
ダウンロードして、バイナリで見てみる。

FILE0.の後にPNGのデータがついているように見える。以降、それが連続している。なので、Stirlingを使って、部分的に別ファイルにしていく。順番に画像を並べると、答えが出てくる。

ctf4b{e52df60c058746a66e4ac4f34db6fc81}
Dump
Analyze dump and extract the flag!!
https://score.beginners.seccon.jp/files/fc23f13bcf6562e540ed81d1f47710af_dump
とりあえずfileコマンド
$ file fc23f13bcf6562e540ed81d1f47710af_dump
fc23f13bcf6562e540ed81d1f47710af_dump: tcpdump capture file (little-endian) - version 2.4 (Ethernet, capture length 262144)
拡張子をpcapにして、Wiresharkで開く。
すると、hexdumpでフラグの中身を取得している通信がある。
/webshell.php?cmd=hexdump -e '16/1 "%02.3o " "\n"' /home/ctf4b/flag
レスポンスはこんな感じ。
<html>
<head>
<title>Web Shell</title>
</head>
<pre>
037 213 010 000 012 325 251 134 000 003 354 375 007 124 023 133
...
050 241 022 115 000 060 014 000
</pre>
</html>
hexdumpのコマンドを見ると、8進数になっている。
なので、preで囲まれた範囲を抜き出し、別ファイルに保存し、バイナリに変換するSolverを書いてみる。
class Program
{
static void Main(string[] args)
{
using (StreamReader sr = new StreamReader(@"C:\Users\rakuha\Downloads\ctg_beginners\Misc\Dump\data.txt"))
{
using (FileStream fs = new FileStream(@"C:\Users\rakuha\Downloads\ctg_beginners\Misc\Dump\output", FileMode.Create))
{
string line = null;
while ((line = sr.ReadLine()) != null)
{
string[] values = line.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
foreach (string value in values)
{
int num = Convert.ToInt32(value, 8);
fs.WriteByte((byte)num);
}
}
}
}
}
}
できたファイルをfileコマンドで見てみる。
$ file output
output: gzip compressed data, last modified: Sun Apr 7 10:46:34 2019, from Unix
tar.gzだったので、展開する。
$ tar xzvf output
./._flag.jpg
flag.jpg
flag.jpgを表示すると、フラグが書いてある。
ctf4b{hexdump_is_very_useful}
コメントを残す