xuenixiang_2018_re_Reverse5
### 题目:cut##### 前言:这题是自己当时敲了2个钟C语言,搞出来的,是用于校赛招新小朋友的,因为要检测测试,还找人试着解了下,OK,起函数名有些头疼,就随意些啦,哈哈哈,莫见怪。
#### 开始分析:
首先拖进ida分析一波:
!(?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
v7是我们的输入,然后可以改写成input,memset初始化不管,重点函数就是_substr666,0x233333和0x666666,还有0x8048000(嗯,认真点),v4是判断条件,看v4如果是1,就是成功congratulation,0就是失败tryagain~把v4改成check,于是:
!(?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这样就舒服些,首先进去_substr666看看是干嘛的,因为对input进行了操作:
!(?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
a3是0,a4是6,a1是新申请的空间,看for循环,判断出是个复制函数,把input输入中下标从0到5的6个字符填充到a1中存起来,很清晰,这样就很清晰了,_substr666(存储数组,输入,起始下标,长度),就是个字符串裁剪函数嘛,于是很快懂了,substr666(v8, &input, 0, 6);substr666(v14, &input, 6, 1); substr666(v11, &input, 7, 6);就是把输入切割成了三段分别存到v8,v14和v11中。
接下来看if判断可以知道,要让check为1,那么3个if要同时满足条件,而且是对我们的输入切片进行处理的~
#### 先进第一关:
!(?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
看到又是substr666这个切片函数,这次是str字符,我们去把它取出来:
!(C:\Users\12192\AppData\Roaming\Typora\typora-user-images\1552386666634.png)
str = vosng%_Ngemkt,看逻辑就是说对str切6个字节,下标从7开始,复制到s2中,然后分别对6位输入进行异或加密,存到s1中,比较s1和s2,相同即可,我们知道异或是可以解密的,这里不难。
#### 进入第二关:
!(?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
这里很明显,就是把str的前面6个字节放到s再放到a2中,然后把输入进行加密存到v7中(简单的加减法加密),最后比较a2和v7的每一位,6位都相同即可,逆向的话也OK。
#### 最后第三关:
!(?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
简单,就是判断第7个字符是不是等于“_”
这样解密脚本就可以写出来了,如下:
```c++
#include<iostream>
#include<cstring>
using namespace std;
//str = {vosng%_Ngemkt}
int main()
{
char input1 = {""};
char input2 = {""};
char input3 = {""};
char a = {"vosng%"};
char b = {"Ngemkt"};
for(int i = 0;i<strlen(b);i++)
{
input1 = char(int(b^2)-4);
}
input2 = '_';
for(int i = 0;i<strlen(a);i++)
{
input3 = char(int(a)+1-i);
}
cout<<input1<<input2<<input3;
return 0;
}
```
跑出来是这个:
!(?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
我们去试试对不对吧:
!(?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
正确,再加个前缀,那么这一道题就完事了:
flag{Hacker_world!}**** Hidden Message *****
页:
[1]