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)

 

posted @ 2021-08-02 19:10  Sk2rw  阅读(1645)  评论(0编辑  收藏  举报