1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Chap4. cpaw Level2後編

Last updated at Posted at 2025-06-17

はじめに

CTF学習のため、cpawというサイトの問題を解いていく記事です。
今回はLevel2後半ということで一工夫いる問題たちをいくつか解いていきます。

この記事の対象者

  • CTF超初心者
  • cpawの問題を解いてみたい人

問題一覧


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.zipmisc100.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(平文)を得ましょう!
ブロック暗号:平文を固定長サイズのブロックに分割し暗号処理を行う共通鍵暗号の方式

crypto100.c
#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の見つけ方

コードの説明は下記にコメントで記載してみました。

crypto100.c
#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のファイルの種類を調べます。
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?

パケットを読んでログインしてみる問題

実行するコマンドと解説

とりあえずたくさんのコマンドを順番に実行していきましょう。

  1. ftpコマンド:ftpサーバに接続準備
  2. open:ftpサーバに接続するためのポートを解放
  3. to:解放したいポートを入力
  4. Name (ポート番号:user):ログインしたいユーザ名
  5. Password:パスワード
  6. passive:Passiveモード起動
    ->Passiveモード:転送用のポート開いてサーバーに接続を要求
  7. ls -la:ファイルの詳細情報と隠しファイルの表示
  8. get ファイル名:ftpサーバからファイルをDLします
  9. exit:ftp接続を終了
  10. 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回目以降も順次上げて行きたいと思います。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?