Misc

签到

打开签到文件,可以看到有个文件夹,一直往里面点,点到最后一个“}”文件夹然后查看路径,再把不用的东西删掉就可以得到flag了

img

flag:QLNU{peng_you_men_juan_qi_lai}

显而易见

首先用stegslove打开图片,对每一个通道进行查看

img

发现了提示,是jpg隐写,然后可以查看misc的大纲了,对着大纲做题真的很爽

这个题是steghide隐写

steghide隐写是分为有密码和没有密码的,在虚拟机进行解密,首先需要下载steghide的模块

然后开始解密

1
2
steghide extract -sf out.jpg
steghide extract -sf out.jpg -p 123456

用没有密码的命令提取,发现让我输入passward,说明有密码,密码就是图片上面显示的内容

wo_jiu_shi_mi_ma

输入上去,解密成功

img

得到flag.txt

img

flag=QLNU{593f92da-233d-45cf-a802-9c4ca1e1b99c}

找不同

这里给了两张一样的图片,根据hint可以判断为双图盲水印

去网上搜索发现,可以使用blindwatermark-master

这有Python2和Python3的脚本,根据不同的Python的环境进行选择

如果是Python的话可以直接用脚本

1
2
python2  /root/ctf/BlindWaterMark/bwm.py decode 3.png 4.png flag 4.png 
python3 /root/ctf/BlindWaterMark/bwm.py decode 3.png 4.png flag 4.png --oldseed

img

然后就得到了所需要的图片

img

flag如图所示

QLNU{BWM_hard_to_see}

简单流量

首先打开文件之后是一个pacpng后缀的文件,这个就是流量包文件的格式,需要专门的工具wireshark来打开了

首先用wireshark打开流量包

img

选择一个数据包,然后右击追踪tcp流吧

img

在这里看到了通过一堆蓝色的东西和一堆红色的东西

据了解,有一个http的协议

HTTP协议(超文本传输协议HyperText Transfer Protocol),它是基于TCP协议的应用层传输协议,简单来说就是客户端和服务端进行数据传输的一种规则。

首先作为发送端的客户端在应用层(HTTP 协议)发出一个想看某个 Web 页面的 HTTP 请求。

接着,为了传输方便,在传输层(TCP 协议)把从应用层处收到的数据(HTTP 请求报文)进行分割,并在各个报文上打上标记序号及端口号后转发给网络层。

在网络层(IP 协议),增加作为通信目的地的 MAC 地址后转发给链路层。这样一来,发往网络的通信请求就准备齐全了。

接收端的服务器在链路层接收到数据,按序往上层发送,一直到应用层。当传输到应用层,才能算真正接收到由客户端发送过来的 HTTP请求。

所以可以知道这些内容大概是向服务器传输请求,然后服务器对于我的请求给出相应的响应

红色的是个人向服务器请求的包,蓝色是服务器对于请求所返回的响应包

然后从下往上,找到最后的流量包,tcp追踪一下,看到了这个界面

然后就可以看到这里有一个fffffllaaaaggg.php,而且还在一个pk下,说明是有一个压缩包

img

为了方便复制出压缩包,所以要变成原始数据,也就是16进制的编码、

img

复制一下代码

504b03040a0009000000646c775679a3ec983f0000003300000012001c0066666666666c6c616161616767672e70687055540900038b551c648b551c6475780b000104520000000452000000c2cabe66a8454fc5cb86b0b8b19fcb8c9dd1b73fa15a58d0cb42e57da9a165cc15647d5fbbd9fa4199c8a1bdada2a00091d9f03b4375a9470573faf65c0287504b070879a3ec983f00000033000000504b01021e030a0009000000646c775679a3ec983f00000033000000120018000000000001000000a4810000000066666666666c6c616161616767672e70687055540500038b551c6475780b000104520000000452000000504b05060000000001000100580000009b000000000065323965360d0a300d0a0d0a

然后把这些字符串放到010中,生成压缩包

新建文件,然后 编辑—>粘贴自—粘贴十六进制文本

或者ctrl+shift+v,然后保存成zip格式

但是有密码,所有还得回去找密码

img

每一个数据流都找一找

img

都这样拿去解密一下

img

得到了压缩包的密码,G0od_paSsWoRd

然后去解压压缩包,打开php文件,ctrl+u查看网页源码

得到flag

img

flag = QLNU{An7sw0rd_f1ow_alSo_e@sy}

找图片

这是一个office word的密码爆破

这里是用到的hashcat

hashcat是用显卡爆破,但是我的是集显,有点谢特,难以操作

首先是下载一个officejohn2.py,获取哈希值

通过脚本跑出来docx文件的哈希值

img

