進行中の何か

主にIT系の調べたこと。やったことをまとめます。

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に慣れていない。。。本買うべきかな。