type
Post
status
Published
date
slug
summary
tags
CTF
推荐
category
CTF-WP
category (1)
icon
password
comment

RE

xor

先用exeinfo查看exe文件
image-20240810090302670
image-20240810090302670
得知是64位的c编译的文件,就拿ida去反编译
image-20240810090608094
image-20240810090608094
大致的解密思路就是用数组里面的密文去异或0x24,直接写py脚本
找到密文所在位置
image-20240810090906624
image-20240810090906624
image-20240810091009695
image-20240810091009695

TEA

查看文件位数
image-20240810091203700
image-20240810091203700
去ida反编译
image-20240810092122681
image-20240810092122681
发现是tea加密算法(好像被改过了),去参考https://en.wikipedia.org/wiki/Tiny_Encryption_Algorithm
接下来写解密脚本,这边有一个坑就是要注意ida当中的整数的位数,默认是32,所以在写解密脚本的时候也要关注整数变量的位数

SecretModule

可能被我非预期了
直接查看customize.sh文件,解密其中的base,得到shell脚本
大致意思是说根据你的7次不同的操作要么在字符串中拼接“114514”,要么拼接“1919810”,拼接后的字符串的md5为77a58d62b2c0870132bfe8e8ea3ad7f1的话,包裹上moectf就是flag了,直接用python脚本遍历2^7种所有的情况

逆向工程入门指北

image-20240810104507232
image-20240810104507232

逆向工程进阶之北

这边注意先加减后异或的运算顺序,因为python没有防止溢出的机制,所以得自己判断32位的溢出

Cython-Strike: Bomb Defusion

题目给了pyd文件,那就直接import
然后执行一下help方法,注意源文件文件名我并没更改
运行结果
发现我们其实得到了类似伪代码的结果,我们大致理一下这个伪代码
我们先去DefuseKit看看bomb变量的值
发现说让我们用read_memory遍历去读取内存,那我们就按它说的做
去解密一下得到
image-20240816154451057
image-20240816154451057
找到关键的代码
我们猜测和mask有关系,就先去查看bomb类中的mask
得到mask是7355608,仔细分析if里的条件,注意第一个条件其实是int ^ (ma == 114)注意运算顺序!!!所以关键是根据第二个条件进行爆破
得到密码3786171
再去解炸弹
得到flag

UPX

直接用upx -d脱壳,然后放入ida,shift+f12看所有字符串
image-20240818093119245
image-20240818093119245

upx-revenge

UPX脱壳,只是要010要修改一点东西
image-20240818103344425
image-20240818103344425
然后用upx -d脱壳
image-20240818103427699
image-20240818103427699
去ida查看
image-20240818103510717
image-20240818103510717
直接得到flag

moedaily

比较恶心的一题逆向题,大致思路是对你输入的flag每四位进行一个128的循环加密,它恶心就恶心在加密过程要自己推,不是直接全给你,以下是我推出来的加密过程
根据这个加密去写解密就方便许多
总之这个题目肝了三小时代码

babe-z3

z3方程求解,先正常脱壳,放进ida查看
image-20240818185405155
image-20240818185405155
根据最后一个if可以知道我们只要求解满足红框内的方程的v11,v12,v13和s即可,直接用python的z3库
注意解出来的数字通过n2s函数转成字符串同时还要逆序一下,因为v11,v12,v13和s都不是用char类型读取出来的,都是小端序,但是flag读进去的时候根据ida可知使用char类型读入的,所以要逆序一下
moectf{9c0525dcbadf4cbd9715067159453e74}

dynamic

直接动态调试进入第一个加密函数查看a1数组的值
image-20240819123342129
image-20240819123342129

xtea

image-20240820192947455
image-20240820192947455
动调可以知道,明文一共12位,第一次对前面的8位进行了加密,第二次对后面的8位进行了加密。实际上中间的8位加密了两次,根据这个再加上xtea算法就可以得到exp,我分别写了c和python的exp,其中c的exp自己还需额外将16进制转成字符,python则直接出结果
其中要注意的是汇编中的对数组的操作
image-20240820193306719
image-20240820193306719
汇编中的x4不用在解密中体现,因为汇编中的数组按字节进行移动而数组是dword所以对偏移量要x4表示一下子移动四个字节

d0tN3t

dll的逆向题目使用dnSpy工具去逆向
image-20240821100447344
image-20240821100447344
得到反编译的代码,根据这个去逆向

rc4

非常简单的一题常规的rc4
image-20240821110821895
image-20240821110821895
因为是常规的rc4,所以我这边直接上大厨解了
image-20240821110851977
image-20240821110851977
下面是用脚本解的
image-20240821111204182
image-20240821111204182

