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 隐写原理
如下图所示:
我们就可以在加粗的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 豝鮹 x笪t悍閠覚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)
结果如下: