きゅうり。

主にCTF関係のことを書いていく気がします

Pragyan CTF 2018 writeup

ソロ参戦。

900ptで137位。

(去年は参加してないけど噂は聞いていたので、まぁ、という感じ)

f:id:Kyuri:20180304174631p:plain

あとbinaryを1問解けばm1z0r3を抜かせたので精進👊🏼👊🏼👊🏼

 

解いたのは以下の問題

・[reverse] Assemble your way to the flag (50pts)

・[forensics] Quick Response (100pts)

・[stego] Scientist's research (150pts)

・[binary] Old School hack (200pts)

・[crypto] Quite an EC task (200pts)

・[crypto] Rivest, Shamir and Aldeman's quest (200pts)

 [reverse] Assemble your way to the flag (50pts)

渡されたファイルを適当に動かしてると、スタックにフラグを積んでることがわかるので見る。

f:id:Kyuri:20180304175419p:plain

pctf{l3g3Nds_c0d3_1n_4Ss3mb1y}

 

[forensics] Quick Response (100pts)

QRコードが渡される。

位置検出の黒い四角が小さいように見えるので適当に塗ってやるとフラグが読み取れる。

ペイントの技術が求められる。

f:id:Kyuri:20180304175938p:plain

pctf{r3p4ir1nG~Qr_1s-my_h0bBy}

 

[stego] Scientist's research (150pts)

xlsファイルが渡される。

見ると数字がいっぱい書いてある。

エクセルでお絵かきをしているような気がしてくるので、倍率を変えてみる。

f:id:Kyuri:20180304180413p:plain

見えた。

pctf{ord3r_out_of=ch4os+this_world}

 

[binary] Old School hack (200pts)

IDAで見るとおおよそ次のような動きをすることがわかる。(文法が適当なのは許して)

void print_record(name){
  if(strlen(name)==36){
    // ファイルの中身を表示
  }
}

int main(){
  scanf(%s,&input);
  if(strncmp(input,"kaiokenx20")){
    sacnf(%d,&num);
    switch(num){
      case [1-6]:
        name = [application_name];
      case 7:
        name = "flag.txt";
        printf("権限ないよ");
        exit(1);
    }
    print_record(name);
  }
  return 0;
}

ここで、1回目のscanfにBOFが存在する。

名前の比較はstrncmpなので、kaiokenx20で初まっていれば後はなんでもよい。

次の数値入力で、1~6を入力するとオーバーフローした部分が上書きされる。

print_recordにflag.txtを渡せばいいことは自明なので、nameにあたる部分がflag.txtになるようにオーバーフローしつつ、switch文は8とかを入力することで上書きされずにスルーする。

ただし、print_recordはファイル名が36文字であることをチェックしている。

flag.txt だけでは8文字しかない。

そこで以下のように入力することでどうにかする。

kaiokenx20AAAAAA././././././././././././././flag.txt

pctf{bUff3r-0v3Rfl0wS`4r3.alw4ys-4_cl4SsiC}

まさに20倍界王拳である。

 

[crypto] Quite an EC task (200pts)

楕円曲線の離散対数問題。

なのだが、与えられたパラメータでググるとpico CTF 2017の問題のほぼパクりであることがわかる。(答えとなる乗数が変わっただけ)

ググって出てきたソルバを一行書き換えると終わり。

おそらく、Pohlig Hellman をやるだけ。まともに読んでないから知らんけど。

152977126447386808276536247114

これはひどい

 

[crypto] Rivest, Shamir and Aldeman's quest (200pts)

RSAの暗号文を渡すと復号してくれるらしいサービス。

(一部値はうまく復号されない)

ただし、フラグの暗号文は復号してくれない。

そこで、準同型暗号の性質を用いる。

2の暗号文とフラグの暗号文の積を復号してもらい、その結果に2の逆数をかければフラグが求まる。

encrypt \equiv flag^{e} \pmod{N}

enc_2 \equiv 2^e \pmod{N}

dec_{flag2} \equiv decrypt(encrypt*enc_2\pmod{N})

flag \equiv dec_{flag2} * modinverse(2,N) \pmod{N}

トルエンディアンというヒントが追加されるまでよくわからなかった。

pctf{13xtb0Ok^Rs4+is`vUln3r4b1e,p4D~i1}

 

残り取り組んでいたもの

・[binary] Unbreakble encryption (300pts):fsbでどうにかしてdecryptに暗号文を渡そうとしてできずに時間切れ

・[crypto] Xmen OR the avengers (100pts):フラグの復号、何を鍵でどうやればいいか(英語が)わからず点数も低いので途中から放置

・[web] Unfinished business (100pts):見た。触った。わからん。

・[web] Authenticated your way to admin (100pts):パスワードリスト攻撃かな、と思って適当に書いて1晩回してたけど当たらなかったのでやめた。

binaryは完全に頭が足りてないのでまだまだ。