010000100100100101010100010100110100001101010100010001100111101101101000001100010110010000110011010111110011000101101110010111110111000001101100001101000011000101101110010111110011010100110001001101110011001101111101
5.在线二进制转字符串:
6.python脚本获取
7.得到flag:BITSCTF{h1d3_1n_pl41n_5173}
writeup:
1.将题目中的十六进制类型转换成十进制:
p=8695224115036335558506571119739296036271134788610181138168484331081777972517240308721981280176995392696427341397469232176120700610749965333026113898553049q=13096749823995628078930936161926731366955083380107539950861609990671457149850288846976369982960384583841424977220385144435351119887497145134804975486079751e=76629781387397242664311670987431757827144139255639280752983416867031015307352014386648673994217913815581782186636488159185965227449303118783362862435899486717504457233649829563176353949817149997773276435581910370559594639570436120596211148973227077565739467641309426944529006537681147498322988959979899800641c=898013894435695699573984069547075984927639234185685360303235460882787583623310431197364379101176970325948359029005820403943674808298008972319252338077452783893580314042780646333136261493367249458548650414390611494119625092476244194480036048744062822136093417043390251690152562280292002226433434300288280630082.通过脚本获取RSA的M值
即,选取了相同的加密指数e(这里取e=3),对相同的明文m进行了加密并进行了消息的传递,那么有:
$c_1equivm^e$$mod$$n_1$
$c_2equivm^e$$mod$$n_2$
$c_3equivm^e$$mod$$n_3$
对上述等式运用中国剩余定理,在e=3时,可以得到:
$c_xequivm^3$$mod$$n_1n_2n_3$
通过对$c_x$进行三次开方可以求得明文。
我们刚刚拦截了,敌军的文件传输获取一份机密文件,请君速速破解
wirteup:
1.下载附件后,内容如下:
504B03040A0001080000626D0A49F4B5091F1E0000001200000008000000666C61672E7478746C9F170D35D0A45826A03E161FB96870EDDFC7C89A11862F9199B4CD78E7504B01023F000A0001080000626D0A49F4B5091F1E00000012000000080024000000000000002000000000000000666C61672E7478740A0020000000000001001800AF150210CAF2D1015CAEAA05CAF2D1015CAEAA05CAF2D101504B050600000000010001005A000000440000000000
很明显,504B0304是zip文件的文件头。
2.通过010editor导入hex,然后保存为test.zip即可
通过BMP文件格式标准,可以用一个有效的BMP头替换OpenSSL字符串+8字节salt,那么就足以打开文件了
需要确定:
根据BMP规范,每个像素的位数可以是1、2、4、8、16、24或32。我们也可以尝试其中的每一种。
可以使用winhex删除前16个字节ecb.bmp(“OpenSSL__”+8个字节salt)并替换BMP头:
对字母表进行编码:
ABCDEFGHIJKLMNOPQRSTUVWXYZ234567012345678910111213141516171819202122232425262728293031则有:
3->11
4->24
8->12
20->8
21->21
25->9
26->22
仿射密码的a=13和b=4,对应表如下:
注意:显然在第一个文件中,flag经过base64加密,跑脚本时要记得给其解密
5.利用openssl来查看key.pub,分别计算得到p和qroot@kali:/opt/RsaCtfTool#opensslrsa-pubin-text-modulus-inkey.pubRSAPublic-Key:(399bit)Modulus:52:a9:9e:24:9e:e7:cf:3c:0c:bf:96:3a:00:96:61:77:2b:c9:cd:f6:e1:e3:fb:fc:6e:44:a0:7a:5e:0f:89:44:57:a9:f8:1c:3a:e1:32:ac:56:83:d3:5b:28:ba:5c:32:42:43Exponent:65537(0x10001)Modulus=52A99E249EE7CF3C0CBF963A009661772BC9CDF6E1E3FBFC6E44A07A5E0F894457A9F81C3AE132AC5683D35B28BA5C324243writingRSAkey-----BEGINPUBLICKEY-----ME0wDQYJKoZIhvcNAQEBBQADPAAwOQIyUqmeJJ7nzzwMv5Y6AJZhdyvJzfbh4/v8bkSgel4PiURXqfgcOuEyrFaD01soulwyQkMCAwEAAQ==-----ENDPUBLICKEY-----得到:
比如给出的明文是HELLO假定给的关键词是JLAY,那么对应的密钥便为:JLAYJ
那么对其进行加密,如图:H对应J行的是Q,E对应L行的是P,以此类推。最后得到的密文变为:QPLJX
1.下载附件,根据题目提示是维吉利亚密码,查看文本内容如下
已知公钥(自动求私钥)—publickey,密文—uncipherfile
命令:python3RsaCtfTool.py--publickey公钥文件--uncipherfile加密的文件
1、解出e、n
方式1:
打开kali虚拟机,用openssl解出e、n
命令:
opensslrsa-pubin-ingy.key-text-modulus
用脚本从公钥文件中解出n、e
(常用于比较大的整数分解)自动整数因式分解,在RSA中,当p、q的取值差异过大或过于相近的时候,使用yafu可以快速的把n值分解出p、q值!
用法:
yafu-x64.exefactor(76775333340223961139427050707840417811156978085146970312315886671546666259161)
p=273821108020968288372911424519201044333
q=280385007186315115828483000867559983517
n=76775333340223961139427050707840417811156978085146970312315886671546666259161
e=65537
XMVZGCRGCAMGRVMGHGFGMQYCDVTVWMBYNO,NSVWDSNSGORAOXGUWFNAFHACDGMVWF.AIRVFNAIIAMGJVRRVC-XVMC,FYRBIGTVIZESVSAHCGQGMXGGCRVMGNSACARYIGTMVRNSGSVWFGESGMGNSGOEGMGXVMCWCNYINSGHAOFVRGIVMHJARGMVWCHNVdeFALNAZGNSGRVTTNVEAM.OVWMTIADYF"CVNSYFYFCVNJMOBNVROHGAM",YCIVEGMJAFG,EYNSWCHGMFJVMGFYCFNGAHVTFBAJGF,FWMMVWCHGHXONSGWFWAI"TIAD"NADACHJWMIOXMAJGF.GCUVO.
这段字符串被替代密码加密。这个加密方法是把一些字母用另外一些字母替换。
2.利用linux的file命令查看日志文件属性,发现capture.log被出题者故意篡改过,对解题人进行迷惑。可以看到是pcap流量文件类型。
3.将文件名重命名为capture.pcap,利用wireshark工具查看内容,分析流量包发现存在ICMP、TCP、UDP协议的流量包,其中IP地址192.168.0.9向IP地址192.168.0.99发送大量的TCP请求,
每次发送TCP请求是,会先进行一次ICMP的Ping请求.
3.发现数据报文有多个ip都对192.168.0.99目标机器进行扫描,分别为192.168.0.9、192.168.0.1、192.168.0.254、192.168.0.199,它们共同特点是每次发起端口扫描时候,
先进行ping操作,在wireshark中过滤出ICMP的数据包进行分析,尝试提交第四次发起扫描第一个报文编号155989,Flag为155989
我们再来对比函数process(m,k):
defprocess(m,k):tmp=m^kres=0foriinbin(tmp)[2:]:res=res<<1;if(int(i)):res=res^tmpif(res>>256):res=res^Preturnresres=res<<1代表乘以x,多项式的系数全体左移一位;
if(res>>256):res^=P代表模本原多项式g;
因此这里的关键是process函数,只要能够通过process的输出求输入:
3.通过尝试,发现将process的输出作为输入(m^k)运算256轮,最终结果与最初输入相同,因此我们可以写出process的反函数arcprocess
4.通过解密脚本进行解密:
异或加密特性:
1两个值相同时,返回false,否则返回true.
2如果对一个值连续做两次XOR,会返回这个值本身.
3加密应用:
假设原始信息是message,密钥是key,第一次XOR会得到加密文本cipherText.对方拿到以后,再用key做一次XOR运算,就会还原得到message.
key的长度大于等于message
key必须是一次性的,且每次都要随机产生
满足上述两个条件,即称为OTP
题目附件:0529242a631234122d2b36697f13272c207f2021283a6b0c79082f28202a302029142c653f3c7f2a2636273e3f2d653e25217908322921780c3a235b3c2c3f207f372e21733a3a2b37263b3130122f6c363b2b312b1e64651b6537222e37377f2020242b6b2c2d5d283f652c2b31661426292b653a292c372a2f20212a316b283c0929232178373c270f682c216532263b2d3632353c2c3c2a293504613c37373531285b3c2a72273a67212a277f373a243c20203d5d243a202a633d205b3c2d3765342236653a2c7423202f3f652a182239373d6f740a1e3c651f207f2c212a247f3d2e65262430791c263e203d63232f0f20653f207f332065262c31683137223679182f2f372133202f142665212637222220733e383f2426386b
1.利用一些用同个密钥生成的密文,猜对其中部分密文对应的明文,即可求出公共密钥,再用该可能的密钥去解其他的密文,若符合,则为密钥正确.
2.下载附件,得到如下字符串
0529242a631234122d2b36697f13272c207f2021283a6b0c7908
2f28202a302029142c653f3c7f2a2636273e3f2d653e25217908
322921780c3a235b3c2c3f207f372e21733a3a2b37263b313012
2f6c363b2b312b1e64651b6537222e37377f2020242b6b2c2d5d
283f652c2b31661426292b653a292c372a2f20212a316b283c09
29232178373c270f682c216532263b2d3632353c2c3c2a293504
613c37373531285b3c2a72273a67212a277f373a243c20203d5d
243a202a633d205b3c2d3765342236653a2c7423202f3f652a18
2239373d6f740a1e3c651f207f2c212a247f3d2e65262430791c
263e203d63232f0f20653f207f332065262c3168313722367918
2f2f372133202f142665212637222220733e383f2426386b
3.通过十六进进制转asci发现转码出乱码
4.对于OTP密码的重用,我们可以利用Cribdraggingattack来破解。这是一种已知部分明文的攻击,countermode的blockcipher如果重用了IV或者counter也可以用这种攻击。
5.将上面的文本内容都按一行展开
0529242a631234122d2b36697f13272c207f2021283a6b0c79082f28202a302029142c653f3c7f2a2636273e3f2d653e25217908322921780c3a235b3c2c3f207f372e21733a3a2b37263b3130122f6c363b2b312b1e64651b6537222e37377f2020242b6b2c2d5d283f652c2b31661426292b653a292c372a2f20212a316b283c0929232178373c270f682c216532263b2d3632353c2c3c2a293504613c37373531285b3c2a72273a67212a277f373a243c20203d5d243a202a633d205b3c2d3765342236653a2c7423202f3f652a182239373d6f740a1e3c651f207f2c212a247f3d2e65262430791c263e203d63232f0f20653f207f332065262c31683137223679182f2f372133202f142665212637222220733e383f2426386b
10根据flag的常见格式,可以猜测HERE之后是下划线。将“ALEXCTF{HERE_”作为crib输入:
11.得到有意义的字符串有:***260:"ncryptionsch",***234:"greewithme",***208:"cure,LetMe",***182:"everifthek",***156:"proventobe",***130:"hodthatism",***104:"istheonlye",***78:"nscheme,Ih",***52:"sedOnetime",***26:"nderstoodmy
260:"ALEXCTF{HERE_GOES"
将新的key后面加上下划线输入:
***260:"ncryptionschemea",***234:"greewithmetous",***208:"cure,LetMeknow",***182:"everifthekeyis",***156:"proventobenot",***130:"hodthatismathem",***104:"istheonlyencryp",***78:"nscheme,Iheard",***52:"sedOnetimepade",***26:"nderstoodmymista",***0:"DearFriend,This"
52的后面几乎可以确定是encryption,而且这样填充的字母多,所以这次输入"sedOnetimepadencryption":