Crypto训练(二)

密码学相关ctf题目

Posted by gxkyrftx on May 27, 2019

0.前言

1.强网先锋-辅助

题目给出了一个python文件,如下:

#flag=open("flag","rb").read()//读flag
from Crypto.Util.number import getPrime,bytes_to_long
p=getPrime(1024)
#第一次产生p
q=getPrime(1024)
#产生q
e=65537
n=p*q
#第一次计算n对flag加密
m=bytes_to_long(flag)
c=pow(m,e,n)
print c,e,n

p=getPrime(1024)
#第二次产生p
e=65537
n=p*q
#第二次计算n对"1"*32加密
m=bytes_to_long("1"*32)
c=pow(m,e,n)
print c,e,n
#2482083893746618248544426737023750400124543452082436334398504986023501710639402060949106693279462896968839029712099336235976221571564642900240827774719199533124053953157919850838214021934907480633441577316263853011232518392904983028052155862154264401108124968404098823946691811798952747194237290581323868666637357604693015079007555594974245559555518819140844020498487432684946922741232053249894575417796067090655122702306134848220257943297645461477488086804856018323986796999103385565540496534422406390355987976815450744535949785073009043007159496929187184338592859040917546122343981520508220332785862546608841127597 65537 14967030059975114950295399874185047053736587880127990542035765201425779342430662517765063258784685868107066789475747180244711352646469776732938544641583842313791872986357504462184924075227433498631423289187988351475666785190854210389587594975456064984611990461126684301086241532915267311675164190213474245311019623654865937851653532870965423474555348239858021551589650169602439423841160698793338115204238140085738680883313433574060243600028500600824624358473403059597593891412179399165813622512901263380299561019624741488779367019389775786547292065352885007224239581776975892385364446446185642939137287519945974807727
#3829060039572042737496679186881067950328956133163629908872348108160129550437697677150599483923925798224328175594483217938833520220087230303470138525970468915511111320396185482564783975435346354440035776909781158407636044986403819840648379609630039348895415045723208843631191252142600667607807479954194447237061080618370787672720344741413537975922184859333432197766580150534457001196765621678659952108010596273244230812327182786329760844037149719587269632133595149294067490955644893402708720284179715002149224068928828656515326446881791228638008572889331511945042911372915003805505412099102954073299010951896955362470 65537 14624662628725820618622370803948630854094687814338334827462870357582795291844925274690253604919535785934208081825425541536057550227048399837243392490762167733083030368221240764693694321150104306044125934201699430146970466657410999261630825931178731857267599750324918610790098952520113593130245010530961350592735239454337631927669542026935873535964487595433984902529960726655481696404006628917922241666148082741874033756970724357470539589848548704573091633917869387239324447730587545472564561496724882799495186768858324490838169123077051890332313671220385830444331578674338014080959653201802476516237464651809255679979

解题思路如下:

首先判断是RSA加密系统,两次的n具有相同的素因子,根据根据欧几里得除法,可以计算出两个n的共同素因子,即为q,再根据两次的n计算两次的p.根据欧几里得除法计算参数,欧几里得除法代码:

def gcd(a, b):
   if a < b:
     a, b = b, a
   while b != 0:
     temp = a % b
     a = b
     b = temp
   return a

计算结果如下:

output:

q=161993393900030566867150602363721535479433489542726899362944130872107225598993516228193877689420023695231584876954537089973673478074348422697619820309397363583748523503035462772765277978491082324620122838540365168604124924805412323471486221429513024367107238770298040268787441768635257727315317704741778501737

c1=2482083893746618248544426737023750400124543452082436334398504986023501710639402060949106693279462896968839029712099336235976221571564642900240827774719199533124053953157919850838214021934907480633441577316263853011232518392904983028052155862154264401108124968404098823946691811798952747194237290581323868666637357604693015079007555594974245559555518819140844020498487432684946922741232053249894575417796067090655122702306134848220257943297645461477488086804856018323986796999103385565540496534422406390355987976815450744535949785073009043007159496929187184338592859040917546122343981520508220332785862546608841127597 

e=65537 

n1=14967030059975114950295399874185047053736587880127990542035765201425779342430662517765063258784685868107066789475747180244711352646469776732938544641583842313791872986357504462184924075227433498631423289187988351475666785190854210389587594975456064984611990461126684301086241532915267311675164190213474245311019623654865937851653532870965423474555348239858021551589650169602439423841160698793338115204238140085738680883313433574060243600028500600824624358473403059597593891412179399165813622512901263380299561019624741488779367019389775786547292065352885007224239581776975892385364446446185642939137287519945974807727

p1=92392842076088454558676873885205432277688794102622657192126179753576488966439636785821047115301443362169549898465575056742381428321997570097374526363913597739756884031644135343404225885226264566916462715686341654211514913366341960827374747754358972050549971216117165750261475461979495685882564817634194301271

c2=3829060039572042737496679186881067950328956133163629908872348108160129550437697677150599483923925798224328175594483217938833520220087230303470138525970468915511111320396185482564783975435346354440035776909781158407636044986403819840648379609630039348895415045723208843631191252142600667607807479954194447237061080618370787672720344741413537975922184859333432197766580150534457001196765621678659952108010596273244230812327182786329760844037149719587269632133595149294067490955644893402708720284179715002149224068928828656515326446881791228638008572889331511945042911372915003805505412099102954073299010951896955362470 

e=65537 

n2=14624662628725820618622370803948630854094687814338334827462870357582795291844925274690253604919535785934208081825425541536057550227048399837243392490762167733083030368221240764693694321150104306044125934201699430146970466657410999261630825931178731857267599750324918610790098952520113593130245010530961350592735239454337631927669542026935873535964487595433984902529960726655481696404006628917922241666148082741874033756970724357470539589848548704573091633917869387239324447730587545472564561496724882799495186768858324490838169123077051890332313671220385830444331578674338014080959653201802476516237464651809255679979

p2= 90279376687119715076904357810855212347782022402759254635072438787841245581930716927541800564582197695494423401147385731042364986596482750220701857807271816829238846312998439918616452075752787878425283820635199121653984306111110530896331011530772771558835563313746863033189248831495407320154948117671577602867 然后计算私钥d,然后解出flag,解题代码如下: ~~~python from Crypto.Util.number import * import Crypto.PublicKey.RSA as RSA p=92392842076088454558676873885205432277688794102622657192126179753576488966439636785821047115301443362169549898465575056742381428321997570097374526363913597739756884031644135343404225885226264566916462715686341654211514913366341960827374747754358972050549971216117165750261475461979495685882564817634194301271 q1=161993393900030566867150602363721535479433489542726899362944130872107225598993516228193877689420023695231584876954537089973673478074348422697619820309397363583748523503035462772765277978491082324620122838540365168604124924805412323471486221429513024367107238770298040268787441768635257727315317704741778501737 e=65537 d = inverse(e, (p-1)*(q1-1)) c=2482083893746618248544426737023750400124543452082436334398504986023501710639402060949106693279462896968839029712099336235976221571564642900240827774719199533124053953157919850838214021934907480633441577316263853011232518392904983028052155862154264401108124968404098823946691811798952747194237290581323868666637357604693015079007555594974245559555518819140844020498487432684946922741232053249894575417796067090655122702306134848220257943297645461477488086804856018323986796999103385565540496534422406390355987976815450744535949785073009043007159496929187184338592859040917546122343981520508220332785862546608841127597 m=pow(c,d,p*q1) m=long_to_bytes(m) print m ~~~ # 2.Easy_Crypto 题目给出了enc.txt和附件.txt两个文件,内容分别如下:

enc.txt
caee 8630 48c4 ec56 3d22 2abc 9a95 7023
3976 3bee 0929 2b01 5400 875e 3723 3e79
8b7b a920 78

附件.txt:
get buf unsign s[256]

get buf t[256]

we have key:hello world

we have flag:????????????????????????????????


for i:0 to 256

set s[i]:i

for i:0 to 256
    set t[i]:key[(i)mod(key.lenth)]

for i:0 to 256
    set j:(j+s[i]+t[i])mod(256)
        swap:s[i],s[j]

for m:0 to 37
    set i:(i + 1)mod(256)
    set j:(j + S[i])mod(256)
    swap:s[i],s[j]
    set x:(s[i] + (s[j]mod(256))mod(256))
    set flag[m]:flag[m]^s[x]

fprint flagx to file 这是一个rc4算法,可以通过伪代码编写python脚本,需要注意的是每次变量的取值需要初始化,解密脚本如下:
#-*- coding:utf-8 -*-
s=[]
t=[]
i=j=0
key='hello world'
flag=''
f = open('C:\\Users\\dell\\Desktop\\ctf\\adworld\\crypto\\enc1\\enc\\enc.txt','r')
c = f.read()
for i in range(0,256):
    s.append(i)

for i in range(0,256):
    t.append(ord(key[(i)%(len(key))]))
# print t
for i in range(0,256):
    j=(j+s[i]+t[i])%(256)
    s[i],s[j]=s[j],s[i]
i=j=0
for r in c:
    i = (i + 1)  % 256
    j = (j + s[i])  % 256
    s[i], s[j] = s[j], s[i]
    x = (s[i] + (s[j] % 256)) % 256
    flag += chr(ord(r) ^ s[x])
print flag

3.Decode_The_File

题目是一个base64编码后的文件,解码后发现是一个3DES的文件,于github上的一致,运行也没有问题。

后百度的到结果,可能为base64隐写,base64隐写的原理如下:

3.1 base64编码

将3个字符编码为base64的4个字符

1.字符对应ASCII转换成八位二进制

2.base64的基础单位是3*8bit的二进制,若是不够3*8bit则在后面添加0字节(padding)直至满足

3.3*8bit的二进制转换成4*6bit的二进制,然后将4*6bit的二进制转换成十进制,对照base64表把十进制转换成字符

3.2 base64解码

1.检查base64编码后面有几个等于号

2.把字符串按照base64表转换成4*6的倍数位数二进制

3.删除等于号的个数*8的bit(base64隐写的关键)

4.按照6个bit一组转成字符

3.3 隐写原理

如下图所示:

avatar

