picoCTF 2023 Writeup : Reverse Engineering

# 最初に

picoCTF 2023のReverse Engineeringの問題を解いていきます！

全部で9問ですね
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/ecae38dd-44bb-43de-8565-fe1a25825c1d.png)


# Writeup

解いていきます！！！



## timer

1. APKファイルが与えられるので、拡張子を「.zip」にして解凍
1. 解凍したフォルダーで、`grep -rl "pico" ./ 2>/dev/null`をして、picoの文字列があるファイルを特定（classes3.dexでした）
1. `strings ./classes3.dex| grep pico`でフラグゲット






## Reverse


実行ファイルらしいものをダウンロードできたので、少し内容を見てみました


```

$ file ret           
ret: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib64/ld-linux-x86-64.so.2, BuildID[sha1]=64856d07d138e412faf30b9722d92f507e3b5c9c, for GNU/Linux 3.2.0, not stripped
```

```
$ checksec --file=ret
RELRO           STACK CANARY      NX            PIE             RPATH      RUNPATH      Symbols         FORTIFY Fortified       Fortifiable     FILE
Full RELRO      Canary found      NX enabled    PIE enabled     No RPATH   No RUNPATH   69 Symbols        No    0               1               ret
```


Ghidraで逆解析したら、一発でした
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/2bea54c8-f9c5-4db6-aeed-7e622b34f679.png)





## Safe Opener 2

strings でgrepしたら終わってしまいました。。。

```
$ strings SafeOpener.class| grep pico
,picoCTF{SAf3_0p3n3rr_y0u_solv3d_it_de45efd6}
```




## Ready Gladiator 0

以下のアセンブリコード（っぽいコード）だけが記載されたテキストファイルがダウンロードできます
```
;redcode
;name Imp Ex
;assert 1
mov 0, 1
end
```

アセンブリのコメントは`;`なので、実質は4行目だけですね、、（後から追記：アセンブリじゃないです笑）


4行目は、レジスタ`0`の値をレジスタ`1`に転送しています（後から追記：アセンブリじゃないです笑）


実際に環境で動かしてみると、以下のようになります

```
nc saturn.picoctf.net 52731 < imp.red
;redcode
;name Imp Ex
;assert 1
mov 0, 1
end
Submit your warrior: (enter 'end' when done)

Warrior1:
;redcode
;name Imp Ex
;assert 1
mov 0, 1
end

Rounds: 100
Warrior 1 wins: 0
Warrior 2 wins: 0
Ties: 100
Try again. Your warrior (warrior 1) must lose all rounds, no ties.
                                                                       
```


何をしているんだ。。。。となったので、CoreWarを少し調べてみました。


> 『コア戦争』（コアせんそう、英：Core War または Core Wars）はプログラミングゲームのひとつである。専用に設計された仮想機械中で、互いに干渉しうるプログラム同士が戦うというもので、敵対するプログラムを終了させ、自分は生き残ってマシンを占領するのがゲームの目的である。

> 初期化し無内容としたコアの上に複数のRedcodeプログラム（Warrior、戦士）を配置し動作させ（=戦わせ）、最後まで動作し生き残ったものを勝者とする。プログラムは自分の分身を作る、他者のコードを上書き破壊するなどして戦う。

https://ja.wikipedia.org/wiki/%E3%82%B3%E3%82%A2%E6%88%A6%E4%BA%89


なるほど、他のプログラムは止めるけど、自分のプログラムは止まらないようにすれば、勝ちになるのか！
そして、そのプログラムはCore Wars独自のコードが使われるみたいです


ということは上記の問題は、imp.redに記載されているコードを動かし続けて、Warrier2のプログラムを停止した回数が、`Warrior 1 wins:`なのか

そして、それを100回やったんだと思われますね
（上記の結果だと、100回引き分けています）

ただ、この問題は「負け続ける」ようにしないといけないので、`end`だけ入力したら、フラグが手に入りました！



