三道不同平台的Reverse题目带你入逆向坑


第一道(APK)

Re100

下载下来 发现没有后缀

IDA载入  发现是apk文件

直接载入jeb分析 找到关键代码  右键反编译这个类(或者可以按快捷键Tab)

先判断我们输入的字符串(记作input)长度是否小于5  若成立  则输出“tryagain!”

不成立的话将input进行逆序 然后md5加密接着进行base64编码最后与

“NzU2ZDJmYzg0ZDA3YTM1NmM4ZjY4ZjcxZmU3NmUxODk=“

进行比较 若相同 则输入正确

得到}321nimda{galflj

逆序一次得到jlflag{admin123}

第二道(PE文件

ransomware

0x01:

PEiD查壳无壳  运行之后也没中毒 无毒

0x02:

运行一下看看 可用的只有一个输入框和一个按钮(Decrypt)

这里可以通过Restorator进行分析

随意输入123456789  点击Decrypt   弹出对话框

看到关键点  

一个是触发的MessageBox  (通过下API断点)

一个是关键字符串 Wrong,The password is error

两种方法都可以定位到关键代码 (通过搜索ASCII字符串)

下边采用API断点进行定位

0x03

先载入Olydbg分析一波

右键任意空白处或者直接(Ctrl+ N)

或者在命令栏中输入bpGetDlgItemTextA,bp MessageBoxA

下好断点之后

直接F9运行

随意输入12456789

程序会中断到这里

选中堆栈窗口buffer这一行  右键数据窗口中跟随

接着调试执行到返回(快捷键Ctrl+ F9)

这时可以看到数据窗口出现了我们的input123456789

接着F7 然后F8单步向下分析即可

具体分析结果:

1.程序先判断我们的输入是否等于18

2.关键代码就是地址00AE12A3 这个call

OD分析不方便叙述

还是用IDA吧

0x04

可以直接shift+F12找关键字符串

也可以像下边这样

双击DialogBoxFunc

接着F5

进行分析

所以我们只需byte_404000[]提取出来 与0xCC进行异或就可以得到flag

有一个简单的办法 就是选中所有数据   shift + E  即可

提取出的直接是C代码

最后得到flag{1_dO_n0t_wAnna_cry}

第三道(ELF文件)

cracking_game

载入IDA

Shift + f12 双击Bingo!....

双击通过Xref查找引用Bingo处(sub_4E0)

接着按下空格 切换成文本模式

代码向上翻 分析可知sub_4E0就是关键   但是发现不可以使用F5

OptionàGeneralà

勾选上Stackpointer

然后就可以看到多了一列绿色的

然后alt+k可以修改

原来数值是0x2C  改为0x0就可以

int__cdecl sub_4E0(inta1)

{

 intv1;//ST18_4

 intv2;//ST1C_4

 intv3;//ST20_4

 intv4;//ST24_4

 intv5;//ST28_4

 intv6;//ST2C_4

 intresult;//eax

 intv8;//[esp-10h] [ebp-3Ch]

 intv9;//[esp-Ch] [ebp-38h]

 intv10;//[esp-Ch] [ebp-38h]

 intv11;//[esp-8h] [ebp-34h]

 intv12;//[esp-8h] [ebp-34h]

 intv13;//[esp-4h] [ebp-30h]

 intv14;//[esp-4h] [ebp-30h]

 intv15;//[esp+0h] [ebp-2Ch]

 intv16;//[esp+4h] [ebp-28h]

 intv17;//[esp+8h] [ebp-24h]

 intv18;//[esp+Ch] [ebp-20h]

 unsignedintv19;//[esp+10h] [ebp-1Ch]

 int*v20;//[esp+20h] [ebp-Ch]

 v20=&a1;

 v19=__readgsdword(0x14u);

 __printf_chk(1,&unk_A50,aCanYouSolveThi,v8,v9,v11,v13,v15,v16,v17,v18);

 __printf_chk(1,"Giveme the flag please: ",v1,v2,v3,v4,v5,v6,v16,v17,v18);

 __isoc99_scanf("%x%x %x",&v16,&v17,&v18);

 if((((((((((((((((((((v17+1514584764)^0x58E7773A)-907520011)^0x74A4134B)+1299160922)^0x2A3457E6)

                 +1267464377)^0xBB5D6AFF)

               +1051920565)^0x3C5A9BE1)

             -1324494254)^0x9D91B40F)

           -1113157154)^0x5D8ACD6E)

         +1467566340)^0x481EE77)

       -754063826)^0x5702EC35)

     +1739736031)^0x80CAFC7B|((((((((((((((((((v18^0x63074EB7)-257813895)^0x3D898713)-515561400)^0xD4A1204D)

                                             -309222932)^0xDB034E6B)

                                           -1757999315)^0x85AEAF52)

                                         +551686536)^0xCDC4D471)

                                       +1687331817)^0x5BF4CECF)

                                     +686778677)^0x97C13118)

                                   -1982126587)^0x5B589A)

                                 +1689812494)^0xDF2FFB19|(((((v16+929931831)^0x5039B3AD)+427557174)^0x1363F241)

                                                            -1960340062))

   puts("Hmm...");

 else

   __printf_chk(

     1,

     "Bingo!The flag is flag{subflag0:subflag1:subflag2}`n",

     (((((((((((((((((((v17+1514584764)^0x58E7773A)-907520011)^0x74A4134B)+1299160922)^0x2A3457E6)

                +1267464377)^0xBB5D6AFF)

              +1051920565)^0x3C5A9BE1)

            -1324494254)^0x9D91B40F)

          -1113157154)^0x5D8ACD6E)

        +1467566340)^0x481EE77)

      -754063826)^0x5702EC35)

    +1739736031)^0x80CAFC7B,

     (((((((((((((((((((v17+1514584764)^0x58E7773A)-907520011)^0x74A4134B)+1299160922)^0x2A3457E6)

                +1267464377)^0xBB5D6AFF)

              +1051920565)^0x3C5A9BE1)

            -1324494254)^0x9D91B40F)

          -1113157154)^0x5D8ACD6E)

        +1467566340)^0x481EE77)

      -754063826)^0x5702EC35)

    +1739736031)^0x80CAFC7B,

     v10,

     v12,

     v14,

     ((((((((((((((((((v17+1514584764)^0x58E7773A)-907520011)^0x74A4134B)+1299160922)^0x2A3457E6)

               +1267464377)^0xBB5D6AFF)

             +1051920565)^0x3C5A9BE1)

           -1324494254)^0x9D91B40F)

         -1113157154)^0x5D8ACD6E)

       +1467566340)^0x481EE77)

     -754063826)^0x5702EC35)

   +1739736031,

     v16,

     v17,

     v18);

 result=0;

 if(__readgsdword(0x14u)!=v19 )

   sub_A20();

 returnresult;

}

很明显,程序对输入的三个数,进行一系列的加减和异或

那么我们只需要将+换成- 逆向操作就好了

计算代码:

intv0 =((((((((((((((((((((0^0x80CAFC7B)-1739736031)   ^0x5702EC35)+754063826)^0x481EE77)-1467566340)^0x5D8ACD6E)+1113157154)^0x9D91B40F)+1324494254)^0x3C5A9BE1)-1051920565)^0xBB5D6AFF)-1267464377)^0x2A3457E6)-1299160922)^0x74A4134B)+907520011)^0x58E7773A)-1514584764);

intv1 =(((((((((((((((((((0^0xDF2FFB19)-1689812494)^0x5B589A)+1982126587)^0x97C13118)-686778677)^0x5BF4CECF)-1687331817)^0xCDC4D471)-551686536)^0x85AEAF52)+1757999315)^0xDB034E6B)+309222932)^0xD4A1204D)+515561400)^0x3D898713)+257813895)^0x63074EB7);

intv2 =(((((0+1960340062)^0x1363F241)-427557174)^0x5039B3AD)-929931831);

 if((((((((((((((((((((v0+1514584764)^0x58E7773A)-907520011)^0x74A4134B)+1299160922)^0x2A3457E6)                 +1267464377)^0xBB5D6AFF)               +1051920565)^0x3C5A9BE1)             -1324494254)^0x9D91B40F)           -1113157154)^0x5D8ACD6E)         +1467566340)^0x481EE77)       -754063826)^0x5702EC35)     +1739736031)^0x80CAFC7B|((((((((((((((((((v1^0x63074EB7)-257813895)^0x3D898713)-515561400)^0xD4A1204D)                                             -309222932)^0xDB034E6B)                                           -1757999315)^0x85AEAF52)                                         +551686536)^0xCDC4D471)                                       +1687331817)^0x5BF4CECF)                                     +686778677)^0x97C13118)                                   -1982126587)^0x5B589A)                                     +1689812494)^0xDF2FFB19|(((((v2+929931831)^0x5039B3AD)+427557174)^0x1363F241)                                                                 -1960340062))

 {    

 printf("%x",v0);

 printf("%x",v1);

 printf("%x",v2);

 }

根据v0,v1,v2的输入顺序进行排序

最后得到:

flag{e698830d:8dd70651:c1ecd292}

题目下载链接:

第一道:

https://pan.baidu.com/s/1bPZnjEXFODiZEAmegjYcPg密码: 9yjv

第二道:

https://pan.baidu.com/s/1Qy_uL1H9LvChcFejAkGmlA密码: ti5n

第三道:

https://pan.baidu.com/s/1mBlcZ5AwQ9GiIsmbbn3c5w密码: 2mu4

别忘了投稿哦!

合天智汇公众号原创稿件征集!

大家有好的技术原创文章,

欢迎投稿至邮箱:edu@heetian.com

合天会根据文章的时效、新颖、文笔、实用等多方面评判给予100元-500元不等的稿费哟。

有才能的你快来投稿吧!

点击了解投稿详情重金悬赏 | 合天原创投稿等你来!

课程推荐时间(via合天网安实验室)

1、逆向工具大全

http://www.hetianlab.com/cour.do?w=1&c=C9d6c0ca797abec2016080315291800001

2、逆向游乐园

http://www.hetianlab.com/cour.do?w=1&c=C9d6c0ca797abec2016080315412500001

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值