2024CtfNewStar Week3 Re&Web-wp
Reverse
simpleAndroid
打开后发现了一个checkActivity的文件里发现我们输入的字符串被传到了so文件里加密,于是解压出so文件丢入ida分析,找到了一个datacheck函数,一进去就发现了一个base64编码和编码密钥。
加密代码看似很多其实总共就两次,一次是反转,还有一次是一个”|”和”&”运算,把反转后的字符串逐个进行运算,最后和密文进行比较。
直接抄下来就行,解密脚本反一下就行,先运算后反转(脚本如下)
最后用密钥在赛博厨师解base64编码就行。
1 |
|
取啥名字好呢?
Ida分析发现main函数里套了许多的signal函数,查询了一下发现是收集异常的函数,然后在第一个signal(注意到报错是8,也就是SIGFPE)函数里找到了一段加密代码,大概就是异或下标吧,之后会把密文比较判断。
打算先猜一手,先提取出密文,写出异或解密脚本后发现不正确,于是用动调看input的值的变化,发现input的所有值在第一次报错8之前被统一更改了,后面就是正常地报错8,进行异或下标加密。
输入不同的字符发现改变前后的差是统一的,当我输入0x31时发现数据被转成0xa1,那么就是我输入的字符被减去了0x17,所以写出脚本,输出的就是flag.
1 |
|
flowering_shrubs
die发现是fle64文件,ida分析天崩开局全是花,不会用pythonida脚本去画捏,手动去花,nop掉push和ret之前的内容(包含有call $+5),识别成函数后就是正常内容。分析函数,加密过程大概就是把明文字符四个一组然后在组内分别与key中的一个字符进行异或和运算加密,而加密的顺序据取决于一个随机数生成的下标,这决定了一个组的密钥。 分析随机数的生成,种子是0,但是是在Linux的文件,因为wind和linux的随机数生成不同,我们要写一份生成随机数的代码到Linux进行生成(脚本1)。
在生成随机数时会舍弃掉一次生成的第一个数,之后若生成与之前相同的数就会重复生成直到不重复(在这个过程中不会跳过第一个生成的数),不知道为什么在winds写的代码在Linux里面运行有问题,无奈把随机数全部生成(200个)然后用上面的逻辑,自己手动整理,最后得到的就是加密的下标顺序(index)。
有了每个的加密顺序就直接反向解密就行。(脚本2)
1 | //脚本1 |
1 | //脚本2 |
SMc_math
Ida分析发现里面代码就是一坨,看题目是smc,于是先寻找解密代码,发现在调用加密函数前,有一个for循环对加密函数进行了异或运算,这估计就是解密加密函数的代码,于是在调用处断点。
进行动调,到断点处用快捷键恢复函数,这样就可以看到加密函数的内容了。
分析函数,就是一个七元一次方程,查找资料想到用z3库来解密,脚本如下。
因为加密时以int转入,解方程后的结果应该是4字节数据16进制转化成了数字表示,因为数据是4字节小端序存储,所以我们要用小端序读取并转成字符就可以了(脚本如下)。
1 | from z3 import * |
SecretsOfKawaii
Jeb解混淆,在mainacticity里面发现了加密代码,在这里主要逻辑就是把明文rc4加密(密钥就在旁边),然后base64编码后交到so层check方法处理。
提取出so文件,查壳发现带壳,后用upx脱壳,然后丢进ida分析。找到一个带check的函数,里面有一个btea函数和密钥,分析btea函数,是一个xxtea加密和密文,把密文用ida提取。
和网上的xxtea加密对比发现delta被修改了,把在网上找到的解密代码的delta进行修改,就可以写出解密脚本(脚本如下)。
把解密后的字符串进行base64编码再rc4解密,密钥是rc4k4y,(http://tool.chacuo.net/cryptrc4),直接输入base64编码就可以解密出结果,结果就是flag
1 |
|
011vm
ollvm平坦化,可以用d810,去一下混淆,效果也不是很好,主要就是猜。
在main函数中可以跟踪一下输入的变量,发现进入了一个函数,查看这个函数,里面有三个128位个字符,里面又发现一个函数,发现这个函数的内容有点像tea加密,对比一下原tea加密代码,好像没有魔改,于是我们把数据提取出来,因为没有发现其他的字符为密钥,推测密钥就在那三个长字符中,刚好满足tea的加密数据格式(4个32位的密钥,和偶数个32位的加密数据),直接进行解密就可以得到结果。
1 |
|
PangBai 过家家(3)
:
用pyinstxtractor进行解包exe文件,再用pycdc提取NotNormalExe.pyc文件,发现代码逻辑不完整并有提示WARNING: Decompyle incomplete,可能是编译不了,于是想到去查看字节码,找ai帮我写了一个用pythondis库查看字节码的脚本(脚本1),看不懂py的字节码,于是丢给ai让它帮我反汇编成代码,这下看到了源码就是完整的了,加密逻辑比较简单就是普通的异或,直接写出脚本就可以解密成功了(脚本2)。
1 | # 脚本1 |
1 | 脚本2 |
Web
Include Me
Php伪协议,发现很多东西都被过滤了,查了资料看到data协议没有被过滤,至于执行命令可以用base64编码,想用<?php system(“ls /“);>查看目录但发现=被过滤了,所以尝试在base64编码下不含等号的命令。
注意到flag被过滤了,推测flag的文件名就是flag,就尝试直接cat /flag,构造<?php system(“cat /flag”);>,刚好编码后又没有含有=,直接执行,http://eci-2ze4q7yfeafl0jdgf4b6.cloudeci1.ichunqiu.com/?me=data://text/plain;base64,PD9waHAgc3lzdGVtKCJjYXQgL2ZsYWciKTs+
臭皮的计算机
在源码中看到了python源码,发现了eval()函数,想到传入命令给eval执行,但是字母被过滤了,寻找只有数字的表示方法。
查询资料了解到八进制的转译符是\不包含字母,于是用八进制传入命令,用os.system()函数来执行Linux系统命令.
先用ls /看看目录,输入
1 | \157\163\56\163\171\163\164\145\155\50\47\154\163 /\47\51 |
发现flag文件,直接cat /flag,传入
1 | \157\163\56\163\171\163\164\145\155\50\47\143\141\164\40\57\146\154\141\147\47\51 |