https://buuoj.cn/challenges#[2019%E7%BA%A2%E5%B8%BD%E6%9D%AF]easyRE
exeinfo: NOT Win EXE - .o - ELF [ 64bit obj. Exe file
字符串定位到主要函数
if ( sub_424BA0(v15) == 36 )
这行猜测是检测字符串长度是 36,对长度重新分配(Y)
打开汇编,发现字符串分配是一起的,IDA 把它分开了(有两个 7F 干扰识别了)
也改成 36 就好了
变成这样:
总之先写个脚本看看是什么东西
cipher = "Iodl>Qnb(ocy\x7Fy.i\x7Fd`3w}wek9{iy=~yL@EC"
# 对index异或
txt = ""
for i in range(len(cipher)):
txt += chr(ord(cipher[i]) ^ i)
print(txt)
Info:The first four chars are `flag`
好吧,很有意义的提示,继续往下看
接下来对输入进行 base64加密 检验
从两个地方可以看出是 →base64加密
解密得网址 https://bbs.pediy.com/thread-254172.htm
得知被坑了……
https://www.cnblogs.com/Moomin/p/15440957.html
在 base64 下面有一些可疑的数字(思路来源 https://blog.csdn.net/qq_61051249/article/details/121884109 )找到该函数
看到关键部分也就是中间的那个 if 部分,if 判断内将 byte_6CC0A0 数组的第一位与 key 的第一位异或,将 byte_6CC0A0 数组的第四位(也就是 byte_6CC0A3)与 key 的第四位异或(因为 HIBYTE() 函数的作用是获取高字节也就是数组的最后一位),并将两者的异或后的结果与 “f” 与 “g” 作比较,所以可以推理出 v4 其实是一个长度为 4 的数组,也就是 key,它按照一定的规律与 byte_6CC0A0 数组中的每一位异或最后生成一串开头为 flag 的字符串
for 循环里面就是干的反复异或 v1 的事情,上面的分析是成立的
但是怎么获取 v1 呢
Info:The first four chars are `flag`
这样通过已知原码和密文,就刚刚好可以知道循环的 4 位 box
写个脚本逆回去吧
cipher = [64, 53, 32, 86, 93, 24, 34, 69, 23, 47,
36, 110, 98, 60, 39, 84, 72, 108, 36, 110,
114, 60, 50, 69, 91]
flag = "flag"
# 前面四位反推出循环box的key
key = [ord(flag[0]) ^ cipher[0], ord(flag[1]) ^ cipher[1], ord(flag[2]) ^ cipher[2], ord(flag[3]) ^ cipher[3]]
print(key)
# 循环box解密
for i in range(len(cipher)):
print(chr(cipher[i] ^ key[i % 4]), end="")
flag{Act1ve_Defen5e_Test}