南邮CTF逆向 480小时精通C++

首先先ida一下,发现程序逻辑比较简单,就是对flag进行了加密:

很明显:StringEncryptFunction函数是对flag进行加密的函数,main是主函数,点开看一下函数结构:
main函数:

(这里要考虑小端序,在对flag进行解密时要把字符串倒过来)

StringEncryptFunction函数结构截取:

点进去几个函数可以发现其实函数的结构是差不多的,只是有一个值发生了改变,

(此处为第一个函数和最后一个函数的截取片段)

由此可见,加密函数里面包括了480个函数,而他们的内部结构是差不多的,只不过是值从“001001001”变到了“480480480”,具体的函数结构如下图所示:

然后就可以上脚本了:
 

def encrypt_i(a1,a2,i):
  key=str(i).zfill(3)*3
  v9=key
  v8=len(v9)
  result=""
  for i in range(a2):
    v2=a1[i]
    v3=v2
    v4=v9[i%v8]
    result+=chr(ord(v4)^ord(v3)^i)
  return result
 
v6 = 'j4Nscadb';
v7 = '[n<g_q`o';
v8 = 'cWv3|waE';
v9 = 'Dt_{q1x[';
v10 = '})wu';
#62646163734e346a6f60715f673c6e5b4561777c337657635b7831717b5f74447577297d
encrypted_flag=v6[::-1]+v7[::-1]+v8[::-1]+v9[::-1]+v10[::-1]#注意加密的flag的输出顺序
 
for i in range(480,0,-1):
  encrypted_flag=encrypt_i(encrypted_flag,len(encrypted_flag),i)
 
print encrypted_flag

 

 

 

 

 

 

 

 

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章