zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    电子公文传输系统个人贡献
    第十三章学习笔记
    第十二章学习笔记
    第14章学习笔记
    团队作业(五):冲刺总结
    冲刺总结(day7)
    thread同步测试
    冲刺总结(day1)
    元宇宙、VR(Unity3D、Unreal4)、AR、WPF&H5外包团队—北京动点飞扬软件新办公室照片
    kanzi外包团队:长年承接kanzi项目应用开发 Kanzi 3.6 LTS已经更新至3.6.3版!
  • 原文地址:https://www.cnblogs.com/gudygudy/p/7638703.html
Copyright © 2011-2022 走看看