我们就可以在加粗的0的位子用二进制隐写。这样子做,既不影响原文的还原,又不影响padding的删除,唯一的区别就是,上图的QQ==中第二个Q会变化,QkM=的M会变化,所以base64可以用于隐写。

解密隐写的脚本如下:

#-*- coding:utf-8 -*-
def get_base64_diff_value(s1, s2):
  base64chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'
  res = 0
  for i in xrange(len(s2)):
    if s1[i] != s2[i]:
      return abs(base64chars.index(s1[i]) - base64chars.index(s2[i]))
  return res

def solve_stego():
  with open('C:\\Users\\dell\\Desktop\\ctf\\adworld\\crypto\\cip_d0283b2c5b4b87423e350f8640a0001e', 'rb') as f:
    file_lines = f.readlines()
    bin_str = ''
    for line in file_lines:
      steg_line = line.replace('\n', '')
      norm_line = line.replace('\n', '').decode('base64').encode('base64').replace('\n', '')
      diff = get_base64_diff_value(steg_line, norm_line)
      pads_num = steg_line.count('=')
      if diff:
        bin_str += bin(diff)[2:].zfill(pads_num * 2)
      else:
        bin_str += '0' * pads_num * 2
      res_str = ''
      for i in xrange(0, len(bin_str), 8):
        res_str += chr(int(bin_str[i:i+8], 2))
    print res_str
solve_stego() 

4.Handicraft_RSA

