因為暑假沒有空參加 AIS3,今年抱持著玩玩的心態在打 pre exam。中間同時卡到 GCJ round 2 和 HP codewar 所以不是所有時間都在解題,不過也因為是抱持娛樂心態就將大部分時間都奉獻給了 Crypto,最後成功解出兩題解題人數偏少的題目,也算是頗有成就感。

以下是應 AIS3 要求寫的 Writeup,就順便放上來了xd

SC

簡單的凱薩加密,寫個 script 好好轉換即可得到 flag。搶到首殺><

AIS3{s0lving_sub5t1tuti0n_ciph3r_wi7h_kn0wn_p14int3xt_4ttack}

Fast Cipher

梗在於用了超級大的數字最後卻只需要 mod 256,因此只要枚舉 0-255 找到正確的起始 key 即可。再次搶到首殺><

AIS3{not_every_bits_are_used_lol}

gift in the dream

看到這題選擇直接上網搜尋 gif ctf,發現可能會跟時間間隔有關於是就利用以下指令拿到 gif 圖檔之間的時間間隔,最後將 ASCII 轉換為 char 就成功拿到 flag。

identify -format "%s %T \n" gift_in_the_dream.gif
AIS3{5T3gn0gR4pHy_c4N_b3_fUn_s0m37iMe}

SAAS Crash

其實隨意嘗試後就不小心拿到 flag 了xd 又仔細研究了一下後猜測應該是跟改變字串長度導致 RE 有關。

AIS3{congrats_on_crashing_my_editor!_but_can_you_get_shell_from_it?}

Poking Bear

首先要知道 secret bear 的 id,那當然是對所有 id 都發 post request 看看了。

知道 id 後點進去被告知自己是 human 而非 bear poker,繞了好大一圈最後發現是在 cookie 的地方自己被標示為 human,改成 bear poker 後就成功拿到 flag。

AIS3{y0u_P0l<3_7h3_Bear_H@rdLy><}

Time Management

因為 ./char 執行後都不會有反應,猜測是內部有呼叫 sleep() 函數,因此嘗試將它覆寫掉即可獲得 flag。

echo 'void sleep(int ms) {} ' > lib.c && gcc -shared lib.c -o lib.so && LD_PRELOAD='./lib.so' ./chal
AIS3{You_are_the_master_of_time_management!!!!!}

Really Strange orAcle

用各種平方數差的 gcd 去求出 p 應該算是老梗了,難點在於這題連 e 都不知道。推了好久的算式後(結果後來居然有提示…)發現可以用二項式展開的性質藉由詢問 pow(1 + p, e, n = p^2) 去求出 e。最後要注意的是這題的 n 是 p^2 而非 pq,因此 phi 會變成 p^2-p。

AIS3{math_go_brrrrr...}

pettan

本次 pre exam 花最多時間做也最有成就感的一題,一開始看到超短的加密方法就覺得躍躍欲試了,雖然最後還是用到了 hint 不過還是學到很多。

根據 Hint 猜測首先要破解的是 python 的 random 函數,利用上網查到的 MT19937Recover 函數,只要提供前 624 個隨機數字,即可預測接下來的隨機數字。

第一個問題是要怎麼從加密過後的結果得到原本的隨機數呢?方法是一直讓 m 為 0 然後再將得到的結果除以用 1 生成的 padding。接下來的問題是我們得到的隨機數字是 64 bits 但 MT19937Recover 只支援 32 bits 的數字,研究了 getrandbits 的實作方法後發現其實 64 bits 的數字是直接將兩個 32 bits 組合而成的,照著拆開即可。

到了這邊我們每次 pow(m + x, e, n) 的 x 就成為確定性的了,只要再多詢問兩次我們就可以藉由 Franklin-reiter 來還原出原本的 m,成功還原出 flag!

AIS3{bad_padding_and_bad_random_٩(ˊᗜˋ*)و}

shamiko

這是第一次做 Digital Signature Algorithm 相關的題目,因此一開始花了很多時間在研究加密的方法。

看了 hint 說 wikipedia 上面就有寫破解方法後重新讀了幾遍,猜測應該是要利用 k 會碰撞的性質,而 k 基本上是用 H(x) 生成的,也就是 sha1 函數!印象中這個 hash 函數並不是十分安全,果不其然就找到了 google 幾年前公布的兩份會讓 hash 值碰撞的 pdf。

因為 pdf 轉成 bytes 長度太長因此花了不少時間研究有沒有更小的碰撞字串,最後發現其實這兩份 pdf 只有一小段前綴有差!? 而取出那一小段前綴就能製造碰撞了,於是就利用相同的 k 搭配 wikipedia 上面提供的算法成功還原出 flag~

AIS3{kiki_kanri!!!_7242d925d0ca45f6ab63b02f388f2b38599f681d}