xxtea

没啥魔改,正常的xxtea,密钥题目有写,直接逆向
逆向的时候注意大小端序!!
image-20240821132436496
image-20240821132436496

moejvav

jadx逆向,但是有点不准确,直接用idea逆向是准确的
image-20240821154223945
image-20240821154223945
应该把i++放到if之后,整个脚本的大致意思就是根据他提供的一些像机器码的东西来验算你输入的flag,我进行了两种解题方法,直接爆破flag输入和直接逆向方法
直接爆破的exp,没什么好说的,逻辑一样只需要不断累加flag里的字符就行,特别需要关注最后转成字符的时候根据题目还需要逆向一下并且可能出现在256下互补的情况!!!
image-20240821154523195
image-20240821154523195
直接逆向的脚本存在一定的侥幸,脚本中没用到&和|,不然异或不了
其中要特别关注的是,操作码存在在数组中的位置是奇偶交替的,并在每次输出flag之后更新,我在脚本中添加了变量f2来适应这种情况
image-20240821154850378
image-20240821154850378
就复杂度来说肯定是脚本二更好

sm4

直接将解密函数的栈内数据改成enc的数据,加密的时候注意输入48位,这样才能解密成功
更简单的方法是将汇编的待解密的数据地址直接指向enc
image-20240821172252368
image-20240821172252368
改成A0是因为在栈中,enc的地址是-100h
image-20240821172330691
image-20240821172330691
此时只需要将A0h-100h相对地址算出来,发现是负的就再+100h,结果就是A0,所以改成A0自然就指向enc的地址了
patch完之后要进行保存edit->patch program->apply patches
现在再直接进行调试,特别要注意随意输入也要48位
image-20240821173419530
image-20240821173419530

moeprotector

先upx脱壳,比较简单就不说了,然后用ida打开
查看流程图
image-20240823100632938
image-20240823100632938
可以看到有一个try语句,正常不产生错误是往左边走,那就一直在左边循环,但是很明显可以发现,我们得往右边走,那就得触发except语句,看到左边的逻辑其实是对输入的数字做除法运算,那就输入的除数为0,就可以触发异常,注意在右边提前下一个断点,不然走太快
image-20240823101409478
image-20240823101409478
输入之后会有报错,这个报错表示异常触发,直接点确定,然后再点f9
image-20240823101457865
image-20240823101457865
出现异常怎么处理的选择,我们需要选择第一个,也就是把异常抛给程序
image-20240823101534553
image-20240823101534553
可以看到已经在我之前下的断点处停了下来,接着直接f8,慢慢下去
image-20240823101640381
image-20240823101640381
发现需要输入了,那就输入57个’a’,至于为什么是57个,其实你按流程图走到最后,会发现
image-20240823101739542
image-20240823101739542
这边再循环比较,所以byte_883658数组中存的大概率就是密文了,进去看一下刚好57位,所以上面输入57个’a’,接着调试发现直接报
image-20240823102051163
image-20240823102051163
被反调试了,在调试前选择插件
image-20240823102223580
image-20240823102223580
然后接着去调试,发现这次没有报错
一步步调试下去
image-20240823102414825
image-20240823102414825
这一部分没进行加密操作
image-20240823102443328
image-20240823102443328
这一部分进行了加密操作,大致流程是对明文进行每4位的加密,因为明文是57位,所以最后一位在单独加密,大胆猜测所有位都和最后一位的加密的方式相同,所以按最后一位来
之后还有两处和上面差不多的加密的方式,我这边直接贴图就不详细分析了
第二处
image-20240823102657928
image-20240823102657928
第三处
image-20240823102719960
image-20240823102719960
所以整个加密流程是这样的
写脚本解密

ezMAZE

就是一个迷宫一样的东西,输入符合条件的wasd,给你flag
image-20240823211529230
image-20240823211529230
switch就是在不断的循环检测你输入的wasd字符串符不符合要求
image-20240823211606311
image-20240823211606311
然后根据这个函数加上你之前输入的wasd字符串来计算flag,将flag中间的数字替换成你计算出来的数字
这题直接逆有点不现实,所以要考虑爆破,在爆破中简单加一点回溯的机制就行了
得到wasd字符串去计算flag

Just-Run-It

