复现一下2022V&NCTF
Crypto
ezmath
生成数之后,挖了开头4位空,我们需要向服务端发送这4位,暴力求解
通过计算得知,把给出的数字*4,即可求出n
先了解一下pwntools的用法:
https://pwntools-docs-zh.readthedocs.io/zh_CN/dev/intro.html
连接上服务端,然后接受服务端发送的数据
1 | from pwn import * |
从服务端发送的数据中截取所需的字符,
1 | s = d[16:32] |
在本地进行sha256暴力破解
1 | def check(s,enc): |
将得出的四位字符发送给服务端,服务段返回,一共循环777次才能满足
1 | context.log_level = 'debug' |
在开头加上以上的代码就能得到下面的形式
参考文档:https://lu1u.xyz/2022/02/12/VNCTF2022/
百感交集,查看源代码请参考上面的链接(同样的代码为什么在我电脑上出错)
flag{068f36ec-cbdb-4840-b069-039bee388b2a}
Reverse
BabyMaze 迷宫
下载下来的文件只是一个3k的pyc文件,而且是python3.8版本的。一开始我用的是网页的pyc解码,发现根本不支持。然后我用的是uncompyle6解码,还是不支持。最后我用的是pycdc,将其转换成了字节码。
当初看的关于pycdc的参考链接:
1 | ./pycdas path of pyc file |
当初用的手算的,虽然解出来,但是太麻烦了……
最好用dfs(深度优先搜索算法)来解这道题
1 | map = [[1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, |
自己修改了一些代码,使其更简洁。用下面的图就能很好理解这段代码了,先定义一个地图列表,再定义一个使用空间列表。
搜索的方向为顺时针,且搜索的条件为下一个位置每次搜索成功,都会使对应坐标状态标志置1。如果其中一个分支没有成功到达,则回溯,回溯到最近的一个分支且分支后的状态标志都置为0
其中一个小知识点就是,在函数中使用全局变量时,需要使用global关键字,其作用是显式的告诉解释器flag为全局变量,否则解释器会认为flag为局部变量,从而报错。
查看官方文档后才发现这个题还有我没发现的盲点
没有用uncompyle6反汇编成功,是因为有==花指令==!!!
这边看一下
1 | import marshal, dis |
开头三个字节在不停的跳,这就是花指令了
下面的是我不加code = marshal.loads(f[16:])这个语句的输出结果,开头多出了23行的东西……
cm1 (安卓逆向)
昨天看这一题看的心态崩了,今天务必要把它复现出来。
发现这题用jadx有问题,参观大佬博客才发现用的都是GDA,下面是关于GDA的介绍:https://zhuanlan.zhihu.com/p/28354064
什么事dex文件?
https://www.cnblogs.com/zhaoyanjun/p/5736305.html
所以说.dex很重要,如果题目中出现dex文件,则必须要注重查看。
跟进这个copyFiles函数
1 | obyteArray = bytearray(open(r"ooo", "rb").read()) |
大佬的博客传送门:https://blog.shi1011.cn/ctf/2162
ooo文件是data文件,用more查看一下,emmm
也就是从ooo文件读取的数据与ooo进行异或操作等,转化成dex文件
下面是大佬z1r0写的代码
1 | bBytes = b'vn2022' |
在linux里,把out.dex放在dex2jar以下目录中
运行以下命令,转化为jar把jar文件放到windows中,用jd-gui分析,加密算法出来了
可以看出此为xxtea算法。最核心的是要明白:XXTEA算法使用128bit的密钥对以32bit为单位的信息块进行加密。
H4pPY_VNCTF!!OvO为秘钥,给我们的字符一共16位,一位8bit,16*8=128bit。
而arrayofbyte1数组则是需要加密的信息,==不太懂为什么是11位==,一共44个数字,4个数字拼成一个32bit的信息块?
1 | from struct import unpack |
1 |
|
btea函数,一参v是加密的组元的起始地址,二参11则是需要加密的组元个数,负数位解密,三参则是秘钥的起始地址
VNCTF{93ee7688-f216-42cb-a5c2-191ff4e412ba}