BITSCTF{S2VyY2tob2Zm}
writup:
1.下载附件,解压文件,得到一个文件名为bf930316910b451c94c41ce8a9d851a8文件
https://adworld.xctf.org.cn/media/task/attachments/bf930316910b451c94c41ce8a9d851a8.gz

2.通过命令file查看文件类型,得知是tar文件类型

3.将其重命名为ras.tar ,并解压得两个文件:flag.b64和key.pub

4.分部对key.pub和flag.64的进行查看,其内容都是经过base64加密

注意:显然在第一个文件中,flag经过base64加密,跑脚本时要记得给其解密
5.利用 openssl来查看 key.pub,分别计算得到p和q
root@kali:/opt/RsaCtfTool# openssl rsa -pubin -text -modulus -in key.pub
RSA Public-Key: (399 bit)
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:43
Exponent: 65537 (0x10001)
Modulus=52A99E249EE7CF3C0CBF963A009661772BC9CDF6E1E3FBFC6E44A07A5E0F894457A9F81C3AE132AC5683D35B28BA5C324243
writing RSA key
-----BEGIN PUBLIC KEY-----
ME0wDQYJKoZIhvcNAQEBBQADPAAwOQIyUqmeJJ7nzzwMv5Y6AJZhdyvJzfbh4/v8
bkSgel4PiURXqfgcOuEyrFaD01soulwyQkMCAwEAAQ==
-----END PUBLIC KEY-----
得到 :
e = 65537
n (hex)= 52A99E249EE7CF3C0CBF963A009661772BC9CDF6E1E3FBFC6E44A07A5E0F894457A9F81C3AE132AC5683D35B28BA5C324243(十六进制)
https://tool.lu/hexconvert/

n(10)= 833810193564967701912362955539789451139872863794534923259743419423089229206473091408403560311191545764221310666338878019(十进制)
分解大数n,得到p、q

p = 863653476616376575308866344984576466644942572246900013156919
q = 965445304326998194798282228842484732438457170595999523426901
6.通过脚本对其进行解密
#coding:utf-8
import gmpy2
import rsa
from base64 import b64decode
p = 863653476616376575308866344984576466644942572246900013156919
q = 965445304326998194798282228842484732438457170595999523426901
n = 833810193564967701912362955539789451139872863794534923259743419423089229206473091408403560311191545764221310666338878019
e = 65537
d = int(gmpy2.invert(e,(p-1)*(q-1)))
privatekey = rsa.PrivateKey(n,e,d,p,q)
with open("flag.b64","rb") as f:
str = b64decode(f.read())
print(rsa.decrypt(str,privatekey).decode())

7.最终得到flag:
ALEXCTF{SMALL_PRIMES_ARE_BAD}
writeup:
1.下载附件pdf,通过阅读器查看,发现文件无法查看
https://adworld.xctf.org.cn/media/task/attachments/9e45191069704531accd66f1ee1d5b2b.pdf

2.通过file命令查看文件类型
file flag.pdf

3.通过winhex查看文件,发现文件头是以:%-1.5.格式开头(正常的pdf文件头部是%PDF-1.x数字开头)

4.通过ctfcrackt00ls工具对PDf关键字进行ROT13进行编码,可以看到得到CQS,正好是flag.pdf格式开头的

5.通过上述描述,进行rot13解密,得到解密后的pdf文件
flag.pdf | tr 'A-Za-z' 'N-ZA-Mn-za-m' > flags.pdf
6.打开pdf文件,发现部门内容被遮挡了

7.通过pdftohtml工具将其覆盖的文件转换成html


8.最终得到flag:BITSCTF{save_the_kid}
基础知识:维吉尼亚密码是使用一系列凯撒密码组成密码字母表的加密算法,属于多表密码的一种简单形式.加密原理:维吉尼亚密码的前身,是我们熟悉的凯撒密码。凯撒密码的加密方式是依靠一张字母表中的每一个字母做一定的偏移。密文生成过程中,其偏移量相等。而升级版的维吉尼亚密码则是在原有基础上,让相等偏移量变为不等的偏移量。以给出的密钥来确定密文的偏移量。在一定程度上,加大了解密的难度。当然原理还是一致的,都是依靠偏移量进行加密。这是一张用于加密的字母表。

比如给出的 明文是 HELLO 假定给的关键词是 JLAY ,那么对应的密钥便为:JLAYJ