第一段flag是exe直接脱壳后ida逆向
image-20240826073019417
image-20240826073019417
6257396c5933526d657a55355a6d45
第二段flag直接去Linux下运行elf的文件
image-20240826073140056
image-20240826073140056
324d444a6a4c5459794e4745744e44
第三段flag用android14的系统去运行apk
image-20240826073643538
image-20240826073643538
42694e7930345954566a4c57557a4e
第四段flag去github查看有没有riscv架构的docker镜像
找到了镜像https://github.com/DavidBurela/riscv-emulator-docker-image去安装直接运行文件
image-20240826073519280
image-20240826073519280
[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
image-20240828163909717
image-20240828163909717
发现关键函数点进去查看
image-20240828163935550
image-20240828163935550
发现在对内存地址的值进行异或0x90的操作,我们就去查看那边的内存
image-20240828164040860
image-20240828164040860
发现确实有一串奇怪的数字
两种解法
解法一:动调,观察内存中的变化
image-20240828164126915
image-20240828164126915
下个断点直接调试,再去查看内存
image-20240828164209187
image-20240828164209187
发现确实变了
image-20240828164228984
image-20240828164228984
按c转汇编,之后就右键,创建函数
反汇编之后得到
image-20240828165455573
逻辑就是每四个字节按条件循环32轮之后与!=的密文进行比较
image-20240828164728751
image-20240828164728751
这边要注意在第一行
image-20240828165513608
image-20240828165513608
第23个字节xor了12所以后面得异或回去,直接写脚本
爆破的c脚本
flag解析脚本
解法二就是写idc脚本
在文件选项那边选择脚本命令输入这个脚本点run就可以改对应的内存,之后的操作和解法一一样了

xor(大嘘)

直接ida分析
image-20240829103125927
image-20240829103125927
可以知道byte中是数组而sub是加密函数,我们追踪一下sub函数
image-20240829103136846
image-20240829103136846
看到只是简单的异或但是其实没有那么简单,我们在return下个断点
image-20240829103313559
image-20240829103313559
执行下去发现并没有直接的return,发现了两个关键的函数,我们去查看第二个关键的函数
image-20240829103411149
image-20240829103411149
可以看到是其实是一个魔改过的tea加密算法,接着往下追踪
image-20240829103518670
image-20240829103518670
tea加密完之后还会去一个新的函数中,我们接着追踪一下
image-20240829103601900
image-20240829103601900
发现进行一系列的初始化操作之后又进入了一个新的函数,我们接着点击这个函数
image-20240829103659734
image-20240829103659734
发现其实就是每位的循环异或所以整个加密的流程就是
我们解密只要反过来就行
先循环异或
再tea解密
再循环异或

特工luo: 闻风而动

image-20240928153600417
image-20240928153600417
先根据提示用hashcat去爆破wifi密码
首先需要通过 Hashcat 网站将 cap 文件转换为 hc22000 格式
网站地址:https://hashcat.net/cap2hashcat/index.pl
再进行hashcat的爆破
这里,-m 22000 是用于 WPA/WPA2 的模式,-1 <custom_charset> 是你的自定义字符集,?1?1?1?1?1?1 表示你想要尝试的密码长度(6个字符)。根据需要调整长度和字符集。
image-20240928154413058
image-20240928154413058
直接爆破出来密码pzyisxnn,运行keygen程序能得到服务器的密码4g3n71u0
image-20240928160745438
image-20240928160745438
v4明文
v14密文
v5明文长度0x42(66)
image-20240928161558218
image-20240928161558218
v7长度,v14密文
image-20240928161715848
image-20240928161715848
a1密文,a2长度,a3密钥,a4=1
image-20240928162011430
image-20240928162011430
密钥生成算法

WEB

弗拉格之地的入口

打开换进提示爬虫,猜测可能要目录扫描,根据多年经验先访问robots.txt,发现路由
image-20240811130137537
image-20240811130137537
直接去访问得到flag
image-20240811130204178
image-20240811130204178

ez_http

简单的http入门
image-20240811130815593
image-20240811130815593
先用post
image-20240811130840758
image-20240811130840758
提示传参
image-20240811130858122
image-20240811130858122
再用get传参
image-20240811130950093
image-20240811130950093
改变refere
image-20240811131025595
image-20240811131025595
去添加cookie
image-20240811131100792
image-20240811131100792
去改变浏览器
image-20240811131132817
image-20240811131132817
用本地去访问
image-20240811131208048
image-20240811131208048
最后得到flag

ProveYourLove

师傅们整活,首先抓包再说,然后爆破400次就可以了
image-20240811133332469
image-20240811133332469
image-20240811133340374
image-20240811133340374

弗拉格之地的挑战

image-20240811202547730
image-20240811202547730
根据提示去访问路由,查看源代码
image-20240811202616554
image-20240811202616554
得到flag1=bW9lY3Rm,接着去访问下一个路由
image-20240811202820521
image-20240811202820521
查看响应得到flag2=e0FmdEV,接着去访问下一个提示的路由
image-20240811203634023
image-20240811203634023
获得flag3=yX3RoMXN,去访问下一个路由
首先修改referer,然后再去js代码审计
image-20240811204047735
image-20240811204047735
发现实质是用post方法去传参数
image-20240811204126082
image-20240811204126082
得到flag4=fdFVUMHJ,再去访问下一个路由
接着js审计
image-20240811204259561
image-20240811204259561
image-20240811204329417
image-20240811204329417
得到flag5=fSV90aDF,再去访问下一个路由
image-20240811204546021
image-20240811204546021
得到flag6=rZV9VX2t,去访问最后一个路由,终于要结束了nnd
image-20240811204727577
image-20240811204727577
得到flag7=rbm93X1dlQn0=
所以flag=bW9lY3Rme0FmdEVyX3RoMXNfdFVUMHJfSV90aDFrZV9VX2trbm93X1dlQn0=
去base64解密一下得到moectf{AftEr_th1s_tUT0r_I_th1ke_U_kknow_WeB}

pop moe

一题反序列化题目,好久没做了,果然还是生疏了,也遇到了新的知识点
特别要注意的是
this− > sec并不冲突一开始我以为this->sec既要是new class003又要是执行的shell命令,后来发现真正是shell命令是在class003中的mystr中的
image-20240811230717729
image-20240811230717729

垫刀之路01: MoeCTF?启动!

image-20240819123544394
image-20240819123544394

ImageCloud前置

经典ssrf
image-20240819123743942
image-20240819123743942
image-20240819123752093
image-20240819123752093

垫刀之路02: 普通的文件上传

直接上传php木马后利用(连后缀什么的都没检查,根本不用绕过)
image-20240819124449802
image-20240819124449802

垫刀之路03: 这是一个图床

前端的后缀绕过
image-20240819125001015
image-20240819125001015
直接去访问
image-20240819125039846
image-20240819125039846

静态网页

点击换装抓包得到提示
image-20240819131141602
image-20240819131141602
image-20240819201011488
image-20240819201011488

电院_Backend

sql万能密码

勇闯铜人阵

算一个简单的游戏题吧,不过要写自动化的脚本才行,除非你手速过快

垫刀之路04: 一个文件浏览器

目录穿越秒了
image-20240820095449343
image-20240820095449343

从零开始的 XDU 教书生活

代码审计(其实也不算
直接上exp
思路大致就是先去登录,然后获取学生的用户名,然后帮学生签到,签到完成后结束签到就能获得flag(整个脚本可能要运行5分钟左右

ImageCloud

SSRF,用外网去访问内网的文件
image-20240820144339439
image-20240820144339439
内网的端口需要自己5001-6000爆破一下

垫刀之路05: 登陆网站

万能密码直接登录
image-20240821112209805
image-20240821112209805

垫刀之路06: pop base mini moe

存粹的反序列化考点,私有属性赋值只能在自己的类中进行
这边不能用eval,要用system,用eval会提示没有这个方法
image-20240822093721435
image-20240822093721435

垫刀之路07: 泄漏的密码

直接访问/conole输入pin码
image-20240829105030988
image-20240829105030988

who’s blog?

直接fengjin的ssti注入一把梭
image-20240824090240926
image-20240824090240926

PetStore

代码审计,一般这种题建议先自己在本地搭docker慢慢打,然后打出来了直接去用exp
追踪import路由
image-20240824101602772
image-20240824101602772
image-20240824101614617
image-20240824101614617
发现存在pickel反序列化,要考虑能不能用反序列化的漏洞,看到反序列化过程中利用了try语句说明我们的报错回显是不可能了,那就是没有直接回显了,题目也不能出网,我们接着看下去发现一个路由
image-20240824101759760
image-20240824101759760
这个路由仿佛提供了回显的点,我们只要想办法把我们的回显写入pet.name中就行,直接上exp
本地运行结果(远程忘记截完图了我太懒了hhhh
image-20240824102132442
image-20240824102132442

PWN

NotEnoughTime

这一题我在新生赛上做过
直接上exp了

MISC

ez_F5

不用多说直接f5隐写,上工具
image-20240813181203510
image-20240813181203510
得到output.txt里面就是flag,其中-p参数后面的密码隐藏在jpg文件的详细信息里,用base32加密了

readme

知识点就是proc虚拟目录读取加载进程序的文件即使程序被删除了
cf662f9bc3787adbf4324577358e8e2
cf662f9bc3787adbf4324577358e8e2

moejail_lv4

具体可以参考https://stackoverflow.com/questions/28100471/how-eval-is-not-dangerous-in-this-example
2024VCTF2023香山杯-misc-pintu
Loading...