本帖最后由 yechen123 于 2018-9-4 20:38 编辑
具体是哪个比赛我也不懂 随便哪来分析的
具体附件先上传
re1.zip
(15.02 KB, 下载次数: 33)
先用exeinfope查壳
无壳 直接上IDA分析
具体流程还是很清晰的
先要求用户输入字符串
最后再在字符串末尾置0
然后在进入第一个加密的循环
这个循环总体思路是不断改变字符串里面的字符的位置
if(j&1)..else这个判断具体是 如果j为单数就执行if里面的语句 否则执行else里面的语句
最后一个加密
如果字符的ascci码 +13 < 61 则字符^0x34 否则^0x37
对于这段代码 可以这样子解密
[Asm] 纯文本查看 复制代码 if ((flags[i]^0x34) + 13) < 61:
flags[i] = flags[i]^0x34
else:
flags[i] = flags[i]^0x37
最后加密字符再跟程序里面字符比较
也就是说 取出存在程序里面的字符再逆着写脚本就可以得到真正的flag
最后直接上脚本
[Asm] 纯文本查看 复制代码 flagde = '00 71 04 03 68 50 52 5B 68 07 5F 02 45 68 40 5E 59'
flags = flagde.split(' ')
for i in range(len(flags)):
flags[i] = int(flags[i], 16)
i = len(flags) - 1
while i>=0:
if ((flags[i]^0x34) + 13) < 61:
flags[i] = flags[i]^0x34
else:
flags[i] = flags[i]^0x37
i -= 1
v5 = len(flags) - 1
j = v5
while j>0:
if j&1:
v7 = v5 - (v5 % j)
v8 = v7
count = 0
k = ''
while v8>j:
v8 -= j
count += 1
k = flags[j]
while count!=0:
v8 += j
flags[v8-j] = flags[v8]
count -= 1
flags[v7] = k
else:
v10 = j
count = 1
v9 = flags[v10]
if (2*j <= v5):
v10 += j
while j + v10 <= v5:
v10 += j
count += 1
v9 = flags[v10]
while count != 0:
v10 -= j
flags[j + v10] = flags[v10]
count -= 1
flags[j] = v9
j -= 1
print (flags)
flag = ''
for i in range(1,len(flags)):
flag += chr(flags[i])
print (flag)
|