HSCTF 6 Writeup
6月3~8日にHSCTFが開催されていたので、参加しました.
といっても、存在に気付いたのが7日の昼だったので今回はyoshikingdom
というチームで参加しました.
zer0pts
のメンバーにregister情報投げると、案外みんな参加してくれました.
その結果、
でした.
プロがぽんぽこ解いていって怖かったです.
クソみたいな名前じゃなくて、結果zer0pts
でもよかったなと思います.
登録した張本人はというと、easyなCryptoを2問解いて、寝てました(午後授業フル+バイトだったから許して☆). その2問のWriteupを書いていこうと思います.
チームメンバーのWriteup
theoldmoon0602: HSCTF 6 writeup - ふるつき
ptr-yudai: HSCTF 6 Writeup - CTFするぞ
st98: HSCTF 6 の write-up - st98 の日記帳
[Crypto 130pts] Reverse Search Algorithm
n, e, cが渡されます.
n = 561985565696052620466091856149686893774419565625295691069663316673425409620917583731032457879432617979438142137 e = 65537 c = 328055279212128616898203809983039708787490384650725890748576927208883055381430000756624369636820903704775835777
nが大きくないので、素因数分解してみると、
n = 29 * 19378812610208711050554891591368513578428260883630885898953907471497427917962675301070084754463193723428901453
でした. あとは、やるだけです.
Python 3.5.2 (default, Nov 12 2018, 13:43:14) [GCC 5.4.0 20160609] on linux Type "help", "copyright", "credits" or "license" for more information. >>> from binascii import unhexlify >>> from Crypto.Util.number import inverse >>> p = 29 >>> q = 19378812610208711050554891591368513578428260883630885898953907471497427917962675301070084754463193723428901453 >>> e = 0x10001 >>> n = 561985565696052620466091856149686893774419565625295691069663316673425409620917583731032457879432617979438142137 >>> n == p*q True >>> c = 328055279212128616898203809983039708787490384650725890748576927208883055381430000756624369636820903704775835777 >>> d = inverse(e, (p-1)*(q-1)) >>> m = pow(c, d, n) >>> unhexlify(hex(m)[2:]) b'hsctf{y3s_rsa_1s_s0lved_10823704961253}'
hsctf{y3s_rsa_1s_s0lved_10823704961253}
[Crypto 190pts] Super Secure System
メッセージを投げると、暗号化されたメッセージが返ってくるシステムです.
$ nc crypto.hsctf.com 8111 * * * SUPER SECURE SYSTEM * * * My encryption system is impossible to crack if used once! You can use this system to encrypt any of your messages with my super special key!!! Here is my super secret message: 20235d3e4e162a732e35177c22044e013179111e42530b3b124f31490b753f5c6c7b47347a5f5a112e74772b2c0a776f6c1b680630 Enter the message you want to encrypt: aaa Encrypted: 29315f Enter the message you want to encrypt: bbb Encrypted: 2a325c Enter the message you want to encrypt: a Encrypted: 29
ちなみに、暗号化は何回でもできます. xorぽいので確認すると、
>>> ord('a')^0x29 72 >>> ord('b')^0x2a 72
あたりです.また、2文字目、3文字目は別の数字でxorされていることがわかります. 方針としては、フラグの長さ分aを送り、返ってきた値とaでxorを取り復号していきます.
from ptrlib import * sock = Socket("crypto.hsctf.com", 8111) sock.recvuntil("Here is my super secret message: ") c = int(sock.recvline().strip(), 16) flag_len = len(hex(c)[2:]) // 2 sock.recvuntil("Enter the message you want to encrypt: ") sock.sendline(b"a"*flag_len) sock.recvuntil("Encrypted: ") recv = int(sock.recvline().strip(), 16) flag = "" for i in range(0, len(hex(c)[2:]) - 1, 2): a = ord('a') ^ int(hex(recv)[2:][i:i+2], 16) flag += chr(a ^ int(hex(c)[2:][i:i+2], 16)) print(flag)
hsctf{h0w_d3d_y3u_de3cryP4_th3_s1p3R_s3cuR3_m355a9e?}
初めxorに気付けなかった...
終わりに
全然仕事してないじゃん!一応Crypto担当としているので、クビになる前に強くなります. チームメンバー、運営・参加された方々お疲れさまでした.