[2019红帽杯]xx
1.
exeinfo查看信息,无壳,然后放入ida64位。
2.
找到关键字符串,跟进看伪代码。
1 | int64 __fastcall sub_1400011A0(__int64 a1, __int64 a2) |
真的是很难了…
检索网上的资料,需要用IDA的findcrypt3插件。这个插件可以识别代码的特征,看出是什么类型的加密。
然而插件安装及其复杂,折腾了好久。想知道会不会有神仙能直接肉眼识别出加密类型呢?
3.
根据findcrypt插件查明为tea加密,进函数内部发现为xxtea加密。(查阅资料明白的,我觉得可以单独拿出来学一遍了)
1 | __int64 __fastcall sub_1400011A0(__int64 a1, __int64 a2) |
*添加了注释的伪代码
流程为
先判断输入的字符串是否都在程序实现存储的数据Code中(实际上我的IDA直接识别出在Code里了)
然后取前四个字符作为xxtea的密钥(因为格式是flag{},所以密钥是flag,不满位数右端补零)
然后对输入的字符串进行加密(进行xxTEA加密,原理没搞懂,但是python有解密脚本)
之后对加密的字符串打乱顺序(伪代码排序部分)
之后异或操作(所以再异或一遍)
再与存储的数据进行比对(为CEBC406B7C3A95C0EF9B202091F70235231802C8E75656FA)
存储的数据也需要一定的知识,v29,v29+1,v30,v31在栈上存放的位置相连。小端序存放,需将其反过来写。
(感觉自己的学习跨度有点大了,以上东西理解了很久。涉及了许多知识。)
4.
于是写python脚本。
1 | data0 = "CEBC406B7C3A95C0EF9B202091F70235231802C8E75656FA"#为提取出来的v29,v29+1,v30,v31 |
然后把置换回来的数据(参考博客原作者突然又用C)
1 |
|
下面是python脚本,但是我看得不是很懂。
1 | enc = 'CEBC406B7C3A95C0EF9B202091F70235231802C8E75656FA'.decode('hex') |
似乎python3.版本不支持这种写法,也不知道是不是我编译器没装好。
实际上python还有xxtea库,但是有巨佬写出解密过程,那我就多学习学习。(一头雾水)
得出flag
flag{CXX_and_++tea}
估计得花几个星期消化。本以为只是稍微难一点的题目(也许真的是,只是我太菜了?)
反思:尝试一次特难题,实际上有好多东西难以理解,这次做下来只是大致了解。原本以为自己基本能看懂c和python语法,结果发现自己这一方面也有很大的欠缺。这么长的伪代码分析真的是折磨。而且自己根本写不出脚本。抽空学习python、C、汇编。内存动态分配是啥意思啥作用啊😫
参考博客: