将文件下载下来是个exe文件,放入查壳工具进行查壳。发现是无壳64位程序,拖入IDA进行分析。

进行字符串搜索发现了Right!,我们进入到相关的函数进行查看

发现逻辑就是读取一个名为flag.txt的文件,然后将读取出来的值放入Buffer数组当中。再将Buffer中的元素与 i 进行异或,最后与str2进行比较。
根据逻辑写出exp
enc = “S[]1475XRQUHY]QIQZW”
for i in range(len(enc)):
temp = ord(enc[i]) ^ i
print(chr(temp),end=”)
#flag{SZ_2023_ZX_CUP_FAKE}
提交flag时发现错了,看来这道题没有想的那么简单。还要再仔细的找找看,果然在函数列表中发现了Tls函数。

发现这里主要调用了两个东西一个是sub_140001240,另一个是loc_140003000。我们都点进去看看,首先看的是sub_140001240

发现就是将两个参数取反,然后将取反后的两个值进行按位与运算。再看看loc_140003000

发现是一堆数据,但是程序又调用了这个东西。那么这个看上去就像是SMC,本来想用IDApython进行解密的,但是看半天也没搞明白是什么操作进行的自解密。只能进行dump了
先动调程序,让程序将这段数据解密为一段代码

分析代码可以得出,这里既然调用了loc_140003000。那么到这里肯定就已经将数据解密为代码了,让程序跑到这个位置,然后将程序dump出来。
将dump出来的exe文件放入IDA中再次进行分析

可以看到loc_140003000已经变成了sub_140003000了,那么我们点进去看看。

发现了真正的加密函数,那么根据逻辑写出exp
def s(a1,a2):
return ~a1 & ~a2
enc = [-83, -91, -93, -49, -52, -55, -53, -88, -82, -81, -85, -72, -89, -93, -81, -88, -89, -95, -51]
for i in range(19):
for j in range(256):
v16 = s(j,i)
v17 = s(i,i)
v1 = j
v18 = v1
v2 = s(v1,v1)
v3 = s(v2,v17)
v19 = s(v3,v16) – 1
v20 = s(j,i)
v21 = s(i,i)
v4 = j
v22 = v4
v5 = s(v4,v4)
v6 = s(v5,v21)
v7 = s(v6,v20)
Str1 = s((v7-1),v19)
if Str1 == enc[i]:
print(chr(j),end=”)
flag{SZ_2023_ZX_CUP_WIN!}