BUUCTF中的reverse3

0x00 前言

        最近觉得正业有点坑,做点题缓解缓解心情。

0x01 正文

       

        首先拿到题目之后,先丢到exeinfo中查看题目信息。

        可以得到的信息有:C++,32位,无壳。所以可以采用IDA32打开。

        打开之后很明显的可以看到main函数,双击追踪一下。

        由于流程图比较长,所以截了两张。可以看到第二张图中存在right和wrong,因此在这里寻找突破口。向上看一个流程图会发现str1和str2两个函数。不看其它的,盲猜一下,应该是str1和str2做比较,如果相等则输出right。

        那么str2是什么呢?上面已经给出了一串字符串:“e3nifIH9b_C@n@dH”。

        假如,str1直接输入这串字符串,肯定是不对的。那么一定是对str1的输入结果进行加密,然后和str2做比较。当然啦,看到流程图里面有strncmp了,就能确定是str1和str2相比较了。

        现在问题来了,str1采用的是什么加密方式?

        在进一步追踪后发现有一串很齐全的字符串,那么一定会有师傅问:看到这一串就确定了是什么加密方式吗?说实话,我也没看出来,但是有经验的师傅就一眼看出来了。既然看不出来,就往上翻翻呗。

        赫然一个大大的Base64input。

        知道加密方式就好办了,那就是str1的字符串通过Base64的加密方式进行加密,然后和str2的字符串相比较。反过来推,str2的值是用Base64加密之后,巴拉巴拉巴拉。

        那就,写个脚本?

# !/bin/python

import base64            //导入base64

res="e3nifIH9b_C@n@dH"    //源字符串
flag=""                    //目的字符串

for i in range(len(res)):        //遍历源字符串
    flag += chr(ord(res[i])-i)    

print(base64.b64decode(flag))    //将遍历出来的字符串用base64解密

代码解析:

chr() 用一个范围在 range(256)内的(就是0~255)整数作参数,返回一个对应的字符。

ord() 函数是 chr() 函数(对于8位的ASCII字符串)或 unichr() 函数(对于Unicode对象)的配对函数,它以一个字符(长度为1的字符串)作为参数,返回对应的 ASCII 数值,或者 Unicode 数值。

        运行一下发现,flag{b'{i_l0ve_you}'}

0x03 总结

        本来想就这样结尾了,但是后来觉得不太妥当,打算记录一下这个脚本的思路。

        这个脚本的思路就是通过遍历的方式把res中的字符通过base64的解密方式打印出来。其中,这个脚本的核心在于:将res字符串中的每个字符的ASCII码值减去它在字符串中的位置,然后将结果转换为对应的字符,最终得到解密后的字符串flag。

        我还是很希望能多写一些脚本之类的,毕竟代码这个东西还是需要多练才行,就好像各种语言都学过,然后时间长了发现写一个简单的程序都写不出来。技能是会遗忘的,多练练总是好的。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值