picoCTF 2017 Level2 writeup 02
Cryptography
SoRandom
ホストとポート番号が与えられるのでncしてみる。
$ nc shell2017.picoctf.com 63997 Unguessably Randomized Flag: BNZQ:3o8b2bgl0689u4aj640407963277k0fc
SoRandom.pyが動いているらしくプログラムを見てみる。
#!/usr/bin/python -u import random,string flag = "FLAG:"+open("flag", "r").read()[:-1] encflag = "" random.seed("random") for c in flag: if c.islower(): #rotate number around alphabet a random amount encflag += chr((ord(c)-ord('a')+random.randrange(0,26))%26 + ord('a')) elif c.isupper(): encflag += chr((ord(c)-ord('A')+random.randrange(0,26))%26 + ord('A')) elif c.isdigit(): encflag += chr((ord(c)-ord('0')+random.randrange(0,10))%10 + ord('0')) else: encflag += c print "Unguessably Randomized Flag: "+encflag
flagの文字列を 一文字ずつ取り出して、randomを足しているだけっぽい。
# なんでord('a')をマイナスしてプラスしてるんだろう。。。
seedが同じであれば乱数は同じになるので復号用プログラムを作成。
といってもrandomを引くだけ!
#!/usr/bin/python -u import random,string flag = "BNZQ:3o8b2bgl0689u4aj640407963277k0fc" decrypt_flag = "" random.seed("random") for c in flag: if c.islower(): #rotate number around alphabet a random amount decrypt_flag += chr((ord(c)-ord('a')-random.randrange(0,26))%26 + ord('a')) elif c.isupper(): decrypt_flag += chr((ord(c)-ord('A')-random.randrange(0,26))%26 + ord('A')) elif c.isdigit(): decrypt_flag += chr((ord(c)-ord('0')-random.randrange(0,10))%10 + ord('0')) else: decrypt_flag += c print decrypt_flag
flagはFLAG:0d6f1cac5615c7ae971761318430c9bb
になりました。
LeakedHashes
なんかパスワードが漏れたけど大丈夫?みたいな問題
リストがダウンロードできるので見てみる。
root:be3f7de032d2e398ec542a7df71e0417 (省略) emiko:a28f30dd072b0aa66337f37526e7efa0 (省略)
saltを入れていないただのMD5 hashであれば解けるはず!
webツールを使ってやってみるとemikoのアカウントがMD5で復号できた!
# rootはだめだったので適当に選びました。
あとはそのパスワードでncするだけ!
emiko's password:pom@shell-web:~$ nc shell2017.picoctf.com 46881 enter username: emiko emiko's password:chumch0r3 welcome to shady file server. would you like to access the cat ascii art database? y/n y /\__/\ /` '\ === 0 0 === \ -- / - flag is 18e27fcac2c4b21329e0b118898794c0 / \ / \ | | \ || || / \_oo__oo_/#######o from http://user.xmission.com/~emailbox/ascii_cats.htm
flagは18e27fcac2c4b21329e0b118898794c0
でした。
Weird RSA
RSAのパラメータっぽいのが与えられる。
中国人剰余定理というものらしい。
解き方を調べて実装しました。
c=95272795986475189505518980251137003509292621140166383887854853863720692420204142448424074834657149326853553097626486371206617513769930277580823116437975487148956107509247564965652417450550680181691869432067892028368985007229633943149091684419834136214793476910417359537696632874045272326665036717324623992885 p=11387480584909854985125335848240384226653929942757756384489381242206157197986555243995335158328781970310603060671486688856263776452654268043936036556215243 q=12972222875218086547425818961477257915105515705982283726851833508079600460542479267972050216838604649742870515200462359007315431848784163790312424462439629 dp=8191957726161111880866028229950166742224147653136894248088678244548815086744810656765529876284622829884409590596114090872889522887052772791407131880103961 dq=3570695757580148093370242608506191464756425954703930236924583065811730548932270595568088372441809535917032142349986828862994856575730078580414026791444659 q_inv= 1/q % p m1 = pow(c,dp,p) m2 = pow(c,dq,q) h = (q_inv*(m1-m2)) % p m = m2 + h * q print format(m,'x').decode('hex')
flagはTheres_more_than_one_way_to_RSA
でした。
CryptographyのLevel2はこれで終わり! やはりpythonに慣れていない。。。本買うべきかな。