Re-white give
1.查壳为无壳,并且为x64的exe程序。
2.ida分析
运行程序,输出2行字符串。但是在ida中没有找到相应的字符串,猜测应该是把字符串加密了。
3.动态调试
得到这样的基本流程。
此处为输入数据的sha256加密,不过在一开始的时候没有认出来是sha256,大写的菜。
然后生成一张伪随机数的数表。
再创建一张在后面用来置换的置换表。
后面的操作就是根据置换表把sha256的数据进行置换,再创建一张异或的数据表。
到这里输入的数据就完成了加密。
然后和指定的数据进行比较,一样则显示成功。
exp:
import hashlib fp_byte_table=open('byte_table.bin',"rb") byte_table=list(bytearray(fp_byte_table.read(0x100))) fp_byte_table.close() fp_check_table=open('check_table.bin',"rb") check_table=list(bytearray(fp_check_table.read(0x200))) fp_check_table.close() fp_rand_table=open('rand_table.bin',"rb") rand_table=list(bytearray(fp_rand_table.read(0x100))) fp_rand_table.close() file_name='rand_table_2.bin' for i in range(8): fp_r_table = open(file_name, "rb") r_table=list(bytearray(fp_r_table.read(0x100))) rand_table=rand_table+r_table file_name_list=[ord(file_name[ii]) for ii in range(len(file_name))] file_name_list[-5]=file_name_list[-5]+1 file_name_list=[chr(k) for k in file_name_list] file_name=''.join(file_name_list) #print(file_name) fp_r_table.close() file_name='rand_table_10.bin' for i in range(7): fp_r_table=open(file_name,"rb") r_table = list(bytearray(fp_r_table.read(0x100))) rand_table = rand_table + r_table file_name_list=[ord(file_name[ii]) for ii in range(len(file_name))] file_name_list[-5]=file_name_list[-5]+1 file_name_list=[chr(k) for k in file_name_list] file_name=''.join(file_name_list) #print(file_name) fp_r_table.close() for n in range(0xf,-1,-1): for i in range(0x100): check_table[i+0x100] = (check_table[i+0x100] - i)%0x100 check_table[i+0x100] ^= rand_table[i+0x100*n] for i in range(0x100): for j in range(0x100): if check_table[i+0x100]==byte_table[j]: check_table[i+0x100]=j break for n in range(0xf,-1,-1): for i in range(0x100): check_table[i] = (check_table[i] - i)%0x100 check_table[i] ^= rand_table[i+0x100*n] for i in range(0x100): for j in range(0x100): if check_table[i]==byte_table[j]: check_table[i]=j break alpha=list("abcdefghijklmnopqrstuvwxyz_ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") flag="" for i in range(0x10): sucess = False print("round: {}".format(i)) for a in alpha: for b in alpha: for c in alpha: for d in alpha: sha256 = hashlib.sha256() slice = a+b+c+d sha256.update(slice.encode('ascii')) sliceresult = sha256.digest() if sliceresult[0:0x20] == bytes(check_table[i*0x20:i*0x20+0x20]): flag += slice print(flag) sucess = True break if sucess: break if sucess: break if sucess: break print(flag)
程序中的所有表都可以通过x64dbg调试器dump下来。