CTFSHOW Reverse re2
前几天去了趟青海搞培训,下课的时候有个老哥问了这道题,之前一直没时间搞,今天突然想起来了就看了看。
有两个文件,双击运行exe。
运行之后输入程序闪退,直接拖进ida,32位程序无壳。
逻辑比较简单,可以看到有两个分别对文件进行读取和写入的操作,我们跟进第一个关键函数
一个简单的异或脚本可以算出str1
str = "DH~mqqvqxB^||zll@Jq~jkwpmvez{" str2 = '' for i in str: str2 += chr(ord(i)^31) print(str2)
[Warnning]Access_Unauthorized
然后跟进下一个函数
进去分析四个函数之后看出是rc4加密,很明显刚刚我们算出的字符串就是密钥,这道题的整体逻辑就是,
有flag和enflag两个文件,程序会读取flag文件里面的内容并进行rc4加密,然后写入到enflag文件里面,从最开始我们已经知道了
密文,也就是enflag文件里面的内容,也知道密钥,我们对密文进行rc4解密就可以得到flag。
在这里有一个问题,enflag文件里面的密文是ANSI编码之后的数据,要想办法把数据转化为可以进行计算的数据,这里有一个办法
就是把文件直接拖进ida,利用ida将密文转化为一个个的十六进制的数据,这样就可以进行计算了。
附上脚本
key3 = [ 0xC3,0x82,0xA3,0x25,0xF6,0x4C,0x36,0x3B,0x59,0xCC,0xC4,0xE9,0xF1,0xB5,0x32,0x18,0xB1,0x96,0xAe,0xBF,0x08,0x35] c = key3 t = [] key = '[Warnning]Access_Unauthorized' ch = '' j = 0 # 初始化 s = list(range(256)) # 创建有序列表 for i in range(256): j = (j + s[i] + ord(key[i % len(key)])) % 256 s[i], s[j] = s[j], s[i] i = 0 # 初始化 j = 0 # 初始化 for r in c: i = (i + 1) % 256 j = (j + s[i]) % 256 s[i], s[j] = s[j], s[i] x = (s[i] + (s[j] % 256)) % 256 ch += chr(r ^ s[x]) print(ch)