2024-MOECTF
RE
xor
先用exeinfo查看exe文件
得知是64位的c编译的文件,就拿ida去反编译
大致的解密思路就是用数组里面的密文去异或0x24,直接写py脚本
找到密文所在位置
1 |
|
TEA
查看文件位数
去ida反编译
发现是tea加密算法(好像被改过了),去参考https://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm
接下来写解密脚本,这边有一个坑就是要注意ida当中的整数的位数,默认是32,所以在写解密脚本的时候也要关注整数变量的位数
1 |
|
SecretModule
可能被我非预期了
直接查看customize.sh文件,解密其中的base,得到shell脚本
1 |
|
大致意思是说根据你的7次不同的操作要么在字符串中拼接“114514”,要么拼接“1919810”,拼接后的字符串的md5为77a58d62b2c0870132bfe8e8ea3ad7f1的话,包裹上moectf就是flag了,直接用python脚本遍历2^7种所有的情况
1 |
|
逆向工程入门指北
逆向工程进阶之北
1 |
|
这边注意先加减后异或的运算顺序,因为python没有防止溢出的机制,所以得自己判断32位的溢出
Cython-Strike: Bomb Defusion
题目给了pyd文件,那就直接import
然后执行一下help方法,注意源文件文件名我并没更改
1 |
|
运行结果
1 |
|
发现我们其实得到了类似伪代码的结果,我们大致理一下这个伪代码
1 |
|
我们先去DefuseKit看看bomb变量的值
1 |
|
1 |
|
发现说让我们用read_memory遍历去读取内存,那我们就按它说的做
1 |
|
1 |
|
去解密一下得到
找到关键的代码
1 |
|
我们猜测和mask有关系,就先去查看bomb类中的mask
1 |
|
得到mask是7355608,仔细分析if里的条件,注意第一个条件其实是int ^ (ma == 114)注意运算顺序!!!所以关键是根据第二个条件进行爆破
1 |
|
得到密码3786171
再去解炸弹
1 |
|
得到flag
UPX
直接用upx -d脱壳,然后放入ida,shift+f12看所有字符串
upx-revenge
UPX脱壳,只是要010要修改一点东西
然后用upx -d脱壳
去ida查看
直接得到flag
moedaily
比较恶心的一题逆向题,大致思路是对你输入的flag每四位进行一个128的循环加密,它恶心就恶心在加密过程要自己推,不是直接全给你,以下是我推出来的加密过程
1 |
|
根据这个加密去写解密就方便许多
1 |
|
总之这个题目肝了三小时代码
babe-z3
z3方程求解,先正常脱壳,放进ida查看
根据最后一个if可以知道我们只要求解满足红框内的方程的v11,v12,v13和s即可,直接用python的z3库
1 |
|
注意解出来的数字通过n2s函数转成字符串同时还要逆序一下,因为v11,v12,v13和s都不是用char类型读取出来的,都是小端序,但是flag读进去的时候根据ida可知使用char类型读入的,所以要逆序一下
moectf{9c0525dcbadf4cbd9715067159453e74}
dynamic
直接动态调试进入第一个加密函数查看a1数组的值
xtea
动调可以知道,明文一共12位,第一次对前面的8位进行了加密,第二次对后面的8位进行了加密。实际上中间的8位加密了两次,根据这个再加上xtea算法就可以得到exp,我分别写了c和python的exp,其中c的exp自己还需额外将16进制转成字符,python则直接出结果
1 |
|
1 |
|
其中要注意的是汇编中的对数组的操作
汇编中的x4不用在解密中体现,因为汇编中的数组按字节进行移动而数组是dword所以对偏移量要x4表示一下子移动四个字节
d0tN3t
dll的逆向题目使用dnSpy工具去逆向
得到反编译的代码,根据这个去逆向
1 |
|
rc4
非常简单的一题常规的rc4
因为是常规的rc4,所以我这边直接上大厨解了
下面是用脚本解的
1 |
|
xxtea
没啥魔改,正常的xxtea,密钥题目有写,直接逆向
1 |
|
逆向的时候注意大小端序!!
moejvav
jadx逆向,但是有点不准确,直接用idea逆向是准确的
应该把i++放到if之后,整个脚本的大致意思就是根据他提供的一些像机器码的东西来验算你输入的flag,我进行了两种解题方法,直接爆破flag输入和直接逆向方法
直接爆破的exp,没什么好说的,逻辑一样只需要不断累加flag里的字符就行,特别需要关注最后转成字符的时候根据题目还需要逆向一下并且可能出现在256下互补的情况!!!
1 |
|
直接逆向的脚本存在一定的侥幸,脚本中没用到&和|,不然异或不了
其中要特别关注的是,操作码存在在数组中的位置是奇偶交替的,并在每次输出flag之后更新,我在脚本中添加了变量f2来适应这种情况
1 |
|
就复杂度来说肯定是脚本二更好
sm4
直接将解密函数的栈内数据改成enc的数据,加密的时候注意输入48位,这样才能解密成功
更简单的方法是将汇编的待解密的数据地址直接指向enc
改成A0是因为在栈中,enc的地址是-100h
此时只需要将A0h-100h相对地址算出来,发现是负的就再+100h,结果就是A0,所以改成A0自然就指向enc的地址了
patch完之后要进行保存edit->patch program->apply patches
现在再直接进行调试,特别要注意随意输入也要48位
moeprotector
先upx脱壳,比较简单就不说了,然后用ida打开
查看流程图
可以看到有一个try语句,正常不产生错误是往左边走,那就一直在左边循环,但是很明显可以发现,我们得往右边走,那就得触发except语句,看到左边的逻辑其实是对输入的数字做除法运算,那就输入的除数为0,就可以触发异常,注意在右边提前下一个断点,不然走太快
输入之后会有报错,这个报错表示异常触发,直接点确定,然后再点f9
出现异常怎么处理的选择,我们需要选择第一个,也就是把异常抛给程序
可以看到已经在我之前下的断点处停了下来,接着直接f8,慢慢下去
发现需要输入了,那就输入57个’a’,至于为什么是57个,其实你按流程图走到最后,会发现
这边再循环比较,所以byte_883658数组中存的大概率就是密文了,进去看一下刚好57位,所以上面输入57个’a’,接着调试发现直接报
被反调试了,在调试前选择插件
然后接着去调试,发现这次没有报错
一步步调试下去
这一部分没进行加密操作
这一部分进行了加密操作,大致流程是对明文进行每4位的加密,因为明文是57位,所以最后一位在单独加密,大胆猜测所有位都和最后一位的加密的方式相同,所以按最后一位来
之后还有两处和上面差不多的加密的方式,我这边直接贴图就不详细分析了
第二处
第三处
所以整个加密流程是这样的
1 |
|
写脚本解密
1 |
|
ezMAZE
就是一个迷宫一样的东西,输入符合条件的wasd,给你flag
switch就是在不断的循环检测你输入的wasd字符串符不符合要求
然后根据这个函数加上你之前输入的wasd字符串来计算flag,将flag中间的数字替换成你计算出来的数字
这题直接逆有点不现实,所以要考虑爆破,在爆破中简单加一点回溯的机制就行了
1 |
|
得到wasd字符串去计算flag
1 |
|
Just-Run-It
第一段flag是exe直接脱壳后ida逆向
6257396c5933526d657a55355a6d45
第二段flag直接去Linux下运行elf的文件
324d444a6a4c5459794e4745744e44
第三段flag用android14的系统去运行apk
42694e7930345954566a4c57557a4e
第四段flag去github查看有没有riscv架构的docker镜像
找到了镜像https://github.com/DavidBurela/riscv-emulator-docker-image去安装直接运行文件
[87, 85, 49, 78, 122, 82, 106, 90, 106, 108, 105, 79, 88, 48, 61]转字符WU1NzRjZjliOX0=
第四段flag用android14的系统去运行apk
flag=moectf{59fa602c-624a-40b7-8a5c-e35e574cf9b9}
SMCProMax
题目提示SMC,意思就是在程序运行过程中程序会更改,查看ida
发现关键函数点进去查看
发现在对内存地址的值进行异或0x90的操作,我们就去查看那边的内存
发现确实有一串奇怪的数字
两种解法
解法一:动调,观察内存中的变化
下个断点直接调试,再去查看内存
发现确实变了
按c转汇编,之后就右键,创建函数
反汇编之后得到
逻辑就是每四个字节按条件循环32轮之后与!=的密文进行比较
这边要注意在第一行
第23个字节xor了12所以后面得异或回去,直接写脚本
爆破的c脚本
1 |
|
flag解析脚本
1 |
|
解法二就是写idc脚本
1 |
|
在文件选项那边选择脚本命令输入这个脚本点run就可以改对应的内存,之后的操作和解法一一样了
xor(大嘘)
直接ida分析
可以知道byte中是数组而sub是加密函数,我们追踪一下sub函数
看到只是简单的异或但是其实没有那么简单,我们在return下个断点
执行下去发现并没有直接的return,发现了两个关键的函数,我们去查看第二个关键的函数
可以看到是其实是一个魔改过的tea加密算法,接着往下追踪
tea加密完之后还会去一个新的函数中,我们接着追踪一下
发现进行一系列的初始化操作之后又进入了一个新的函数,我们接着点击这个函数
发现其实就是每位的循环异或所以整个加密的流程就是
1 |
|
我们解密只要反过来就行
先循环异或
1 |
|
再tea解密
1 |
|
再循环异或
1 |
|
特工luo: 闻风而动
先根据提示用hashcat去爆破wifi密码
首先需要通过 Hashcat 网站将 cap 文件转换为 hc22000 格式
网站地址:https://hashcat.net/cap2hashcat/index.pl
再进行hashcat的爆破
1 |
|
这里,-m 22000
是用于 WPA/WPA2 的模式,-1 <custom_charset>
是你的自定义字符集,?1?1?1?1?1?1
表示你想要尝试的密码长度(6个字符)。根据需要调整长度和字符集。
直接爆破出来密码pzyisxnn,运行keygen程序能得到服务器的密码4g3n71u0
v4明文
v14密文
v5明文长度0x42(66)
v7长度,v14密文
a1密文,a2长度,a3密钥,a4=1
密钥生成算法
WEB
弗拉格之地的入口
打开换进提示爬虫,猜测可能要目录扫描,根据多年经验先访问robots.txt,发现路由
直接去访问得到flag
ez_http
简单的http入门
先用post
提示传参
再用get传参
改变refere
去添加cookie
去改变浏览器
用本地去访问
最后得到flag
ProveYourLove
师傅们整活,首先抓包再说,然后爆破400次就可以了
弗拉格之地的挑战
根据提示去访问路由,查看源代码
得到flag1=bW9lY3Rm,接着去访问下一个路由
查看响应得到flag2=e0FmdEV,接着去访问下一个提示的路由
获得flag3=yX3RoMXN,去访问下一个路由
首先修改referer,然后再去js代码审计
发现实质是用post方法去传参数
得到flag4=fdFVUMHJ,再去访问下一个路由
接着js审计
得到flag5=fSV90aDF,再去访问下一个路由
得到flag6=rZV9VX2t,去访问最后一个路由,终于要结束了nnd
得到flag7=rbm93X1dlQn0=
所以flag=bW9lY3Rme0FmdEVyX3RoMXNfdFVUMHJfSV90aDFrZV9VX2trbm93X1dlQn0=
去base64解密一下得到moectf{AftEr_th1s_tUT0r_I_th1ke_U_kknow_WeB}
pop moe
一题反序列化题目,好久没做了,果然还是生疏了,也遇到了新的知识点
1 |
|
特别要注意的是
1 |
|
$this->sec并不冲突,一开始我以为$this->sec既要是new class003又要是执行的shell命令,后来发现真正是shell命令是在class003中的mystr中的
垫刀之路01: MoeCTF?启动!
ImageCloud前置
经典ssrf
垫刀之路02: 普通的文件上传
直接上传php木马后利用(连后缀什么的都没检查,根本不用绕过)
垫刀之路03: 这是一个图床
前端的后缀绕过
直接去访问
静态网页
点击换装抓包得到提示
电院_Backend
sql万能密码
1 |
|
勇闯铜人阵
算一个简单的游戏题吧,不过要写自动化的脚本才行,除非你手速过快
1 |
|
垫刀之路04: 一个文件浏览器
目录穿越秒了
从零开始的 XDU 教书生活
代码审计(其实也不算
直接上exp
1 |
|
思路大致就是先去登录,然后获取学生的用户名,然后帮学生签到,签到完成后结束签到就能获得flag(整个脚本可能要运行5分钟左右
ImageCloud
SSRF,用外网去访问内网的文件
内网的端口需要自己5001-6000爆破一下
垫刀之路05: 登陆网站
万能密码直接登录
垫刀之路06: pop base mini moe
存粹的反序列化考点,私有属性赋值只能在自己的类中进行
1 |
|
这边不能用eval,要用system,用eval会提示没有这个方法
垫刀之路07: 泄漏的密码
直接访问/conole输入pin码
who’s blog?
直接fengjin的ssti注入一把梭
PetStore
代码审计,一般这种题建议先自己在本地搭docker慢慢打,然后打出来了直接去用exp
追踪import路由
发现存在pickel反序列化,要考虑能不能用反序列化的漏洞,看到反序列化过程中利用了try语句说明我们的报错回显是不可能了,那就是没有直接回显了,题目也不能出网,我们接着看下去发现一个路由
这个路由仿佛提供了回显的点,我们只要想办法把我们的回显写入pet.name中就行,直接上exp
1 |
|
本地运行结果(远程忘记截完图了我太懒了hhhh
PWN
NotEnoughTime
这一题我在新生赛上做过
直接上exp了
1 |
|
MISC
ez_F5
不用多说直接f5隐写,上工具
得到output.txt里面就是flag,其中-p参数后面的密码隐藏在jpg文件的详细信息里,用base32加密了
readme
知识点就是proc虚拟目录读取加载进程序的文件即使程序被删除了
moejail_lv4
1 |
|
具体可以参考https://stackoverflow.com/questions/28100471/how-eval-is-not-dangerous-in-this-example