去网上查询到,这个是0ffice 2003,哈希值是9600

然后用hashcat进行爆破一下

使用命令

hashcat -a 3 -m 9600 $office$20131000002561696e0cea33c94d4da946330ec7f2b1365ea07e5fa882e2c258a2edd79580 d22f1*07d4aa4672c59dc93f0f379f6d20bf4019a5b0a56501d9bca4452d0fe89f66aa ?d?d?d?d?d?d?d

然后开始爆破

img

cv工程师的基本修养(我都电脑爆了一晚上也没出来什么结果,就用孙世昌的顶替一下)

得到密码:3322583

解开docx文档的密码

img

打开提示还有一张,往下一拖,就得到了flag

flag:QLNU{32e3c1b9-cl8a3-4906-a152-Of1c3f174ec9}

摩拉克斯(no)

Crypto(no)

1

题目如下

1
2
3
4
5
6
7
from secret import flag
from Crypto.Util.number import bytes_to_long

m = bytes_to_long(flag)
print(m)

# 2191791638908840156765536270892615890049122589128917876054775676626045

本题函数很简略的就是一个bytes和long的相互转化

最重要的就是调用一下crypto函数

但是直接pip install crypto现在是已经不行了

因为crypto已经不提供服务了,所以要换一个下载

下载之前去编译器把已经下好了的crypto库给卸载了,都删干净,不然存在调用优先级,还是会先用那个库导致还是报错

pip install pycryptodome

然后就可以直接调用最简单的一步出flag

1
2
导入long_to_bytes函数 from Crypto.Util.number import long_to_bytes  flag=long_to_bytes(2191791638908840156765536270892615890049122589128917876054775676626045)
print(flag)

img

flag:QLNU{Welcome_to_Crypt0_Wor1d}

2

题目

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
from secret import flag
from Crypto.Util.number import bytes_to_long,getPrime
import libnum
# 阅读代码的能力也是必须的哦
flag1 = flag[:len(flag)//2]
flag2 = flag[len(flag)//2:]

m1 = bytes_to_long(flag1)
m2 = bytes_to_long(flag2)


def challenge1(m):
p = getPrime(1024)
q = getPrime(1024)
e = 3
n = p*q
c = pow(m,e,n)
print ("n1=",n)
print ("e1=",e)
print ("c1=",c)

def challenge2(m):
p = getPrime(1024)
q = getPrime(1024)
n = p*q
phi_n = (p-1)*(q-1)
while True:
d = getPrime(256)
if (libnum.gcd(d, phi_n) == 1 and 36 * pow(d, 4) < n):
break
e = libnum.invmod(d,phi_n)
c = pow(m,e,n)
print ("n2=",n)
print ("e2=",e)
print ("c2=",c)


challenge1(m1)
"""
n1= 17794322651985244360398798297236427197573099919777514390150548716043011554909472386538419547646479217198212860392441088306482436079057597017673282668575104805696280644632851112533403306674446415017207139655032895492883126061112607345051218406669295154148958166274223016727551462902566417623047515071725277952574163061484432382823360998093917106149223318057791276272014868197026724133570608265590284050526460086825829070086760617092472050523406342180114072290933789764539189990961852638276421000034476472644757648042472764152115642143975454219099357466733210241984509297458075644727434818666677787414405014312485796877
e1= 3
c1= 1677407691835378198546657984223033477067493258850917927258352885520853732106150834607491649923038875268749604055578354093790916134845045758103489513761
"""
challenge2(m2)
"""
n2= 28764801891789630496158814107080280277129502361885222750082931951763197520627874705493345391184359108052978734919530375982818388373339206160218665275185601487103229570607819926113211153276542794365361104430082886339857276733492860339158729793976251480644019363618395047922069151455888530980320799065099543029094821092174328932901892049723862108644692248879129903763321885608879912420989261553280584980567748492711574994986214234350421900028706698190893297507027399412244052287754949432571827799437153212833094683689783752996417279952432942753568479754941623066905711324867955960167005070199455435147452836309126906689
e2= 704703041144161577012087456962842558336673764999654897668687010636927707025602054444354219778297700025759519613233509979555365795481578339351421529962881828041145966504800164692212600548676492959357409580016951536391396052780299206338725968939324161070771908294718717256193742456675415335048405717976288953597614820809458361599091353315706929802591235336969094270784765619059768027279430682498525232895575015433173059620825639441417362939309239535120311284043598713270951064688241406088374817444860613773911719770085809168462743751201411017304148214621214323182377222124862116850365217134192566868062790147116360325
c2= 3866285343510070083843161056507294375390716979334211957925424967972852907319726974524439549790432648684090478346561160514189492737204174375363568105167990348408074584350091709078165069987747442114703962691664627250544741977495737664347880190406218395917102999140628020486151094186478587531410396120883481857200470129442887105515526164873980943607492720026927216851742181529233646089914113373499946092277370990871673101990023285241588799357977463021397782746204431918110203057893107358565558349933724569763816796275443109700621987152070902253447675368970939979877470783869101009631358741569724263427019402694253315975
"""

本题主要是将flag分成了两部分

第一部分的e1=3,可以判定为是低指数加密

第一部分直接用星爷的脚本直接嗦了

第二部分的e2很大,winner维纳攻击,用一下星爷的脚本

也是直接用星爷的解题脚本,一把嗦了

img

前后连起来

flag: QLNU{e57885f7-bb8e-4a 32-95a3-8d053e0d0764}

3

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
from secret import flag
from Crypto.Util.number import bytes_to_long,getPrime

assert flag[:5]==b'QLNU{' and flag[-1:]==b'}'
m = bytes_to_long(flag)


p = getPrime(1024)
q = getPrime(768)

hint = p**3 + q**2 + 647**6 + 653522531*15 + 9
n = p * q
e = 65537
c = pow(m,e,n)




print('e =',e)
print('c =',c)
print('hint =',hint)
print('n =',n)

"""
e = 65537
c = 71006103372412044312819415754890236591010667290476171732849891031154161413755756389800031863634501968018973467994336921863576045927865057620110276133007713394607890961299688961072344705219549236488634012357200622261985508555546257123851675662932077761718811343763329757348379337874687284169335699712263079874026606077256470412455955555001948525310460766417311320754027857069001783963330608415206416087008625618806534900951705480932603981460028570259100040394319693229444019729643289680350720405041972843156579023545489559211823014364723365
hint = 763988131420320188479892287267696489693396898988105285846900692836754599870159523586378097011331586604180594063858628653160374239087049720173273678997338656365290709175007462308792914764526938138682615513678977756046442022565426509529058163085713367064159219029236072276269919500619494538505141786746087592664650756173248773382978137789826117651006728629279458560271573846908938345822453005130071054010616749156629583078397037500477872504767682172353097156891520577850342314503906130598715529966031568908756077232337382426632008061010900144961139303263727332977956017214420922179906897445364947617712539526290564738019842221362720681462392443568054084727743685697670839411948419531440915662698528122732843223199635984625606055022505075833481655072423339796902426998391099759213144574465170323947529123968023330138074183035345449975498762386946018715765891508629051064752285064503821804187068577224459514916723382079436021471
n = 105361355921951406643065722436313111246476986934021086173449727693279893065728667917709118878188948228194465347089170930695097516066620270901945303316964510010107090704402489648436400663026405879196957932589771399882776268958933339208259789349792421639569172020234415156529867093982373273980906179294820018512047476786638890884024189564528513736425987699351218749032372724008052769632106170152224310382368197368520228134396942550906922599026196447360906637679928259938669021204162648957102935522653270640038794869782779949024288669057427837
"""

本题是p和q两个素数,p是1024位,q是768位,p》q

hint是一个超级大的值

所以从公式来看,hint无限趋近于p^3

所以对hint开三次方,所以可以近似求出p的值

然后由于n=p*q,所有可以求出q的值=n//p

然后求出p和q就可以去解密了

分析完了直接脚本解密

1
2
3
4
5
6
7
8
9
10
11
import libnum
e = 65537
c =71006103372412044312819415754890236591010667290476171732849891031154161413755756389800031863634501968018973467994336921863576045927865057620110276133007713394607890961299688961072344705219549236488634012357200622261985508555546257123851675662932077761718811343763329757348379337874687284169335699712263079874026606077256470412455955555001948525310460766417311320754027857069001783963330608415206416087008625618806534900951705480932603981460028570259100040394319693229444019729643289680350720405041972843156579023545489559211823014364723365
hint =763988131420320188479892287267696489693396898988105285846900692836754599870159523586378097011331586604180594063858628653160374239087049720173273678997338656365290709175007462308792914764526938138682615513678977756046442022565426509529058163085713367064159219029236072276269919500619494538505141786746087592664650756173248773382978137789826117651006728629279458560271573846908938345822453005130071054010616749156629583078397037500477872504767682172353097156891520577850342314503906130598715529966031568908756077232337382426632008061010900144961139303263727332977956017214420922179906897445364947617712539526290564738019842221362720681462392443568054084727743685697670839411948419531440915662698528122732843223199635984625606055022505075833481655072423339796902426998391099759213144574465170323947529123968023330138074183035345449975498762386946018715765891508629051064752285064503821804187068577224459514916723382079436021471
n =105361355921951406643065722436313111246476986934021086173449727693279893065728667917709118878188948228194465347089170930695097516066620270901945303316964510010107090704402489648436400663026405879196957932589771399882776268958933339208259789349792421639569172020234415156529867093982373273980906179294820018512047476786638890884024189564528513736425987699351218749032372724008052769632106170152224310382368197368520228134396942550906922599026196447360906637679928259938669021204162648957102935522653270640038794869782779949024288669057427837
p = libnum.nroot(hint,3)
q = n//p
phi_n = (p-1)*(q-1)
d = libnum.invmod(e,phi_n)
m = pow(c,d,n)
print(libnum.n2s(m))

img

FLAG:QLNU{That_ca1culaTe_re4lly_Ea5Y_alright}

4

伪随机算法

不会……

Re

再仔细一点就会爆炸

拖动到ida中查壳,看到是upx的壳

img

Upx -d 脱掉了一个壳哟

img

然后用ida64为反编译一下

img

看到了好多字符串,但是是乱序的,而且因为是QLNU的比赛,所以对于8176很敏感,把这些数字都变成字符看看

img

然后按照顺序把flag连起来即可

QLNU{Welcome_to_the_competition}

动次打次

通过题目不难猜出,本题考的是动调

还是先查壳,没壳

而且是linux系统,那就是需要远程动调了

img

先用ida反编译一下

img

分析这段函数,在strcmp函数段是s1是输入的字符串,s是flag进行加密得到的字符串,所以可以在strcmp函数段设置断点,进行动调

img

然后在linux打开远程调试的程序

img

然后就开始动调

img

选择Remote Linux debugger

img

点击ok之后到这这个页面

img

到了这里函数停止了,应该是因为有一个scanf函数,让我输入,在等待输入,所以才会停止

(比赛的时候以为动调不出来,蠢了蠢了)

去虚拟机看一下程序,就可以看到他在等待输入呢

img

随便输入之后,就来到了动调成功的界面

img

单击就出来啦flag!

img

flag:QLNU{Cr@zy_Sund@y}

APK

打开是一个啊apk文件,有点不会,慢慢来吧

据学姐透露,说是jadx反编译java很好用,咱今天试试

img

把apk文件拖动到jadx里面

img

之后就是从一堆数据中找到main函数,来解密

img

这个函数包括了加密函数和解密函数,可以直接调用加密解密函数

本题的环境是jdk1.8,所以需要安装相应的版本才可以运行

运行Java程序推荐使用idea

然后复制一下xxx加密和解密函数

img

用xxx里面的解密函数新建一个函数,然后再main函数调用解密函数,输入代码进行解密

img

在apk反编译的时候,找main函数优先到com中查找,然后在除了谷歌的文件夹下找main函数得到flag

img

QLNU{Its_t1m3s_t0_dr1nk_@_Cup_0f_T3a}

兔兔兔兔兔兔兔兔

首选打开文件,是一款游戏

img

试着运行一下exe文件

只能说游戏很好玩

img

拖入die查壳

img

然后把main函数拖动到ida中反编译一下

img

发现很多Python的代码,而且很乱,加上之前的那些py文件,基本上可以判断出来这个就是pyc反编译了,需要把exe文件先转化为pyc,然后在把pyc转化为py文件,然后再查看源代码进行解密

首先先用pyoinstall将exe文件反编译为pyc文件

首先把pyinstxtractor.py文件复制到re4的文件夹下面

然后使用命令 Python pyinstxtractor.py xxx.exe

将exe文件反编译成.pyc文件

img

img

然后pip3 install uncompyle6,下载这个包

然后在刚生成的文件夹进入cmd,输入命令

uncompyle6 -o main.py main.pyc

生产新的py文件

img

pycharm打开py文件

img

面向wp做题是说这个magic是仿射密码,浅浅学习一下

在仿射密码中,加密函数定义为: e(x)=(ax+b)mod26

img

为这样的函数被称为仿射函数,所以这样的密码体制也称为仿射密码(可以看出,当a=1时,其对应的正是移位密码)。

img

首先看到from secret import flag

可以看一下secret的函数,里面肯有flag

img

unompyle6一下secret.pyc,变回py文件

img

img

这样就得到了flag的密文形式,之后去main函数找加密过程

img

magic函数就是一个仿射密码,他会有多轮自加密模式

然后在刚打开软件的时候,显示得到114514分就可以通关,所以可以猜测加密了114514次

并且也可以在函数中看到,114514次循环

img

然后写一下解题的脚本,调用类

img

输出结果

flag: QLNU{L0ve1y_RabBit_aNd_Re_pyth0n_with_you}