Sign-in
关注公众号,回复HSC2019,拿到flag
DORAEMON
开幕告诉我是6位数字,经过爆破得到密码为:376852
用密码解开压缩包,校验宽高,发现高度不高,把图片改长
改长图片后得到
把二维码定位符补上,扫码得到flag
WIRESHARK
010打开,发现还有一个png图片
手动分离出来,得到一张小鲨鱼的图片,我们直接看看它的最低有效位
发现还存在一个png,我们把它导出,得到一个二维码
扫码得到wrsak..iehr370
把它进行一次栅栏密码枚举,得到真正的压缩包密码:wireshark3.7.0
解密得到一个wireshark文件,查看16进制,发现很像pdf文件
补上PDF文件头,直接查看最低有效位
成功get到了flag
汝闻,人言否
下载解压得到一张png图片,直接16进制打开,搜索PNG文件尾(AE 42 60 82)
发现这里有一个错位的压缩包,我们把关键位置的4B 50改为50 4B(不止一处)
随后我们手动分离压缩包
看右面的字符串,我们用键盘同时按下几个键,可以看到很像字符,保留大写,得到压缩包密码:WVALOU
解压出来得到一个没有后缀的文件,查看hex发现是WAV文件,使用AU打开,得到flag
PERFORMANCE-ART
这个题目是真的很艺术,看到图片后首先想到了星际密码,下面给出对照表
对照着对照着发现,有一些字符对照表里没有
根据我们的经验,发现这个很像504B03041400,很容易联想到压缩包
接下来就是20多分钟的摸索了,慢慢摸索出来了这些对照表没有的字符代表什么,得到zip
50 4B 03 04 14 00 00 00 08 00 4A 7E 72 53 14 8E
1E 1E 16 00 00 00 14 00 00 00 06 00 00 00 75 6E
6B 6E 6F 77 8B CA AD C8 88 32 2E C9 F3 0B 75 2D
F7 0C CF AE 8C CA 72 B3 04 00 50 4B 01 02 1F 00
14 00 00 00 08 00 4A 7E 72 53 14 8E 1E 1E 16 00
00 00 14 00 00 00 06 00 24 00 00 00 00 00 00 00
20 00 00 00 00 00 00 00 75 6E 6B 6E 6F 77 0F 00
20 00 00 00 00 00 01 00 18 00 77 82 84 EF 50 DC
D7 01 6B 04 EF EF 60 DC D7 01 E1 B0 EF 14 4F DC
D7 01 50 4B 05 06 00 00 00 00 01 00 01 00 58 00
00 00 3A 00 00 00 00 00
解压出来解密base64,得到flag
Easy Signln
直接用军刀一把梭,得到ZmxhZ3t3ZWxjMG1lX3RvX215X3MxZ25faW59,进行base64解密,得到flag
LINE-GENERATION-TEST
观察描述,发现是在暗示希尔,也就是希尔密码
我们直接求出它的矩阵的逆
学习了一下矩形乘法的运算方式(左边矩阵每行乘以右边的列向量),得到明文对应的数字,拿到关键的“RSCTF”,对它进行md5加密再加上flag{},得到最终flag
RSA
脚本如下:
n=124689085077258164778068312042204623310499608479147230303784397390856552161216990480107601962337145795119702418941037207945225700624828698479201514402813520803268719496873756273737647275368178642547598433774089054609501123610487077356730853761096023439196090013976096800895454898815912067003882684415072791099101814292771752156182321690149765427100411447372302757213912836177392734921107826800451961356476403676537015635891993914259330805894806434804806828557650766890307484102711899388691574351557274537187289663586196658616258334182287445283333526057708831147791957688395960485045995002948607600604406559062549703501
t=10
import gmpy2
for k in range(-1000000,1000000):
x=gmpy2.iroot(k**2+4*t*n,2)
if x[1]:
p=(-k+x[0])//(2*t)
q=t*p+k
break
import gmpy2
from Crypto.Util.number import long_to_bytes,bytes_to_long
phi=(p-1)*(q-1)
e=57742
c=57089349656454488535971268237112640808678921972499308620061475860564979797594115551952530069277022452969364212192304983697546604832633827546853055947447207342333989645243311993521374600648715233552522771885346402556591382705491510591127114201773297304492218255645659953740107015305266722841039559992219190665868501327315897172069355950699626976019934375536881746570219967192821765127789432830133383612341872295059056728626931869442945556678768428472037944494803103784312535269518166034046358978206653136483059224165128902173951760232760915861623138593103016278906012134142386906130217967052002870735327582045390117565
t=gmpy2.gcd(e,phi)
d=gmpy2.invert(e//t,phi)
m=pow(c,d,n)
msg=gmpy2.iroot(m,t)
if msg[1]:
print(long_to_bytes(msg[0]))
AFFINE
研究研究脚本,发现是仿射密码
求解仿射密码需要两组明文与对应的密文来求出系量和增量,题目中我们已知flag是明文的一部分,我们直接爆破获取密钥然后解出密码
letter= 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'
meg='xGJ13kkRK9QDfORQomFOf9NZs9LKVZvGqVIsVO9NOkorv'
known='flag'
for i in range(90):
for j in range(90):
c=[]
for len in range(4):
ch = known[len]
t=(letter.index(ch) * i + j) % 62
c.append(letter[t])
d = ''.join(c)
if d in meg:
print("i=",i)
print("j=",j)
flag = ""
for c in meg:
for m in letter:
if letter[(11*letter.index(m)+17)%62] == c:
print(m,end='')
运行脚本后得到flag,进行md5加密后得出正确flag
CLICK
查看源码,分析main.js
发现有一串base64,我们解密一下得到flag
Web-sign in
我当然知道robots协议了,我们在后面加上/rotbots.txt
我们访问这个PHP,Ctrl+U拿到flag
hiahia o(*^▽^*)┛
直接IDA打开,F5看一下伪代码
看看flag函数
哇哦,虽然看起来很复杂,但其实就是简单的ASCII加减运算,直接使用python还原一波
def get_flag(a1,a2):
v3 = ord(a1)
if (a2>9):
if a2%2 ==1:
v3+=13
if a2&1 == 0:
v3 = ord(a1) -11
else:
if a2%2 == 1:
v3+=5
if a2&1 == 0:
v3 = ord(a1)-3
return chr(v3)
v4 = "igdb~Mumu@p&>%;%<$<p"
for i in range(20):
flag = get_flag(v4[i],i)
print(flag,end='')
运行得到flag
ANDROID
直接jeb反编译源码
反编译到了有兴趣的内容,就是个java代码,给了两个数组,分析运算的过程
算法分析可知:当i是个偶数的时候,flag对应的字符可以由列表1对应下表的数字和i异或得到
a1 = [102, 13, 99, 28, 127, 55, 99, 19, 109, 1, 121, 58, 83, 30, 79, 0, 64, 42]
a2 = [42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42]
a3 = []
for i in range(17):
if i%2 == 0:
a3.append(a1[i] ^ i)
print(a3)
得到了
[102, 97, 123, 101, 101, 115, 95, 65, 80]
利用上面求出的一半flag的ASCII码可以用类似的异或操作求出下一半
[108, 103, 82, 118, 114, 101, 95, 80]
对应ASCII码得到最终flag