首先下载文件,winhex打开,发现是7z头,直接改后缀名为.7z,然后解压,发现是文件夹,里面有一个Handicraft_RSA文件,使用winhex打开, 可以在里面看到里面有一个python脚本,有公钥信息,加密后密文信息

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000800   23 21 2F 75 73 72 2F 62  69 6E 2F 70 79 74 68 6F   #!/usr/bin/pytho
00000810   6E 0A 0A 66 72 6F 6D 20  43 72 79 70 74 6F 2E 55   n  from Crypto.U
00000820   74 69 6C 2E 6E 75 6D 62  65 72 20 69 6D 70 6F 72   til.number impor
00000830   74 20 2A 0A 66 72 6F 6D  20 43 72 79 70 74 6F 2E   t * from Crypto.
00000840   50 75 62 6C 69 63 4B 65  79 20 69 6D 70 6F 72 74   PublicKey import
00000850   20 52 53 41 0A 66 72 6F  6D 20 73 65 63 72 65 74    RSA from secret
00000860   20 69 6D 70 6F 72 74 20  73 2C 20 46 4C 41 47 0A    import s, FLAG 
00000870   0A 64 65 66 20 67 65 6E  5F 70 72 69 6D 65 28 73    def gen_prime(s
00000880   29 3A 0A 20 20 20 20 77  68 69 6C 65 20 54 72 75   ):     while Tru
00000890   65 3A 0A 20 20 20 20 20  20 20 20 72 20 3D 20 67   e:         r = g
000008A0   65 74 50 72 69 6D 65 28  73 29 0A 20 20 20 20 20   etPrime(s)      
000008B0   20 20 20 52 20 3D 20 5B  72 5D 0A 20 20 20 20 20      R = [r]      
000008C0   20 20 20 74 20 3D 20 69  6E 74 28 35 20 2A 20 73      t = int(5 * s
000008D0   20 2F 20 32 29 20 2B 20  31 0A 20 20 20 20 20 20    / 2) + 1       
000008E0   20 20 66 6F 72 20 69 20  69 6E 20 72 61 6E 67 65     for i in range
000008F0   28 30 2C 20 74 29 3A 0A  20 20 20 20 20 20 20 20   (0, t):         
00000900   20 20 20 20 52 2E 61 70  70 65 6E 64 28 72 20 2B       R.append(r +
00000910   20 67 65 74 52 61 6E 64  6F 6D 52 61 6E 67 65 28    getRandomRange(
00000920   30 2C 20 34 20 2A 20 73  20 2A 2A 20 32 29 29 0A   0, 4 * s ** 2)) 
00000930   20 20 20 20 20 20 20 20  70 20 3D 20 72 65 64 75           p = redu
00000940   63 65 28 6C 61 6D 62 64  61 20 61 2C 20 62 3A 20   ce(lambda a, b: 
00000950   61 20 2A 20 62 2C 20 52  2C 20 32 29 20 2B 20 31   a * b, R, 2) + 1
00000960   0A 20 20 20 20 20 20 20  20 69 66 20 69 73 50 72            if isPr
00000970   69 6D 65 28 70 29 3A 0A  20 20 20 20 20 20 20 20   ime(p):         
00000980   20 20 20 20 69 66 20 6C  65 6E 28 62 69 6E 28 70       if len(bin(p
00000990   29 5B 32 3A 5D 29 20 3D  3D 20 31 30 32 34 3A 0A   )[2:]) == 1024: 
000009A0   20 20 20 20 20 20 20 20  20 20 20 20 20 20 20 20                   
000009B0   72 65 74 75 72 6E 20 70  0A 0A 77 68 69 6C 65 20   return p  while 
000009C0   54 72 75 65 3A 0A 20 20  20 20 70 20 3D 20 67 65   True:     p = ge
000009D0   6E 5F 70 72 69 6D 65 28  73 29 0A 20 20 20 20 71   n_prime(s)     q
000009E0   20 3D 20 67 65 6E 5F 70  72 69 6D 65 28 73 29 0A    = gen_prime(s) 
000009F0   20 20 20 20 6E 20 3D 20  70 20 2A 20 71 0A 20 20       n = p * q   
00000A00   20 20 65 20 3D 20 36 35  35 33 37 0A 20 20 20 20     e = 65537     
00000A10   64 20 3D 20 69 6E 76 65  72 73 65 28 65 2C 20 28   d = inverse(e, (
00000A20   70 2D 31 29 2A 28 71 2D  31 29 29 0A 20 20 20 20   p-1)*(q-1))     
00000A30   69 66 20 6C 65 6E 28 62  69 6E 28 6E 29 5B 32 3A   if len(bin(n)[2:
00000A40   5D 29 20 3D 3D 20 32 30  34 38 3A 0A 20 20 20 20   ]) == 2048:     
00000A50   20 20 20 20 62 72 65 61  6B 0A 0A 6D 73 67 20 3D       break  msg =
00000A60   20 46 4C 41 47 0A 6B 65  79 20 3D 20 52 53 41 2E    FLAG key = RSA.
00000A70   63 6F 6E 73 74 72 75 63  74 28 28 6C 6F 6E 67 28   construct((long(
00000A80   6E 29 2C 20 6C 6F 6E 67  28 65 29 2C 20 6C 6F 6E   n), long(e), lon
00000A90   67 28 64 29 2C 20 6C 6F  6E 67 28 70 29 2C 20 6C   g(d), long(p), l
00000AA0   6F 6E 67 28 70 29 29 29  0A 66 6F 72 20 5F 20 69   ong(p))) for _ i
00000AB0   6E 20 78 72 61 6E 67 65  28 73 29 3A 0A 20 20 20   n xrange(s):    
00000AC0   20 65 6E 63 20 3D 20 6B  65 79 2E 65 6E 63 72 79    enc = key.encry
00000AD0   70 74 28 6D 73 67 2C 20  30 29 5B 30 5D 0A 20 20   pt(msg, 0)[0]   
00000AE0   20 20 6D 73 67 20 3D 20  65 6E 63 0A 0A 70 72 69     msg = enc  pri
00000AF0   6E 74 20 6B 65 79 2E 70  75 62 6C 69 63 6B 65 79   nt key.publickey
00000B00   28 29 2E 65 78 70 6F 72  74 4B 65 79 28 29 0A 70   ().exportKey() p
00000B10   72 69 6E 74 20 27 2D 27  20 2A 20 37 36 0A 70 72   rint '-' * 76 pr
00000B20   69 6E 74 20 65 6E 63 2E  65 6E 63 6F 64 65 28 27   int enc.encode('
00000B30   62 61 73 65 36 34 27 29  0A 70 72 69 6E 74 20 27   base64') print '
00000B40   2D 27 20 2A 20 37 36 0A  00 00 00 00 00 00 00 00   -' * 76         

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000E00   2D 2D 2D 2D 2D 42 45 47  49 4E 20 50 55 42 4C 49   -----BEGIN PUBLI
00000E10   43 20 4B 45 59 2D 2D 2D  2D 2D 0A 4D 49 49 42 49   C KEY----- MIIBI
00000E20   6A 41 4E 42 67 6B 71 68  6B 69 47 39 77 30 42 41   jANBgkqhkiG9w0BA
00000E30   51 45 46 41 41 4F 43 41  51 38 41 4D 49 49 42 43   QEFAAOCAQ8AMIIBC
00000E40   67 4B 43 41 51 45 41 71  2B 6D 37 69 48 75 72 42   gKCAQEAq+m7iHurB
00000E50   61 39 47 38 75 6A 45 69  54 70 5A 0A 37 31 61 48   a9G8ujEiTpZ 71aH
00000E60   4F 56 4E 68 51 58 70 64  36 6A 43 51 4E 68 77 4D   OVNhQXpd6jCQNhwM
00000E70   4E 33 68 44 36 4A 48 6B  76 30 48 53 78 6D 4A 77   N3hD6JHkv0HSxmJw
00000E80   66 47 65 30 45 6E 58 44  74 6A 52 72 61 57 6D 53   fGe0EnXDtjRraWmS
00000E90   36 4F 59 7A 54 34 2B 4C  53 72 58 73 0A 7A 39 49   6OYzT4+LSrXs z9I
00000EA0   6B 57 47 7A 52 6C 4A 34  6C 43 37 57 48 53 38 44   kWGzRlJ4lC7WHS8D
00000EB0   33 4E 57 49 57 59 48 43  50 34 54 52 74 32 4E 30   3NWIWYHCP4TRt2N0
00000EC0   54 6C 57 58 57 6D 39 6E  46 43 72 45 58 71 51 33   TlWXWm9nFCrEXqQ3
00000ED0   49 57 67 59 51 70 51 76  4B 7A 73 64 73 0A 65 74   IWgYQpQvKzsds et
00000EE0   6E 49 5A 4A 4C 31 74 66  31 77 51 7A 47 45 36 72   nIZJL1tf1wQzGE6r
00000EF0   62 6B 62 76 55 52 6C 55  42 62 7A 42 53 75 69 64   bkbvURlUBbzBSuid
00000F00   6B 6D 69 30 6B 59 35 51  78 70 32 4A 66 62 36 4F   kmi0kY5Qxp2Jfb6O
00000F10   55 49 36 34 37 7A 78 32  64 50 78 4A 70 44 0A 66   UI647zx2dPxJpD f
00000F20   66 53 43 4E 66 66 56 49  44 55 59 4F 76 72 67 59   fSCNffVIDUYOvrgY
00000F30   78 49 68 73 35 48 6D 43  46 33 58 45 43 43 33 56   xIhs5HmCF3XECC3V
00000F40   66 61 4B 74 52 63 65 4C  35 4A 4D 38 52 30 71 7A   faKtRceL5JM8R0qz
00000F50   35 6E 56 55 32 4E 73 38  68 50 76 53 56 50 2B 0A   5nVU2Ns8hPvSVP+ 
00000F60   37 2F 69 37 47 34 34 37  63 6A 57 31 35 31 73 69   7/i7G447cjW151si
00000F70   30 6A 6F 42 37 52 70 42  70 6C 75 34 34 56 6B 38   0joB7RpBplu44Vk8
00000F80   54 58 58 44 41 6B 30 4A  5A 64 57 36 4B 77 4A 6E   TXXDAk0JZdW6KwJn
00000F90   37 49 54 61 58 30 34 41  41 41 41 41 41 41 41 41   7ITaX04AAAAAAAAA
00000FA0   0A 41 51 49 44 41 51 41  42 0A 2D 2D 2D 2D 2D 45    AQIDAQAB -----E
00000FB0   4E 44 20 50 55 42 4C 49  43 20 4B 45 59 2D 2D 2D   ND PUBLIC KEY---
00000FC0   2D 2D 0A 2D 2D 2D 2D 2D  2D 2D 2D 2D 2D 2D 2D 2D   -- -------------
00000FD0   2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 2D 2D 2D 2D 2D 2D   ----------------
00000FE0   2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 2D 2D 2D 2D 2D 2D   ----------------
00000FF0   2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 2D 2D 2D 2D 2D 2D   ----------------
00001000   2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 2D 2D 2D 2D 2D 0A   --------------- 
00001010   65 45 52 30 4A 4E 49 63  5A 59 78 2F 74 2B 37 6C   eER0JNIcZYx/t+7l
00001020   6E 52 76 76 38 73 38 7A  79 4D 77 38 64 59 73 70   nRvv8s8zyMw8dYsp
00001030   5A 6C 6E 65 30 4D 51 55  61 74 51 4E 63 6E 44 4C   Zlne0MQUatQNcnDL
00001040   2F 77 6E 48 74 6B 41 6F  4E 64 43 61 6C 51 6B 70   /wnHtkAoNdCalQkp
00001050   63 62 6E 5A 65 41 7A 34  71 65 4D 58 0A 35 47 42   cbnZeAz4qeMX 5GB
00001060   6D 73 4F 2B 42 58 79 41  4B 44 75 65 4D 41 34 75   msO+BXyAKDueMA4u
00001070   79 33 66 77 32 6B 2F 64  71 46 53 73 5A 46 69 42   y3fw2k/dqFSsZFiB
00001080   37 49 39 4D 30 6F 45 6B  71 55 6A 61 35 32 49 4D   7I9M0oEkqUja52IM
00001090   70 6B 47 44 4A 32 65 58  47 6A 39 57 48 65 34 6D   pkGDJ2eXGj9WHe4m
000010A0   71 6B 6E 69 49 61 79 53  34 0A 32 6F 34 70 39 62   qkniIayS4 2o4p9b
000010B0   30 51 6C 7A 37 35 34 71  71 52 67 6B 75 61 4B 7A   0Qlz754qqRgkuaKz
000010C0   50 57 6B 5A 50 4B 79 6E  55 4C 41 74 46 58 46 33   PWkZPKynULAtFXF3
000010D0   39 7A 6D 36 64 50 49 2F  6A 55 41 32 42 45 6F 35   9zm6dPI/jUA2BEo5
000010E0   57 42 6F 50 7A 73 43 7A  77 52 6D 64 72 36 51 6D   WBoPzsCzwRmdr6Qm
000010F0   4A 58 54 73 61 75 0A 35  42 41 51 43 35 71 64 49   JXTsau 5BAQC5qdI
00001100   6B 6D 43 4E 71 37 2B 4E  4C 59 31 66 6A 4F 6D 53   kmCNq7+NLY1fjOmS
00001110   45 46 2F 57 2B 6D 64 51  76 63 77 59 50 62 65 32   EF/W+mdQvcwYPbe2
00001120   7A 65 7A 72 6F 43 69 4C  69 50 4E 5A 6E 6F 41 42   zezroCiLiPNZnoAB
00001130   66 6D 50 62 57 41 63 41  53 56 55 36 4D 30 59 78   fmPbWAcASVU6M0Yx
00001140   76 6E 58 0A 73 68 32 59  6A 6B 79 4C 46 66 34 63   vnX sh2YjkyLFf4c
00001150   4A 53 67 72 6F 4D 33 41  77 34 66 56 7A 33 50 50   JSgroM3Aw4fVz3PP
00001160   53 73 41 51 79 43 46 4B  42 41 3D 3D 0A 0A 2D 2D   SsAQyCFKBA==  --
00001170   2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 2D 2D 2D 2D 2D 2D   ----------------
00001180   2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 2D 2D 2D 2D 2D 2D   ----------------
00001190   2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 2D 2D 2D 2D 2D 2D   ----------------
000011A0   2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 2D 2D 2D 2D 2D 2D   ----------------
000011B0   2D 2D 2D 2D 2D 2D 2D 2D  2D 2D 0A                  ---------- 

整理一下如下所示:

#!/usr/bin/python

from Crypto.Util.number import *
from Crypto.PublicKey import RSA
from secret import s, FLAG

def gen_prime(s):
    while True:
        r = getPrime(s)
        R = [r]
        t = int(5 * s / 2) + 1
        for i in range(0, t):
            R.append(r + getRandomRange(0, 4 * s ** 2))
        p = reduce(lambda a, b: a * b, R, 2) + 1
        if isPrime(p):
            if len(bin(p)[2:]) == 1024:
                return p

while True:
    p = gen_prime(s)
    q = gen_prime(s)
    n = p * q
    e = 65537
    d = inverse(e, (p-1)*(q-1))
    if len(bin(n)[2:]) == 2048:
        break

msg = FLAG
key = RSA.construct((long(n), long(e), long(d), long(p), long(p)))
for _ in xrange(s):
    enc = key.encrypt(msg, 0)[0]
    msg = enc

print key.publickey().exportKey()
print '-' * 76
print enc.encode('base64')
print '-' * 76

#-----BEGIN PUBLIC KEY-----
# MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq+m7iHurBa9G8ujEiTpZ
# 71aHOVNhQXpd6jCQNhwMN3hD6JHkv0HSxmJwfGe0EnXDtjRraWmS6OYzT4+LSrXs
# z9IkWGzRlJ4lC7WHS8D3NWIWYHCP4TRt2N0TlWXWm9nFCrEXqQ3IWgYQpQvKzsds
# etnIZJL1tf1wQzGE6rbkbvURlUBbzBSuidkmi0kY5Qxp2Jfb6OUI647zx2dPxJpD
# ffSCNffVIDUYOvrgYxIhs5HmCF3XECC3VfaKtRceL5JM8R0qz5nVU2Ns8hPvSVP+
# 7/i7G447cjW151si0joB7RpBplu44Vk8TXXDAk0JZdW6KwJn7ITaX04AAAAAAAAA
# AQIDAQAB
# -----END PUBLIC KEY-----
# ----------------------------------------------------------------------------
# eER0JNIcZYx/t+7lnRvv8s8zyMw8dYspZlne0MQUatQNcnDL/wnHtkAoNdCalQkpcbnZeAz4qeMX
# 5GBmsO+BXyAKDueMA4uy3fw2k/dqFSsZFiB7I9M0oEkqUja52IMpkGDJ2eXGj9WHe4mqkniIayS4
# 2o4p9b0Qlz754qqRgkuaKzPWkZPKynULAtFXF39zm6dPI/jUA2BEo5WBoPzsCzwRmdr6QmJXTsau
# 5BAQC5qdIkmCNq7+NLY1fjOmSEF/W+mdQvcwYPbe2zezroCiLiPNZnoABfmPbWAcASVU6M0YxvnX
# sh2YjkyLFf4cJSgroM3Aw4fVz3PPSsAQyCFKBA==

# ----------------------------------------------------------------------------

破解思路如下:一个rsa加密系统,s为产生素数的种子,flag为消息,n和e在公钥里,首先爆破s,发现在短时间内可以产生密钥的只有s=20的时候,然后尝试分解n,可以在网站上得到分解结果,至此解决了这个体系,破解脚本如下:

#!/usr/bin/python
import base64
from Crypto.Util.number import *
from Crypto.PublicKey import RSA
publickey = """-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAq+m7iHurBa9G8ujEiTpZ
71aHOVNhQXpd6jCQNhwMN3hD6JHkv0HSxmJwfGe0EnXDtjRraWmS6OYzT4+LSrXs
z9IkWGzRlJ4lC7WHS8D3NWIWYHCP4TRt2N0TlWXWm9nFCrEXqQ3IWgYQpQvKzsds
etnIZJL1tf1wQzGE6rbkbvURlUBbzBSuidkmi0kY5Qxp2Jfb6OUI647zx2dPxJpD
ffSCNffVIDUYOvrgYxIhs5HmCF3XECC3VfaKtRceL5JM8R0qz5nVU2Ns8hPvSVP+
7/i7G447cjW151si0joB7RpBplu44Vk8TXXDAk0JZdW6KwJn7ITaX04AAAAAAAAA
AQIDAQAB
-----END PUBLIC KEY-----"""
key = RSA.importKey(publickey)
n = int(key.n)
print n

p=139457081371053313087662621808811891689477698775602541222732432884929677435971504758581219546068100871560676389156360422970589688848020499752936702307974617390996217688749392344211044595211963580524376876607487048719085184308509979502505202804812382023512342185380439620200563119485952705668730322944000000001
q=155617827023249833340719354421664777126919280716316528121008762838820577123085292134385394346751341309377546683859340593439660968379640585296350265350950535158375685103003837903550191128377455111656903429282868722284520586387794090131818535032744071918282383650099890243578253423157468632973312000000000000001
n=p*q
def decrypt(n, p, q):
    e = 65537
    d = inverse(e, (p-1)*(q-1))
    key = RSA.construct((long(n), long(e), long(d), long(p), long(q)))
    msg = base64.b64decode("eER0JNIcZYx/t+7lnRvv8s8zyMw8dYspZlne0MQUatQNcnDL/wnHtkAoNdCalQkpcbnZeAz4qeMX5GBmsO+BXyAKDueMA4uy3fw2k/dqFSsZFiB7I9M0oEkqUja52IMpkGDJ2eXGj9WHe4mqkniIayS42o4p9b0Qlz754qqRgkuaKzPWkZPKynULAtFXF39zm6dPI/jUA2BEo5WBoPzsCzwRmdr6QmJXTsau5BAQC5qdIkmCNq7+NLY1fjOmSEF/W+mdQvcwYPbe2zezroCiLiPNZnoABfmPbWAcASVU6M0YxvnXsh2YjkyLFf4cJSgroM3Aw4fVz3PPSsAQyCFKBA==")
    for _ in xrange (20):
        enc = key.decrypt(msg)
        msg = enc           
    print repr(msg)
decrypt(n, p, q)

5.sleeping-guard

题目给出了一个服务器,端口。使用nc连接后,发现可以收到一些数据。使用以下命令保存数据:

ncat 域名 端口号 > a.txt

winhex打开后,发现是base64编码的字符串,然后使用base64解码,代码如下:

cat a.txt | base64 -d > b.txt

根据提示,应该是一张图片,但是winhex打开后如下所示:

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   DE 3F 0F 2F 52 4B 45 41  65 79 21 32 1E 27 05 3A   ? /RKEAey!2 ' :
00000010   5F 41 5E B7 65 79 21 97  5F 69 41 68 5F 44 65 17   _A^積y!梍iAh_De 
00000020   23 79 21 3F 53 08 00 25  1E 41 5F FA EA 72 DD 5E   #y!?S  % A_r較
00000030   52 6F 41 68 7F 22 17 19  28 79 21 45 71 6F 41 E8   RoAh "  (y!EqoA?
00000040   DB 41 5F B1 65 79 21 BF  BF 6F 41 1D 6F 41 5F A1   跘_眅y!靠oA oA_?
00000050   05 79 21 05 CF 6F 41 7F  2F DD E5 1A 59 79 21 3F    y! 蟧A /蒎 Yy!?
00000060   5E 1F 09 31 2C 41 5F 59  11 79 21 2D 23 6E 9F 0E   ^  1,A_Y y!-#n?
00000070   40 39 5F 4B 64 20 48 6B  0F 1B 19 25 13 7B 3C 24   @9_Kd Hk   % {<$
00000080   08 57 40 5B 38 0D 24 46  27 2C 2F 4B 65 79 21 3F    W@[8 $F',/Key!?
00000090   6B 17 7B 10 32 31 32 2E  11 18 01 47 3A 03 2F 1B   k { 212.   G: / 
000000A0   65 39 62 69 04 1D 4E 5D  32 55 2F 1B 65 2C 3A 3F   e9bi  N]2U/ e,:?
000000B0   04 56 03 1F 2F 55 39 05  2F 35 34 76 47 21 6C 6F    V  /U9 /54vG!lo
000000C0   77 2C 2E 1A 3A 61 6A 65  51 57 11 1D 69 65 61 48   w,. :ajeQW  ieaH
000000D0   7F 7D 2D 2F 03 43 73 7B  11 4F 39 05 33 2F 2C 71    }-/ Cs{ O9 3/,q
000000E0   17 1D 47 02 75 07 35 1C  2F 7B 70 64 12 0E 56 11     G u 5 /{pd  V 
000000F0   20 5C 6F 07 2D 26 70 7A  5C 40 18 10 67 5D 6E 5A    \o -&pz\@  g]nZ
00000100   6D 6C 2D 2F 03 54 52 46  39 1B 20 10 72 2F 2C 68   ml-/ TRF9   r/,h
00000110   47 47 2B 1F 77 4F 61 48  7F 7D 2D 2F 03 43 65 5A   GG+ wOaH }-/ CeZ
00000120   24 0C 33 01 2F 35 36 24  0B 59 53 5B 31 55 20 0A   $ 3 /56$ YS[1U  
00000130   30 34 2B 76 47 5B 2B 1F  77 4F 61 48 7F 61 7F 6B   04+vG[+ wOaH a k
00000140   45 59 01 47 3A 03 2F 1B  65 35 36 2D 03 44 03 57   EY G: / e56- D W
00000150   23 1B 31 52 70 6E 31 38  4B 18 45 50 35 0A 6F 0B   # 1Rpn18K EP5 o 
00000160   30 2C 70 3F 0C 1F 47 10  66 41 71 47 7D 7F 55 6B   0,p?  G fAqG} Uk
00000170   45 59 01 1F 77 4F 61 48  63 35 36 2D 03 43 6E 4D   EY  wOaHc56- CnM
00000180   3E 0A 2F 1C 3E 35 36 24  0B 47 10 03 78 1B 28 0E   > / >56$ G  x ( 
00000190   39 7B 10 39 0C 1C 4F 4B  36 1B 28 07 31 7F 55 6B   9{ 9  OK6 ( 1 Uk
000001A0   45 59 01 1F 77 53 6E 1A  3B 27 65 0F 00 0A 42 4D   EY  wSn ;'e   BM
000001B0   3E 1F 35 01 30 2F 61 41  45 59 01 03 78 1D 25 0E   > 5 0/aAEY  x % 
000001C0   65 13 1B 0D 5B 73 1D 10  2F 55 39 05 2F 2C 3A 3F   e   [s  /U9 /,:?
000001D0   04 47 2B 73 95 48 18 68  5F 01 5F 02 21 38 75 47    G+s旽 h_ _ !8uG
000001E0   56 83 FC 0F CF ED B6 3E  BA 0E 1B D8 B9 A6 78 A7   V凕 享?? 毓?
000001F0   83 FD D6 6B 57 7C B3 3D  5E 6D 0D C8 16 10 7B 8E   凖謐W|?^m ? {?
00000200   77 9C 0B 64 45 42 C8 1E  16 6B D6 B5 C5 76 53 2A   w?dEB? k值舦S*

想到了异或加密,正常的png文件的开头是这样的

Offset      0  1  2  3  4  5  6  7   8  9  A  B  C  D  E  F

00000000   89 50 4E 47 0D 0A 1A 0A  00 00 00 0D 49 48 44 52   NG        IHDR
00000010   00 00 04 68 00 00 02 CE  08 06 00 00 00 F5 1F 25      h   ?    ?%
00000020   F9 00 00 00 01 73 52 47  42 00 AE CE 1C E9 00 00   ?   sRGB  ? 
00000030   00 04 67 41 4D 41 00 00  B1 8F 0B FC 61 05 00 00     gAMA  ?    
00000040   00 09 70 48 59 73 00 00  0E C3 00 00 0E C3 01 C7     pHYs   ?  ??
00000050   6F A8 64 00 00 7E A8 49  44 41 54 78 5E ED FD 09   o  ~DATx^ 
00000060   D8 5E F5 7D 1F 78 F3 CE  74 BA B7 E9 74 D2 99 77   豝鮹 xt悍閠覚w
00000070   72 CD FB BE 49 93 CC DB  A4 4D 9B 2E D3 74 52 27   r望綢撎郅M?觮R'
00000080   71 92 36 C9 4C D2 24 8D  9B 36 4B 63 EC 00 36 D8   q?蒐? ?Kc?6?
00000090   D8 14 42 BC 81 6D 0C C6  C1 2C C1 60 B0 8C 31 5E   ?B?m 屏,羆皩1^
000000A0   C4 66 9B 1D 81 C0 58 98  C5 80 40 20 40 2C 62 11   膄? 繶樑€@ @,b 
000000B0   32 02 24 B4 22 B4 20 16  09 F9 3F E7 7F 96 FB 3E   2 $??  ??桘>
000000C0   E7 DC E7 DC CB B3 E8 3C  B7 F8 7C AE EB 77 E9 B9   畿畿顺?辐|w楣
000000D0   CF BE DF CF F9 EA 7F CE  73 C8 F7 9F 7B 31 28 A5   暇呦 蝧洒焮1(?
000000E0   BA A9 B5 CF 6D C8 FF 4D  3E 3F BF 71 A0 7F B9 5E   憨迪m?M>?縬?筤
000000F0   DC B4 2D EC DC BD 27 BC  F6 FA 1B E1 CD FD FB 03   艽-燔?荐?嵬 
00000100   D0 9D 78 0E C6 73 31 9E  93 1B 92 73 B3 E9 9C 55   ?x 苨1灀 抯抽淯

png文件首部固定为

png=['89','50','4E','47','0D','0A','1A','0A','00','00','00','0D','49','48','44','52']

解密出的文件首部为

enc=['DE','3F','0F','2F','52','4B','45','41','65','79','21','32','1E','27','05','3A']

尝试进行异或解密,结果如下:

# coding :utf-8
png=['89','50','4E','47','0D','0A','1A','0A','00','00','00','0D','49','48','44','52']
enc=['DE','3F','0F','2F','52','4B','45','41','65','79','21','32','1E','27','05','3A']
key=''
for i in range(0,16):
    key+=chr(int(png[i],16)^int(enc[i],16))
print key
key='WoAh_A_Key!?WoAh',所以key应该为WoAh_A_Key!?

用key解密整个文件:

key='WoAh_A_Key!?'
output=''
f = open('C:\\Users\\dell\\Desktop\\b.png', 'rb+')
i = 0
data = f.read()
for char in data:
    output += chr(ord(char) ^ ord(key[i % len(key)]))
    i += 1

f = open('C:\\Users\\dell\\Desktop\\decrypted1.png', 'wb+')
f.write(output)

结果如下:

avatar


本文访问量: