2018.11.4 东华杯(骇极) REVERSE What's it wp

What

打开先要求输入luck string,拖进ida看,输入的必须是长度为6的英文小写。之后对输入的数据取md5,然后遍历生成的MD5串,统计其中0的个数v15和下标总和v14,当满足10*v15+v14 == 403的时候为有效输入。这个题目的亮点在于打开decode函数的时候,有这么一个提示

然后结合着汇编看c代码,然偶看到了check,找check函数,发现

看出来这里是对输入的luck string的MD5的后四位ascii之和作为srand随机数种子,然后xor动态解密check的函数内容。解密之后调用check函数,传入参数luck string的md5的前4位。

大概明白了流程之后,首先得先获得check函数的内容,所以我们要首先对这个MD5进行爆破

用自己电脑单核心跑了10分钟跑出来,luck string =ozulmt。这里顺便问一下python的for有没有多线程?

md5 : 0ec448d42dbf0000c020c0000048010e

好多0,,,

v5 = “0ec4”; v6 = “010e”。

这里直接使用OD动调:

在这里断可以看到内存也有

 

f7跟进去,就是解密之后的check函数体了。为了方便分析,大概往后看了下,retn就在下面,所以直接选中0x402626 – 0x402756的部分,复制到新的exe里。

新的exe载入ida发现check函数已经正常显示。继续看

check接受了luck string的md5的前4位,取ascii和作为随机数种子,然后看到scanfs flag之后有了checkht函数,点进去发现是对输入flag的格式的核对,开头flag{,结尾},长度42,下标13 28 18 23是‘-’ 。然后删除了里面的‘-’继续。

随机数的产生分为两个阶段,首先需要srand一个随机数种子,之后会根据这个随机数种子生成一串“随机数”。在这里只要随机数种子给定,那么后面每一次执行rand()生成的数出现的顺序是一样的。即一个seed对应一张随机数表。

构造之后感觉有个坑,不同的cpp编译器的srand实现好像不一样

这个结果其实是不对的。

所以直接从内存或者寄存器找v3:(原始文件载入)

寄存器窗口有了显示,就是flag ,加上连字符即可:

flag{a197b847-7092-53a4-7c41-bc7d6d52e69d}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值