码迷,mamicode.com
首页 > 其他好文 > 详细

Reverse前两个题

时间:2017-10-08 22:40:45      阅读:311      评论:0      收藏:0      [点我收藏+]

标签:src   char   分析   com   鼠标   变量   16进制   函数返回值   一个   

@1   猜数字

用工具IDA打开题目中的程序

按F5直接变成c程序

然后读程序可以知道必须使check函数返回值是真,然后进入check函数看看怎么写的

技术分享

 返回值是真,就必须进入第一个if语句的第一个if语句,即满足条件a1 + a2 == 30

返回值是真,那么result等式右边就必须是真,也就是解这个方程,有一个条件是 a1 + a2 == 30

解得a2 = 16 ,a1 = 14,返回main函数中,v4是14,也就是如果我们输入的是14,得到结果是正确,那么根据题意,flag组装一下就是

flag{14}

技术分享

 

@2   Crackme

用工具IDA分析

强大的F5

技术分享

读完代码,发现还是让check函数为真才是正确,进check函数看看

技术分享

是对传入的字符串进行处理,字符串长度一定是20,第一个循环让字符串的前十个字符两两头尾互换,后十个字符两两头尾互换;

第二个循环中,让互换完的字符串中每个字符与9取异或,得到的值要和这个result【j】中的字符串相等才能返回真值

result的值怎么知道呢?

鼠标双击这个变量result,可以得到这个图

技术分享

我们得到了result中的东西

不过这20个值都是16进制,一开始我是一个个算(好心酸。。其实本可以写个程序的。。。)

然后发现

技术分享

这里有个东西,点进去

技术分享

 点进去发现后面都是对应的ascii码,问号不是,点点点与问号之间的字符正好是20个!!

哈哈

result的值我们就知道了。

 

然后我计算了一个数与9异或的值,发现如果a ^ 9=b,那么a = b ^ 9,然后搜了一下,发现这是异或的性质。。。。。。

那就好办了,可以让result和9异或得到换完位置的原字符,然后交换一下位置就好了。

然后可以直接写个程序来跑了

 1 #include<stdio.h>
 2 int main()
 3 {
 4     char a[30];
 5     char q; //暂存,用于交换位置
 6     for(int i = 0 ; i < 20 ;i++){//获取字符串并进行异或处理
 7         scanf("%c",&a[i]);
 8         a[i] = a[i]^9;    
 9     }
10     for(int i = 0 ; i <= 9;i++){//交换位置
11         q = a[11 * i % 20];
12         a[11 * i % 20] = a[11* (19 - i) % 20];
13         a[11* (19 - i) % 20] = q;
14     }
15     for(int i = 0 ; i < 20 ; i ++){//输出
16         printf("%c",a[i]) ;
17     }
18     return 0;
19  } 

运行时,输入result的值

z`V}8rnheot(p<hlV9<V

得到flag

技术分享

 

Reverse前两个题

标签:src   char   分析   com   鼠标   变量   16进制   函数返回值   一个   

原文地址:http://www.cnblogs.com/zhibin123/p/7638703.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!