## Ready Gladiator 1


Core Warsの「戦士」のモデルが以下のサイトに記載されていました

https://vyznev.net/corewar/guide.html#start_dwarf


これのDarfを使えば、何度か勝利できました！
（ただし、仕組はそこまで理解できていない、、、）

```
nc saturn.picoctf.net 49538 < Dwarf
ADD #4, 3        ; execution begins here
MOV 2, @2
JMP -2
DAT #0, #0
end
Submit your warrior: (enter 'end' when done)

Warrior1:
ADD #4, 3        ; execution begins here
MOV 2, @2
JMP -2
DAT #0, #0
end

Warning:
        Missing ';assert'. Warrior may not work with the current setting
Number of warnings: 1

Rounds: 100
Warrior 1 wins: 25
Warrior 2 wins: 0
Ties: 75
You did it!
picoCTF{1mp_1n_7h3_cr055h41r5_ec57a42e}
```


## Ready Gladiator 2

こんどは全勝を目指さないといけないみたいですね。。。


Imp対策がされているWarriorが以下のWebページに記載されていたので、いろいろ試してみました


https://corewar.co.uk/strategy.htm?form=MG0AV3



しかし、うまくいかず、、、


いろいろ探していると、以下のWebページがありましたが、PicoCTF2023当時の質問みたいですね笑

https://www.reddit.com/r/programminggames/comments/11vaxk8/beat_classic_imp_100_of_the_time_in_corewars/?form=MG0AV3&rdt=40995

記載されている`JMP 0, <-5`を試したらうまくいきました！






## Virtual Machine 0

Zipファイルには「.dae」のファイルが格納されている。
初めて見る拡張子ですが、COLLADAファイルという3Dデータのファイルのようです。

https://www.adobe.com/jp/creativecloud/file-types/image/vector/collada-file.html


適当にWebで探した可視化できるサイトでとりあえず可視化してみます。

https://imagetostl.com/jp/view-dae-online


可視化したのですが、赤色しかない、、、
あと、ギアっぽいものもありますね

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2152468/77a7d02f-124e-412e-a41d-84044ab9e40e.png)


以下のWriteupを見てみると、右側が青い軸みたいなので、これを参考に続行します

https://www.ta-oot.page/posts/ctf-writeups/picoctf2023/virtualmachine0/


ギア数を数えたところ、右側の軸（青）のギアが1回転で８、左側は40なので、左側の赤い軸を1回転させると、右側の青い軸は5回転します

つまり、赤軸を1回回転させれば、青軸が5回回転するので、input.txtの数値を5倍する必要があります

5倍した値は以下
```
198614235373674103788002620892906122161486462450519980432607127393331851645
```

上記のWriteupでは、これをHex Stringにするとありましたが、一度16進数に変換する必要がありますね（だいぶ悩んだ💦）


10進数の数値　→　16進数に変換　→　HEX Stringに変換
でフラグが手に入ります！


## No way out

Unityで作られたゲームを攻略する問題です。

少しゲームで遊びましたが、旗が立っているところにいけない、、、


以下のWriteupを見てみました。
コードを書き換えるのか、、、そんなことありなんだ、、、

https://daisuke20240310.hatenablog.com/entry/picoctf2023re#No-way-out200%E3%83%9D%E3%82%A4%E3%83%B3%E3%83%88


Writeupの通りにやってみたら、うまくいきました！

リバースエンジニアリングで、コードを書き換えて実行する、ということもあるんですね、、、



### dnSPyのトロイの木馬版があるみたい

以下のWebページに記載がありました。
このWebページの内容も正しいとは限らないですが、注意してください

https://constella-sec.jp/blog/hobokomo-securitynews/tips-227/


## Virtual Machine 0

上記のWritupを見てみましたが、ちょっと無理かな、、、、、




# 最後に


今回学んだことは以下です
- Core Warsというゲームがあること
- リバースエンジニアリングで、コードを書き換えることは多分初めて、、、