南京邮电大学 RE-WxyVM2

把文件拖入IDA进行反编译。然后到main函数F5查看伪代码(IDA7.0版本不能查看伪代码,6.8版本可以)

代码非常好读懂,输入一个数然后处理,然后再与某个字符串对比,完全一样即为flag。

要对比的字符串存在dword_694060

dword为双字类型,即每32位为一个字符。又因为在参与运算时候为BYTE类型

所以只需要取第一个字节,共取25个形成处理后的flag字符串。

字符串长度在这里限制。

接下来就是过滤的事,将所有的操作取出,用脚本进行处理。逆运算即可得到答案。

python脚本:

import re
file_name = 'a.txt'
a=[]
b=""
with open(file_name) as file_obj:
       for line in file_obj:
              if 'byte_6941' in line: #过滤掉不含有byte_6941的运算
                     if '--' not in line and '++' not in line: #其中有的运算是以++,++开头,需要单独处理
                            a.append(re.findall(r"6941(.+?);",line.rstrip()))#用re的字符串过滤,来处理,即只取r6941到;中间的内容
                     else:
                            a.append(re.findall(r"(.+?);",line.rstrip()))#保留r6941,因为是++,--开头
c =[0xC0,0x85,0xF9,0x6C,0xE2,0x14,0xBB,0xe4,0xd,0x59,0x1c,0x23,0x88,0x6e,0x9b,0xca,0xba,0x5c,0x37,0xfff,0x48,0xd8,0x1f,0xab,0xa5]
for i in reversed(a): #逆取出,从后往前逆向运算。以下处理都是根据处理完后的字符打印出来,取出相应位置的数据进行处理
       if i[0][2]=='+':
              num1=int(i[0][13:],16)
              c[num1]=c[num1]-1
       elif i[0][2]=='-':
              num1=int(i[0][13:],16)
              c[num1]=c[num1]+1
       elif i[0][3] =='+':
              num1=i[0][:2]
              if 'x' in i[0]:
                     num2=int(i[0][8:],16)
                     c[int(num1,16)]-=num2
              else:
                     num2=int(i[0][6:],10)
                     c[int(num1,16)]-=num2
       elif i[0][3] =='-':
              num1=i[0][0:2]
              if 'x' in i[0]:
                     num2=int(i[0][8:],16)
                     c[int(num1,16)]+=num2
              else:
                     num2=int(i[0][6:],10)
                     c[int(num1,16)]+=num2
       elif i[0][3] =='^':
              num1=i[0][0:2]
              if 'x' in i[0]:
                     num2=int(i[0][8:],16)
                     c[int(num1,16)]^=num2
              else:
                     num2=int(i[0][6:],10)
                     c[int(num1,16)]^=num2

flag = ""
for i in c:
       flag+=chr(i%128)
print(flag)

其中处理的txt文件内容截取:

最终跑出来的答案:

总结,题目本身不难,难点可能在数据量庞大,需要过滤处理。但是仍然不难

猜你喜欢

转载自blog.csdn.net/qq_38025365/article/details/82588050