安恒杯10月月赛两道逆向2018.10.27
这次两道逆向题都用到了base64加密,参看:base64由来、原理及代码实现
两道题目及脚本链接:链接
提取码:6oc7
一、easytree 给出的是一个没有后缀的文件,经过查看是一个exe程序:
加上后缀,运行程序:
打开ida,发现有upx加壳,呵!拉到脱壳机脱壳后,再用ida打开
可知flag长度为15,经过了三个函数处理,最后和一个字符串比较,若相同则为flag
重点是三个函数的作用:
我们就从下往上看,看sub_401794(&v6);
有什么操作:
明白人一看就知道这是base64加密,因为特点就是在于移位操作,参看:base64加密原理
知道加密方法之后将“aWNuZXJyc2VhZXRydmVl”解密:icnerrseaetrvee
再看上一个函数sub_40166E(v8, v9, (int)&v6);
/递归方式前序遍历二叉树
void PreOrderTraverse(BiTree T, int level)
{
if (T == NULL)
return;
/*此处表示对遍历的树结点进行的操作,根据你自己的要求进行操作,这里只是输出了结点的数据*/
//operation1(T->data);
operation2(T->data, level);
//输出了层数
PreOrderTraverse(T->lchild, level + 1);
PreOrderTraverse(T->rchild, level + 1);
}
输入为flag,只看算法就是递归将flag相应的位给了新的地址,最后返回结果,最后应该是将flag乱序排列,至于乱序排列的顺序,不知道,但是题目给了tree提示,那不就是二叉树嘛,二叉树的遍历就用到了递归,然后观察代码应该是个前序遍历,到这就知道了,这个函数返回地是遍历结果:icnerrseaetrvee
复原不就是按照前序结果复原二叉树吗?前序都知道,第一个是跟节点,经过复原:
这时候,就可以猜到flag,按层序读:icanreversetree,猜想应该是按层序建立的二叉树,然后通过先序遍历二叉树,之后再经过base64加密得到密文。
其实也可以用OD跟出第二个函数排列之后的顺序:
输入15位:abcdefghijklmno
跟出的结果:abdhiejkcflmgno
abcdefjhijklmno
abdhiejkcflmgno
根据这个顺序可以将解密后的密文按照上面顺序再排列:
icnerrseaetrvee
icanreversetree
也可以得到flag
二、BASE++ 运行程序:
拖进ida:
首先输入flag,判断长度是否小于32,小于的话就跳转,不小于的话,就进行transform_1((const char )&input_flag); ,然后transform_2(); ,transform_3(strlen((const char )&input_flag), (int)&input_flag, (int)a0); 之后比较返回结果和”TRLT5amLBoLT5Z6Fa5LqN6mkTomqR66Da4LqX5mgBwkkP5wmTZ6D====”比较,相等返回0,则程序可以输出Congratulations!!!
看见显眼的=号base64,32解密一下,无果,怪不得题目名字叫base++,可能是又改了东西。
1.看第一个函数transform_1((const char *)&input_flag);
目的:仅对flag大小写字母进行移位操作
【安恒杯10月月赛两道逆向2018.10.27】2.transform_2(); 函数:
数组内容:’ABCDEFGHIJKLMNOPQRSTUVWXYZ’
目的:对密码表进行变换操作
3.transform_3(strlen((const char *)&input_flag), (int)&input_flag, (int)a0); 函数:
目的:对flag进行加密,每5个字符生成一个数值v4,将v4移位后分成5位二进制数作为密码表的索引下标,加密方法类似于base32,但是密码表是出题人自己定义的。
base_tran_5(v3 + input_flag, v5, v4); 函数
分析到这,来整理一下思路:
现在还没有确定flag长度,但根据分析函数flag5位-》密文8位 可知长度位32,
1.将flag进行变换
2.对密码表进行变换
3.对flag进行每5个字符加密,生成8个5位二进制数,在密码表索引密文最后生成密文
例:
在这里给一下思路 该代码每次使用五个字符
比如我输入
abcdefghijklmn
那么先取abcde
在内存中就是6162636465
eax只存62636465 edx存00000061
6162636465 换成二进制就是
0110000101100010011000110110010001100101
每五个位分成一组
01100 00101 10001 00110 00110 11001 00011 00101
每一组换成十进制后当成序号取密码表中的值换成密文
脚本:
# coding=utf-8
def transform_1(flag):
v2 = 0
while v2
结果验证:
赏你的支持是我最大的动力!
支付宝 微信
推荐阅读
- 20210307《挑战赛怂人胆》【能量将帅挑战赛(01)】
- C语言学习|第十一届蓝桥杯省赛 大学B组 C/C++ 第一场
- python青少年编程比赛_第十一届蓝桥杯大赛青少年创意编程组比赛细则
- ACSL|ACSL 美国计算机科学联赛 2016-2017 R4 摩天大楼-Skyscraper 题解
- 临清一中学子斩获北大培文杯作文大赛全国大奖
- 排球比赛
- 第三届文人杯诗书画大赛获名单公示
- 参加【21天写作挑战赛】,第七期第14天,挑战感受小总结
- 记一次赛课失利
- 休赛期3全明星去哪队算合理(詹皇该选火箭,考神不必留鹈鹕!)