cookies.txt      .scr

ただのテキストファイルのようだ

ASIS CTF Quals 2017 writeup

wasamusumeで参加しました。
最近ずっとwriteup書いてなかったけど、書く気になったので書きます。

A fine OTP server

eが3と圧倒的に小さく、nに比べてplaintextがだいぶ小さいです。
それゆえに p**e mod n = p**eとなってしまうために、暗号文を普通に実数上で三乗根を求めるとFlagが得られてしまいます。

Secured OTP Server

plaintextが上のに比べて若干大きくなりました。しかしやっぱりまだ短いです。
それゆえに、plaintext**3 はたしかにnを超えるんだけれども、plaintext**2はnを超えません。
さらにtemplateが既知なので、templateの分の数値をt(これはtemplate stringを8文字分左シフトしたものであることに注意)とし、
flagの数値をfとすると、(t+f)**3 = ttt + 3ttf + 3tff + fffとなります。
第二項以降はn未満ですので、暗号文からtttを引いた数値をmod nしておいて、その数値のmod tをとればfffが得られます。あとはやるだけ。

DLP

(n+1)**flagとか、めっちゃ二項定理してほしそうです。mod n**sの効果で、適当に打ち切られますが、暗号文は
1 + flag * n + (flag C 2) * n**2 + ...
となります。
おわかりですね。
1引いてn**2でmodをとるだけです。

F-4 Phantom

素数pに対して、ちょっとrandom性をもたせたあとに、そのつぎの素数をqに採用します。
pのうち、選択されたbitがともに0だったと仮定すると、
N ≒ p(p + 2^k + 2^l)
と概算できます。
kは高々300程度であり、それを決定してからこれをpの二次方程式とみなせば、pの概算値がでます。
各kの仮定に対し、この概算値の周り10**4程度で試し割りをしてみて、割り切れたらやったねっていう。
これで確率的にn = pqに素因数分解できました。(うまくいかなかったら接続を切って新たな暗号文を貰いに行く)
あとはやるだけ、と思いきや、eが必ずp-1の約数になるように設定されているようでした。これだとeとΦ=(p-1)(q-1)が互いに素でないので、dが求まりません。
q-1の方はeと互いに素だったのでなんとかなります。
考えた結果、ふたつの素因数分解済みの暗号文をもらってきて、pの情報はすてて、得た2つのflag mod qから、中国人剰余定理でflag mod q1*q2 = flagを得ることにしました。

ed = 1 mod (q-1)なるdを求めて、
enc ** d
= flag ** (ed)
= flag ** (k(q-1) + 1)
= flag (mod q)
です。

Alice, Bob, and Rob

これは暗号なんでしょうか。
ksnctfのare you human?を解くのに比べたらなんてことないです。
公開鍵が線型符号の生成行列になっているので、この検査行列を気合で手で求めて、コセット分解だのシンドローム計算だのして誤り訂正してつなげるだけです。
PNGが得られます。

CRC

getsが2つもいます。
mainはcanaryがいないのでret addrが書き換えられるかと思いきや、こいつが抜けるのはexitが呼ばれた場合だけなのでだめです。
mainの中のgetsの方で、crcを求める対象のアドレスが積まれているスタックを書き換えられるので、任意の位置のcrcを読めます。
サイズは1って答えたらいいんじゃないでしょうか。
そうすると任意の位置の1byteのcrcが読めるので、もう1byteがleakできたも同然です。
うれしいことに、グローバル変数sizeはスタック上の固定位置を指してます。
そこを起点に、canaryをleakします。あとgetsのアドレスもGOTからleakします。
そしたらget_userinputのほうのgetsでバッファオーバーフローをして、canaryをあわせつつsystemを呼びます。

時間内に終わりませんでした。(そして今もローカルでうまく行っただけの段階)(libcとってくるのめんどくさい)