也可参考这篇文章:
本题并不是拖入ida中,进行静态分析,下载文件后文件名是py,我们将其重命名(即修改后缀为.py) (如图)
打开后分析以下代码
逆向一下有点麻烦,看了大佬的题解,说是直接正向爆破一下:
flag = ''
result = 'v0b9n1nkajz@j0c4jjo3oi1h1i937b395i5y5e0e$i'
s = 'wesyvbniazxchjko1973652048@$+-&*<>'
for i in range(len(result)//2):
for j in range(32,126):
s1 = j//17
s2 = j%17
a=(s1+i)%34
b=-(s2+i+1)%34
if (result[2*i]==s[a] and result[2*i+1]==s[b]):
flag+=chr(j)
break
print(flag)
下面详细分析一下中间四步和if循环:
中间四步目的是为了找到原始字符 j 在加密过程中是如何被转换成加密字符串 result 中的两个字符的。
1.计算 s1 和 s2:
s1 = j//17
s2 = j%17
这两个值 s1 和 s2 是将原始字符 j 的 ASCII 码值分解为两部分,这两部分随后被用来从 s 字符串中选择字符。
2.计算索引 a 和 b:
a=(s1+i)%34
b=-(s2+i+1)%34
在加密过程中,原始字符 j 的 ASCII 码值被分解为两部分,这两部分随后被用来从 s 字符串中选择两个字符,并将它们组合起来形成加密结果的一部分。通过这个过程,我们可以从加密结果中提取出原始字符 j。
分析一下if语句:
1.分析条件检查:
if (result[2*i]==s[a] and result[2*i+1]==s[b]):
这个条件检查包含两个部分,它们必须同时满足:
这两个条件一起确保了通过当前的 j 值计算出的两个字符能够精确地匹配加密结果 result 中的对应字符。
2.如果条件满足:
flag+=chr(j)
如果上述条件为真,即我们找到了正确的字符 j,那么我们就将这个字符(通过 chr(j) 转换为字符)添加到 flag 字符串中。这是还原原始 flag 的过程。
3.跳出内层循环:
break
一旦找到正确的字符,就没有必要继续尝试其他字符了,因此使用 break 语句跳出内层循环。这可以节省时间,因为我们已经找到了当前字符的正确值,可以继续寻找下一个字符。
总结来说,这个 if 循环的作用是:
这个过程重复进行,直到 flag 字符串中的所有字符都被找到。
Flag{Fake_RERE_QAQ}
也可参考这篇文章:NSSCTF RE [SWPUCTF 2021 新生赛]非常简单的逻辑题-CSDN博客