学逆向论坛

找回密码
立即注册

只需一步,快速开始

发新帖

2万

积分

41

好友

1168

主题
发表于 2020-4-22 16:11:51 | 查看: 3300| 回复: 0

相关题目:

♦ Reverse5

[md]### 题目:cut

##### 前言:这题是自己当时敲了2个钟C语言,搞出来的,是用于校赛招新小朋友的,因为要检测测试,还找人试着解了下,OK,起函数名有些头疼,就随意些啦,哈哈哈,莫见怪。

#### 开始分析:

首先拖进ida分析一波:

![image.png](

xuenixiang_2018_re_Reverse5

xuenixiang_2018_re_Reverse5
?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

v7是我们的输入,然后可以改写成input,memset初始化不管,重点函数就是_substr666,0x233333和0x666666,还有0x8048000(嗯,认真点),v4是判断条件,看v4如果是1,就是成功congratulation,0就是失败tryagain~把v4改成check,于是:

![image.png](

xuenixiang_2018_re_Reverse5

xuenixiang_2018_re_Reverse5
?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

这样就舒服些,首先进去_substr666看看是干嘛的,因为对input进行了操作:

![image.png](

xuenixiang_2018_re_Reverse5

xuenixiang_2018_re_Reverse5
?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要同时满足条件,而且是对我们的输入切片进行处理的~

#### 先进第一关:

![image.png](

xuenixiang_2018_re_Reverse5

xuenixiang_2018_re_Reverse5
?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

看到又是substr666这个切片函数,这次是str字符,我们去把它取出来:

![1552386666634](C:\Users\12192\AppData\Roaming\Typora\typora-user-images\1552386666634.png)

str = vosng%_Ngemkt,看逻辑就是说对str切6个字节,下标从7开始,复制到s2中,然后分别对6位输入进行异或加密,存到s1中,比较s1和s2,相同即可,我们知道异或是可以解密的,这里不难。

#### 进入第二关:

![image.png](

xuenixiang_2018_re_Reverse5

xuenixiang_2018_re_Reverse5
?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

这里很明显,就是把str的前面6个字节放到s再放到a2中,然后把输入进行加密存到v7中(简单的加减法加密),最后比较a2和v7的每一位,6位都相同即可,逆向的话也OK。

#### 最后第三关:

![image.png](

xuenixiang_2018_re_Reverse5

xuenixiang_2018_re_Reverse5
?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

简单,就是判断第7个字符是不是等于“_”

这样解密脚本就可以写出来了,如下:

```c++
#include<iostream>
#include<cstring>
using namespace std;
//str = {vosng%_Ngemkt}
int main()
{
char input1[100] = {""};
char input2[100] = {""};
char input3[100] = {""};
char a[100] = {"vosng%"};
char b[100] = {"Ngemkt"};

for(int i = 0;i<strlen(b);i++)
{
        input1 = char(int(b^2)-4);
}
input2[0] = '_';
for(int i = 0;i<strlen(a);i++)
{
        input3 = char(int(a)+1-i);
}

cout<<input1<<input2<<input3;
return 0;
}
```

跑出来是这个:

![image.png](

xuenixiang_2018_re_Reverse5

xuenixiang_2018_re_Reverse5
?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

我们去试试对不对吧:

![image.png](

xuenixiang_2018_re_Reverse5

xuenixiang_2018_re_Reverse5
?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

正确,再加个前缀,那么这一道题就完事了:

flag{Hacker_world!}[/md]
游客,如果您要查看本帖隐藏内容请回复

温馨提示:
1.如果您喜欢这篇帖子,请给作者点赞评分,点赞会增加帖子的热度,评分会给作者加学币。(评分不会扣掉您的积分,系统每天都会重置您的评分额度)。
2.回复帖子不仅是对作者的认可,还可以获得学币奖励,请尊重他人的劳动成果,拒绝做伸手党!
3.发广告、灌水回复等违规行为一经发现直接禁言,如果本帖内容涉嫌违规,请点击论坛底部的举报反馈按钮,也可以在【投诉建议】板块发帖举报。
论坛交流群:672619046

小黑屋|手机版|站务邮箱|学逆向论坛 ( 粤ICP备2021023307号 )|网站地图

GMT+8, 2024-11-22 19:08 , Processed in 0.630140 second(s), 45 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表