标签: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
标签:src char 分析 com 鼠标 变量 16进制 函数返回值 一个
原文地址:http://www.cnblogs.com/zhibin123/p/7638703.html