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}