はじめに
CTF学習のため、cpawというサイトの問題を解いていく記事です。
今回はLevel2後半ということで一工夫いる問題たちをいくつか解いていきます。
この記事の対象者
- CTF超初心者
- cpawの問題を解いてみたい人
問題一覧
- Q19 [Misc] Image!
- Q20 [Crypto] Block Cipher
- Q21 [Reversing] reversing easy!
- Q28 [Network] Can you login?
Q19. [Misc] Image!
zipファイルからどうにかしてflagを得る問題
とりあえずmisc100.zipをダウンロードしたら、
解凍して中身を覗いてみましょう。
下記の見つけ方2の方は簡単ですが、恐らく問題の意図してる解き方ではないと思われる方法です。
flagの見つけ方1
minetype
というファイルを開くとapplication/vnd.oasis.opendocument.graphics
こう書いてあり、Open Document(ODF)形式で作成されたことがわかります。
Open Document:オフィスソフトで使われる、XMLベースのファイル形式
調べてみると、Open Document形式の拡張子は
ワープロ・プレゼン・表など9種類に分かれているらしく、
今回はワープロ形式での表示をしたいのでmisc100.zip
をmisc100.odt
に変換します。
これをWordで開いて、邪魔な黒い図形をどかしてやればflagが得られました!
flagの見つけ方2
解凍した際、Thumbnailsフォルダ
にthumbnail.png
という
いかにもflagが消された後のような画像があります。
zipフォルダであることや、minetype
から
何かしらのDocument作成ツールで作成されたと推測できるのではないでしょうか?
ということでフォルダ内のxmlファイルをあさってみましょう!
xmlファイルを読むと、content.xml
にlayoutやdrowといった
オブジェクトの描画関係の内容が書かれているようです。
xmlの上の方にあるgr2に関するスタイルと下記のスタイルから、
thumbnail.png
で隠されていたflagがIt_is_fun__isn't_it?
であると読み取れます!
<draw:frame draw:style-name="gr2" draw:text-style-name="P2" draw:layer="layout" svg:width="17.2cm" svg:height="2.3cm" svg:x="2cm" svg:y="19.3cm">
<draw:text-box>
<text:p text:style-name="P2">
<text:span text:style-name="T1">It_is_fun__isn't_it?</text:span>
</text:p>
</draw:text-box>
</draw:frame>
flag
cpaw{It_is_fun__isn't_it?}
Q22. [Crypto] Block Cipher
Cのソースコードを読んで実行する問題
付属のブロック暗号を解くプログラムを実行してflag(平文)を得ましょう!
ブロック暗号:平文を固定長サイズのブロックに分割し暗号処理を行う共通鍵暗号の方式
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]){
int i;
int j;
int key = atoi(argv[2]);
const char* flag = argv[1];
printf("cpaw{");
for(i = key - 1; i <= strlen(flag); i+=key) {
for(j = i; j>= i - key + 1; j--) {
printf("%c", flag[j]);
}
printf("}");
}
return 0;
}
flagの見つけ方
コードの説明は下記にコメントで記載してみました。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char* argv[]){
int i;
int j;
int key = atoi(argv[2]); // 2番目の引数を整数に変換
const char* flag = argv[1]; // 1番目の引数を文字列で取得
printf("cpaw{");
// keyまでiを増加
for(i = key - 1; i <= strlen(flag); i+=key) {
// iから i-key+1 まで逆順処理
for(j = i; j>= i - key + 1; j--) {
// flag[j]の文字1文字ずつ出力
printf("%c", flag[j]);
}
printf("}");
}
return 0;
}
今回実行する際、問題になるのがこのint main(int argc, char* argv[])
です。
これはコマンドライン引数というもので、実行の際に引数を与えてやる必要があります。
今回は1つ目が暗号文、2つ目が整数という2つの引数が必要のようです。
通常の実行コマンド:
gcc ファイル名.c -o 実行ファイル
今回の実行コマンド:gcc ファイル名.c -o 実行ファイル 暗号文 整数
これに則って下記のように実行すればflagが得られます。
gcc crypto100.c -o crypto100 ruoYced_ehpigniriks_i_llrg_stae 4
flag
cpaw{Your_deciphering_skill_is_great}
Q21. [Reversing] reversing easy!
バイナリファイルからflag見つける問題
WSL環境でコマンドを実行していきます。
ここでは中身を見ることで無理やり解いていますが、IDA Freeというツールを用いると綺麗にflagが得られるようです。
flagの見つけ方
file rev100
実行結果の一部
rev100: ELF 32-bit LSB executable, Intel 80386, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux.so.2, for GNU/Linux 2.6.24...
ここでELF 32-bit
のLinux環境で実行できることがわかります。
実行ファイルだからと言って./rev100
で実行してもflagの中身がなかったので、
ファイルの可読部分を表示させるstringsコマンド
を使用してみましょう。
strings rev100
/lib/ld-linux.so.2
libc.so.6
_IO_stdin_used
__stack_chk_fail
putchar
printf
__libc_start_main
__gmon_start__
GLIBC_2.4
GLIBC_2.0
PTRh
D$L1
D$Fcpawf
D$J{
D$ y
D$$a
D$(k
D$,i
D$0n
D$4i
D$8k
D$<u
D$@!
T$Le3
[^_]
;*2$"
GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4
GCC: (Ubuntu 4.8.2-19ubuntu1) 4.8.2
...
ここから見えるyakiniku!
がflagになっています。
flag
cpaw{yakiniku!}
Q28. [Network] Can you login?
パケットを読んでログインしてみる問題
実行するコマンドと解説
とりあえずたくさんのコマンドを順番に実行していきましょう。
- ftpコマンド:ftpサーバに接続準備
- open:ftpサーバに接続するためのポートを解放
- to:解放したいポートを入力
- Name (ポート番号:user):ログインしたいユーザ名
- Password:パスワード
- passive:Passiveモード起動
->Passiveモード:転送用のポート開いてサーバーに接続を要求- ls -la:ファイルの詳細情報と隠しファイルの表示
- get ファイル名:ftpサーバからファイルをDLします
- exit:ftp接続を終了
- cat ファイル名:ファイルの内容を出力
ユーザー名:cpaw_user
パスワード:5f4dcc3b5aa765d61d8327deb882cf99
実行結果のまとめは下記の画像のようになります。
user@Default ~ % ftp
ftp> open
(to) 118.27.110.77
Connected to 118.27.110.77.
220 Welcome to Cpaw CTF FTP servuser.
Name (118.27.110.77:user): cpaw_user
331 Please specify the password.
Password:
230 Login successful.
Remote system type is UNIX.
Using binary mode to transfer files.
ftp> passive
Passive mode: off; fallback to active mode: off.
ftp> passive
Passive mode: on; fallback to active mode: on.
ftp> ls -la
229 Entering Extended Passive Mode (|||60001|)
150 Here comes the directory listing.
drwxr-xr-x 2 ftp ftp 42 Mar 17 2021 .
drwxr-xr-x 2 ftp ftp 42 Mar 17 2021 ..
-rw-r--r-- 1 ftp ftp 39 Sep 01 2017 .hidden_flag_file
-rw-r--r-- 1 ftp ftp 36 Sep 01 2017 dummy
226 Directory send OK.
ftp> get .hidden_flag_file
local: .hidden_flag_file remote: .hidden_flag_file
229 Entering Extended Passive Mode (|||60029|)
150 Opening BINARY mode data connection for .hidden_flag_file (39 bytes).
100% |***********************************| 39 76.01 KiB/s 00:00 ETA
226 Transfer complete.
39 bytes received in 00:00 (2.31 KiB/s)
ftp> exit
221 Goodbye.
user@Default ~ % cat .hidden_flag_file
cpaw{f4p_sh0u1d_b3_us3d_in_3ncryp4i0n}
このcatで得られた出力がflagです!
flag
cpaw{f4p_sh0u1d_b3_us3d_in_3ncryp4i0n}
おわりに
第4回目はLevel2の後半戦について解説しました。
elfファイルやftpサーバ接続など、なかなか手間のかかる問題が多いですね。
第5回目以降も順次上げて行きたいと思います。