天生我材必有用,千金散尽还复来。 仰天大笑出门去,我辈岂是蓬蒿人。 大鹏一日同风起,扶摇直上九万里。 十步杀一人,千里不留行。 事了拂衣去,深藏身与名。 安能摧眉折腰事权贵,使我不得开心颜! 且乐生前一杯酒,何须身后千载名? 愿将腰下剑,直为斩楼兰。
 

Reverse前两个题

@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

 

posted @ 2017-10-08 21:42  gudy  阅读(304)  评论(0编辑  收藏  举报