最初に
picoCTF 2023のReverse Engineeringの問題を解いていきます!
Writeup
解いていきます!!!
timer
- APKファイルが与えられるので、拡張子を「.zip」にして解凍
- 解凍したフォルダーで、
grep -rl "pico" ./ 2>/dev/null
をして、picoの文字列があるファイルを特定(classes3.dexでした) -
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
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、戦士)を配置し動作させ(=戦わせ)、最後まで動作し生き残ったものを勝者とする。プログラムは自分の分身を作る、他者のコードを上書き破壊するなどして戦う。
なるほど、他のプログラムは止めるけど、自分のプログラムは止まらないようにすれば、勝ちになるのか!
そして、そのプログラムはCore Wars独自のコードが使われるみたいです
ということは上記の問題は、imp.redに記載されているコードを動かし続けて、Warrier2のプログラムを停止した回数が、Warrior 1 wins:
なのか
そして、それを100回やったんだと思われますね
(上記の結果だと、100回引き分けています)
ただ、この問題は「負け続ける」ようにしないといけないので、end
だけ入力したら、フラグが手に入りました!
Ready Gladiator 1
Core Warsの「戦士」のモデルが以下のサイトに記載されていました
これの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ページに記載されていたので、いろいろ試してみました
しかし、うまくいかず、、、
いろいろ探していると、以下のWebページがありましたが、PicoCTF2023当時の質問みたいですね笑
記載されているJMP 0, <-5
を試したらうまくいきました!
Virtual Machine 0
Zipファイルには「.dae」のファイルが格納されている。
初めて見る拡張子ですが、COLLADAファイルという3Dデータのファイルのようです。
適当にWebで探した可視化できるサイトでとりあえず可視化してみます。
可視化したのですが、赤色しかない、、、
あと、ギアっぽいものもありますね
以下のWriteupを見てみると、右側が青い軸みたいなので、これを参考に続行します
ギア数を数えたところ、右側の軸(青)のギアが1回転で8、左側は40なので、左側の赤い軸を1回転させると、右側の青い軸は5回転します
つまり、赤軸を1回回転させれば、青軸が5回回転するので、input.txtの数値を5倍する必要があります
5倍した値は以下
198614235373674103788002620892906122161486462450519980432607127393331851645
上記のWriteupでは、これをHex Stringにするとありましたが、一度16進数に変換する必要がありますね(だいぶ悩んだ💦)
10進数の数値 → 16進数に変換 → HEX Stringに変換
でフラグが手に入ります!
No way out
Unityで作られたゲームを攻略する問題です。
少しゲームで遊びましたが、旗が立っているところにいけない、、、
以下のWriteupを見てみました。
コードを書き換えるのか、、、そんなことありなんだ、、、
Writeupの通りにやってみたら、うまくいきました!
リバースエンジニアリングで、コードを書き換えて実行する、ということもあるんですね、、、
dnSPyのトロイの木馬版があるみたい
以下のWebページに記載がありました。
このWebページの内容も正しいとは限らないですが、注意してください
Virtual Machine 0
上記のWritupを見てみましたが、ちょっと無理かな、、、、、
最後に
今回学んだことは以下です
- Core Warsというゲームがあること
- リバースエンジニアリングで、コードを書き換えることは多分初めて、、、