MoeCTF2024部分Re与Pwn
Re
入门指北
xor
upx
dynamic
第一个函数就是加密函数
xxtea
在最后result下断点,然后去看a1数组
upx_revenge
修改特征码vmp为UPX
xtea
这题由于密文只有三组,中间一组会经过两次解密
1  |  | 
d0tN3t
dnspy打开找到main
有部分不可见字符记得这样处理
rc4
两位一组是密文
1  |  | 
xxtea
前三个key题目提示了
明显的xxtea无魔改
1  |  | 
tea
输入不明确但是可以猜测
1  |  | 
进阶指北
先用python求出乘法逆元,注意+优先级要高于^
1  |  | 
或者用爆破的方式,c爆破速度明显比python快
1  |  | 
moedaily
这题比较创新,用excel实现了tea,注意64次循环,且32次之后sum要重置
1  |  | 
moejvav
给的命令是运行用的
vm题,但是可以自己模拟一下
1  |  | 
sm4
直接在线解密不对,估计还需要iv
可能算法有魔改,测试过加密函数和解密函数刚好对称,那就把解密函数的encode_Result改为enc
调试发现解密之后和直接解密结果一样
输入长度为48位的时候正常输出flag
这题不同之处在于直接给了加解密函数,也可以到解密函数把加密后的数据改成密文
ez_MAZE
类似迷宫题,多了一个校验函数,会把反复的跳动排除
因为逆向题目的路径大多唯一且不需要考虑回溯,直接爆破即可,这里爆破的时候发现爆不到指定长度且不同顺序对于爆破长度有影响,那就回溯几步换一个爆破顺序,这里需要尝试
1  |  | 
Just_Run_It
0x0和0x1都是脱壳后解码
模拟器运行不了,开启事件无法调试
要么根据签名v2直接找工具绕,要么找到密文直接base64解密,要么找检验函数修改后重新打包(最后一种比较难,出题者肯定不希望我们这样做)
META-INF是签名之后的文件,DebugProbestKt.bin用于后续调试
后面qetx找到Play My Application (appetize.io)
可以模拟多个环境
bW9lY3RmezU5ZmE2MDJjLTYyNGEtNDBiNy04YTVjLWUzNWU1NzRjZjliOX0=
SMCProMax
moectf{1111111111111111111111111111111111111111}
moectf{y0u_mu5t_know_vvHAt_1s__SMC__n0w}
直接爆破出来发现不对去调试,发现在下面会跳出
一开始有个地方异或了,没执行到,但是最后的密文还是要异或一步
1  |  | 
xor_rev
1  |  | 
调试的时候发现后面还有tea
解tea的时候记得打印%02x
1  |  | 
Secret_Module
sh文件base64+解压缩得到php
1  |  | 
Cython_Strike
得到whl,看格式是zip,解压得到pyd
有一些打印出来的描述和很像flag的字符串,但不知道如何加密了
先用python3.12导入,help之后看方法,mask刚好是运行获得的
需要知道输入的密码,两个方程算出来的input不一样,都去试一下发现第二个是对的
后面发现==优先级高于^,也就是说第一个方程没用,同时真正的flag和上面的字符串长度一样,但不知道如何代换的
发现和ida显示的一摸一样
babe_z3
通过推理可得,v4最后要不等于0,而23行强制类型转化之后也要不等于0,那么v4|=0x100000000之后要为0x100000000,也就是说一开始v4为0,即第一个表达式没用
这里v6,v7,v8其实都是s的一部分,也就是说都要打印
最后得到的字符串都要逆序因为按小端序存储
1  |  | 
BlackHole-2
dll有vmp壳
moeprotector
静态分析到这里,发现比较复杂,需要结合动调
输入0能触发第一次异常
输入长度符合触发第二次异常
1  |  | 
到这里有反调试,需要用ScyllaHide插件反反调试
Release v1.4 · x64dbg/ScyllaHide (github.com)
动态调试发现8个密文一组
对最后一位进行处理,总共三次循环,基本逻辑差不多
正常分析大概是这样,但是逆不明白
有个思路是57位明文,8个一组,那么最后一位多余了,但是一般的算法要么直接是8的整数倍,要么填充到8的整数倍,这里没有,猜测是不是所有位处理方式都是一样的,都按最后一位的加密逻辑来,尝试一下发现真的是这样,所以前面的加密可能是在混淆
1  |  | 
闻风而动-2
先脱壳
根据调试发现一次生成一位
aaaaaaaa:^0x44 ^0x1d ^0x4a ^0x7 ^0x44 ^0x49 ^0x1b ^0x5e
abcdegh:^0x44 ^0x1d ^0x4a ^0x7 ^0x44 ^0x49 ^0x1b ^0x5e
得出结论每一位异或的数固定,后续发现没什么用
将流量包转为22000文件
.\hashcat -m 22000 -a 3 output.22000 ?1?1?1?1?1?1?1?1 -1 hilmnoprsuvwxyz爆破22min得到密码pzyisxnn
得到服务器端加密密钥4g3n71u0
findcrypt发现有des
flag长度为66
把srv放在win虚拟机上,发现没成功
后续直接调试srv.exe,输入对应长度的flag和psw后输入ip和addr
32位长度高低位交换
调试发现不是标准des,不想做了
Pwn
入门指北
NotEnoughTime
用pwntools进行四则运算,注意发送的时候向下取整,因为结果是负数会wrong,直接str也是wrong
1  |  | 
no_more_gets
溢出修改返回地址
1  |  | 
leak_sth
随机数固定在rsp+8处
泄露之后直接发送
1  |  | 
ezshellcode
溢出长度自己决定,开头输入shellcode后修改返回地址
1  |  | 
prelibc
ret2libc,gadgets去libc里找
1  |  | 
preshellcode
调用系统函数getshell
1  |  | 
prerandom
第一次随机可以预测且必须正确
用c跑出随机数
1  |  | 
flag_helper
不能直接读flag,open需要有参数flags
需要mmap开辟空间
需要mmap
等价于两条命令open(‘/flag’,0);mmap(7,34)(部分参数题目没问就省略了,7代表rwx,34是常见的flags值),fd012分别表示标准输入,输出,错误,加上flag前面open的两个文件,所以fd为5
pregot-1
got表可写
这里不能直接调用plt表,而是写0x401056
1  |  | 
给的是一个结构体,直接玩肯定玩不出来,看到数组想到下标越界
还能修改其实就是任意地址改写,直接把距离改大会告诉我不过,后面考虑改速度,速度大一点好像没事,不用距离刚刚好
1  |  |