yoshikingのがんばる日記

あたまよくないけどがんばります

HSCTF 6 Writeup

 6月3~8日にHSCTFが開催されていたので、参加しました. といっても、存在に気付いたのが7日の昼だったので今回はyoshikingdomというチームで参加しました. zer0ptsのメンバーにregister情報投げると、案外みんな参加してくれました. その結果、

f:id:y05h1k1ng:20190608123849p:plain

でした. プロがぽんぽこ解いていって怖かったです. クソみたいな名前じゃなくて、結果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担当としているので、クビになる前に強くなります. チームメンバー、運営・参加された方々お疲れさまでした.