那么对其进行加密,如图:H对应J行的是Q,E对应L行的是P,以此类推。最后得到的密文变为:QPLJX
writeup:
1.下载附件,根据题目提示是维吉利亚密码,查看文本内容如下
https://adworld.xctf.org.cn/media/task/attachments/429b7c1947d44bc4b7e62270d0fee6b3.zip
2.通过在线维吉尼亚解密网站对其进行解密,可以得到加密key为:icqvigenerehttps://www.guballa.de/vigenere-solver
3.在result解密文本中搜索关键字flag,可得到 flag, '{' and 'vigenereisveryeasyhuh' and '}'
4.那么进行简化和去掉字符最终得到flag:flag{vigenereisveryeasyhuh}
writeup:方法一:
1.下载附件,可以看到RSA私钥上面的部分被屏蔽了请恢复私钥并解密文件,附件给出私钥编码的截图,但是只能看见最后5行
附件下载:https://adworld.xctf.org.cn/media/task/attachments/92d8c7449d614543a0f9da8f05e39bbe.zip

2.OpenSSL私钥结构
私钥信息按如下顺序排列:
version | pad | n | pad | e | pad | d | pad | p | pad | q | pad | x1 | pad | x2 | pad | x3
其中,pad是填充信息,各pad并不同,x1=d mod (p−1),x2=d mod (q−1),x3=p−1 mod qx1=d mod (p−1),x2=d mod (q−1),x3=p−1 mod q,填充pad用来注释接下来的大数的(字节)长度,x02为pad开头的标记,有时后面接x81或x82,这用来标记长度值所占用的字节(x81代表占用1个字节,x82代表占用2个字节),有时后面不接x81或x82而直接放置长度;
例:x02x03代表接下来的大数的字节长度为3个字节;x02x81x80,首先,x81代表长度占用1个字节,因此x80就是长度值,即128,表明接下来的大数的字节长度为128个字节。
将私钥信息按照上述顺序排列好之后,再进行base64编码
3.利用已知信息恢复私钥
截图可见编码为:
Os9mhOQRdqW2cwVrnNI72DLcAXpXUJ1HGwJBANWiJcDUGxZpnERxVw7s0913WXNtV4GqdxCzG0pG5EHThtoTRbyX0aqRP4U/hQ9tRoSoDmBn+3HPITsnbCy67VkCQBM4xZPTtUKM6Xi+16VTUnFVs9E4rqwIQCDAxn9UuVMBXlX2Cl0xOGUF4C5hItrX2woF7LVS5EizR63CyRcPovMCQQDVyNbcWD7N88MhZjujKuSrHJot7WcCaRmTGEIJ6TkU8NWt9BVjR4jVkZ2EqNd0KZWdQPukeynPcLlDEkIXyaQx
解码后结合OpenSSL私钥结构分析可得:x1,x2,x3为已知;但是仅有x1,x2,x3并不能恢复出p,q与d,若我们假设e为常用的指数3,65537等等,则可试出p与q:
d⋅e≡1 mod (p−1)(q−1)d⋅e≡1 mod (p−1)(q−1)
则有d⋅e≡1 mod (p−1)d⋅e≡1 mod (p−1)与d⋅e≡1 mod (q−1)d⋅e≡1 mod (q−1);
由x1x1与x2x2的定义可得x1⋅e≡1 mod (p−1)x1⋅e≡1 mod (p−1),x2⋅e≡1 mod (q−1)x2⋅e≡1 mod (q−1);
因此(p−1)|(x1⋅e−1)(p−1)|(x1⋅e−1);
记x1⋅e−1=r1⋅(p−1)x1⋅e−1=r1⋅(p−1);
由于x1=d mod (p−1)x1=d mod (p−1),则x1<(p−1)x1<(p−1);
几乎可以看做x1⋅e=r1⋅(p−1)x1⋅e=r1⋅(p−1),那么必有r1<er1<e;
同理可得r2<er2<e,其中x2⋅e−1=r2⋅(q−1)x2⋅e−1=r2⋅(q−1)
可以看到,ri<e,i=1,2ri<e,i=1,2,从而可使用试除法求出ri,i=1,2ri,i=1,2;
则p=(x1⋅e−1)/r1+1,q=(x2⋅e−1)/r2+1p=(x1⋅e−1)/r1+1,q=(x2⋅e−1)/r2+1;
4.解题
实现的Python脚本如下:
from Crypto.Util.number import bytes_to_long,isPrime,inverse
from Crypto.PublicKey import RSA
from Crypto.Cipher import PKCS1_v1_5
():
e=65537L
N1=X1*e-1
N2=X2*e-1
for r in range(e):
if N1%(e-r)==0:
p=N1/(e-r)+1
if isPrime(p):
break
for r in range(e):
if N2%(e-r)==0:
q=N2/(e-r)+1
if isPrime(q):
break
N=p*q
phi=(p-1)*(q-1)
d=inverse(e,phi)
assert inverse(q,p)==X3
return RSA.construct((N,e,long(d),p,q))
():
X1=bytes_to_long('xd5xa2%xc0xd4x1bx16ix9cDqWx0execxd3xddwYsmWx81xaawx10xb3x1bJFxe4Axd3x86xdax13Exbcx97xd1xaax91?x85?x85x0fmFx84xa8x0e`gxfbqxcf!;'l,xbaxedY')
X2=bytes_to_long('x138xc5x93xd3xb5Bx8cxe9xxbexd7xa5SRqUxb3xd18xaexacx08@ xc0xc6x7fTxb9Sx01^Uxf6
]18ex05xe0.a"xdaxd7xdb
x05xecxb5Rxe4Hxb3Gxadxc2xc9x17x0fxa2xf3')
X3=bytes_to_long('xd5xc8xd6xdcX>xcdxf3xc3!f;xa3*xe4xabx1cx9a-xedgx02ix19x93x18B xe99x14xf0xd5xadxf4x15cGx88xd5x91x9dx84xa8xd7t)x95x9d@xfbxa4
方法二:
1.已给出部分解密,先把已给出部分进行base64解密
# -*- coding: utf-8 -*-
import base64
import binascii
a = """Os9mhOQRdqW2cwVrnNI72DLcAXpXUJ1HGwJBANWiJcDUGxZpnERxVw7s0913WXNt
V4GqdxCzG0pG5EHThtoTRbyX0aqRP4U/hQ9tRoSoDmBn+3HPITsnbCy67VkCQBM4
xZPTtUKM6Xi+16VTUnFVs9E4rqwIQCDAxn9UuVMBXlX2Cl0xOGUF4C5hItrX2woF
7LVS5EizR63CyRcPovMCQQDVyNbcWD7N88MhZjujKuSrHJot7WcCaRmTGEIJ6TkU
8NWt9BVjR4jVkZ2EqNd0KZWdQPukeynPcLlDEkIXyaQx"""
print binascii.hexlify(base64.b64decode(a))

得到:
3acf6684e41176a5b673056b9cd23bd832dc017a57509d471b024100d5a225c0d41b16699c4471570eecd3dd7759736d5781aa7710b31b4a46e441d386da1345bc97d1aa913f853f850f6d4684a80e6067fb71cf213b276c2cbaed5902401338c593d3b5428ce978bed7a553527155b3d138aeac084020c0c67f54b953015e55f60a5d31386505e02e6122dad7db0a05ecb552e448b347adc2c9170fa2f3024100d5c8d6dc583ecdf3c321663ba32ae4ab1c9a2ded6702691993184209e93914f0d5adf415634788d5919d84a8d77429959d40fba47b29cf70b943124217c9a431
2.rsa私钥格式解析
参考:
OPENSSL中RSA私钥文件(PEM格式)解析
可以得知:
标签头 3082025c(4 bytes) 类型为SEQUENCE 后接 604 bytes
020100 INTEGER 长度为0 内容为:VERSION
028181 INTEGER 长度为129 bytes 内容为: n(modulus)
0203 INTEGER 长度为3 bytes 内容为: e(publicExponent)
028180 INTEGER 长度为128 bytes 内容为: d(privateExponent)
0241 INTEGER 长度为65 bytes 内容为: p(prime1)
0241 INTEGER 长度为65 bytes 内容为: q(prime2)
0240 INTEGER 长度为64 bytes 内容为: d mod(p-1) exponent1
0240 INTEGER 长度为 64 bytes 内容为: d mod (q-1) exponent2
0241 INTEGER 长度为65 bytes 内容为: q -1 mod p coefficient
3.那么根据关键的标签头进行划分之后,可以得到:
3acf6684e41176a5b673056b9cd23bd832dc017a57509d471b
0241//d mod(p-1) exponent1
00d5a225c0d41b16699c4471570eecd3dd7759736d5781aa7710b31b4a46e441d386da1345bc97d1aa913f853f850f6d4684a80e6067fb71cf213b276c2cbaed59
0240//d mod (q-1) exponent2
1338c593d3b5428ce978bed7a553527155b3d138aeac084020c0c67f54b953015e55f60a5d31386505e02e6122dad7db0a05ecb552e448b347adc2c9170fa2f3
0241//q -1 mod p coefficient
00d5c8d6dc583ecdf3c321663ba32ae4ab1c9a2ded6702691993184209e93914f0d5adf415634788d5919d84a8d77429959d40fba47b29cf70b943124217c9a431
因为:
e * dp == 1 (mod (p-1)) = d mod (p-1)
e * dq == 1 (mod (q-1)) = d mod (q-1)
q * qi == 1 (mod p) = q^-1 mod p
所以:
(e * dp -1)/k +1 == (p)
(e * dq -1)/j +1 == (q)
(q * qi -1)/l == (p)
4.脚本破解pq:
# -*- coding: utf-8 -*-
import gmpy2
d_p = 0xd5a225c0d41b16699c4471570eecd3dd7759736d5781aa7710b31b4a46e441d386da1345bc97d1aa913f853f850f6d4684a80e6067fb71cf213b276c2cbaed59
d_q = 0x1338c593d3b5428ce978bed7a553527155b3d138aeac084020c0c67f54b953015e55f60a5d31386505e02e6122dad7db0a05ecb552e448b347adc2c9170fa2f3
e = 65537
for k_p in range(1, e):
if (e*d_p - 1) % k_p == 0:
p = (e*d_p - 1) / k_p + 1
if gmpy2.is_prime(p):
print '[p] {}'.format(p)
break
for k_q in range(1, e):
if (e*d_q - 1) % k_q == 0:
q = (e*d_q - 1) / k_q + 1
if gmpy2.is_prime(q):
print '[q] {}'.format(q)
break
得到:
[p] 12883429939639100479003058518523248493821688207697138417834631218638027564562306620214863988447681300666538212918572472128732943784711527013224777474072569
[q] 12502893634923161599824465146407069882228513776947707295476805997311776855879024002289593598657949783937041929668443115224477369136089557911464046118127387
5.通过脚本解密:
6.最终得到flag:
0ctf{Keep_ca1m_and_s01ve_the_RSA_Eeeequati0n!!!}
writeup:
1.下载附件,解压文件,得到一个文件名为8eec4a4af1e14eb08648c8fda7660a0f文件
https://adworld.xctf.org.cn/media/task/attachments/8eec4a4af1e14eb08648c8fda7660a0f.gz

2.通过命令file查看文件类型,得知是tar文件类型

3.将其重命名为ras256.tar ,并解压得两个文件:fllllllag.txt和gy.key

4.给出了公钥文件gy.key和密文文件fllllllag.txt,就是常规的RSA解密,有多种方法
方法一:利用RsaCtfTool工具(kali虚拟机中)
已知公钥(自动求私钥)—publickey,密文—uncipherfile
命令:python3 RsaCtfTool.py --publickey 公钥文件 --uncipherfile 加密的文件

方法二:利用公钥文件用openssl工具解出e、n,然后python3脚本解出明文
1、解出e、n
方式1:
打开kali虚拟机,用openssl解出e、n
命令:
openssl rsa -pubin -in gy.key -text -modulus

e为65537,n还比较短,用python先转换成10进制

方式2:
用脚本从公钥文件中解出n、e
# -*- coding: cp936 -*-
from Crypto.PublicKey import RSA
#1.从公钥文件中分解n和e
public_key = RSA.importKey(open(r"C:UsersbacklionDesktop8eec4a4af1e14eb08648c8fda7660a0f
as256RSA256gy.key",'rb').read())
n = public_key.n
e = public_key.e
print('N:',n)
print('E:',e)

获取模数(Modulus) N=76775333340223961139427050707840417811156978085146970312315886671546666259161(0xA9BD4C7A7763370A042FE6BEC7DDC841602DB942C7A362D1B5D372A4D08912D9)
公钥指数(Exponent)e=65537 (0x10001)
5.对n进行因数分解
方式1:登录网站http://factordb.com/,解出p和q

方式2:使用yafu工具
(常用于比较大的整数分解)自动整数因式分解,在RSA中,当p、q的取值差异过大或过于相近的时候,使用yafu可以快速的把n值分解出p、q值!
用法:
yafu-x64.exe factor(76775333340223961139427050707840417811156978085146970312315886671546666259161)

6.到此,已经获取到RSA的全部参数
p = 273821108020968288372911424519201044333
q = 280385007186315115828483000867559983517
n=76775333340223961139427050707840417811156978085146970312315886671546666259161
e=65537
7.使用python代码解出明文
import gmpy2
import rsa
p = 273821108020968288372911424519201044333
q = 280385007186315115828483000867559983517
n = 76775333340223961139427050707840417811156978085146970312315886671546666259161
e = 65537
d = int(gmpy2.invert(e , (p-1)*(q-1)))
privatekey = rsa.PrivateKey(n , e , d , p , q)
with open("fllllllag.txt" , "rb") as f:
print(rsa.decrypt(f.read(), privatekey).decode())

最终得到flag:
flag{2o!9CTFECUN}
1.下载附件,解压压缩文件,通过记事本打开https://adworld.xctf.org.cn/media/task/attachments/cf8f3a8ed8544ab19e3c183547d1b93c.zip
里面包含密文:
XMVZGC RGC AMG RVMG HGFGMQYCD VT VWM BYNO, NSVWDS NSGO RAO XG UWFN AF HACDGMVWF. AIRVFN AII AMG JVRRVC-XVMC, FYRBIG TVIZ ESV SAH CGQGM XGGC RVMG NSAC A RYIG TMVR NSG SVWFG ESGMG NSGO EGMG XVMC WCNYI NSG HAO FVRG IVMH JARG MVWCH NVdeFAL NAZG NSGR VTT NV EAM. OVWM TIAD YF "CV NSYF YF CVN JMOBNV RO HGAM", YC IVEGMJAFG, EYNS WCHGMFJVMGF YCFNGAH VT FBAJGF, FWMMVWCHGH XO NSG WFWAI "TIAD" NAD ACH JWMIO XMAJGF. GCUVO.
这段字符串被替代密码加密。这个加密方法是把一些字母用另外一些字母替换。
2.由题目名称safer-than-rot13,先对密文进行rot13置换(这里通过ctfcracktools工具中的rot13解码),看不出任何逻辑。
3。用在线解密解密quipqiup.com(http://quipqiup.com/)
4.得出解码:BROKEN MEN ARE MORE DESERVING OF OUR PITY, THOUGH THEY MAY BE JUST AS DANGEROUS. ALMOST ALL ARE COMMON-BORN, SIMPLE FOLK WHO HAD NEVER BEEN MORE THAN A MILE FROM THE HOUSE WHERE THEY WERE BORN UNTIL THE DAY SOME LORD CAME ROUND TO TAKE THEM OFF TO WAR. YOUR FLAG IS "NO THIS IS NOT CRYPTO MY DEAR", IN LOWERCASE, WITH UNDERSCORES INSTEAD OF SPACES, SURROUNDED BY THE USUAL "FLAG" TAG AND CURLY BRACES. ENJOY.5.或者通过命令置换得到:cat cry100 | tr A-Za-z N-ZA-Mn-za-m > dec100
6.简单翻译如下
破碎的人更值得我们同情,尽管他们可能同样危险。几乎所有的人都是普通的,简单的人,
他们从来没有离开过他们出生的房子超过一英里,直到有一天上帝来带他们去打仗。你的
FLAG 是“NO THIS IS NOT CRYPTO MY DEAR”,小写,用下划线代替空格,周围是通常的
“FLAG”标签和大括号。享受吧。
7.可根据文意解最终得到flag:
no_this_is_not_crypto_my_dear
题目:有黑客入侵了工控设备后再内网发起大量扫描,而且扫描次数不止一次。分析日志指出第四次发起扫描时数据包的编号,flag形式为{}
题目附件连接:https://adworld.xctf.org.cn/media/task/attachments/57971150970f41609af811c73d8d8aac.zip
writeup:1.下载附件,并解压得到文件capture.log
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
4.最终得到flag:
flag{155989}
基础知识:
ZG300是什么ctf之crypto练习二
未经允许不得转载:上海聚慕医疗器械有限公司 » ZG300是什么ctf之crypto练习二









