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