Chap4. cpaw Level2後編

## はじめに

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

https://ctf.cpaw.site/index.php


### この記事の対象者
- CTF超初心者
- cpawの問題を解いてみたい人

### 問題一覧

- [Q19 [Misc] Image!](#q19-misc-image)
- [Q20 [Crypto] Block Cipher](#q20-crypto-block-cipher)
- [Q21 [Reversing] reversing easy!](#q21-reversing-reversing-easy)
- [Q28 [Network] Can you login?](#q28-network-can-you-login)

***
### Q19. [Misc] Image!
__zipファイルからどうにかしてflagを得る問題__
とりあえずmisc100.zipをダウンロードしたら、
解凍して中身を覗いてみましょう。

下記の見つけ方2の方は簡単ですが、恐らく問題の意図してる解き方ではないと思われる方法です。

<details><summary>flagの見つけ方1</summary>
<div>

`minetype`というファイルを開くと`application/vnd.oasis.opendocument.graphics`
こう書いてあり、Open Document(ODF)形式で作成されたことがわかります。

Open Document：オフィスソフトで使われる、XMLベースのファイル形式

調べてみると、Open Document形式の拡張子は
ワープロ・プレゼン・表など9種類に分かれているらしく、
今回はワープロ形式での表示をしたいので`misc100.zip`を`misc100.odt`に変換します。
これをWordで開いて、邪魔な黒い図形をどかしてやればflagが得られました！

</div>
</details>

<details><summary>flagの見つけ方2</summary>
<div>

解凍した際、`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>
```

</div>
</details>

<details><summary>flag</summary>
<div>

```
cpaw{It_is_fun__isn't_it?}
```

</div>
</details>

***
### Q22. [Crypto] Block Cipher
__Cのソースコードを読んで実行する問題__
付属のブロック暗号を解くプログラムを実行してflag(平文)を得ましょう！
ブロック暗号：平文を固定長サイズのブロックに分割し暗号処理を行う共通鍵暗号の方式

```c: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;
}
```

<details><summary>flagの見つけ方</summary>
<div>

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

```c: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
```

</div>
</details>

<details>
  <summary>flag</summary>
  <div>
  
  ```
  cpaw{Your_deciphering_skill_is_great}
  ```
  
  </div>
</details>

***
### Q21. [Reversing] reversing easy!
__バイナリファイルからflag見つける問題__
WSL環境でコマンドを実行していきます。
ここでは中身を見ることで無理やり解いていますが、[IDA Free](https://hex-rays.com/ida-free)というツールを用いると綺麗にflagが得られるようです。

<details><summary>flagの見つけ方</summary>
<div>
まず、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になっています。

</div>
</details>

<details>
  <summary>flag</summary>
  <div>
  
  ```
  cpaw{yakiniku!}
  ```
  
  </div>
</details>

***
### Q28. [Network] Can you login?
__パケットを読んでログインしてみる問題__


<details><summary>実行するコマンドと解説</summary>
<div>

とりあえずたくさんのコマンドを順番に実行していきましょう。
> 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です！

</div>
</details>

<details><summary>flag</summary> 
<div>

```
cpaw{f4p_sh0u1d_b3_us3d_in_3ncryp4i0n}
```

</div>
</details>

***
## おわりに
第4回目はLevel2の後半戦について解説しました。
elfファイルやftpサーバ接続など、なかなか手間のかかる問題が多いですね。
第5回目以降も順次上げて行きたいと思います。