baby_maze
常见的迷宫题,但考法却不常见,没有直接的地图,只是给出每走一步的程序的反馈,提示是否遇到障碍,是否到可以通行,是否到达终点。
程序就是通过每走一步,调用一个函数。
感觉上方法很多的,这里我是采用与程序交互写一个dfs来跑。
首先交互采用的pexpect模块,然后把程序中提示正确信息的字符串都改为:“1\r\n”,到达终点的字符串改为了:“2\r\n”,方便判断交互数据。
其次写这个dfs来与程序交互跑迷宫和常规的有地图自己跑要注意一点,在每次走一步后返回到上一层的时候要加一个步骤:往回走的步骤,因为这是在程序交互。
刚开始我写这个迷宫,以为程序可能就是几十步吧,所以也没有去做什么过滤,后面跑的时候发现步数远不止几十,,起码上百,说明这个地图是很大的,这样直接跑时间上肯定是不行的。。
接下来改进,想到我可以开始初始化一个大的迷宫,让程序在跑的时候根据回显是障碍物来在初始化的迷宫上记录这是一个障碍点(maze[x][y] = 1)。
最后程序在10分钟跑出了结果,勉强能接受,虽然还是很慢。
1 | import pexpect |
1 | found: SSSSSSSSSDDDDDDWWWWAAWWAAWWDDDDDDDDDDDDDDDDDDDDSSDDSSAASSSSAAAAWWAAWWWWAASSSSSSAASSDDSSSSDDWWWWDDSSDDDDWWDDDDDDWWAAAAWWDDDDWWAAWWWWDDSSDDSSSSSSSSSSDDDDSSAAAASSSSSSAASSSSAAWWAASSSSDDDDDDDDDDSSDDSSAASSSSAASSSSSSSSDDWWWWWWDDWWWWDDWWWWDDSSSSSSSSAASSSSDDDDSSDDDDWWDDSSDDSSDDDDDDDDSSDDSSSSDDDDSSDDSSSSSSDDSSSSDDDDSSSSDDDDDDSSSSDDSSDSSASSSSAASSDDSSAASSDDDDDDSSDDDDWWDDSSSSSSDDDDWWAAWWWWDDDDSSSSDDDDDDSSAASSSSSSDDDDDDDDSSDDDDSSSSSSDDWWDDDDDDSSSSSSSSAASSDDSSSSSSAASSDDS |
medical_app
算是很常规的一个安卓题了,就native层逻辑很明显的加密。
做的时候发现这个不同架构的so去ida反编译的结果区别真的大,,没有经验,我开始选择了熟悉的x86架构的去看😅:
1 | char __cdecl Java_come_crack_crackme2_MainActivity_chk(int a1, int a2, int a3) |
和之前看release模式编译的800多行c++代码比起来,其实还好。很明显开始一个rc4加密,接着一个tea,仔细看下,可以知道是xxtea。
然后有几个函数,看得出来是加密函数,但没有引用关系。但这样看,不好看出这个xxtea是否经过魔改。
所以我决定去看下armV7的so,然后调试一波,感觉发现了新天地,,这清晰的加密流程。。从这才知道不同版本的so反编译结果如此之大,其实这个armV7的so应该才是作者自己写的,以后看so的时候应该首先armV7的so。
1 | bool __fastcall Java_come_crack_crackme2_MainActivity_chk(int a1, int a2, int a3) |
上面z2,z3就是rc4的初始化和加密,看z4:相当清晰的xxtea,确定只是改了delat。
1 | unsigned int __fastcall z4(unsigned int *a1, unsigned int a2, unsigned int *a3) |
找密文,用之前逆xxtea写的脚本解一下,然后找rc4异或序列异或一下即可:
1 |
|
1 | 0x00, 0x59, 0xE3, 0x80, 0xD3, 0x67, 0x42, 0x33, 0x96, 0xC4, 0xC6, 0x0D, 0x94, 0xBD, 0x6E, 0xD2, 0x5D, 0x18, 0x48, 0xB3, 0x8E, 0x32, 0xE0, 0x46, 0x38, 0x77, 0x9B, 0x54, 0xCE, 0xB0, 0x5F, 0x19, 0xE2, 0x81, 0x5E, 0xD8] s = [ |
so_get_source
进入网站,上传一个一句化木马拿到shell,然后把网站打包下来。
发现flag.php与index.php都是被加密后的,而这里有一个可疑的php_screw_plus.so文件,这和逆向就更贴近了。
搜索一下php_screw_plus.so,发现这个就是对我们的php文件实现加解密功能的文件。
到ida中去找到pm9screw_ext_fopen函数:打开待加密或者解密的文件。
1 | FILE *__fastcall pm9screw_ext_fopen(FILE *stream) |
都有函数名的,所以分析起来难度不大,主要就是一个aes_256_cbc加密,我们只需要找密钥,iv在这里就是不需要的,因为iv的错误只会影响前16字节的解密,我们猜测程序的flag放在16字节后,因为iv我没找到,感觉不好找。
首先是一个对GH65Hws2jedf3fl3MeK进行md5加密,追踪变量,发现它的结果是作为了后面aes_256_cbc的密钥。
但这里有一个问题,md5加密结果是16字节,而这里密钥是256位的,要32字节嗯。。
然后看看md5函数及外面取结果的函数:
所以说,程序是直接使用的加密结果的hex形式作为32位密钥。
接下来使用openssl来解密试试,-d:解密 -K:指定密钥,-iv:指定iv,-in:指定要加密或解密的文件,且注意key和iv要以hex形式给出
1 | openssl aes-256-cbc -d -K 3834326434326239383837366635383166306466626566623063643262356333 -iv 1 -in flag.php > ans.txt |
解密,得到一个乱码文件。
再次回到程序中分析加密函数:发现在加密之后有一个异或,解密之前同样对应一个异或。
而这个v9,我向上找该变量的赋值及回溯,在读文件这里找到。。但这也是不知道的。
好在上面异或的v9变量只是一个字节,所以考虑爆破,找到flag/
1 | import os |
解密结果:(这里我去除了解密结果中的开始的16字节乱码字符,因为它会导致的我博客使用的gulp出错。
1 | ****************flag{47a3f7b1-499c-4e45-ed3e-404602cfef96}"; |