読者です 読者をやめる 読者になる 読者になる

ASIS CTF writeup RPS

総評として、ASIS CTFのバイナリは正直バイナリ問題としてクソだと思います。

BIN50はなかなか面白い問題でした。

しかし、BIN100(Serial) ~ 200についてはひどい。

これらは全てPasswordを演算にかけた結果を比較するタイプの問題でした。

DEFCON Qualsでは、Binary 4で同じような問題がありましたね。

しかし、これらはまともに読むことをせずに、手計算、あるいはScriptで解くことが可能(というかそっちのほうが確実に楽)で、100ptレベルなら許せますが、全てについてそれが言えるのは本当にクソだと思います(意図的なものかは別として)。

 

さて、RPSですが、これはstringsのみで解けます。

が、まあWriteupなのでちゃんと解説していこうかなと思います。

 

したこととしては、まずusleep, sleepによる出力のエフェクトがウザいので、切りました。

次に、stringsを見ると、明らかに答えっぽい文字列があったので、確証を得るためにどこでFLAGを表示するのか探しました。

探し始めにmainの処理を眺めて見ましたが、初めに文字列の代入、次にエフェクト付きの文字列の出力、そしてFLAGの判定と出力のルーチンがあって、その次にジャンケンのプログラムが呼ばれてるようでした。

FLAGの出力については、特にひねりもないですが、妨害要素が一点あるので、そこのみ気をつければ全く悩む必要はないです。

(gdb) r
Starting program: /home/poteti/Downloads/bin100_dice
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Imagine we live in a world that a Dice has 10 sides,
To make best use of this Dice,
we changed the popular game, Rock-Paper-Scissors.
Have you ever thought about simulating this game with a Dice? Mind the rules ;)
Remember that our Dice have 10 sides not 6!

Breakpoint 1, 0x0000000000402180 in ?? ()
(gdb) set $rip=0x402186
(gdb) set *(void**)(-0x174+$rbp)=0xa
(gdb) c
Continuing.
ASIS_e8a10c04d72b2f135dabe360c4bdd534[Inferior 1 (process 12113) exited normally]